From 3fb608e4f38df2781461ee601156258c90b6c472 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Thu, 3 Nov 2016 16:27:40 -0700 Subject: [PATCH] AudioService: fix mismatch in device volume index for alias streams Fix VolumeStreamState.setIndex() to force device volume index update on an alias stream when no specific device volume exists on the VolumeStreamState of this alias stream. This prevents asymetric behaviors of setDeviceVolume() and setAllVolumes() causing some stream types to be muted and not unmuted if no specific device volume index exist. Test: make Test: wipe device, setup wizard, place call and check nofication volume Bug: 32626244 Change-Id: Idd170aa9f295b0a9533a589e1891a04c05ab2f2f --- .../android/server/audio/AudioService.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 0f351f62d991d..cfa97d607e1ae 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4046,21 +4046,23 @@ public class AudioService extends IAudioService.Stub { mIndexMap.put(device, index); changed = oldIndex != index; - if (changed) { - // Apply change to all streams using this one as alias - // if changing volume of current device, also change volume of current - // device on aliased stream - boolean currentDevice = (device == getDeviceForStream(mStreamType)); - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != mStreamType && - mStreamVolumeAlias[streamType] == mStreamType) { - int scaledIndex = rescaleIndex(index, mStreamType, streamType); - mStreamStates[streamType].setIndex(scaledIndex, device, caller); - if (currentDevice) { - mStreamStates[streamType].setIndex(scaledIndex, - getDeviceForStream(streamType), caller); - } + // Apply change to all streams using this one as alias if: + // - the index actually changed OR + // - there is no volume index stored for this device on alias stream. + // If changing volume of current device, also change volume of current + // device on aliased stream + final boolean currentDevice = (device == getDeviceForStream(mStreamType)); + final int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + final VolumeStreamState aliasStreamState = mStreamStates[streamType]; + if (streamType != mStreamType && + mStreamVolumeAlias[streamType] == mStreamType && + (changed || !aliasStreamState.hasIndexForDevice(device))) { + final int scaledIndex = rescaleIndex(index, mStreamType, streamType); + aliasStreamState.setIndex(scaledIndex, device, caller); + if (currentDevice) { + aliasStreamState.setIndex(scaledIndex, + getDeviceForStream(streamType), caller); } } } @@ -4097,6 +4099,12 @@ public class AudioService extends IAudioService.Stub { } } + public boolean hasIndexForDevice(int device) { + synchronized (VolumeStreamState.class) { + return (mIndexMap.get(device, -1) != -1); + } + } + public int getMaxIndex() { return mIndexMax; }