From 1af0b37a863d0829f0788a96ee8fb8883aca0c31 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Thu, 17 Mar 2022 17:54:13 -0700 Subject: [PATCH] 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 --- .../server/audio/SpatializerHelper.java | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java index f0f04e27b7de9..40a63504fb6bf 100644 --- a/services/core/java/com/android/server/audio/SpatializerHelper.java +++ b/services/core/java/com/android/server/audio/SpatializerHelper.java @@ -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 sensors = new ArrayList(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 sensors = new ArrayList(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; + } }