cancel
Showing results for 
Search instead for 
Did you mean: 

Receiver unable to properly connect/sync with transmitter BIS and play selected audio streams.

jeevanmv1998
Associate II

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.qqqqqqqqqqqqqqqqqqq.png

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:

    1. Parse the transmitter’s BASE (languages, subgroups, BIS indexes)

    2. Show them on OLED menu (eng/chi etc.)

    3. Allow joystick navigation and selection

    4. Auto-select after 2s if user doesn’t choose

    5. Pass chosen subgroup + BIS indexes dynamically to CAP_Broadcast_StartBIGSync()

    6. 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


Media(2).jpeg

➡ 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)

  1. Receive PA sync event

    • Trigger Start BASE parsing (CAP_Broadcast_ParseBASEReport()).

    • Extract number of subgroups and BIS per subgroup.

  2. 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).

  3. Auto-selection Fallback

    • If no joystick press in 2 sec → auto-select subgroup 0 (default language).

  4. 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 
  5. Start BIG Sync

    CAP_Broadcast_StartBIGSync(sync_handle, num_bis, bis_indexes);
  6. 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?

11 REPLIES 11

Thank you Tom, I'll try it now. 
Can you share me the Github repository current commit where you are working on if you can, so that I can continue from there. Because I don't have time.

- Jeevan

TPITEL
ST Employee

I'm not working on a public git branch so I won't be able to share it to you unfortunately..