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

Commit 6121d0f2 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Ytai Ben-Tsvi
Browse files

AudioService: SpatializerHelper initializes head tracker

Use dynamic sensor callback to initialize head tracker.
Make all sensor initialization go through the onInitSensor() code
path.

Bug: 205187183
Test: TBA based on head tracker availability
Change-Id: I29f4f8681d185930b1675b227e75166c4110ac5d
parent 7c1c6a69
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -7587,7 +7587,7 @@ public class AudioService extends IAudioService.Stub
                    break;

                case MSG_INIT_HEADTRACKING_SENSORS:
                    mSpatializerHelper.onInitSensors(/*init*/ msg.arg1 == 1);
                    mSpatializerHelper.onInitSensors();
                    break;

                case MSG_CHECK_MUSIC_ACTIVE:
@@ -8521,14 +8521,13 @@ public class AudioService extends IAudioService.Stub

    /**
     * post a message to schedule init/release of head tracking sensors
     * @param init initialization if true, release if false
     * whether to initialize or release sensors is based on the state of spatializer
     */
    void postInitSpatializerHeadTrackingSensors(boolean init) {
    void postInitSpatializerHeadTrackingSensors() {
        sendMsg(mAudioHandler,
                MSG_INIT_HEADTRACKING_SENSORS,
                SENDMSG_REPLACE,
                /*arg1*/ init ? 1 : 0,
                0, TAG, /*delay*/ 0);
                /*arg1*/ 0, /*arg2*/ 0, TAG, /*delay*/ 0);
    }

    //==========================================================================================
