SpatializerHelper: fix setting desired head tracking mode

When the desired head tracking mode changes, do not compare against
current actual mode, as transient mode could be equal to the
desired mode. Instead always set the desired mode when the value
changes.
Also move head tracker / screen sensor init to dedicated methods
for code readability.

Bug: 225220771
Test: 5.1 playback with head tracker
Change-Id: I1147f6fa5c74a017c32edfe2ff19a578d6b38470
This commit is contained in:
Jean-Michel Trivi
2022-03-17 17:54:13 -07:00
parent 7105d4ac13
commit 1af0b37a86

View File

@@ -1024,9 +1024,9 @@ public class SpatializerHelper {
mDesiredHeadTrackingMode = mode;
dispatchDesiredHeadTrackingMode(mode);
}
if (mode != headTrackingModeTypeToSpatializerInt(mSpat.getActualHeadTrackingMode())) {
mSpat.setDesiredHeadTrackingMode(spatializerIntToHeadTrackingModeType(mode));
}
Log.i(TAG, "setDesiredHeadTrackingMode("
+ Spatializer.headtrackingModeToString(mode) + ")");
mSpat.setDesiredHeadTrackingMode(spatializerIntToHeadTrackingModeType(mode));
} catch (RemoteException e) {
Log.e(TAG, "Error calling setDesiredHeadTrackingMode", e);
}
@@ -1340,32 +1340,14 @@ public class SpatializerHelper {
}
}
// initialize sensor handles
UUID routingDeviceUuid = mAudioService.getDeviceSensorUuid(ROUTING_DEVICES[0]);
List<Sensor> sensors = new ArrayList<Sensor>(0);
sensors.addAll(mSensorManager.getDynamicSensorList(Sensor.TYPE_HEAD_TRACKER));
sensors.addAll(mSensorManager.getDynamicSensorList(Sensor.TYPE_DEVICE_PRIVATE_BASE));
for (Sensor sensor : sensors) {
if (sensor.getType() == Sensor.TYPE_HEAD_TRACKER
|| sensor.getStringType().equals(HEADTRACKER_SENSOR)) {
UUID uuid = sensor.getUuid();
if (uuid.equals(routingDeviceUuid)) {
headHandle = sensor.getHandle();
// TODO check risk of race condition:
// does this happen before routing is updated?
// avoid by supporting adding device here AND in onRoutingUpdated()
if (!setHasHeadTracker(ROUTING_DEVICES[0])) {
headHandle = -1;
}
break;
}
if (uuid.equals(UuidUtils.STANDALONE_UUID)) {
headHandle = sensor.getHandle();
}
}
}
Sensor screenSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
screenHandle = screenSensor.getHandle();
// TODO check risk of race condition for updating the association of a head tracker
// and an audio device:
// does this happen before routing is updated?
// avoid by supporting adding device here AND in onRoutingUpdated()
headHandle = getHeadSensorHandleUpdateTracker();
Log.i(TAG, "head tracker sensor handle initialized to " + headHandle);
screenHandle = getScreenSensorHandle();
Log.i(TAG, "found screen sensor handle initialized to " + screenHandle);
} else {
if (mSensorManager != null && mDynSensorCallback != null) {
mSensorManager.unregisterDynamicSensorCallback(mDynSensorCallback);
@@ -1498,4 +1480,39 @@ public class SpatializerHelper {
}
return false;
}
private int getHeadSensorHandleUpdateTracker() {
int headHandle = -1;
UUID routingDeviceUuid = mAudioService.getDeviceSensorUuid(ROUTING_DEVICES[0]);
List<Sensor> sensors = new ArrayList<Sensor>(0);
sensors.addAll(mSensorManager.getDynamicSensorList(Sensor.TYPE_HEAD_TRACKER));
sensors.addAll(mSensorManager.getDynamicSensorList(Sensor.TYPE_DEVICE_PRIVATE_BASE));
for (Sensor sensor : sensors) {
if (sensor.getType() == Sensor.TYPE_HEAD_TRACKER
|| sensor.getStringType().equals(HEADTRACKER_SENSOR)) {
UUID uuid = sensor.getUuid();
if (uuid.equals(routingDeviceUuid)) {
headHandle = sensor.getHandle();
if (!setHasHeadTracker(ROUTING_DEVICES[0])) {
headHandle = -1;
}
break;
}
if (uuid.equals(UuidUtils.STANDALONE_UUID)) {
headHandle = sensor.getHandle();
break;
}
}
}
return headHandle;
}
private int getScreenSensorHandle() {
int screenHandle = -1;
Sensor screenSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
if (screenSensor != null) {
screenHandle = screenSensor.getHandle();
}
return screenHandle;
}
}