2025-09-25 2:28 AM
hi
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).
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.
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.
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).
I’ll break it down step by step:
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.
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.
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).
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
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.
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 selection
Start 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
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?