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);