diff options
| author | 2024-10-23 22:29:34 +0000 | |
|---|---|---|
| committer | 2024-10-23 22:30:23 +0000 | |
| commit | 30a43a512f7b3980347b1ea0ac020e6ab8c30645 (patch) | |
| tree | 4b39dac310398b83b6456e0650614bee8d0ee93c | |
| parent | 2ad89bfb27c9b4058ab612d7ed3778c4fc881c8a (diff) | |
Synchronize calls to mAbsoluteDeviceInfoMap
Flag: EXEMPT bugfix
Test: manual test
Bug: 347423032
Bug: 375065861
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:114f113db70159895edbfc9e131fa36974f015c8)
Merged-In: Ib900153cec1f5800f4aa2a77151d5b4d96d2460c
Change-Id: Ib900153cec1f5800f4aa2a77151d5b4d96d2460c
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index b0590fe70232..2d3b7f399fec 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -787,9 +787,11 @@ public class AudioService extends IAudioService.Stub AudioSystem.DEVICE_OUT_HDMI_EARC )); + private final Object mAbsoluteVolumeDeviceInfoMapLock = new Object(); // Devices where the framework sends a full scale audio signal, and controls the volume of // the external audio system separately. // For possible volume behaviors, see {@link AudioManager.AbsoluteDeviceVolumeBehavior}. + @GuardedBy("mAbsoluteVolumeDeviceInfoMapLock") Map<Integer, AbsoluteVolumeDeviceInfo> mAbsoluteVolumeDeviceInfoMap = new ArrayMap<>(); /** @@ -3729,9 +3731,8 @@ public class AudioService extends IAudioService.Stub int oldIndex = mStreamStates[streamType].getIndex(device); // Check if the volume adjustment should be handled by an absolute volume controller instead - if (isAbsoluteVolumeDevice(device) - && (flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0) { - AbsoluteVolumeDeviceInfo info = mAbsoluteVolumeDeviceInfoMap.get(device); + if (isAbsoluteVolumeDevice(device) && (flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0) { + final AbsoluteVolumeDeviceInfo info = getAbsoluteVolumeDeviceInfo(device); if (info.mHandlesVolumeAdjustment) { dispatchAbsoluteVolumeAdjusted(streamType, info, oldIndex, direction, keyEventMode); @@ -3798,7 +3799,7 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(newIndex / 10); } else if (isAbsoluteVolumeDevice(device) && (flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0) { - AbsoluteVolumeDeviceInfo info = mAbsoluteVolumeDeviceInfoMap.get(device); + final AbsoluteVolumeDeviceInfo info = getAbsoluteVolumeDeviceInfo(device); dispatchAbsoluteVolumeChanged(streamType, info, newIndex); } @@ -4801,7 +4802,7 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(index / 10); } else if (isAbsoluteVolumeDevice(device) && ((flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0)) { - AbsoluteVolumeDeviceInfo info = mAbsoluteVolumeDeviceInfoMap.get(device); + final AbsoluteVolumeDeviceInfo info = getAbsoluteVolumeDeviceInfo(device); dispatchAbsoluteVolumeChanged(streamType, info, index); } @@ -7603,7 +7604,8 @@ public class AudioService extends IAudioService.Stub if (register) { AbsoluteVolumeDeviceInfo info = new AbsoluteVolumeDeviceInfo( device, volumes, cb, handlesVolumeAdjustment, deviceVolumeBehavior); - AbsoluteVolumeDeviceInfo oldInfo = mAbsoluteVolumeDeviceInfoMap.get(deviceOut); + final AbsoluteVolumeDeviceInfo oldInfo = getAbsoluteVolumeDeviceInfo(deviceOut); + boolean volumeBehaviorChanged = (oldInfo == null) || (oldInfo.mDeviceVolumeBehavior != deviceVolumeBehavior); if (volumeBehaviorChanged) { @@ -7763,8 +7765,10 @@ public class AudioService extends IAudioService.Stub if (mAbsVolumeMultiModeCaseDevices.contains(audioSystemDeviceOut)) { return AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE; } - if (mAbsoluteVolumeDeviceInfoMap.containsKey(audioSystemDeviceOut)) { - return mAbsoluteVolumeDeviceInfoMap.get(audioSystemDeviceOut).mDeviceVolumeBehavior; + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + if (mAbsoluteVolumeDeviceInfoMap.containsKey(audioSystemDeviceOut)) { + return mAbsoluteVolumeDeviceInfoMap.get(audioSystemDeviceOut).mDeviceVolumeBehavior; + } } if (isA2dpAbsoluteVolumeDevice(audioSystemDeviceOut) @@ -11806,10 +11810,12 @@ public class AudioService extends IAudioService.Stub } private Set<Integer> getAbsoluteVolumeDevicesWithBehavior(int behavior) { - return mAbsoluteVolumeDeviceInfoMap.entrySet().stream() - .filter(entry -> entry.getValue().mDeviceVolumeBehavior == behavior) - .map(Map.Entry::getKey) - .collect(Collectors.toSet()); + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.entrySet().stream() + .filter(entry -> entry.getValue().mDeviceVolumeBehavior == behavior) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + } } private String dumpDeviceTypes(@NonNull Set<Integer> deviceTypes) { @@ -14302,14 +14308,26 @@ public class AudioService extends IAudioService.Stub } /** + * Returns the input device which uses absolute volume behavior, including its variants, + * or {@code null} if there is no mapping for the device type + */ + @Nullable + private AbsoluteVolumeDeviceInfo getAbsoluteVolumeDeviceInfo(int deviceType) { + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.get(deviceType); + } + } + + /** * Returns whether the input device uses absolute volume behavior, including its variants. * For included volume behaviors, see {@link AudioManager.AbsoluteDeviceVolumeBehavior}. - * - * This is distinct from Bluetooth A2DP absolute volume behavior + * <p>This is distinct from Bluetooth A2DP absolute volume behavior * ({@link #isA2dpAbsoluteVolumeDevice}). */ private boolean isAbsoluteVolumeDevice(int deviceType) { - return mAbsoluteVolumeDeviceInfoMap.containsKey(deviceType); + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.containsKey(deviceType); + } } /** @@ -14421,7 +14439,9 @@ public class AudioService extends IAudioService.Stub + AudioDeviceVolumeManager.volumeBehaviorName(info.mDeviceVolumeBehavior) ); } - mAbsoluteVolumeDeviceInfoMap.put(audioSystemDeviceOut, info); + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + mAbsoluteVolumeDeviceInfoMap.put(audioSystemDeviceOut, info); + } } private AbsoluteVolumeDeviceInfo removeAudioSystemDeviceOutFromAbsVolumeDevices( @@ -14430,7 +14450,10 @@ public class AudioService extends IAudioService.Stub Log.d(TAG, "Removing DeviceType: 0x" + Integer.toHexString(audioSystemDeviceOut) + " from mAbsoluteVolumeDeviceInfoMap"); } - return mAbsoluteVolumeDeviceInfoMap.remove(audioSystemDeviceOut); + + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.remove(audioSystemDeviceOut); + } } //==================== |