Better support for head and screen sensors being the same one
This is not a super interesting use-case, but for completeness we
should make sure it is handled correctly.
From the Sensor Framework standpoint, a sensor can only be enabled
once at a given time. We mirror this behavior in SensorPoseProvider
and document it well.
At the SpatializerPoseController layer we make sure that we don't
enable a sensor more than once and that if both sensors are the same
that we treat an event as applying to both.
Test: manual verification of this mode.
Bug: 188502620
Change-Id: I3aa1f225d7100c5d934af9255484caec75375380
diff --git a/services/audiopolicy/service/SpatializerPoseController.cpp b/services/audiopolicy/service/SpatializerPoseController.cpp
index 7e91d76..3d79c9d 100644
--- a/services/audiopolicy/service/SpatializerPoseController.cpp
+++ b/services/audiopolicy/service/SpatializerPoseController.cpp
@@ -117,25 +117,45 @@
void SpatializerPoseController::setHeadSensor(const ASensor* sensor) {
std::lock_guard lock(mMutex);
- // Stop current sensor, if valid.
- if (mHeadSensor != SensorPoseProvider::INVALID_HANDLE) {
+ // Stop current sensor, if valid and different from the other sensor.
+ if (mHeadSensor != SensorPoseProvider::INVALID_HANDLE && mHeadSensor != mScreenSensor) {
mPoseProvider->stopSensor(mHeadSensor);
}
- // Start new sensor, if valid.
- mHeadSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
- : SensorPoseProvider::INVALID_HANDLE;
+
+ if (sensor != nullptr) {
+ if (ASensor_getHandle(sensor) != mScreenSensor) {
+ // Start new sensor.
+ mHeadSensor = mPoseProvider->startSensor(sensor, mSensorPeriod);
+ } else {
+ // Sensor is already enabled.
+ mHeadSensor = mScreenSensor;
+ }
+ } else {
+ mHeadSensor = SensorPoseProvider::INVALID_HANDLE;
+ }
+
mProcessor->recenter(true, false);
}
void SpatializerPoseController::setScreenSensor(const ASensor* sensor) {
std::lock_guard lock(mMutex);
- // Stop current sensor, if valid.
- if (mScreenSensor != SensorPoseProvider::INVALID_HANDLE) {
+ // Stop current sensor, if valid and different from the other sensor.
+ if (mScreenSensor != SensorPoseProvider::INVALID_HANDLE && mScreenSensor != mHeadSensor) {
mPoseProvider->stopSensor(mScreenSensor);
}
- // Start new sensor, if valid.
- mScreenSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
- : SensorPoseProvider::INVALID_HANDLE;
+
+ if (sensor != nullptr) {
+ if (ASensor_getHandle(sensor) != mHeadSensor) {
+ // Start new sensor.
+ mScreenSensor = mPoseProvider->startSensor(sensor, mSensorPeriod);
+ } else {
+ // Sensor is already enabled.
+ mScreenSensor = mHeadSensor;
+ }
+ } else {
+ mScreenSensor = SensorPoseProvider::INVALID_HANDLE;
+ }
+
mProcessor->recenter(false, true);
}
@@ -188,7 +208,8 @@
std::lock_guard lock(mMutex);
if (sensor == mHeadSensor) {
mProcessor->setWorldToHeadPose(timestamp, pose, twist.value_or(Twist3f()));
- } else if (sensor == mScreenSensor) {
+ }
+ if (sensor == mScreenSensor) {
mProcessor->setWorldToScreenPose(timestamp, pose);
}
}