Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32cd5a14 authored by Rongxuan Liu's avatar Rongxuan Liu
Browse files

[le audio] Broadcast: skip creating broadcast if exceeding maximum number

Add this check in the service to support what is mentioned in API startBroadcast description.
"In particular, when the number of Broadcast Sources reaches
{@link #getMaximumNumberOfBroadcast()}, this method will fail with
{@link BluetoothStatusCodes#ERROR_LOCAL_NOT_ENOUGH_RESOURCES}"

Bug: 291519369
Test: atest LeAudioBroadcastServiceTest LeAudioBinderTest
Change-Id: Ib22dbfbede25ea87d5103bf50c8becfd4b6e3ab8
parent 0da4cf20
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -827,6 +827,15 @@ public class LeAudioService extends ProfileService {
     * @param broadcastSettings broadcast settings for this broadcast source
     */
    public void createBroadcast(BluetoothLeBroadcastSettings broadcastSettings) {
        if (mBroadcastDescriptors.size() >= getMaximumNumberOfBroadcasts()) {
            Log.w(
                    TAG,
                    "createBroadcast reached maximum allowed broadcasts number: "
                            + getMaximumNumberOfBroadcasts());
            notifyBroadcastStartFailed(null, BluetoothStatusCodes.ERROR_LOCAL_NOT_ENOUGH_RESOURCES);
            return;
        }

        if (mLeAudioBroadcasterNativeInterface == null) {
            Log.w(TAG, "Native interface not available.");
            return;
+76 −46
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ public class LeAudioBroadcastServiceTest {
    private boolean mOnBroadcastUpdatedCalled = false;
    private boolean mOnBroadcastUpdateFailedCalled = false;
    private boolean mOnBroadcastMetadataChangedCalled = false;
    private int mOnBroadcastStartFailedReason = BluetoothStatusCodes.SUCCESS;

    private final IBluetoothLeBroadcastCallback mCallbacks =
            new IBluetoothLeBroadcastCallback.Stub() {
@@ -116,6 +117,7 @@ public class LeAudioBroadcastServiceTest {
                @Override
                public void onBroadcastStartFailed(int reason) {
                    mOnBroadcastStartFailedCalled = true;
                    mOnBroadcastStartFailedReason = reason;
                }

                @Override
@@ -149,8 +151,8 @@ public class LeAudioBroadcastServiceTest {
                }

                @Override
        public void onBroadcastMetadataChanged(int broadcastId,
                BluetoothLeBroadcastMetadata metadata) {
                public void onBroadcastMetadataChanged(
                        int broadcastId, BluetoothLeBroadcastMetadata metadata) {
                    mOnBroadcastMetadataChangedCalled = true;
                }
            };
@@ -634,6 +636,34 @@ public class LeAudioBroadcastServiceTest {
        Assert.assertEquals(-1, activeGroup);
    }

    @Test
    public void testCreateBroadcastMoreThanMaxFailed() {
        int broadcastId = 243;
        byte[] code = {0x00, 0x01, 0x00, 0x02};

        mService.mBroadcastCallbacks.register(mCallbacks);

        BluetoothLeAudioContentMetadata.Builder meta_builder =
                new BluetoothLeAudioContentMetadata.Builder();
        meta_builder.setLanguage("deu");
        meta_builder.setProgramInfo("Subgroup broadcast info");
        BluetoothLeAudioContentMetadata meta = meta_builder.build();
        BluetoothLeBroadcastSettings settings = buildBroadcastSettingsFromMetadata(meta, code, 1);

        verifyBroadcastStarted(broadcastId, settings);
        mOnBroadcastStartedCalled = false;
        mOnBroadcastStartFailedCalled = false;

        // verify creating another broadcast will fail
        mService.createBroadcast(settings);

        Assert.assertFalse(mOnBroadcastStartedCalled);
        Assert.assertTrue(mOnBroadcastStartFailedCalled);
        Assert.assertEquals(
                BluetoothStatusCodes.ERROR_LOCAL_NOT_ENOUGH_RESOURCES,
                mOnBroadcastStartFailedReason);
    }

    private class LeAudioIntentReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {