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;