LeAudio: Fix volume control
The calculation formula is now set to be the inverse of the one used
in VolumeControlService.java when calculating volume index from the
BLE audio volume level.
This also fixes not using the absolute volume for BLE audio stream,
which could result with very low volume levels at the lower registers
of the volume slider. It was caused by lowering the volume on both
ends. Not transmitting the sound at the maximum volume level could
also reduce the sound quality due to effective sound sample resolution
being lower.
Bug: 238587620
Bug: 241501978
Test: built and manually tested
Tag: #feature
Change-Id: I368c8978be5fbd94b0f62df2551fe179a9f203a0
Merged-In: I368c8978be5fbd94b0f62df2551fe179a9f203a0
(cherry picked from commit 51d75fbc69)
This commit is contained in:
@@ -2385,6 +2385,14 @@ public class AudioSystem
|
||||
return types.size() == 1 && types.contains(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
* Return true if the audio device type is a Bluetooth LE Audio device.
|
||||
*/
|
||||
public static boolean isLeAudioDeviceType(int type) {
|
||||
return DEVICE_OUT_ALL_BLE_SET.contains(type);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public static final int DEFAULT_MUTE_STREAMS_AFFECTED =
|
||||
(1 << STREAM_MUSIC) |
|
||||
|
||||
@@ -3353,8 +3353,7 @@ public class AudioService extends IAudioService.Stub
|
||||
dispatchAbsoluteVolumeChanged(streamType, info, newIndex);
|
||||
}
|
||||
|
||||
if ((device == AudioSystem.DEVICE_OUT_BLE_HEADSET
|
||||
|| device == AudioSystem.DEVICE_OUT_BLE_BROADCAST)
|
||||
if (AudioSystem.isLeAudioDeviceType(device)
|
||||
&& streamType == getBluetoothContextualVolumeStream()
|
||||
&& (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) {
|
||||
if (DEBUG_VOL) {
|
||||
@@ -4110,8 +4109,7 @@ public class AudioService extends IAudioService.Stub
|
||||
dispatchAbsoluteVolumeChanged(streamType, info, index);
|
||||
}
|
||||
|
||||
if ((device == AudioSystem.DEVICE_OUT_BLE_HEADSET
|
||||
|| device == AudioSystem.DEVICE_OUT_BLE_BROADCAST)
|
||||
if (AudioSystem.isLeAudioDeviceType(device)
|
||||
&& streamType == getBluetoothContextualVolumeStream()
|
||||
&& (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) {
|
||||
if (DEBUG_VOL) {
|
||||
@@ -6950,7 +6948,8 @@ public class AudioService extends IAudioService.Stub
|
||||
return AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE;
|
||||
}
|
||||
if (isAbsoluteVolumeDevice(audioSystemDeviceOut)
|
||||
|| isA2dpAbsoluteVolumeDevice(audioSystemDeviceOut)) {
|
||||
|| isA2dpAbsoluteVolumeDevice(audioSystemDeviceOut)
|
||||
|| AudioSystem.isLeAudioDeviceType(audioSystemDeviceOut)) {
|
||||
return AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE;
|
||||
}
|
||||
return AudioManager.DEVICE_VOLUME_BEHAVIOR_VARIABLE;
|
||||
@@ -7717,7 +7716,9 @@ public class AudioService extends IAudioService.Stub
|
||||
int index;
|
||||
if (isFullyMuted()) {
|
||||
index = 0;
|
||||
} else if (isAbsoluteVolumeDevice(device) || isA2dpAbsoluteVolumeDevice(device)) {
|
||||
} else if (isAbsoluteVolumeDevice(device)
|
||||
|| isA2dpAbsoluteVolumeDevice(device)
|
||||
|| AudioSystem.isLeAudioDeviceType(device)) {
|
||||
index = getAbsoluteVolumeIndex((getIndex(device) + 5)/10);
|
||||
} else if (isFullVolumeDevice(device)) {
|
||||
index = (mIndexMax + 5)/10;
|
||||
@@ -7739,7 +7740,8 @@ public class AudioService extends IAudioService.Stub
|
||||
if (isFullyMuted()) {
|
||||
index = 0;
|
||||
} else if (isAbsoluteVolumeDevice(device)
|
||||
|| isA2dpAbsoluteVolumeDevice(device)) {
|
||||
|| isA2dpAbsoluteVolumeDevice(device)
|
||||
|| AudioSystem.isLeAudioDeviceType(device)) {
|
||||
index = getAbsoluteVolumeIndex((getIndex(device) + 5)/10);
|
||||
} else if (isFullVolumeDevice(device)) {
|
||||
index = (mIndexMax + 5)/10;
|
||||
@@ -8160,7 +8162,8 @@ public class AudioService extends IAudioService.Stub
|
||||
int streamDevice = getDeviceForStream(streamType);
|
||||
if ((device != streamDevice)
|
||||
&& (isAbsoluteVolumeDevice(device)
|
||||
|| isA2dpAbsoluteVolumeDevice(device))) {
|
||||
|| isA2dpAbsoluteVolumeDevice(device)
|
||||
|| AudioSystem.isLeAudioDeviceType(device))) {
|
||||
mStreamStates[streamType].applyDeviceVolume_syncVSS(device);
|
||||
}
|
||||
mStreamStates[streamType].applyDeviceVolume_syncVSS(streamDevice);
|
||||
|
||||
@@ -433,7 +433,7 @@ public class AudioServiceEvents {
|
||||
case VOL_SET_LE_AUDIO_VOL:
|
||||
return new StringBuilder("setLeAudioVolume:")
|
||||
.append(" index:").append(mVal1)
|
||||
.append(" gain dB:").append(mVal2)
|
||||
.append(" maxIndex:").append(mVal2)
|
||||
.toString();
|
||||
case VOL_SET_AVRCP_VOL:
|
||||
return new StringBuilder("setAvrcpVolume:")
|
||||
|
||||
@@ -412,9 +412,8 @@ public class BtHelper {
|
||||
}
|
||||
return;
|
||||
}
|
||||
/* leaudio expect volume value in range 0 to 255
|
||||
*/
|
||||
int volume = (index * (BT_LE_AUDIO_MAX_VOL - BT_LE_AUDIO_MIN_VOL)) / maxIndex ;
|
||||
/* leaudio expect volume value in range 0 to 255 */
|
||||
int volume = (int) Math.round((double) index * BT_LE_AUDIO_MAX_VOL / maxIndex);
|
||||
|
||||
if (AudioService.DEBUG_VOL) {
|
||||
Log.i(TAG, "setLeAudioVolume: calling mLeAudio.setVolume idx="
|
||||
|
||||
Reference in New Issue
Block a user