From 19a459b78dc56de3eae5a7d0a16891e1d8b41b49 Mon Sep 17 00:00:00 2001 From: Jakub Tyszkowski Date: Fri, 28 Apr 2023 20:53:04 +0000 Subject: AudioDeviceBroker: Fix not setting proper call volume for LE Headset When switching from A2DP to SCO device for the IN_CALL mode, the new device type stream volume gets applied. However in case of LE Audio devices, the device stays the same, but when the mode changes to IN_CALL, the LE Headset is not yet set as a communication device so we must do an additional stream volume level alignment for the communication stream when it gets activated. When the call ends, the mode change handler will restore the previous mode stream volume for the LE Headset device. Bug: 278197636 Bug: 245638147 Test: tested manually Change-Id: I08b0052c799a657b31d6e1a1db2ee88573ae5e83 --- .../android/server/audio/AudioDeviceBroker.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index bc4e8df2a4ad..d02a80ee4433 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -420,6 +420,20 @@ import java.util.concurrent.atomic.AtomicBoolean; mBtHelper.stopBluetoothSco(eventSource); } + // In BT classic for communication, the device changes from a2dp to sco device, but for + // LE Audio it stays the same and we must trigger the proper stream volume alignment, if + // LE Audio communication device is activated after the audio system has already switched to + // MODE_IN_CALL mode. + if (isBluetoothLeAudioRequested()) { + final int streamType = mAudioService.getBluetoothContextualVolumeStream(); + final int leAudioVolIndex = getVssVolumeForDevice(streamType, device.getInternalType()); + final int leAudioMaxVolIndex = getMaxVssVolumeForStream(streamType); + if (AudioService.DEBUG_COMM_RTE) { + Log.v(TAG, "setCommunicationRouteForClient restoring LE Audio device volume lvl."); + } + postSetLeAudioVolumeIndex(leAudioVolIndex, leAudioMaxVolIndex, streamType); + } + updateCommunicationRoute(eventSource); } @@ -632,6 +646,16 @@ import java.util.concurrent.atomic.AtomicBoolean; return isDeviceRequestedForCommunication(AudioDeviceInfo.TYPE_BLUETOOTH_SCO); } + /** + * Helper method on top of isDeviceRequestedForCommunication() indicating if + * Bluetooth LE Audio communication device is currently requested or not. + * @return true if Bluetooth LE Audio device is requested, false otherwise. + */ + /*package*/ boolean isBluetoothLeAudioRequested() { + return isDeviceRequestedForCommunication(AudioDeviceInfo.TYPE_BLE_HEADSET) + || isDeviceRequestedForCommunication(AudioDeviceInfo.TYPE_BLE_SPEAKER); + } + /** * Indicates if preferred route selection for communication is Bluetooth SCO. * @return true if Bluetooth SCO is preferred , false otherwise. -- cgit v1.2.3-59-g8ed1b