diff options
3 files changed, 37 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 1a482e47e5c3..0b3c18b5113b 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -656,6 +656,9 @@ import java.util.concurrent.atomic.AtomicBoolean;                      audioDevice = AudioSystem.DEVICE_IN_BLE_HEADSET;                  }                  break; +            case BluetoothProfile.LE_AUDIO_BROADCAST: +                audioDevice = AudioSystem.DEVICE_OUT_BLE_BROADCAST; +                break;              default: throw new IllegalArgumentException("Invalid profile " + d.mInfo.getProfile());          }          return new BtDeviceInfo(d, device, state, audioDevice, codec); diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 69b75e6e8edb..e14527098a72 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -370,6 +370,7 @@ public class AudioDeviceInventory {                      }                      break;                  case BluetoothProfile.LE_AUDIO: +                case BluetoothProfile.LE_AUDIO_BROADCAST:                      if (switchToUnavailable) {                          makeLeAudioDeviceUnavailable(address, btInfo.mAudioSystemDevice);                      } else if (switchToAvailable) { @@ -847,7 +848,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 @@ -857,28 +861,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 @@ -908,7 +923,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 = @@ -1162,8 +1179,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"); @@ -1215,6 +1231,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 b1b5d3ffb2c7..1357ed244d10 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3228,7 +3228,8 @@ public class AudioService extends IAudioService.Stub                  dispatchAbsoluteVolumeChanged(streamType, info, newIndex);              } -            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) { @@ -3891,7 +3892,8 @@ public class AudioService extends IAudioService.Stub                  dispatchAbsoluteVolumeChanged(streamType, info, index);              } -            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) { @@ -6832,6 +6834,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 {} @@ -6853,6 +6856,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);  |