+74 −45
Original line number Diff line number Diff line
@@ -63,6 +63,14 @@ public class SpatializerHelper {
    private @Nullable SensorManager mSensorManager;

    //------------------------------------------------------------
    /** head tracker sensor name */
    // TODO: replace with generic head tracker sensor name.
    //       the current implementation refers to the "google" namespace but will be replaced
    //       by an android name at the next API level revision, it is not Google-specific.
    //       Also see "TODO-HT" in onInitSensors() method
    private static final String HEADTRACKER_SENSOR =
            "com.google.hardware.sensor.hid_dynamic.headtracker";

    // Spatializer state machine
    private static final int STATE_UNINITIALIZED = 0;
    private static final int STATE_NOT_SUPPORTED = 1;
@@ -81,7 +89,7 @@ public class SpatializerHelper {
    private @Nullable ISpatializer mSpat;
    private @Nullable SpatializerCallback mSpatCallback;
    private @Nullable SpatializerHeadTrackingCallback mSpatHeadTrackingCallback;

    private @Nullable HelperDynamicSensorCallback mDynSensorCallback;

    // default attributes and format that determine basic availability of spatialization
    private static final AudioAttributes DEFAULT_ATTRIBUTES = new AudioAttributes.Builder()
@@ -209,11 +217,7 @@ public class SpatializerHelper {
            // TODO use reported spat level to change state

            // init sensors
            if (level == SpatializationLevel.NONE) {
                initSensors(/*init*/false);
            } else {
                postInitSensors(true);
            }
            postInitSensors();
        }

        public void onOutputChanged(int output) {
@@ -229,6 +233,7 @@ public class SpatializerHelper {
        }
    };

    //------------------------------------------------------
    // spatializer head tracking callback from native
    private final class SpatializerHeadTrackingCallback
            extends ISpatializerHeadTrackingCallback.Stub {
@@ -268,6 +273,20 @@ public class SpatializerHelper {
        }
    };

    //------------------------------------------------------
    // dynamic sensor callback
    private final class HelperDynamicSensorCallback extends SensorManager.DynamicSensorCallback {
        @Override
        public void onDynamicSensorConnected(Sensor sensor) {
            postInitSensors();
        }

        @Override
        public void onDynamicSensorDisconnected(Sensor sensor) {
            postInitSensors();
        }
    }

    //------------------------------------------------------
    // compatible devices
    /**
@@ -851,28 +870,60 @@ public class SpatializerHelper {

    //------------------------------------------------------
    // sensors
    private void initSensors(boolean init) {
        if (mSensorManager == null) {
            mSensorManager = (SensorManager)
                    mAudioService.mContext.getSystemService(Context.SENSOR_SERVICE);
    private void postInitSensors() {
        mAudioService.postInitSpatializerHeadTrackingSensors();
    }

    synchronized void onInitSensors() {
        final boolean init = (mSpatLevel != SpatializationLevel.NONE);
        final String action = init ? "initializing" : "releasing";
        if (mSpat == null) {
            Log.e(TAG, "not " + action + " sensors, null spatializer");
            return;
        }
        try {
            if (!mSpat.isHeadTrackingSupported()) {
                Log.e(TAG, "not " + action + " sensors, spatializer doesn't support headtracking");
                return;
            }
        } catch (RemoteException e) {
            Log.e(TAG, "not " + action + " sensors, error querying headtracking", e);
            return;
        }
        final int headHandle;
        final int screenHandle;
        int headHandle = -1;
        int screenHandle = -1;
        if (init) {
            if (mSensorManager == null) {
                Log.e(TAG, "Null SensorManager, can't init sensors");
                try {
                    mSensorManager = (SensorManager)
                            mAudioService.mContext.getSystemService(Context.SENSOR_SERVICE);
                    mDynSensorCallback = new HelperDynamicSensorCallback();
                    mSensorManager.registerDynamicSensorCallback(mDynSensorCallback);
                } catch (Exception e) {
                    Log.e(TAG, "Error with SensorManager, can't initialize sensors", e);
                    mSensorManager = null;
                    mDynSensorCallback = null;
                    return;
                }
            // TODO replace with dynamic association of sensor for headtracker
            Sensor headSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
            headHandle = headSensor.getHandle();
            //Sensor screenSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
            //screenHandle = deviceSensor.getHandle();
            screenHandle = -1;
            }
            // initialize sensor handles
            // TODO-HT update to non-private sensor once head tracker sensor is defined
            for (Sensor sensor : mSensorManager.getDynamicSensorList(
                    Sensor.TYPE_DEVICE_PRIVATE_BASE)) {
                if (sensor.getStringType().equals(HEADTRACKER_SENSOR)) {
                    headHandle = sensor.getHandle();
                    break;
                }
            }
            Sensor screenSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
            screenHandle = screenSensor.getHandle();
        } else {
            // -1 is disable value
            screenHandle = -1;
            headHandle = -1;
            if (mSensorManager != null && mDynSensorCallback != null) {
                mSensorManager.unregisterDynamicSensorCallback(mDynSensorCallback);
                mSensorManager = null;
                mDynSensorCallback = null;
            }
            // -1 is disable value for both screen and head tracker handles
        }
        try {
            Log.i(TAG, "setScreenSensor:" + screenHandle);
@@ -888,28 +939,6 @@ public class SpatializerHelper {
        }
    }

    private void postInitSensors(boolean init) {
        mAudioService.postInitSpatializerHeadTrackingSensors(init);
    }

    synchronized void onInitSensors(boolean init) {
        final String action = init ? "initializing" : "releasing";
        if (mSpat == null) {
            Log.e(TAG, "not " + action + " sensors, null spatializer");
            return;
        }
        try {
            if (!mSpat.isHeadTrackingSupported()) {
                Log.e(TAG, "not " + action + " sensors, spatializer doesn't support headtracking");
                return;
            }
        } catch (RemoteException e) {
            Log.e(TAG, "not " + action + " sensors, error querying headtracking", e);
            return;
        }
        initSensors(init);
    }

    //------------------------------------------------------
    // SDK <-> AIDL converters
    private static int headTrackingModeTypeToSpatializerInt(byte mode) {