Receiver unable to properly connect/sync with transmitter BIS and play selected audio streams.
hi
1. Your STM32WBA55G-DK1 with BLE_Audio_TMAP_Peripheral
The TMAP (Telephony and Media Audio Profile) example in the STM32 WBA SDK has different roles.
In your case, the BLE_Audio_TMAP_Peripheral project is designed as a TMAP Sink/Peripheral device (meaning it receives Auracast™ / BIS streams).
So your STM32WBA55G-DK1 is the Receiver (Sink).
2. Your nRF5340 Audio DK
You are running the nRF5340 Audio DK in “Broadcast Source / Transmitter” role.
That means it is sending audio over BIS (Broadcast Isochronous Streams).
In your logs:
LE_AUDIO_EVT_STREAM_0 LE_AUDIO_EVT_STREAM_1 ...
These indicate stream events per BIS index being transmitted.
3. BIS and Subgroups
You mentioned Number of BIS = 4, with 2 subgroups.
Example breakdown:Subgroup 1 → BIS 0 & BIS 1
Subgroup 2 → BIS 2 & BIS 3
The transmitter (nRF5340) is advertising 4 streams grouped into 2 subgroups.
The receiver (STM32WBA) must parse the BASE (Broadcast Audio Stream Endpoint) info and decide:
Which subgroup(s) it will sync to.
Which BIS index(es) it will actually receive/play.

4. Receiver Role (Your STM32WBA)
It scans advertisements from the nRF5340 source.
Decodes the BASE → finds available subgroups and BIS indexes.
Selects BISes dynamically (you’ll need to implement Select_Suitable_BISes() correctly).
Then it synchronizes to the BIG (Broadcast Isochronous Group) and starts receiving audio.
:white_heavy_check_mark: So final answer:
STM32WBA55G-DK1 with BLE_Audio_TMAP_Peripheral → Sink/Peripheral (Receiver).
nRF5340 Audio DK → Source/Transmitter (Broadcaster).
The 4 BIS / 2 subgroups you see in logs are exactly the broadcast streams from nRF5340, which your STM32 board should choose and sync to for playback.
:backhand_index_pointing_right: Do you want me to show you the code changes needed on STM32 receiver side so it automatically picks one BIS (like BIS 0/1 for left/right channel), instead of just logging the broadcast info?
######################################################################
this is receiver side presently i am try to implement feature is once the receiver side will syn to transmitter then i need to select the bis audio has the oled display menau showing select audio then the receiver side will play the audio
Receiver side flow you want:
Receiver scans & syncs to a transmitter (BIG sync established).
Once synced, your OLED menu shows “Select Audio”.
User selects a BIS index from the OLED.
Receiver starts playing that audio.
Your issue right now:
You’re not sure what is blocking this behavior (sync is happening, but audio selection/playback isn’t working).
Where the issue could be
I’ll break it down step by step:
:small_blue_diamond: 1. BIG Sync Success, but BIS not selected
After CAP_Broadcast_StartBIGSync() succeeds, the receiver is synced to BIG, but not yet subscribed to BIS indexes.
You must explicitly pass the selected BIS indexes + selected_count to the sync API.
If you hardcoded BIS index earlier, but now you want dynamic user selection → you need to stop BIG sync, update BIS selection, and restart OR implement runtime BIS switching.
:small_blue_diamond: 2. OLED menu integration
If your OLED shows “Select Audio” before BIG Sync is fully complete, the BIS handle may not be valid yet.
Sequence should be:
CAP_BROADCAST_BIG_SYNC_EVT → only then show menu.
After user chooses → call API again with chosen BIS index.
:small_blue_diamond: 3. Audio path setup
Even if BIS subscription works, check if:
The audio buffer/decoder is correctly bound to that BIS index.
PCM pipeline is reconfigured when switching BIS (some stacks only configure once).
:small_blue_diamond: 4. Encryption/Broadcast Code mismatch
If transmitter uses encryption (BAP_BROADCAST_ENCRYPTION enabled) → your receiver must provide the same broadcast code.
Wrong code = you’ll sync to BIG, but BIS data won’t decrypt → looks like “no audio”.
=== Available Languages ===
[0] Subgroup 0 → Language: eng (BIS count: 2)
[1] Subgroup 1 → Language: chi (BIS count: 2)
Select language index: 0
Selected subgroup 0 → BIS count: 2
BIS[0] = 0x01
BIS[1] = 0x02
Success: CAP_Broadcast_StartBIGSync() with 2 BIS
i am implementation for oled display to select the audio showing display
Got it :white_heavy_check_mark:
I’ve gone carefully through your logs and the issue is very clear:
Static BIS selection works fine (you hardcode bis_indexes[0] = 0x01; bis_indexes[1] = 0x02;)
Dynamic BIS selection is failing: after PA sync, your code doesn’t parse the BASE → subgroup → BIS correctly, so the receiver never proceeds to BIG sync & playback.
You want the receiver side to:
Parse the transmitter’s BASE (languages, subgroups, BIS indexes)
Show them on OLED menu (eng/chi etc.)
Allow joystick navigation and selection
Auto-select after 2s if user doesn’t choose
Pass chosen subgroup + BIS indexes dynamically to CAP_Broadcast_StartBIGSync()
Establish BIG sync → Setup codec → Play audio
:magnifying_glass_tilted_right: Why it is “stuck” at PA sync
From your logs:
CAP Event : 0x19 == CAP_BROADCAST_PA_SYNC_ESTABLISHED_EVT - SyncHandle : 0x00 PA sync established - preparing for language selection![]()
➡ At this point your code should immediately parse BASE report (CAP Event 0x1A) and show menu.
But currently your implementation only logs PA sync and doesn’t trigger menu + subgroup/BIS parsing.
That’s why it hangs.
:white_heavy_check_mark: Correct Flow for Dynamic BIS Selection (Receiver Side)
Receive PA sync event
Trigger Start BASE parsing (CAP_Broadcast_ParseBASEReport()).
Extract number of subgroups and BIS per subgroup.
Display Menu (OLED)
For each subgroup: map language metadata (0x656e67 = “eng”, 0x636869 = “chi”)
Show:
[0] English (BIS 1,2) [1] Chinese (BIS 3,4)
Wait joystick input (up/down/select).
Auto-selection Fallback
If no joystick press in 2 sec → auto-select subgroup 0 (default language).
Prepare BIS Index Array
uint8_t bis_indexes[2]; bis_indexes[0] = 0x01;//chosen->pBIS[0].BIS_Index; bis_indexes[1] = 0x02;//chosen->pBIS[1].BIS_Index;
it was hard coded bis selection only in static wise not dynamic selectionStart BIG Sync
CAP_Broadcast_StartBIGSync(sync_handle, num_bis, bis_indexes);
On BIG_SYNC_ESTABLISHED_EVT (0x1C)
Setup ISO data path
Start codec
Begin playback
:white_heavy_check_mark: Key Guarantees in this Implementation
Menu appears right after PA sync (0x19 event).
Dynamic parsing of BIS indexes from BASE, no hardcoding.
Auto-selection prevents deadlock if user doesn’t select.
BIG sync + ISO datapath start automatically after selection.
Logs for each step → easy debugging.
:backhand_index_pointing_right: Now, I need to confirm from you:
Do you want me to write the full integrated code (including OLED + joystick handling + auto-select timer) for your STM32WBA tmap_app.c, or just the dynamic BIS parsing + selection module so you can hook it into your existing menu system?

