Merge "Bluetooth: Fine tune audio gain for Absolute Volume case" into nyc-dev
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index a6dfab0..0874fa7 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 @@
}
}
+ 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 @@
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;