Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1af0b37a authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

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
parent 7105d4ac
Loading
Loading
Loading
Loading
+46 −29
Original line number Diff line number Diff line
@@ -1024,9 +1024,9 @@ public class SpatializerHelper {
                mDesiredHeadTrackingMode = mode;
                dispatchDesiredHeadTrackingMode(mode);
            }
            if (mode != headTrackingModeTypeToSpatializerInt(mSpat.getActualHeadTrackingMode())) {
            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:
            // 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()
                        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();
            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;
    }
}