From 39fb5670a8d863ec1ee9b3ece0d477a8b9dd44c2 Mon Sep 17 00:00:00 2001 From: Liejun Tao Date: Wed, 9 Mar 2016 15:52:13 -0600 Subject: [PATCH] Bluetooth: Fine tune audio gain for Absolute Volume case Fine tune the audio gain for Bluetooth Absolute Volume. Use 50%, 70% and 85% for lowest volume steps 1, 2 and 3. Thus the volume change sounds smoother, more linear. When remote end tune volume out of mute, we should also tune the audio gain for the lowest volume steps. Bug: 26694114 Change-Id: I298a334a4b40ddb87495fda1935349bfce8b0537 --- .../android/server/audio/AudioService.java | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) 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;