Review radio metadata allocations/deallocations.
Bug: b/34054813
Test: VTS, manual
Change-Id: I8c402ff6fed8d1fe7c5c2d468f2e7822dc0dac6f
diff --git a/services/radio/HidlUtils.cpp b/services/radio/HidlUtils.cpp
index 3b33386..6895377 100644
--- a/services/radio/HidlUtils.cpp
+++ b/services/radio/HidlUtils.cpp
@@ -134,14 +134,18 @@
halInfo->channel, halInfo->subChannel);
}
+// TODO(twasilczyk): drop unnecessary channel info
//static
void HidlUtils::convertMetaDataFromHal(radio_metadata_t **metadata,
const hidl_vec<MetaData>& halMetadata,
- uint32_t channel,
- uint32_t subChannel)
+ uint32_t channel __unused,
+ uint32_t subChannel __unused)
{
- radio_metadata_allocate(metadata, channel, subChannel);
+ if (metadata == nullptr || *metadata == nullptr) {
+ ALOGE("destination metadata buffer is a nullptr");
+ return;
+ }
for (size_t i = 0; i < halMetadata.size(); i++) {
radio_metadata_key_t key = static_cast<radio_metadata_key_t>(halMetadata[i].key);
radio_metadata_type_t type = static_cast<radio_metadata_key_t>(halMetadata[i].type);
diff --git a/services/radio/RadioHalHidl.cpp b/services/radio/RadioHalHidl.cpp
index 032d3fd..3dcf2f3 100644
--- a/services/radio/RadioHalHidl.cpp
+++ b/services/radio/RadioHalHidl.cpp
@@ -20,7 +20,7 @@
#include <media/audiohal/hidl/HalDeathHandler.h>
#include <utils/Log.h>
#include <utils/misc.h>
-#include <system/radio_metadata.h>
+#include <system/RadioMetadataWrapper.h>
#include <android/hardware/broadcastradio/1.0/IBroadcastRadioFactory.h>
#include "RadioHalHidl.h"
@@ -261,27 +261,25 @@
Return<void> RadioHalHidl::Tuner::tuneComplete(Result result, const ProgramInfo& info)
{
ALOGV("%s IN", __FUNCTION__);
- radio_hal_event_t event;
- memset(&event, 0, sizeof(radio_hal_event_t));
+ radio_hal_event_t event = {};
+ RadioMetadataWrapper metadataWrapper(&event.info.metadata);
+
event.type = RADIO_EVENT_TUNED;
event.status = HidlUtils::convertHalResult(result);
HidlUtils::convertProgramInfoFromHal(&event.info, &info);
onCallback(&event);
- radio_metadata_deallocate(event.info.metadata);
return Return<void>();
}
Return<void> RadioHalHidl::Tuner::afSwitch(const ProgramInfo& info)
{
ALOGV("%s IN", __FUNCTION__);
- radio_hal_event_t event;
- memset(&event, 0, sizeof(radio_hal_event_t));
+ radio_hal_event_t event = {};
+ RadioMetadataWrapper metadataWrapper(&event.info.metadata);
+
event.type = RADIO_EVENT_AF_SWITCH;
HidlUtils::convertProgramInfoFromHal(&event.info, &info);
onCallback(&event);
- if (event.info.metadata != NULL) {
- radio_metadata_deallocate(event.info.metadata);
- }
return Return<void>();
}
@@ -319,14 +317,12 @@
const ::android::hardware::hidl_vec<MetaData>& metadata)
{
ALOGV("%s IN", __FUNCTION__);
- radio_hal_event_t event;
- memset(&event, 0, sizeof(radio_hal_event_t));
+ radio_hal_event_t event = {};
+ RadioMetadataWrapper metadataWrapper(&event.info.metadata);
+
event.type = RADIO_EVENT_METADATA;
HidlUtils::convertMetaDataFromHal(&event.metadata, metadata, channel, subChannel);
onCallback(&event);
- if (event.metadata != NULL) {
- radio_metadata_deallocate(event.info.metadata);
- }
return Return<void>();
}