diff options
| author | 2022-07-10 18:42:50 +0000 | |
|---|---|---|
| committer | 2022-08-19 18:50:50 +0000 | |
| commit | c408b9825f4433eb5e849ce1ac0eaafd5f8bd69d (patch) | |
| tree | 55c4f5cefefc83893768e22a9605e94f6f649443 | |
| parent | 32b243659731c92156131b3d659176e76f271ad4 (diff) | |
BLE audio: support assigning volume at BLE device connection
Add support for associating an initial volume with a BLE
connection:
- add volume info to BluetoothProfileConnectionInfo in a new
BLE output factory method
- when handling device connection for BLE, also check if
volume information from the connection information is available.
Bug: 233975367
Test: atest frameworks/base/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/BluetoothProfileConnectionInfoTest.java
Change-Id: Ib54267727bc4d47e6999f2b84eab805f23c4955a
Merged-In: Ib54267727bc4d47e6999f2b84eab805f23c4955a
3 files changed, 66 insertions, 4 deletions
diff --git a/media/java/android/media/BluetoothProfileConnectionInfo.java b/media/java/android/media/BluetoothProfileConnectionInfo.java index c14884657ddd..f3a65a121768 100644 --- a/media/java/android/media/BluetoothProfileConnectionInfo.java +++ b/media/java/android/media/BluetoothProfileConnectionInfo.java @@ -126,6 +126,21 @@ public final class BluetoothProfileConnectionInfo implements Parcelable { } /** + * @hide + * Factory method for <code>BluetoothProfileConnectionInfo</code> for an LE output device + * @param suppressNoisyIntent if true the {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} + * intent will not be sent. + * @param volume the volume index of the device, -1 if unknown or to be ignored + * @return an instance of BluetoothProfileConnectionInfo for the BLE output device that reflects + * the given parameters + */ + public static @NonNull BluetoothProfileConnectionInfo createLeAudioOutputInfo( + boolean suppressNoisyIntent, int volume) { + return new BluetoothProfileConnectionInfo(BluetoothProfile.LE_AUDIO, suppressNoisyIntent, + volume, /*isLeOutput*/ true); + } + + /** * @return The profile connection */ public int getProfile() { diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/BluetoothProfileConnectionInfoTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/BluetoothProfileConnectionInfoTest.java new file mode 100644 index 000000000000..ae162b57b709 --- /dev/null +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/BluetoothProfileConnectionInfoTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mediaframeworktest.unit; + +import static org.junit.Assert.assertEquals; + +import android.bluetooth.BluetoothProfile; +import android.media.BluetoothProfileConnectionInfo; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class BluetoothProfileConnectionInfoTest { + + @Test + public void testCoverageLeAudioOutputVolume() { + final boolean supprNoisy = false; + final int volume = 1; + final BluetoothProfileConnectionInfo info = BluetoothProfileConnectionInfo + .createLeAudioOutputInfo(supprNoisy, volume); + assertEquals(info.getProfile(), BluetoothProfile.LE_AUDIO); + assertEquals(info.isSuppressNoisyIntent(), supprNoisy); + assertEquals(info.isLeOutput(), true); + assertEquals(info.getVolume(), volume); + } + +} diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index dbe4fb8c8795..9c0d3dfe17a1 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -375,7 +375,8 @@ public class AudioDeviceInventory { makeLeAudioDeviceUnavailable(address, btInfo.mAudioSystemDevice); } else if (switchToAvailable) { makeLeAudioDeviceAvailable(address, BtHelper.getName(btInfo.mDevice), - streamType, btInfo.mAudioSystemDevice, "onSetBtActiveDevice"); + streamType, btInfo.mVolume, btInfo.mAudioSystemDevice, + "onSetBtActiveDevice"); } break; default: throw new IllegalArgumentException("Invalid profile " @@ -1159,8 +1160,8 @@ public class AudioDeviceInventory { } @GuardedBy("mDevicesLock") - private void makeLeAudioDeviceAvailable(String address, String name, int streamType, int device, - String eventSource) { + private void makeLeAudioDeviceAvailable(String address, String name, int streamType, + int volumeIndex, int device, String eventSource) { if (device != AudioSystem.DEVICE_NONE) { /* Audio Policy sees Le Audio similar to A2DP. Let's make sure * AUDIO_POLICY_FORCE_NO_BT_A2DP is not set @@ -1181,7 +1182,9 @@ public class AudioDeviceInventory { return; } - final int leAudioVolIndex = mDeviceBroker.getVssVolumeForDevice(streamType, device); + final int leAudioVolIndex = (volumeIndex == -1) + ? mDeviceBroker.getVssVolumeForDevice(streamType, device) + : volumeIndex; final int maxIndex = mDeviceBroker.getMaxVssVolumeForStream(streamType); mDeviceBroker.postSetLeAudioVolumeIndex(leAudioVolIndex, maxIndex, streamType); mDeviceBroker.postApplyVolumeOnDevice(streamType, device, "makeLeAudioDeviceAvailable"); |