diff options
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioDeviceBroker.java | 71 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioDeviceInventory.java | 139 |
2 files changed, 72 insertions, 138 deletions
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 2bbe08d22020..875041540f40 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -1564,38 +1564,6 @@ public class AudioDeviceBroker { sendLMsgNoDelay(MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED, SENDMSG_QUEUE, client); } - /*package*/ void postSaveSetPreferredDevicesForStrategy(int strategy, - List<AudioDeviceAttributes> devices) - { - sendILMsgNoDelay(MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy, devices); - } - - /*package*/ void postSaveRemovePreferredDevicesForStrategy(int strategy) { - sendIMsgNoDelay(MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy); - } - - /*package*/ void postSaveSetDeviceAsNonDefaultForStrategy( - int strategy, AudioDeviceAttributes device) { - sendILMsgNoDelay(MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy, device); - } - - /*package*/ void postSaveRemoveDeviceAsNonDefaultForStrategy( - int strategy, AudioDeviceAttributes device) { - sendILMsgNoDelay( - MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy, device); - } - - /*package*/ void postSaveSetPreferredDevicesForCapturePreset( - int capturePreset, List<AudioDeviceAttributes> devices) { - sendILMsgNoDelay( - MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset, devices); - } - - /*package*/ void postSaveClearPreferredDevicesForCapturePreset(int capturePreset) { - sendIMsgNoDelay( - MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset); - } - /*package*/ void postUpdateCommunicationRouteClient( int btScoRequesterUid, String eventSource) { sendILMsgNoDelay(MSG_IL_UPDATE_COMMUNICATION_ROUTE_CLIENT, SENDMSG_QUEUE, @@ -2112,40 +2080,9 @@ public class AudioDeviceBroker { mDeviceInventory.setBluetoothActiveDevice(btInfo); } } break; - case MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY: { - final int strategy = msg.arg1; - final List<AudioDeviceAttributes> devices = - (List<AudioDeviceAttributes>) msg.obj; - mDeviceInventory.onSaveSetPreferredDevices(strategy, devices); - } break; - case MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY: { - final int strategy = msg.arg1; - mDeviceInventory.onSaveRemovePreferredDevices(strategy); - } break; - case MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY: { - final int strategy = msg.arg1; - final AudioDeviceAttributes device = (AudioDeviceAttributes) msg.obj; - mDeviceInventory.onSaveSetDeviceAsNonDefault(strategy, device); - } break; - case MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY: { - final int strategy = msg.arg1; - final AudioDeviceAttributes device = (AudioDeviceAttributes) msg.obj; - mDeviceInventory.onSaveRemoveDeviceAsNonDefault(strategy, device); - } break; case MSG_CHECK_MUTE_MUSIC: checkMessagesMuteMusic(0); break; - case MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET: { - final int capturePreset = msg.arg1; - final List<AudioDeviceAttributes> devices = - (List<AudioDeviceAttributes>) msg.obj; - mDeviceInventory.onSaveSetPreferredDevicesForCapturePreset( - capturePreset, devices); - } break; - case MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET: { - final int capturePreset = msg.arg1; - mDeviceInventory.onSaveClearPreferredDevicesForCapturePreset(capturePreset); - } break; case MSG_L_NOTIFY_PREFERRED_AUDIOPROFILE_APPLIED: { final BluetoothDevice btDevice = (BluetoothDevice) msg.obj; BtHelper.onNotifyPreferredAudioProfileApplied(btDevice); @@ -2238,16 +2175,10 @@ public class AudioDeviceBroker { // process external command to (dis)connect a hearing aid device private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 31; - private static final int MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY = 32; - private static final int MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY = 33; - private static final int MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED = 34; private static final int MSG_CHECK_MUTE_MUSIC = 35; private static final int MSG_REPORT_NEW_ROUTES_A2DP = 36; - private static final int MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET = 37; - private static final int MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET = 38; - private static final int MSG_L_SET_COMMUNICATION_DEVICE_FOR_CLIENT = 42; private static final int MSG_IL_UPDATE_COMMUNICATION_ROUTE_CLIENT = 43; @@ -2256,8 +2187,6 @@ public class AudioDeviceBroker { // process set volume for Le Audio, obj is BleVolumeInfo private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; - private static final int MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY = 47; - private static final int MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY = 48; private static final int MSG_IIL_BTLEAUDIO_TIMEOUT = 49; private static final int MSG_L_NOTIFY_PREFERRED_AUDIOPROFILE_APPLIED = 52; diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index a9bff8bf4bc3..5fd12c29d2f8 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -548,14 +548,17 @@ public class AudioDeviceInventory { @GuardedBy("mDevicesLock") private final ArrayMap<Integer, String> mApmConnectedDevices = new ArrayMap<>(); + @GuardedBy("mDevicesLock") // List of preferred devices for strategies private final ArrayMap<Integer, List<AudioDeviceAttributes>> mPreferredDevices = new ArrayMap<>(); + @GuardedBy("mDevicesLock") // List of non-default devices for strategies private final ArrayMap<Integer, List<AudioDeviceAttributes>> mNonDefaultDevices = new ArrayMap<>(); + @GuardedBy("mDevicesLock") // List of preferred devices of capture preset private final ArrayMap<Integer, List<AudioDeviceAttributes>> mPreferredDevicesForCapturePreset = new ArrayMap<>(); @@ -808,24 +811,18 @@ public class AudioDeviceInventory { synchronized (mDevicesLock) { mAppliedStrategyRoles.clear(); mAppliedPresetRoles.clear(); - } - synchronized (mPreferredDevices) { mPreferredDevices.forEach((strategy, devices) -> { setPreferredDevicesForStrategy(strategy, devices); }); - } - synchronized (mNonDefaultDevices) { mNonDefaultDevices.forEach((strategy, devices) -> { addDevicesRoleForStrategy(strategy, AudioSystem.DEVICE_ROLE_DISABLED, devices, false /* internal */); }); - } - synchronized (mPreferredDevicesForCapturePreset) { mPreferredDevicesForCapturePreset.forEach((capturePreset, devices) -> { setDevicesRoleForCapturePreset( capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices); }); - } + } } /** only public for mocking/spying, do not call outside of AudioService */ @@ -1225,7 +1222,8 @@ public class AudioDeviceInventory { mmi.record(); } - /*package*/ void onSaveSetPreferredDevices(int strategy, + @GuardedBy("mDevicesLock") + private void saveSetPreferredDevices(int strategy, @NonNull List<AudioDeviceAttributes> devices) { mPreferredDevices.put(strategy, devices); List<AudioDeviceAttributes> nonDefaultDevices = mNonDefaultDevices.get(strategy); @@ -1243,12 +1241,14 @@ public class AudioDeviceInventory { dispatchPreferredDevice(strategy, devices); } - /*package*/ void onSaveRemovePreferredDevices(int strategy) { + @GuardedBy("mDevicesLock") + private void saveRemovePreferredDevices(int strategy) { mPreferredDevices.remove(strategy); dispatchPreferredDevice(strategy, new ArrayList<AudioDeviceAttributes>()); } - /*package*/ void onSaveSetDeviceAsNonDefault(int strategy, + @GuardedBy("mDevicesLock") + private void saveSetDeviceAsNonDefault(int strategy, @NonNull AudioDeviceAttributes device) { List<AudioDeviceAttributes> nonDefaultDevices = mNonDefaultDevices.get(strategy); if (nonDefaultDevices == null) { @@ -1272,7 +1272,8 @@ public class AudioDeviceInventory { } } - /*package*/ void onSaveRemoveDeviceAsNonDefault(int strategy, + @GuardedBy("mDevicesLock") + private void saveRemoveDeviceAsNonDefault(int strategy, @NonNull AudioDeviceAttributes device) { List<AudioDeviceAttributes> nonDefaultDevices = mNonDefaultDevices.get(strategy); if (nonDefaultDevices != null) { @@ -1282,14 +1283,16 @@ public class AudioDeviceInventory { } } - /*package*/ void onSaveSetPreferredDevicesForCapturePreset( + @GuardedBy("mDevicesLock") + private void saveSetPreferredDevicesForCapturePreset( int capturePreset, @NonNull List<AudioDeviceAttributes> devices) { mPreferredDevicesForCapturePreset.put(capturePreset, devices); dispatchDevicesRoleForCapturePreset( capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices); } - /*package*/ void onSaveClearPreferredDevicesForCapturePreset(int capturePreset) { + @GuardedBy("mDevicesLock") + private void saveClearPreferredDevicesForCapturePreset(int capturePreset) { mPreferredDevicesForCapturePreset.remove(capturePreset); dispatchDevicesRoleForCapturePreset( capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, @@ -1301,21 +1304,22 @@ public class AudioDeviceInventory { /*package*/ int setPreferredDevicesForStrategyAndSave(int strategy, @NonNull List<AudioDeviceAttributes> devices) { - final int status = setPreferredDevicesForStrategy(strategy, devices); - if (status == AudioSystem.SUCCESS) { - mDeviceBroker.postSaveSetPreferredDevicesForStrategy(strategy, devices); + synchronized(mDevicesLock){ + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + final int status = setPreferredDevicesForStrategy(strategy, devices); + if (status == AudioSystem.SUCCESS) { + saveSetPreferredDevices(strategy, devices); + } + return status; + } } - return status; } // Only used for external requests coming from an API /*package*/ int setPreferredDevicesForStrategy(int strategy, @NonNull List<AudioDeviceAttributes> devices) { - int status = AudioSystem.ERROR; - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - status = setDevicesRoleForStrategy( - strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices, false /* internal */); - } - return status; + + return setDevicesRoleForStrategy( + strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices, false /* internal */); } // Only used for internal requests /*package*/ int setPreferredDevicesForStrategyInt(int strategy, @@ -1326,21 +1330,21 @@ public class AudioDeviceInventory { } /*package*/ int removePreferredDevicesForStrategyAndSave(int strategy) { - final int status = removePreferredDevicesForStrategy(strategy); - if (status == AudioSystem.SUCCESS) { - mDeviceBroker.postSaveRemovePreferredDevicesForStrategy(strategy); + synchronized(mDevicesLock){ + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + final int status = removePreferredDevicesForStrategy(strategy); + if (status == AudioSystem.SUCCESS) { + saveRemovePreferredDevices(strategy); + } + return status; + } } - return status; } // Only used for external requests coming from an API /*package*/ int removePreferredDevicesForStrategy(int strategy) { - int status = AudioSystem.ERROR; - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - status = clearDevicesRoleForStrategy( + return clearDevicesRoleForStrategy( strategy, AudioSystem.DEVICE_ROLE_PREFERRED, false /*internal */); - } - return status; } // Only used for internal requests /*package*/ int removePreferredDevicesForStrategyInt(int strategy) { @@ -1351,16 +1355,17 @@ public class AudioDeviceInventory { /*package*/ int setDeviceAsNonDefaultForStrategyAndSave(int strategy, @NonNull AudioDeviceAttributes device) { int status = AudioSystem.ERROR; - - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - List<AudioDeviceAttributes> devices = new ArrayList<>(); - devices.add(device); - status = addDevicesRoleForStrategy( + synchronized(mDevicesLock){ + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + List<AudioDeviceAttributes> devices = new ArrayList<>(); + devices.add(device); + status = addDevicesRoleForStrategy( strategy, AudioSystem.DEVICE_ROLE_DISABLED, devices, false /* internal */); - } - if (status == AudioSystem.SUCCESS) { - mDeviceBroker.postSaveSetDeviceAsNonDefaultForStrategy(strategy, device); + if (status == AudioSystem.SUCCESS) { + saveSetDeviceAsNonDefault(strategy, device); + } + } } return status; } @@ -1368,16 +1373,17 @@ public class AudioDeviceInventory { /*package*/ int removeDeviceAsNonDefaultForStrategyAndSave(int strategy, @NonNull AudioDeviceAttributes device) { int status = AudioSystem.ERROR; - - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - List<AudioDeviceAttributes> devices = new ArrayList<>(); - devices.add(device); - status = removeDevicesRoleForStrategy( + synchronized(mDevicesLock){ + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + List<AudioDeviceAttributes> devices = new ArrayList<>(); + devices.add(device); + status = removeDevicesRoleForStrategy( strategy, AudioSystem.DEVICE_ROLE_DISABLED, devices, false /* internal */); - } - if (status == AudioSystem.SUCCESS) { - mDeviceBroker.postSaveRemoveDeviceAsNonDefaultForStrategy(strategy, device); + if (status == AudioSystem.SUCCESS) { + saveRemoveDeviceAsNonDefault(strategy, device); + } + } } return status; } @@ -1405,41 +1411,40 @@ public class AudioDeviceInventory { /*package*/ int setPreferredDevicesForCapturePresetAndSave( int capturePreset, @NonNull List<AudioDeviceAttributes> devices) { - final int status = setPreferredDevicesForCapturePreset(capturePreset, devices); - if (status == AudioSystem.SUCCESS) { - mDeviceBroker.postSaveSetPreferredDevicesForCapturePreset(capturePreset, devices); + synchronized(mDevicesLock){ + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + final int status = setPreferredDevicesForCapturePreset(capturePreset, devices); + if (status == AudioSystem.SUCCESS) { + saveSetPreferredDevicesForCapturePreset(capturePreset, devices); + } + return status; + } } - return status; } // Only used for external requests coming from an API private int setPreferredDevicesForCapturePreset( int capturePreset, @NonNull List<AudioDeviceAttributes> devices) { - int status = AudioSystem.ERROR; - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - status = setDevicesRoleForCapturePreset( + return setDevicesRoleForCapturePreset( capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices); - } - return status; } /*package*/ int clearPreferredDevicesForCapturePresetAndSave(int capturePreset) { - final int status = clearPreferredDevicesForCapturePreset(capturePreset); - if (status == AudioSystem.SUCCESS) { - mDeviceBroker.postSaveClearPreferredDevicesForCapturePreset(capturePreset); + synchronized(mDevicesLock){ + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + final int status = clearPreferredDevicesForCapturePreset(capturePreset); + if (status == AudioSystem.SUCCESS) { + saveClearPreferredDevicesForCapturePreset(capturePreset); + } + return status; + } } - return status; } // Only used for external requests coming from an API private int clearPreferredDevicesForCapturePreset(int capturePreset) { - int status = AudioSystem.ERROR; - - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - status = clearDevicesRoleForCapturePreset( + return clearDevicesRoleForCapturePreset( capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED); - } - return status; } // Only used for internal requests |