audio service: fix volume burst on user switch

Change the convention on use of default device volume with
audio policy manager: Now setting the default device volume on a stream does not
reset all specific device volumes. The default volume is just used by audio policy
manager if no specific device volume is present for a given selected device.

Bug: 27557733

Change-Id: I1edd9530ccafc615d9353b9b06489c688e21f719
This commit is contained in:
Eric Laurent
2016-04-07 14:04:23 -07:00
parent 8eb8a32f98
commit d9ac2be3e3

View File

@@ -3954,25 +3954,16 @@ public class AudioService extends IAudioService.Stub {
public void applyAllVolumes() {
synchronized (VolumeStreamState.class) {
// apply default volume first: by convention this will reset all
// devices volumes in audio policy manager to the supplied value
// apply device specific volumes first
int index;
if (mIsMuted) {
index = 0;
} else {
index = (getIndex(AudioSystem.DEVICE_OUT_DEFAULT) + 5)/10;
}
AudioSystem.setStreamVolumeIndex(mStreamType, index, AudioSystem.DEVICE_OUT_DEFAULT);
// then apply device specific volumes
for (int i = 0; i < mIndexMap.size(); i++) {
int device = mIndexMap.keyAt(i);
final int device = mIndexMap.keyAt(i);
if (device != AudioSystem.DEVICE_OUT_DEFAULT) {
if (mIsMuted) {
index = 0;
} else if (((device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 &&
mAvrcpAbsVolSupported)
|| ((device & mFullVolumeDevices) != 0))
{
|| ((device & mFullVolumeDevices) != 0)) {
index = (mIndexMax + 5)/10;
} else {
index = (mIndexMap.valueAt(i) + 5)/10;
@@ -3980,6 +3971,15 @@ public class AudioService extends IAudioService.Stub {
AudioSystem.setStreamVolumeIndex(mStreamType, index, device);
}
}
// apply default volume last: by convention , default device volume will be used
// by audio policy manager if no explicit volume is present for a given device type
if (mIsMuted) {
index = 0;
} else {
index = (getIndex(AudioSystem.DEVICE_OUT_DEFAULT) + 5)/10;
}
AudioSystem.setStreamVolumeIndex(
mStreamType, index, AudioSystem.DEVICE_OUT_DEFAULT);
}
}