Refine the recenter operation

This change allows recentering to happen for an individual sensor
rather than to all at once. This avoids unecessary recentering and
rate limiting if the sensor being recentered is not being used in the
current mode.

Test: atest --host libheadtracking-test
Bug: 188502620
Change-Id: Ifb73050e0072e676b5936a22e0cd1be8d31e9596
diff --git a/media/libheadtracking/HeadTrackingProcessor.cpp b/media/libheadtracking/HeadTrackingProcessor.cpp
index ee60fa5..3f1a18d 100644
--- a/media/libheadtracking/HeadTrackingProcessor.cpp
+++ b/media/libheadtracking/HeadTrackingProcessor.cpp
@@ -108,10 +108,22 @@
 
     HeadTrackingMode getActualMode() const override { return mModeSelector.getActualMode(); }
 
-    void recenter() override {
-        mHeadPoseDriftCompensator.recenter();
-        mScreenPoseDriftCompensator.recenter();
-        mRateLimiter.enable();
+    void recenter(bool recenterHead, bool recenterScreen) override {
+        if (recenterHead) {
+            mHeadPoseDriftCompensator.recenter();
+        }
+        if (recenterScreen) {
+            mScreenPoseDriftCompensator.recenter();
+        }
+
+        // If a sensor being recentered is included in the current mode, apply rate limiting to
+        // avoid discontinuities.
+        HeadTrackingMode mode = mModeSelector.getActualMode();
+        if ((recenterHead && (mode == HeadTrackingMode::WORLD_RELATIVE ||
+                              mode == HeadTrackingMode::SCREEN_RELATIVE)) ||
+            (recenterScreen && mode == HeadTrackingMode::SCREEN_RELATIVE)) {
+            mRateLimiter.enable();
+        }
     }
 
   private:
diff --git a/media/libheadtracking/include/media/HeadTrackingProcessor.h b/media/libheadtracking/include/media/HeadTrackingProcessor.h
index 23de540..9fea273 100644
--- a/media/libheadtracking/include/media/HeadTrackingProcessor.h
+++ b/media/libheadtracking/include/media/HeadTrackingProcessor.h
@@ -89,9 +89,9 @@
     virtual HeadTrackingMode getActualMode() const = 0;
 
     /**
-     * This causes the current poses for both the head and screen to be considered "center".
+     * This causes the current poses for both the head and/or screen to be considered "center".
      */
-    virtual void recenter() = 0;
+    virtual void recenter(bool recenterHead = true, bool recenterScreen = true) = 0;
 };
 
 /**
diff --git a/services/audiopolicy/service/SpatializerPoseController.cpp b/services/audiopolicy/service/SpatializerPoseController.cpp
index f0d7f7c..7e91d76 100644
--- a/services/audiopolicy/service/SpatializerPoseController.cpp
+++ b/services/audiopolicy/service/SpatializerPoseController.cpp
@@ -124,7 +124,7 @@
     // Start new sensor, if valid.
     mHeadSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
                                     : SensorPoseProvider::INVALID_HANDLE;
-    mProcessor->recenter();
+    mProcessor->recenter(true, false);
 }
 
 void SpatializerPoseController::setScreenSensor(const ASensor* sensor) {
@@ -136,7 +136,7 @@
     // Start new sensor, if valid.
     mScreenSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
                                       : SensorPoseProvider::INVALID_HANDLE;
-    mProcessor->recenter();
+    mProcessor->recenter(false, true);
 }
 
 void SpatializerPoseController::setDesiredMode(HeadTrackingMode mode) {