I'm working on a product prototype using the nrf5340 audio dk to send audio via Auracast. We started from the nrf5340_audio application, as it implements a large fraction of what we need already.
The main thing we're missing is multiple BIGs (not arbitrarily many, 2 is fine). After adjusting some KConfig parameters I've been able to use the `broadcast_source.c` code to _create_ a second broadcaster and populate the external/periodic advertising data. But when I try to actually start advertising with `bt_mgmt_adv_start`, I'm getting `-5` (`-EIO`) back.
Having added some logging and stepped through a bit with a debugger, I find that the error code ultimately shows up in `bt_hci_cmd_send_sync`. Here are the final log entries I see before the error:
GW [00:00:00.362,152] <inf> bt_connection_manager: set initial broadcast name 'castaura' (9 chars) GW [00:00:00.362,182] <dbg> broadcast_source: broadcast_source_enable: Callbacks already registered GW [00:00:00.362,304] <dbg> bt_bap_broadcast_source: broadcast_source_ep_init: ep 0x2001149c GW [00:00:00.362,335] <dbg> bt_bap_iso: bt_bap_iso_bind_ep: iso 0x2001022c ep 0x2001149c dir source GW [00:00:00.362,365] <dbg> bt_bap_broadcast_source: broadcast_source_ep_init: ep 0x20011558 GW [00:00:00.362,396] <dbg> bt_bap_iso: bt_bap_iso_bind_ep: iso 0x2001028c ep 0x20011558 dir source GW [00:00:00.362,396] <dbg> bt_bap_broadcast_source: broadcast_source_set_ep_state: ep 0x2001149c id 0x00 idle -> qos-configured GW [00:00:00.362,426] <dbg> bt_bap_broadcast_source: broadcast_source_set_ep_state: ep 0x20011558 id 0x00 idle -> qos-configured GW [00:00:00.362,457] <inf> broadcast_source: Created: 0x20011a80 castaura GW [00:00:00.362,457] <dbg> bt_connection_manager: ext_adv_populate: Using FICR ID GW [00:00:00.362,701] <inf> broadcast_source: castaura GW [00:00:00.362,731] <dbg> bt_connection_manager: ext_adv_populate: Size of adv data: 32, num_elements: 4 GW [00:00:00.362,731] <dbg> bt_connection_manager: per_adv_populate: Size of per adv data: 8, num_elements: 1 GW [00:00:00.363,739] <wrn> bt_hci_core: opcode 0x2036 status 0x07 GW [00:00:00.363,891] <err> bt_mgmt_adv: Unable to create extended advertising set: -5 GW [00:00:00.363,891] <err> bt_connection_manager: Failed to start advertiser GW [00:00:00.363,891] <err> bt_connection_manager: ERR_CHK Err_code: [-5] @ line: 133
(note that `bt_connection_manager` seen in the logs is just a cosmetic change for a more convenient interface, the `ext_adv_populate`, `per_adv_populate` functions have not been altered from the example nrf5340_audio application)
Does anybody know what kind of limitation I'm bumping up against here? I see that the nrf_auraconfig sample application is "meant to be used with maximum two BIG with four BIS streams each", and uses the same `bt_mgmt_adv_start` from the code for the nrf5340_audio application to begin the advertising, so it seems that this should be possible.
My prj.conf looks like:#
# Copyright (c) 2022 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
# nRF5340 Audio
CONFIG_NRF5340_AUDIO=y
CONFIG_SAMPLE_RATE_CONVERTER=y
CONFIG_SAMPLE_RATE_CONVERTER_FILTER_SIMPLE=y
CONFIG_AUDIO_SOURCE_I2S=y
CONFIG_TRANSPORT_BIS=y
# General
CONFIG_DEBUG=y
CONFIG_DEBUG_INFO=y
CONFIG_ASSERT=y
CONFIG_STACK_USAGE=y
CONFIG_THREAD_RUNTIME_STATS=y
CONFIG_STACK_SENTINEL=y
CONFIG_INIT_STACKS=y
CONFIG_BT=y
CONFIG_NET_BUF_POOL_USAGE=y
CONFIG_BROADCAST_SOURCE_LOG_LEVEL_DBG=y
CONFIG_BT_BAP_BROADCAST_SOURCE_LOG_LEVEL_DBG=y
CONFIG_BT_HCI_CORE_LOG_LEVEL_DBG=y
# Uart driver
CONFIG_SERIAL=y
# Logging
CONFIG_LOG=y
CONFIG_LOG_TAG_MAX_LEN=2
CONFIG_LOG_TAG_DEFAULT="--"
CONFIG_LOG_BACKEND_UART=y
CONFIG_LOG_BUFFER_SIZE=4096
CONFIG_BT_SECURITY_ERR_TO_STR=y
# Use this for debugging thread usage
#CONFIG_LOG_THREAD_ID_PREFIX=y
# Console related defines
CONFIG_CONSOLE=y
CONFIG_RTT_CONSOLE=y
CONFIG_UART_CONSOLE=y
# Shell related defines
CONFIG_SHELL=y
CONFIG_KERNEL_SHELL=y
CONFIG_USE_SEGGER_RTT=y
## Disable logs on RTT
CONFIG_SHELL_RTT_INIT_LOG_LEVEL_NONE=y
CONFIG_SHELL_BACKEND_RTT=y
CONFIG_SHELL_BACKEND_SERIAL=n
CONFIG_SHELL_VT100_COMMANDS=y
CONFIG_SHELL_VT100_COLORS=y
CONFIG_SHELL_STACK_SIZE=4096
CONFIG_SHELL_CMD_BUFF_SIZE=128
## Reduce shell memory usage
CONFIG_SHELL_WILDCARD=n
CONFIG_SHELL_HELP_ON_WRONG_ARGUMENT_COUNT=n
CONFIG_SHELL_STATS=n
CONFIG_SHELL_CMDS=n
CONFIG_SHELL_HISTORY=y
# Turn off default shell commands
CONFIG_I2C_SHELL=n
CONFIG_HWINFO_SHELL=n
CONFIG_CLOCK_CONTROL_NRF_SHELL=n
CONFIG_FLASH_SHELL=n
CONFIG_DEVICE_SHELL=n
# Suppress LOG_ERR messages from sd_check_card_type. Because SPI_SDHC has no card presence method,
# assume card is in slot. Thus error message is always shown if card is not inserted
CONFIG_SD_LOG_LEVEL_OFF=y
# Suppress LOG_INF messages from hci_core
CONFIG_BT_HCI_CORE_LOG_LEVEL_WRN=y
# BT related configs
CONFIG_BT_ISO_TX_BUF_COUNT=12
CONFIG_BT_BUF_ACL_TX_COUNT=6
CONFIG_BT_ATT_TX_COUNT=24
CONFIG_BT_AUDIO_BROADCAST_NAME="auracast"
CONFIG_BT_AUDIO_BROADCAST_NAME_ALT="castaura"
CONFIG_BT_DEVICE_NAME_DYNAMIC=y
CONFIG_BT_CAP_INITIATOR=y
CONFIG_BT_MGMT_LOG_LEVEL_INF=y
CONFIG_BT_MGMT_SCAN_LOG_LEVEL_DBG=y
CONFIG_AURACAST=y
# Enable UART
CONFIG_SERIAL=y
CONFIG_UART_ASYNC_API=y
and the overlay for the broadcaster:
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
CONFIG_TRANSPORT_BIS=y
CONFIG_AUDIO_DEV=2
CONFIG_BT_CAP_INITIATOR=y
CONFIG_BT_AUDIO=y
CONFIG_BT_AUDIO_BROADCAST_CONFIGURABLE=y
CONFIG_BT_DEVICE_APPEARANCE=2181
CONFIG_BT_ISO_BROADCASTER=y
CONFIG_BT_BAP_BROADCAST_SOURCE=y
CONFIG_BT_BAP_BROADCAST_SRC_COUNT=2
CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT=8
CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT=4
CONFIG_BT_ISO_BROADCASTER=y
CONFIG_BT_ISO_MAX_CHAN=10
CONFIG_BT_ISO_MAX_BIG=2
CONFIG_BT_EXT_ADV_MAX_ADV_SET=4
CONFIG_EXT_ADV_BUF_MAX=40
CONFIG_LC3_ENC_CHAN_MAX=4
CONFIG_AUDIO_ENCODE_CHANNELS_MAX=4
CONFIG_ENTROPY_GENERATOR=y
CONFIG_BT_ISO_TX_BUF_COUNT=24
CONFIG_BT_BUF_ACL_TX_COUNT=12
CONFIG_BT_BUF_EVT_RX_COUNT=24
# additional debug output
CONFIG_BT_BAP_ISO_LOG_LEVEL_DBG=y