Spatializer: Deliver metrics to MediaMetrics
Test: adb shell dumpsys media.metrics
Bug: 203434487
Change-Id: I4899db6bad8960b8dd5e65f24c8e6c4ee73f6fd1
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index 9baaf93..b19d669 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -31,6 +31,7 @@
#include <media/audiohal/EffectsFactoryHalInterface.h>
#include <media/stagefright/foundation/AHandler.h>
#include <media/stagefright/foundation/AMessage.h>
+#include <media/MediaMetricsItem.h>
#include <media/ShmemCompat.h>
#include <mediautils/ServiceUtilities.h>
#include <utils/Thread.h>
@@ -57,6 +58,19 @@
if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
std::move(_tmp.value()); })
+audio_channel_mask_t getMaxChannelMask(std::vector<audio_channel_mask_t> masks) {
+ uint32_t maxCount = 0;
+ audio_channel_mask_t maxMask = AUDIO_CHANNEL_NONE;
+ for (auto mask : masks) {
+ const size_t count = audio_channel_count_from_out_mask(mask);
+ if (count > maxCount) {
+ maxMask = mask;
+ maxCount = count;
+ }
+ }
+ return maxMask;
+}
+
// ---------------------------------------------------------------------------
class Spatializer::EngineCallbackHandler : public AHandler {
@@ -286,6 +300,21 @@
ALOGW("%s: SPATIALIZER_PARAM_SUPPORTED_CHANNEL_MASKS reports empty", __func__);
return BAD_VALUE;
}
+
+ // Currently we expose only RELATIVE_WORLD.
+ // This is a limitation of the head tracking library based on a UX choice.
+ mHeadTrackingModes.push_back(SpatializerHeadTrackingMode::DISABLED);
+ if (mSupportsHeadTracking) {
+ mHeadTrackingModes.push_back(SpatializerHeadTrackingMode::RELATIVE_WORLD);
+ }
+ mediametrics::LogItem(mMetricsId)
+ .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_CREATE)
+ .set(AMEDIAMETRICS_PROP_CHANNELMASK, (int32_t)getMaxChannelMask(mChannelMasks))
+ .set(AMEDIAMETRICS_PROP_LEVELS, aidl_utils::enumsToString(mLevels))
+ .set(AMEDIAMETRICS_PROP_MODES, aidl_utils::enumsToString(mSpatializationModes))
+ .set(AMEDIAMETRICS_PROP_HEADTRACKINGMODES, aidl_utils::enumsToString(mHeadTrackingModes))
+ .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)status)
+ .record();
return NO_ERROR;
}
@@ -294,14 +323,7 @@
std::lock_guard lock(mLock);
audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
// For now use highest supported channel count
- uint32_t maxCount = 0;
- for ( auto mask : mChannelMasks) {
- const size_t count = audio_channel_count_from_out_mask(mask);
- if (count > maxCount) {
- config.channel_mask = mask;
- maxCount = count;
- }
- }
+ config.channel_mask = getMaxChannelMask(mChannelMasks);
return config;
}
@@ -338,7 +360,7 @@
if (levels == nullptr) {
return binderStatusFromStatusT(BAD_VALUE);
}
- levels->push_back(SpatializationLevel::NONE);
+ // SpatializationLevel::NONE is already required from the effect or we don't load it.
levels->insert(levels->end(), mLevels.begin(), mLevels.end());
return Status::ok();
}
@@ -399,11 +421,7 @@
if (modes == nullptr) {
return binderStatusFromStatusT(BAD_VALUE);
}
-
- modes->push_back(SpatializerHeadTrackingMode::DISABLED);
- if (mSupportsHeadTracking) {
- modes->push_back(SpatializerHeadTrackingMode::RELATIVE_WORLD);
- }
+ modes->insert(modes->end(), mHeadTrackingModes.begin(), mHeadTrackingModes.end());
return Status::ok();
}