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

Commit e99cdc2b authored by Jakub Tyszkowski's avatar Jakub Tyszkowski
Browse files

Bass: Support local broadcasts

Bug: 245105247
Test: manual testing
Tag: #feature
Change-Id: I7c9edfd48e38d91d11348b668aa98c4826bf9c1e
parent f1650f0c
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.csip.CsipSetCoordinatorService;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
@@ -1260,6 +1261,25 @@ public class BassClientService extends ProfileService {
        return stateMachine.getMaximumSourceCapacity();
    }

    boolean isLocalBroadcast(BluetoothLeBroadcastMetadata metaData) {
        if (metaData == null) {
            return false;
        }

        LeAudioService leAudioService = mServiceFactory.getLeAudioService();
        if (leAudioService == null) {
            return false;
        }

        boolean wasFound = leAudioService.getAllBroadcastMetadata()
                .stream()
                .anyMatch(meta -> {
                    return meta.getSourceAdvertisingSid() == metaData.getSourceAdvertisingSid();
                });
        log("isLocalBroadcast=" + wasFound);
        return wasFound;
    }

    static void log(String msg) {
        if (BassConstants.BASS_DBG) {
            Log.d(TAG, msg);
+18 −4
Original line number Diff line number Diff line
@@ -591,13 +591,27 @@ public class BassClientStateMachine extends StateMachine {
                            + "serviceData" + serviceData);
                    mPeriodicAdvManager.transferSync(mDevice, serviceData, syncHandle);
                }
            } else {
                if (mService.isLocalBroadcast(mPendingMetadata)) {
                    int advHandle = mPendingMetadata.getSourceAdvertisingSid();
                    serviceData = 0x000000FF & recvState.getSourceId();
                    serviceData = serviceData << 8;
                    // Address we set in the Source Address can differ from the address in the air
                    serviceData = serviceData
                            | BassConstants.ADV_ADDRESS_DONT_MATCHES_SOURCE_ADV_ADDRESS;
                    log("Initiate local broadcast PAST for: " + mDevice
                            + ", advSID/Handle: " +  advHandle
                            + ", serviceData: " + serviceData);
                    mPeriodicAdvManager.transferSetInfo(mDevice, serviceData,
                            advHandle, mPeriodicAdvCallback);
                } else {
                    Log.e(TAG, "There is no valid sync handle for this Source");
                    if (mAutoAssist) {
                    //initiate Auto Assist procedure for this device
                        // Initiate Auto Assist procedure for this device
                        mService.getBassUtils().triggerAutoAssist(recvState);
                    }
                }
            }
        } else if (state == BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_SYNCHRONIZED
                || state == BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_NO_PAST) {
            Message message = obtainMessage(STOP_SCAN_OFFLOAD);