Spatializer: head tracking optimization

Do not create a head pose controller and accept head
tracking commands if the engine does not support
headtracking.

Bug: 188502620
Test: manual test with mock spatializer
Change-Id: I9579729588e10d9c3b628266333674caf08022b4
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index 7d49ea2..ee25dc8 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -391,6 +391,9 @@
 }
 
 Status Spatializer::recenterHeadTracker() {
+    if (!mSupportsHeadTracking) {
+        return binderStatusFromStatusT(INVALID_OPERATION);
+    }
     std::lock_guard lock(mLock);
     if (mPoseController != nullptr) {
         mPoseController->recenter();
@@ -400,6 +403,9 @@
 
 Status Spatializer::setGlobalTransform(const std::vector<float>& screenToStage) {
     ALOGV("%s", __func__);
+    if (!mSupportsHeadTracking) {
+        return binderStatusFromStatusT(INVALID_OPERATION);
+    }
     std::optional<Pose3f> maybePose = Pose3f::fromVector(screenToStage);
     if (!maybePose.has_value()) {
         ALOGW("Invalid screenToStage vector.");
@@ -437,6 +443,9 @@
 
 Status Spatializer::setHeadSensor(int sensorHandle) {
     ALOGV("%s sensorHandle %d", __func__, sensorHandle);
+    if (!mSupportsHeadTracking) {
+        return binderStatusFromStatusT(INVALID_OPERATION);
+    }
     std::lock_guard lock(mLock);
     if (sensorHandle == ASENSOR_INVALID) {
         mHeadSensor = nullptr;
@@ -451,6 +460,9 @@
 
 Status Spatializer::setScreenSensor(int sensorHandle) {
     ALOGV("%s sensorHandle %d", __func__, sensorHandle);
+    if (!mSupportsHeadTracking) {
+        return binderStatusFromStatusT(INVALID_OPERATION);
+    }
     std::lock_guard lock(mLock);
     if (sensorHandle == ASENSOR_INVALID) {
         mScreenSensor = nullptr;
@@ -465,6 +477,9 @@
 
 Status Spatializer::setDisplayOrientation(float physicalToLogicalAngle) {
     ALOGV("%s physicalToLogicalAngle %f", __func__, physicalToLogicalAngle);
+    if (!mSupportsHeadTracking) {
+        return binderStatusFromStatusT(INVALID_OPERATION);
+    }
     std::lock_guard lock(mLock);
     mDisplayOrientation = physicalToLogicalAngle;
     if (mPoseController != nullptr) {
@@ -494,6 +509,9 @@
 // SpatializerPoseController::Listener
 void Spatializer::onHeadToStagePose(const Pose3f& headToStage) {
     ALOGV("%s", __func__);
+    LOG_ALWAYS_FATAL_IF(!mSupportsHeadTracking,
+            "onHeadToStagePose() called with no head tracking support!");
+
     auto vec = headToStage.toVector();
     LOG_ALWAYS_FATAL_IF(vec.size() != sHeadPoseKeys.size(),
             "%s invalid head to stage vector size %zu", __func__, vec.size());
@@ -610,18 +628,22 @@
         mEngine->setEnabled(true);
         mOutput = output;
 
-        mPoseController = std::make_shared<SpatializerPoseController>(
-                static_cast<SpatializerPoseController::Listener*>(this), 10ms, 50ms);
-        LOG_ALWAYS_FATAL_IF(mPoseController == nullptr,
-                            "%s could not allocate pose controller", __func__);
+        if (mSupportsHeadTracking) {
+            mPoseController = std::make_shared<SpatializerPoseController>(
+                    static_cast<SpatializerPoseController::Listener*>(this), 10ms, 50ms);
+            LOG_ALWAYS_FATAL_IF(mPoseController == nullptr,
+                                "%s could not allocate pose controller", __func__);
 
-        mPoseController->setDesiredMode(mDesiredHeadTrackingMode);
-        mPoseController->setHeadSensor(mHeadSensor);
-        mPoseController->setScreenSensor(mScreenSensor);
-        mPoseController->setDisplayOrientation(mDisplayOrientation);
-        poseController = mPoseController;
+            mPoseController->setDesiredMode(mDesiredHeadTrackingMode);
+            mPoseController->setHeadSensor(mHeadSensor);
+            mPoseController->setScreenSensor(mScreenSensor);
+            mPoseController->setDisplayOrientation(mDisplayOrientation);
+            poseController = mPoseController;
+        }
     }
-    poseController->waitUntilCalculated();
+    if (poseController != nullptr) {
+        poseController->waitUntilCalculated();
+    }
     return NO_ERROR;
 }