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
(cherry picked from commit 3fb608e4f3)
This commit is contained in:
@@ -4035,25 +4035,27 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
mIndexMap.put(device, index);
|
mIndexMap.put(device, index);
|
||||||
|
|
||||||
changed = oldIndex != index;
|
changed = oldIndex != index;
|
||||||
if (changed) {
|
// Apply change to all streams using this one as alias if:
|
||||||
// Apply change to all streams using this one as alias
|
// - the index actually changed OR
|
||||||
// if changing volume of current device, also change volume of current
|
// - 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
|
// device on aliased stream
|
||||||
boolean currentDevice = (device == getDeviceForStream(mStreamType));
|
final boolean currentDevice = (device == getDeviceForStream(mStreamType));
|
||||||
int numStreamTypes = AudioSystem.getNumStreamTypes();
|
final int numStreamTypes = AudioSystem.getNumStreamTypes();
|
||||||
for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
|
for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
|
||||||
|
final VolumeStreamState aliasStreamState = mStreamStates[streamType];
|
||||||
if (streamType != mStreamType &&
|
if (streamType != mStreamType &&
|
||||||
mStreamVolumeAlias[streamType] == mStreamType) {
|
mStreamVolumeAlias[streamType] == mStreamType &&
|
||||||
int scaledIndex = rescaleIndex(index, mStreamType, streamType);
|
(changed || !aliasStreamState.hasIndexForDevice(device))) {
|
||||||
mStreamStates[streamType].setIndex(scaledIndex, device, caller);
|
final int scaledIndex = rescaleIndex(index, mStreamType, streamType);
|
||||||
|
aliasStreamState.setIndex(scaledIndex, device, caller);
|
||||||
if (currentDevice) {
|
if (currentDevice) {
|
||||||
mStreamStates[streamType].setIndex(scaledIndex,
|
aliasStreamState.setIndex(scaledIndex,
|
||||||
getDeviceForStream(streamType), caller);
|
getDeviceForStream(streamType), caller);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
oldIndex = (oldIndex + 5) / 10;
|
oldIndex = (oldIndex + 5) / 10;
|
||||||
index = (index + 5) / 10;
|
index = (index + 5) / 10;
|
||||||
@@ -4086,6 +4088,12 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasIndexForDevice(int device) {
|
||||||
|
synchronized (VolumeStreamState.class) {
|
||||||
|
return (mIndexMap.get(device, -1) != -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int getMaxIndex() {
|
public int getMaxIndex() {
|
||||||
return mIndexMax;
|
return mIndexMax;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user