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

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?

0 REPLIES 0