Hi Nordic team,
I’m building an LE Audio gateway on the nRF5340 DK using the TMAP_Central sample (NCS v3.0.2, with minor local changes). The setup captures audio, encodes it to LC3, and streams it to headsets.
With Sony Inzone, everything works correctly and audio is heard.
With EarFun Air Pro 4, the control procedure completes (PAC discovery → codec config → QoS → Enable → CIS → Streaming), but no audio is heard.
Initial issue
At first, PAC discovery failed due to a metadata length mismatch:
TMAS discovery done [00:00:37.757,141] <dbg> bt_gatt: bt_gatt_write: handle 0x0088 length 2 [00:00:38.006,408] <dbg> bt_gatt: gatt_write_rsp: err 0 [00:00:38.006,408] <dbg> bt_gatt: att_err_from_int: 0 ... ... ... [00:00:40.756,713] <dbg> bt_bap_unicast_client: unicast_client_read_func: pac #1/1 [00:00:40.756,713] <dbg> bt_bap_unicast_client: unicast_client_set_codec_cap: codec id 0x06 cid 0x0000 vid 0x0000 data_len 19 meta_len 20 [00:00:40.756,744] <err> bt_bap_unicast_client: Unable to parse Codec [00:00:40.756,774] <dbg> bt_bap_unicast_client: unicast_client_read_func: Failed to process all PAC records (0/1) Discovery failed: 4 TMAS discovery done [00:00:37.757,141] <dbg> bt_gatt: bt_gatt_write: handle 0x0088 length 2 [00:00:38.006,408] <dbg> bt_gatt: gatt_write_rsp: err 0 [00:00:38.006,408] <dbg> bt_gatt: att_err_from_int: 0 ... ... ... [00:00:40.756,713] <dbg> bt_bap_unicast_client: unicast_client_read_func: pac #1/1 [00:00:40.756,713] <dbg> bt_bap_unicast_client: unicast_client_set_codec_cap: codec id 0x06 cid 0x0000 vid 0x0000 data_len 19 meta_len 20 [00:00:40.756,744] <err> bt_bap_unicast_client: Unable to parse Codec [00:00:40.756,774] <dbg> bt_bap_unicast_client: unicast_client_read_func: Failed to process all PAC records (0/1) Discovery failed: 4
I resolved this by increasing:
CONFIG_BT_AUDIO_CODEC_CAP_MAX_METADATA_SIZE=20
Current issue
After this fix, the stream starts successfully but still no audio plays on the EarFun headset.
Here’s a trimmed log when the stream starts:Attempt to connect!
MTU exchanged: 23/23
[00:00:07.375,183] <dbg> bt_gatt: bt_gatt_connected: conn 0x200031a8
[00:00:07.375,274] <dbg> bt_gatt: gatt_exchange_mtu_encode: Client MTU 247
Connected to headset 0: 70:5A:6F:6B:3E:A3 (public)
...
...
[00:00:08.077,545] <dbg> bt_gatt: gatt_find_type_rsp: err 0
[00:00:08.077,575] <dbg> bt_gatt: gatt_find_type_rsp: start_handle 0x0083 end_handle 0x008b
[00:00:08.077,575] <dbg> bt_gatt: gatt_read_type: start_handle 0x0084 end_handle 0x008b
[00:00:08.147,613] <dbg> bt_gatt: bt_gatt_attr_read: handle 0x0000 offset 0 length 1
Security changed: 0
[00:00:10.307,861] <dbg> bt_gatt: gatt_find_type_encode: uuid 1855 start_handle 0x0001 end_handle 0xffff
[00:00:10.409,545] <dbg> bt_gatt: gatt_write_ccc_rsp: err 0
[00:00:10.409,545] <dbg> bt_gatt: att_err_from_int: 0
[00:00:10.507,751] <dbg> bt_gatt: gatt_write_ccc_rsp: err 0
[00:00:10.507,751] <dbg> bt_gatt: att_err_from_int: 0
[00:00:10.607,757] <dbg> bt_gatt: gatt_find_type_rsp: err 0
[00:00:10.607,757] <dbg> bt_gatt: gatt_find_type_rsp: start_handle 0x008c end_handle 0x008e
[00:00:10.607,788] <dbg> bt_tmap: discover_func: Discovered TMAS
...
...
...
TMAS discovery done
[00:00:10.807,678] <dbg> bt_gatt: bt_gatt_write: handle 0x0088 length 2
[00:00:10.907,501] <dbg> bt_gatt: gatt_write_rsp: err 0
[00:00:10.907,501] <dbg> bt_gatt: att_err_from_int: 0
[00:00:10.908,111] <dbg> bt_gatt: bt_gatt_notification: handle 0x0085 length 3
discover_sinks
[00:00:12.807,952] <dbg> bt_gatt: gatt_read_type: start_handle 0x0001 end_handle 0xffff
[00:00:12.958,221] <dbg> bt_gatt: gatt_read_type_rsp: err 0
[00:00:12.958,282] <dbg> bt_gatt: parse_characteristic: handle 0x0002 uuid 2a05 properties 0x20
[00:00:12.958,343] <dbg> bt_gatt: parse_characteristic: handle 0x0005 uuid 2b29 properties 0x0a
[00:00:12.958,374] <dbg> bt_gatt: parse_characteristic: handle 0x0007 uuid 2b2a properties 0x02
...
...
[00:00:13.459,930] <dbg> bt_gatt: parse_characteristic: handle 0x0056 uuid 2a19 properties 0x12
[00:00:13.459,991] <dbg> bt_gatt: parse_characteristic: handle 0x005b uuid 2bc3 properties 0x1a
[00:00:13.460,021] <dbg> bt_gatt: parse_characteristic: handle 0x005f uuid 2bc9 properties 0x12
[00:00:13.460,083] <dbg> bt_bap_unicast_client: unicast_client_pac_discover_cb: conn 0x200031a8 attr 0x2000da94 handle 0x0060 dir sink
[00:00:13.460,083] <dbg> bt_gatt: bt_gatt_read: handle 0x0060
data: type 0x04 value_len 4
--- 19 messages dropped ---
4b009b00
data: type 0x05 value_len 1
02
meta: type 0x01 value_len 2
0800
meta: type 0xff value_len 14
0a000b1001020000000000000000
...
...
...
Sink discover complete
discover_sources
[00:00:20.157,745] <dbg> bt_gatt: gatt_read_type: start_handle 0x0001 end_handle 0xffff
[00:00:20.259,765] <dbg> bt_gatt: gatt_read_type_rsp: err 0
[00:00:20.259,857] <dbg> bt_gatt: parse_characteristic: handle 0x0002 uuid 2a05 properties 0x20
[00:00:20.259,918] <dbg> bt_gatt: parse_characteristic: handle 0x0005 uuid 2b29 properties 0x0a
[00:00:20.259,979] <dbg> bt_gatt: parse_characteristic: handle 0x0007 uuid 2b2a properties 0x02
[00:00:20.260,009] <dbg> bt_gatt: parse_characteristic: handle 0x0009 uuid 2b3a properties 0x02
[00:00:20.260,070] <dbg> bt_gatt: parse_characteristic: handle 0x000c uuid 2a00 properties 0x02
[00:00:20.260,131] <dbg> bt_gatt: parse
...
...
Enabled stream 0x20005c78
[00:00:26.408,447] <dbg> bt_cap_initiator: bt_cap_initiator_enabled: cap_stream 0x20005c78
[00:00:26.408,477] <dbg> bt_cap_initiator: update_proc_done_cnt: proc 1 subproc 3: 1/1
[00:00:26.408,477] <dbg> bt_cap_initiator: bt_cap_initiator_enabled: Stream 0x20005c78 enabled (1/1 streams done)
[00:00:26.408,508] <dbg> bt_bap_unicast_client: bt_bap_unicast_client_connect: stream 0x20005c78
[00:00:26.408,538] <dbg> bt_bap_unicast_client: bt_bap_unicast_client_connect: stream 0x20005c78 iso 0x20006d28
[00:00:26.614,868] <dbg> bt_bap_unicast_client: unicast_client_ep_iso_connected: stream 0x20005c78 ep 0x20003d54 dir sink receiver_ready 0
[00:00:26.614,898] <dbg> bt_cap_initiator: bt_cap_initiator_connected: cap_stream 0x20005c78
[00:00:26.614,929] <dbg> bt_cap_initiator: update_proc_done_cnt: proc 1 subproc 4: 1/1
[00:00:26.614,929] <dbg> bt_cap_initiator: bt_cap_initiator_connected: Stream 0x20005c78 connected (1/1 streams done)
[00:00:26.657,623] <dbg> bt_gatt: bt_gatt_notification: handle 0x009b length 20
[00:00:26.657,653] <dbg> bt_bap_unicast_client: unicast_client_ep_notify: conn 0x200031a8 ep 0x20003d54 len 20
[00:00:26.657,745] <dbg> bt_bap_unicast_client: unicast_client_ep_set_status: ep 0x20003d54 handle 0x009b id 0x01 dir sink state enabling -> streaming
[00:00:26.657,775] <dbg> bt_bap_unicast_client: unicast_client_ep_streaming_state: dir sink cig 0x00 cis 0x00
Started stream 0x20005c78
[00:00:26.657,806] <dbg> bt_cap_initiator: bt_cap_initiator_started: cap_stream 0x20005c78
[00:00:26.657,836] <dbg> bt_cap_initiator: update_proc_done_cnt: proc 1 subproc 5: 1/1
[00:00:26.657,836] <dbg> bt_cap_initiator: bt_cap_initiator_started: Stream 0x20005c78 started (1/1 streams done)
Additional info
Attached: Screenshot of the headset profile UUIDs from nRF Connect.
Question
For single-MAC TWS earbuds, is the host expected to always send mono (with earbuds duplicating internally), or are there cases where the host must stream stereo?
Any insights on why streaming starts but no audio is heard would be very helpful.
Thanks in advance!