AudioService: Add makeLeAudioDeviceUnavailableLater
Currently, when LE Audio device becomes unavaliable due to BT adapter disable, user can hear audio from device speaker for a split second. This is because we make device unavaliable immediately for LE Audio. Instead, it should become unavaliable after AUDIO_BECOMING_NOISY intent is sent. Since this is working correctly for A2DP, fix is to copy solution from there for LE Audio code path, and split makeLeAudioDeviceUnavailable into *Now and *Later versions. With this fix, the device becomes unavaliable after the noisy intent, and audio glitch is not heard from speaker. Example dumpsys audio logs after fix is applied: 02-16 11:25:43:022 broadcast ACTION_AUDIO_BECOMING_NOISY 02-16 11:25:44:050 LE Audio device addr=14:3F:A6:60:0A:A5 made unavailable Bug: 263209656 Test: play music in Spotfiy, listen on LE Audio device, then disable Bluetooth. Verify that audio is not heard from the phoen speaker Merged-In: I0ff85798c3672b2d6862460c2f2d914f705aac2c Change-Id: I0ff85798c3672b2d6862460c2f2d914f705aac2c
This commit is contained in:
committed by
Jakub Pawłowski
parent
1c2ff8b889
commit
ee67bd4a5a
@@ -1147,6 +1147,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs);
|
||||
}
|
||||
|
||||
/*package*/ void setLeAudioTimeout(String address, int device, int delayMs) {
|
||||
sendILMsg(MSG_IL_BTLEAUDIO_TIMEOUT, SENDMSG_QUEUE, device, address, delayMs);
|
||||
}
|
||||
|
||||
/*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) {
|
||||
synchronized (mDeviceStateLock) {
|
||||
mBtHelper.setAvrcpAbsoluteVolumeSupported(supported);
|
||||
@@ -1351,6 +1355,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
mDeviceInventory.onMakeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1);
|
||||
}
|
||||
break;
|
||||
case MSG_IL_BTLEAUDIO_TIMEOUT:
|
||||
// msg.obj == address of LE Audio device
|
||||
synchronized (mDeviceStateLock) {
|
||||
mDeviceInventory.onMakeLeAudioDeviceUnavailableNow(
|
||||
(String) msg.obj, msg.arg1);
|
||||
}
|
||||
break;
|
||||
case MSG_L_A2DP_DEVICE_CONFIG_CHANGE:
|
||||
final BluetoothDevice btDevice = (BluetoothDevice) msg.obj;
|
||||
synchronized (mDeviceStateLock) {
|
||||
@@ -1577,11 +1588,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
// process set volume for Le Audio, obj is BleVolumeInfo
|
||||
private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46;
|
||||
|
||||
private static final int MSG_IL_BTLEAUDIO_TIMEOUT = 49;
|
||||
|
||||
private static boolean isMessageHandledUnderWakelock(int msgId) {
|
||||
switch(msgId) {
|
||||
case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
|
||||
case MSG_L_SET_BT_ACTIVE_DEVICE:
|
||||
case MSG_IL_BTA2DP_TIMEOUT:
|
||||
case MSG_IL_BTLEAUDIO_TIMEOUT:
|
||||
case MSG_L_A2DP_DEVICE_CONFIG_CHANGE:
|
||||
case MSG_TOGGLE_HDMI:
|
||||
case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT:
|
||||
@@ -1672,6 +1686,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
case MSG_L_SET_BT_ACTIVE_DEVICE:
|
||||
case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
|
||||
case MSG_IL_BTA2DP_TIMEOUT:
|
||||
case MSG_IL_BTLEAUDIO_TIMEOUT:
|
||||
case MSG_L_A2DP_DEVICE_CONFIG_CHANGE:
|
||||
if (sLastDeviceConnectMsgTime >= time) {
|
||||
// add a little delay to make sure messages are ordered as expected
|
||||
|
||||
@@ -374,7 +374,7 @@ public class AudioDeviceInventory {
|
||||
case BluetoothProfile.LE_AUDIO:
|
||||
case BluetoothProfile.LE_AUDIO_BROADCAST:
|
||||
if (switchToUnavailable) {
|
||||
makeLeAudioDeviceUnavailable(address, btInfo.mAudioSystemDevice);
|
||||
makeLeAudioDeviceUnavailableNow(address, btInfo.mAudioSystemDevice);
|
||||
} else if (switchToAvailable) {
|
||||
makeLeAudioDeviceAvailable(address, BtHelper.getName(btInfo.mDevice),
|
||||
streamType, btInfo.mVolume == -1 ? -1 : btInfo.mVolume * 10,
|
||||
@@ -486,6 +486,12 @@ public class AudioDeviceInventory {
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/ void onMakeLeAudioDeviceUnavailableNow(String address, int device) {
|
||||
synchronized (mDevicesLock) {
|
||||
makeLeAudioDeviceUnavailableNow(address, device);
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/ void onReportNewRoutes() {
|
||||
int n = mRoutesObservers.beginBroadcast();
|
||||
if (n > 0) {
|
||||
@@ -883,10 +889,11 @@ public class AudioDeviceInventory {
|
||||
new MediaMetrics.Item(mMetricsId + "disconnectLeAudio")
|
||||
.record();
|
||||
if (toRemove.size() > 0) {
|
||||
final int delay = checkSendBecomingNoisyIntentInt(device, 0,
|
||||
final int delay = checkSendBecomingNoisyIntentInt(device,
|
||||
AudioService.CONNECTION_STATE_DISCONNECTED,
|
||||
AudioSystem.DEVICE_NONE);
|
||||
toRemove.stream().forEach(deviceAddress ->
|
||||
makeLeAudioDeviceUnavailable(deviceAddress, device)
|
||||
makeLeAudioDeviceUnavailableLater(deviceAddress, device, delay)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1210,7 +1217,7 @@ public class AudioDeviceInventory {
|
||||
}
|
||||
|
||||
@GuardedBy("mDevicesLock")
|
||||
private void makeLeAudioDeviceUnavailable(String address, int device) {
|
||||
private void makeLeAudioDeviceUnavailableNow(String address, int device) {
|
||||
if (device != AudioSystem.DEVICE_NONE) {
|
||||
AudioSystem.setDeviceConnectionState(new AudioDeviceAttributes(device, address),
|
||||
AudioSystem.DEVICE_STATE_UNAVAILABLE,
|
||||
@@ -1221,6 +1228,14 @@ public class AudioDeviceInventory {
|
||||
setCurrentAudioRouteNameIfPossible(null, false /*fromA2dp*/);
|
||||
}
|
||||
|
||||
@GuardedBy("mDevicesLock")
|
||||
private void makeLeAudioDeviceUnavailableLater(String address, int device, int delayMs) {
|
||||
// the device will be made unavailable later, so consider it disconnected right away
|
||||
mConnectedDevices.remove(DeviceInfo.makeDeviceListKey(device, address));
|
||||
// send the delayed message to make the device unavailable later
|
||||
mDeviceBroker.setLeAudioTimeout(address, device, delayMs);
|
||||
}
|
||||
|
||||
@GuardedBy("mDevicesLock")
|
||||
private void setCurrentAudioRouteNameIfPossible(String name, boolean fromA2dp) {
|
||||
synchronized (mCurAudioRoutes) {
|
||||
|
||||
Reference in New Issue
Block a user