BassClient: Force PA sync reset before removing source Test: presubmit Bug: 229965085 Merged-In: I509651c0f5b6682eaac2a25edaff61cc02539e30 Change-Id: I509651c0f5b6682eaac2a25edaff61cc02539e30 (cherry picked from commit c870cb4b7ed5ff3d47b42be33027cabe00725ce4)
diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java index df1b458..881ef14 100755 --- a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
@@ -816,6 +816,7 @@ } Message message = stateMachine.obtainMessage(BassClientStateMachine.UPDATE_BCAST_SOURCE); message.arg1 = sourceId; + message.arg2 = BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_INVALID; message.obj = updatedMetadata; stateMachine.sendMessage(message); } @@ -844,6 +845,20 @@ BluetoothStatusCodes.ERROR_REMOTE_LINK_ERROR); return; } + BluetoothLeBroadcastReceiveState recvState = + stateMachine.getBroadcastReceiveStateForSourceId(sourceId); + BluetoothLeBroadcastMetadata metaData = + stateMachine.getCurrentBroadcastMetadata(sourceId); + if (metaData != null && recvState != null && recvState.getPaSyncState() == + BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_SYNCHRONIZED) { + log("Force source to lost PA sync"); + Message message = stateMachine.obtainMessage( + BassClientStateMachine.UPDATE_BCAST_SOURCE); + message.arg1 = sourceId; + message.arg2 = BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE; + message.obj = metaData; + stateMachine.sendMessage(message); + } Message message = stateMachine.obtainMessage(BassClientStateMachine.REMOVE_BCAST_SOURCE); message.arg1 = sourceId; stateMachine.sendMessage(message);
diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java index 062c52b..1e30480 100755 --- a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java +++ b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
@@ -1271,7 +1271,7 @@ } private byte[] convertBroadcastMetadataToUpdateSourceByteArray(int sourceId, - BluetoothLeBroadcastMetadata metaData) { + BluetoothLeBroadcastMetadata metaData, int paSync) { BluetoothLeBroadcastReceiveState existingState = getBroadcastReceiveStateForSourceId(sourceId); if (existingState == null) { @@ -1303,7 +1303,9 @@ // Source_ID res[offset++] = (byte) sourceId; // PA_Sync - if (existingState.getPaSyncState() + if (paSync != BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_INVALID) { + res[offset++] = (byte) paSync; + } else if (existingState.getPaSyncState() == BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_SYNCHRONIZED) { res[offset++] = (byte) (0x01); } else { @@ -1315,7 +1317,12 @@ // Num_Subgroups res[offset++] = numSubGroups; for (int i = 0; i < numSubGroups; i++) { - int bisIndexValue = existingState.getBisSyncState().get(i).intValue(); + int bisIndexValue; + if (paSync != BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_INVALID) { + bisIndexValue = 0; + } else { + bisIndexValue = existingState.getBisSyncState().get(i).intValue(); + } log("UPDATE_BCAST_SOURCE: bisIndexValue : " + bisIndexValue); // BIS_Sync res[offset++] = (byte) (bisIndexValue & 0x00000000000000FF); @@ -1513,9 +1520,10 @@ case UPDATE_BCAST_SOURCE: metaData = (BluetoothLeBroadcastMetadata) message.obj; int sourceId = message.arg1; + int paSync = message.arg2; log("Updating Broadcast source" + metaData); byte[] updateSourceInfo = convertBroadcastMetadataToUpdateSourceByteArray( - sourceId, metaData); + sourceId, metaData, paSync); if (updateSourceInfo == null) { Log.e(TAG, "update source: source Info is NULL"); break;