audio: optimize spatializer activation
Only enable the spatializer effect engine when the requested
level is not none and there are active playback clients.
Also set max update period to 1 second instead of 50ms when creating
the head pose controller as there is no need to wake so often if no
audio is processed by the spatializer effect.
Also add a missing forwarded of the head tracking mode to the engine
when the actual mode changes
Bug: 227740874
Test: make
Change-Id: I05a6f4e9edea319e300e98a33dc3a3fd78143466
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index 579b852..971aaa8 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -298,7 +298,7 @@
callback = mSpatializerCallback;
if (levelChanged && mEngine != nullptr) {
- setEffectParameter_l(SPATIALIZER_PARAM_LEVEL, std::vector<SpatializationLevel>{level});
+ checkEngineState_l();
}
checkSensorsState_l();
}
@@ -594,6 +594,7 @@
ALOGV("%s(%d)", __func__, (int) mode);
sp<media::ISpatializerHeadTrackingCallback> callback;
SpatializerHeadTrackingMode spatializerMode;
+ bool modeChanged = false;
{
std::lock_guard lock(mLock);
if (!mSupportsHeadTracking) {
@@ -613,10 +614,15 @@
LOG_ALWAYS_FATAL("Unknown mode: %d", mode);
}
}
+ modeChanged = mActualHeadTrackingMode != spatializerMode;
mActualHeadTrackingMode = spatializerMode;
+ if (modeChanged && mEngine != nullptr) {
+ setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
+ std::vector<SpatializerHeadTrackingMode>{spatializerMode});
+ }
callback = mHeadTrackingCallback;
}
- if (callback != nullptr) {
+ if (callback != nullptr && modeChanged) {
callback->onHeadTrackingModeChanged(spatializerMode);
}
}
@@ -648,18 +654,13 @@
return status;
}
- setEffectParameter_l(SPATIALIZER_PARAM_LEVEL,
- std::vector<SpatializationLevel>{mLevel});
- setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
- std::vector<SpatializerHeadTrackingMode>{mActualHeadTrackingMode});
-
- mEngine->setEnabled(true);
+ checkEngineState_l();
outputChanged = mOutput != output;
mOutput = output;
if (mSupportsHeadTracking) {
mPoseController = std::make_shared<SpatializerPoseController>(
- static_cast<SpatializerPoseController::Listener*>(this), 10ms, 50ms);
+ static_cast<SpatializerPoseController::Listener*>(this), 10ms, 1000ms);
LOG_ALWAYS_FATAL_IF(mPoseController == nullptr,
"%s could not allocate pose controller", __func__);
@@ -709,8 +710,11 @@
void Spatializer::updateActiveTracks(size_t numActiveTracks) {
std::lock_guard lock(mLock);
- mNumActiveTracks = numActiveTracks;
- checkSensorsState_l();
+ if (mNumActiveTracks != numActiveTracks) {
+ mNumActiveTracks = numActiveTracks;
+ checkEngineState_l();
+ checkSensorsState_l();
+ }
}
void Spatializer::checkSensorsState_l() {
@@ -727,6 +731,22 @@
}
}
+void Spatializer::checkEngineState_l() {
+ if (mEngine != nullptr) {
+ if (mLevel != SpatializationLevel::NONE && mNumActiveTracks > 0) {
+ mEngine->setEnabled(true);
+ setEffectParameter_l(SPATIALIZER_PARAM_LEVEL,
+ std::vector<SpatializationLevel>{mLevel});
+ setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
+ std::vector<SpatializerHeadTrackingMode>{mActualHeadTrackingMode});
+ } else {
+ setEffectParameter_l(SPATIALIZER_PARAM_LEVEL,
+ std::vector<SpatializationLevel>{SpatializationLevel::NONE});
+ mEngine->setEnabled(false);
+ }
+ }
+}
+
void Spatializer::calculateHeadPose() {
ALOGV("%s", __func__);
std::lock_guard lock(mLock);