LE Audio interoperability with non-Nordic device (nRF5340 Audio DK and Airoha AB156x)

Hi,

based on the nRF5340 Audio DK (nRF5340_AUDIO example: gateway, BIS) we send an LE Audio Stream.

As transceiver we use an Airoha AB156x based speaker:
SoC name    : ab156x_evb
SDK version : IoT_SDK_for_BT_Audio_V5.1.0.AB156x

The speaker is able to scan and select the stream but does not play.
I can play the stream wirh an nRF4340 headset or an Ellisys Bluetooth tracker, so I guess the stream is specification conform.
And the other way round the speaker can play a stream sent by a JBL Go 4.
So it seems to be an interoperability issue betwen the nRF and the Airoha setup.

Does anyone have experiences with interoperability with this setup?
Maybe there are config options modifying the transmitter to get the setup working.

I already tried to set:
CONFIG_BT_AUDIO_PRESENTATION_DELAY_US=40000
without success.

Best regards,
Tobias

Parents
  • Hi Tobias

    Have you tried the nRF Auraconfig tool? https://github.com/nrfconnect/sdk-nrf/tree/main/samples/bluetooth/nrf_auraconfig

    You can adjust different broadcast parameters in the nRF Auraconfig tool to at least figure out what's not working.

    Regards,
    Amanda H.

  • Hi Amanda,

    yes I tried the nRF Auraconfig tool as well.
    I tried to set the parameter to the same values as the JBL Go 4 stream:

    uart:~$ nac show
    BIG 0:
            Streaming: true
            Advertising name: NRF5340_BROADCASTER
            Broadcast name: NRF5340_BROADCASTER
            Broadcast ID (random): 0x177aa
            Packing: interleaved
            Encryption: false
            Broadcast code: Auratest
            Subgroup 0:
                    Preset: Custom
                            PHY: 2M
                            Framing: unframed
                            RTN: 4
                            SDU size: 100
                            Max Transport Latency: 65 ms
                            Frame Interval: 10000 us
                            Presentation Delay: 40000 us
                    Sampling rate: 48000 Hz
                    Bit rate: 80000 bps
                    Frame duration: 10000 us
                    Octets per frame: 100
                    Language: not_set
                    Context(s):
                            Media
                    Immediate rendering flag: not set
                    Number of BIS: 2
                    Location:
                            BIS 0: Front left
                            BIS 1: Front right
                    Files:
                            BIS 0: nRF_Aura_Config_Audio_Files/10ms/48000hz/80_kbps/left-channel_48kHz_left_80kbps_10ms.lc3 (looping)
                            BIS 1: nRF_Aura_Config_Audio_Files/10ms/48000hz/80_kbps/right-channel_48kHz_left_80kbps_10ms.lc3 (looping)
    uart:~$

    Regarding differeces to the JBL Go 4 stream there are 2 parameters:

    • ISO Interval: 20 ms
    • BN: 2



    With the Auraconfig tool I could not set these parameter to the same value.
    Is it possible to modify these parameters?


    Best regards,
    Tobias

  • These are set by the controller. The application can try to influence these, but does not have direct control over them. 

  • Ok, I could manage to set ISO interval = 20 ms and BN = 2.
    The stream still does not work.

    Meanwhile I tested a 3rd transmitter (UGREEN-BT701-Source).
    This transmitter is also working with the Airoha chipset.

    I tried to compare the config.
    I see a difference regarding the Advertising Address, nRF5340 send this in the primary advertising packet and the two others in secondary.

    I tried to configure sending AdvA in the Secondary packet, but it seems to be controlled by the stack.
    Do we have any options?


    Best regards,
    Tobias

  • Hello  ,

    I am interested about how you have succeeded to achieve an ISO interval of 20ms.

    We are trying to configure with 48_6_2 and an RTN of 4 but the softdevice controller select an RTN of 3 and still use ISO interval of 10ms. 

Reply Children
  • Hi Cyril,

    as far as I remember this requires modifications in src/bluetooth/bt_stream/broadcast/broadcast_source.c
    See the example code whrere CONFIG_BT_AUDIO_ISO_INTERVAL_US=20000.

    int broadcast_source_enable(struct broadcast_source_big const *const broadcast_param,
    			    uint8_t big_index)
    {
    	int ret;
    
    	if (big_index >= CONFIG_BT_ISO_MAX_BIG) {
    		LOG_ERR("Trying to set up %d BIGS, but only allocated memory for %d", big_index,
    			CONFIG_BT_ISO_MAX_BIG);
    		return -EINVAL;
    	}
    
    	if (!initialized) {
    		bt_le_audio_tx_init();
    	}
    
    	LOG_INF("Enabling broadcast_source %d", big_index);
    
    	ret = create_param_produce(big_index, broadcast_param, &create_param[big_index]);
    	if (ret) {
    		LOG_ERR("Failed to create the create_param: %d", ret);
    		return ret;
    	}
    
    	/* Register callbacks per stream */
    	for (size_t j = 0U; j < create_param[big_index].subgroup_count; j++) {
    		for (size_t k = 0; k < create_param[big_index].subgroup_params[j].stream_count;
    		     k++) {
    			bt_cap_stream_ops_register(
    				create_param[big_index].subgroup_params[j].stream_params[k].stream,
    				&stream_ops);
    		}
    	}
    
    	ret = bt_cap_initiator_broadcast_audio_create(&create_param[big_index],
    						      &broadcast_sources[big_index]);
    	if (ret) {
    		LOG_ERR("Failed to create broadcast source, ret: %d", ret);
    		return ret;
    	}
    
    #if defined(CONFIG_BT_ISO_TEST_PARAMS) && CONFIG_BT_AUDIO_ISO_INTERVAL_US > 0
    	{
    		// CAP layer does not forward BIG-level test params, so set
    		// them directly on the BAP source before starting the BIG.
    		// bt_cap_broadcast_source is opaque, but its first member is
    		// the bap_broadcast pointer.
    		struct bt_bap_broadcast_source *bap_src =
    			*(struct bt_bap_broadcast_source **)broadcast_sources[big_index];
    		uint16_t iso_interval_1_25ms =
    			CONFIG_BT_AUDIO_ISO_INTERVAL_US / 1250;
    		uint8_t bn = iso_interval_1_25ms /
    			     (CONFIG_AUDIO_FRAME_DURATION_US / 1250);
    		uint8_t irc = 1 + CONFIG_BT_AUDIO_RETRANSMITS;
    
    		bap_src->irc = irc;
    		bap_src->pto = 0;
    		bap_src->iso_interval = iso_interval_1_25ms;
    
    		LOG_INF("BIG test params: ISO_Interval=%u (%u.%u ms), BN=%u, "
    			"IRC=%u, NSE=%u, Max_PDU=%u",
    			iso_interval_1_25ms,
    			(iso_interval_1_25ms * 5) / 4,
    			((iso_interval_1_25ms * 5) % 4) * 25,
    			bn, irc, bn * irc, bap_src->qos->sdu);
    	}
    #endif
    
    	initialized = true;
    
    	LOG_DBG("Broadcast source enabled");
    
    	return 0;
    }

Related