diff options
| -rw-r--r-- | services/core/java/com/android/server/audio/SpatializerHelper.java | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java index 04fcda7835fa..122a950e4fd3 100644 --- a/services/core/java/com/android/server/audio/SpatializerHelper.java +++ b/services/core/java/com/android/server/audio/SpatializerHelper.java @@ -242,15 +242,19 @@ public class SpatializerHelper { mSACapableDeviceTypes.add(SPAT_MODE_FOR_DEVICE_TYPE.keyAt(i)); } } + // for both transaural / binaural, we are not forcing enablement as the init() method + // could have been called another time after boot in case of audioserver restart if (mTransauralSupported) { // TODO deal with persisted values - mSADevices.add( - new SADeviceState(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, null)); + addCompatibleAudioDevice( + new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_SPEAKER, ""), + false /*forceEnable*/); } if (mBinauralSupported) { // TODO deal with persisted values - mSADevices.add( - new SADeviceState(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, null)); + addCompatibleAudioDevice( + new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, ""), + false /*forceEnable*/); } // TODO read persisted states } catch (RemoteException e) { @@ -461,6 +465,20 @@ public class SpatializerHelper { } synchronized void addCompatibleAudioDevice(@NonNull AudioDeviceAttributes ada) { + addCompatibleAudioDevice(ada, true /*forceEnable*/); + } + + /** + * Add the given device to the list of devices for which spatial audio will be available + * (== possible). + * @param ada the compatible device + * @param forceEnable if true, spatial audio is enabled for this device, regardless of whether + * this device was already in the list. If false, the enabled field is only + * set to true if the device is added to the list, otherwise, if already + * present, the setting is left untouched. + */ + private void addCompatibleAudioDevice(@NonNull AudioDeviceAttributes ada, + boolean forceEnable) { loglogi("addCompatibleAudioDevice: dev=" + ada); final int deviceType = ada.getType(); final boolean wireless = isWireless(deviceType); @@ -471,7 +489,9 @@ public class SpatializerHelper { && (wireless && ada.getAddress().equals(deviceState.mDeviceAddress)) || !wireless) { isInList = true; - deviceState.mEnabled = true; + if (forceEnable) { + deviceState.mEnabled = true; + } break; } } @@ -508,7 +528,7 @@ public class SpatializerHelper { private synchronized Pair<Boolean, Boolean> evaluateState(AudioDeviceAttributes ada) { // if not a wireless device, this value will be overwritten to map the type // to TYPE_BUILTIN_SPEAKER or TYPE_WIRED_HEADPHONES - int deviceType = ada.getType(); + @AudioDeviceInfo.AudioDeviceType int deviceType = ada.getType(); final boolean wireless = isWireless(deviceType); // if not a wireless device: find if media device is in the speaker, wired headphones @@ -1468,13 +1488,13 @@ public class SpatializerHelper { } private static final class SADeviceState { - final int mDeviceType; + final @AudioDeviceInfo.AudioDeviceType int mDeviceType; final @Nullable String mDeviceAddress; // non-null for wireless devices boolean mEnabled = true; // by default, SA is enabled on any device boolean mHasHeadTracker = false; boolean mHeadTrackerEnabled = true; // by default, if head tracker is present, use it - SADeviceState(int deviceType, @Nullable String address) { + SADeviceState(@AudioDeviceInfo.AudioDeviceType int deviceType, @Nullable String address) { mDeviceType = deviceType; mDeviceAddress = address; } @@ -1505,7 +1525,7 @@ public class SpatializerHelper { } } - private static boolean isWireless(int deviceType) { + private static boolean isWireless(@AudioDeviceInfo.AudioDeviceType int deviceType) { for (int type : WIRELESS_TYPES) { if (type == deviceType) { return true; @@ -1514,7 +1534,7 @@ public class SpatializerHelper { return false; } - private static boolean isWirelessSpeaker(int deviceType) { + private static boolean isWirelessSpeaker(@AudioDeviceInfo.AudioDeviceType int deviceType) { for (int type : WIRELESS_SPEAKER_TYPES) { if (type == deviceType) { return true; |