diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index a3c6f0a68c785ecbdd17b2e8a52e2fdd19bf8a35..282714a5dd21f130972dfecb1d7bdc452f619b33 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -363,6 +363,7 @@ public class AudioDeviceInventory { } break; case BluetoothProfile.LE_AUDIO: + case BluetoothProfile.LE_AUDIO_BROADCAST: if (switchToUnavailable) { makeLeAudioDeviceUnavailable(address, btInfo.mAudioSystemDevice); } else if (switchToAvailable) { @@ -814,7 +815,10 @@ public class AudioDeviceInventory { disconnectHearingAid(); break; case BluetoothProfile.LE_AUDIO: - disconnectLeAudio(); + disconnectLeAudioUnicast(); + break; + case BluetoothProfile.LE_AUDIO_BROADCAST: + disconnectLeAudioBroadcast(); break; default: // Not a valid profile to disconnect @@ -824,28 +828,39 @@ public class AudioDeviceInventory { } } - /*package*/ void disconnectLeAudio() { + /*package*/ void disconnectLeAudio(int device) { + if (device != AudioSystem.DEVICE_OUT_BLE_HEADSET || + device != AudioSystem.DEVICE_OUT_BLE_BROADCAST) { + Log.e(TAG, "disconnectLeAudio: Can't disconnect not LE Audio device " + device); + return; + } + synchronized (mDevicesLock) { final ArraySet<String> toRemove = new ArraySet<>(); - // Disconnect ALL DEVICE_OUT_BLE_HEADSET devices + // Disconnect ALL DEVICE_OUT_BLE_HEADSET or DEVICE_OUT_BLE_BROADCAST devices mConnectedDevices.values().forEach(deviceInfo -> { - if (deviceInfo.mDeviceType == AudioSystem.DEVICE_OUT_BLE_HEADSET) { + if (deviceInfo.mDeviceType == device) { toRemove.add(deviceInfo.mDeviceAddress); } }); new MediaMetrics.Item(mMetricsId + "disconnectLeAudio") .record(); if (toRemove.size() > 0) { - final int delay = checkSendBecomingNoisyIntentInt( - AudioSystem.DEVICE_OUT_BLE_HEADSET, 0, AudioSystem.DEVICE_NONE); toRemove.stream().forEach(deviceAddress -> - makeLeAudioDeviceUnavailable(deviceAddress, - AudioSystem.DEVICE_OUT_BLE_HEADSET) + makeLeAudioDeviceUnavailable(deviceAddress, device) ); } } } + /*package*/ void disconnectLeAudioUnicast() { + disconnectLeAudio(AudioSystem.DEVICE_OUT_BLE_HEADSET); + } + + /*package*/ void disconnectLeAudioBroadcast() { + disconnectLeAudio(AudioSystem.DEVICE_OUT_BLE_BROADCAST); + } + // must be called before removing the device from mConnectedDevices // musicDevice argument is used when not AudioSystem.DEVICE_NONE instead of querying // from AudioSystem @@ -875,7 +890,9 @@ public class AudioDeviceInventory { int delay; synchronized (mDevicesLock) { if (!info.mSupprNoisy - && ((info.mProfile == BluetoothProfile.LE_AUDIO && info.mIsLeOutput) + && (((info.mProfile == BluetoothProfile.LE_AUDIO + || info.mProfile == BluetoothProfile.LE_AUDIO_BROADCAST) + && info.mIsLeOutput) || info.mProfile == BluetoothProfile.HEARING_AID || info.mProfile == BluetoothProfile.A2DP)) { @AudioService.ConnectionState int asState = @@ -1110,8 +1127,7 @@ public class AudioDeviceInventory { return; } - final int leAudioVolIndex = mDeviceBroker.getVssVolumeForDevice(streamType, - AudioSystem.DEVICE_OUT_BLE_HEADSET); + final int leAudioVolIndex = mDeviceBroker.getVssVolumeForDevice(streamType, device); final int maxIndex = mDeviceBroker.getMaxVssVolumeForStream(streamType); mDeviceBroker.postSetLeAudioVolumeIndex(leAudioVolIndex, maxIndex, streamType); mDeviceBroker.postApplyVolumeOnDevice(streamType, device, "makeLeAudioDeviceAvailable"); @@ -1163,6 +1179,7 @@ public class AudioDeviceInventory { BECOMING_NOISY_INTENT_DEVICES_SET.add(AudioSystem.DEVICE_OUT_LINE); BECOMING_NOISY_INTENT_DEVICES_SET.add(AudioSystem.DEVICE_OUT_HEARING_AID); BECOMING_NOISY_INTENT_DEVICES_SET.add(AudioSystem.DEVICE_OUT_BLE_HEADSET); + BECOMING_NOISY_INTENT_DEVICES_SET.add(AudioSystem.DEVICE_OUT_BLE_BROADCAST); BECOMING_NOISY_INTENT_DEVICES_SET.addAll(AudioSystem.DEVICE_OUT_ALL_A2DP_SET); BECOMING_NOISY_INTENT_DEVICES_SET.addAll(AudioSystem.DEVICE_OUT_ALL_USB_SET); BECOMING_NOISY_INTENT_DEVICES_SET.addAll(AudioSystem.DEVICE_OUT_ALL_BLE_SET); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 1cc044387553956b996fb06304a6b6089176dea4..490f84456823e5b025b9d2c243ff1ec82cf06d83 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -2998,7 +2998,8 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(newIndex / 10); } - if (device == AudioSystem.DEVICE_OUT_BLE_HEADSET + if ((device == AudioSystem.DEVICE_OUT_BLE_HEADSET + || device == AudioSystem.DEVICE_OUT_BLE_BROADCAST) && streamType == getBluetoothContextualVolumeStream() && (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) { if (DEBUG_VOL) { @@ -3644,7 +3645,8 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(index / 10); } - if (device == AudioSystem.DEVICE_OUT_BLE_HEADSET + if ((device == AudioSystem.DEVICE_OUT_BLE_HEADSET + || device == AudioSystem.DEVICE_OUT_BLE_BROADCAST) && streamType == getBluetoothContextualVolumeStream() && (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) { if (DEBUG_VOL) { @@ -6336,6 +6338,7 @@ public class AudioService extends IAudioService.Stub BluetoothProfile.A2DP, BluetoothProfile.A2DP_SINK, BluetoothProfile.LE_AUDIO, + BluetoothProfile.LE_AUDIO_BROADCAST, }) @Retention(RetentionPolicy.SOURCE) public @interface BtProfile {} @@ -6357,6 +6360,7 @@ public class AudioService extends IAudioService.Stub final int profile = info.getProfile(); if (profile != BluetoothProfile.A2DP && profile != BluetoothProfile.A2DP_SINK && profile != BluetoothProfile.LE_AUDIO + && profile != BluetoothProfile.LE_AUDIO_BROADCAST && profile != BluetoothProfile.HEARING_AID) { throw new IllegalArgumentException("Illegal BluetoothProfile profile for device " + previousDevice + " -> " + newDevice + ". Got: " + profile);