diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index a6dfab042aa0a..0874fa7a58e53 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3940,33 +3940,40 @@ public class AudioService extends IAudioService.Stub { } } + private int getAbsoluteVolumeIndex(int index) { + /* Special handling for Bluetooth Absolute Volume scenario + * If we send full audio gain, some accessories are too loud even at its lowest + * volume. We are not able to enumerate all such accessories, so here is the + * workaround from phone side. + * Pre-scale volume at lowest volume steps 1 2 and 3. + * For volume step 0, set audio gain to 0 as some accessories won't mute on their end. + */ + if (index == 0) { + // 0% for volume 0 + index = 0; + } else if (index == 1) { + // 50% for volume 1 + index = (int)(mIndexMax * 0.5) /10; + } else if (index == 2) { + // 70% for volume 2 + index = (int)(mIndexMax * 0.70) /10; + } else if (index == 3) { + // 85% for volume 3 + index = (int)(mIndexMax * 0.85) /10; + } else { + // otherwise, full gain + index = (mIndexMax + 5)/10; + } + return index; + } + // must be called while synchronized VolumeStreamState.class public void applyDeviceVolume_syncVSS(int device) { int index; if (mIsMuted) { index = 0; } else if ((device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && mAvrcpAbsVolSupported) { - /* Special handling for Bluetooth Absolute Volume scenario - * If we send full audio gain, some accessories are too loud even at its lowest - * volume. We are not able to enumerate all such accessories, so here is the - * workaround from phone side. - * For the lowest volume steps 1 and 2, restrict audio gain to 50% and 75%. - * For volume step 0, set audio gain to 0 as some accessories won't mute on their end. - */ - int i = (getIndex(device) + 5)/10; - if (i == 0) { - // 0% for volume 0 - index = 0; - } else if (i == 1) { - // 50% for volume 1 - index = (int)(mIndexMax * 0.5) /10; - } else if (i == 2) { - // 75% for volume 2 - index = (int)(mIndexMax * 0.75) /10; - } else { - // otherwise, full gain - index = (mIndexMax + 5)/10; - } + index = getAbsoluteVolumeIndex((getIndex(device) + 5)/10); } else if ((device & mFullVolumeDevices) != 0) { index = (mIndexMax + 5)/10; } else { @@ -3984,9 +3991,10 @@ public class AudioService extends IAudioService.Stub { if (device != AudioSystem.DEVICE_OUT_DEFAULT) { if (mIsMuted) { index = 0; - } else if (((device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && - mAvrcpAbsVolSupported) - || ((device & mFullVolumeDevices) != 0)) { + } else if ((device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && + mAvrcpAbsVolSupported) { + index = getAbsoluteVolumeIndex((getIndex(device) + 5)/10); + } else if ((device & mFullVolumeDevices) != 0) { index = (mIndexMax + 5)/10; } else { index = (mIndexMap.valueAt(i) + 5)/10;