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
This commit is contained in:
committed by
Andre Eisenbach
parent
a0676c9207
commit
39fb5670a8
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user