diff options
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 9 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/SpatializerHelper.java | 119 |
2 files changed, 78 insertions, 50 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 655278657b83..d4c9b4865bd5 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -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); } //========================================================================================== diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java index 7cd027c7550f..6a26bea6f8f0 100644 --- a/services/core/java/com/android/server/audio/SpatializerHelper.java +++ b/services/core/java/com/android/server/audio/SpatializerHelper.java @@ -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 { @@ -269,6 +274,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 /** * @return a shallow copy of the list of compatible audio 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; } - final int headHandle; - final int screenHandle; + 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; + } + int headHandle = -1; + int screenHandle = -1; if (init) { if (mSensorManager == null) { - Log.e(TAG, "Null SensorManager, can't init sensors"); - return; + 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) { |