1 /*
2  * Copyright (c) 2022-2024 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <errno.h>
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <string.h>
11 
12 #include <zephyr/autoconf.h>
13 #include <zephyr/bluetooth/audio/audio.h>
14 #include <zephyr/bluetooth/audio/bap.h>
15 #include <zephyr/bluetooth/audio/bap_lc3_preset.h>
16 #include <zephyr/bluetooth/bluetooth.h>
17 #include <zephyr/bluetooth/byteorder.h>
18 #include <zephyr/bluetooth/crypto.h>
19 #include <zephyr/bluetooth/gap.h>
20 #include <zephyr/bluetooth/iso.h>
21 #include <zephyr/bluetooth/uuid.h>
22 #include <zephyr/device.h>
23 #include <zephyr/devicetree.h>
24 #include <zephyr/drivers/usb/udc_buf.h>
25 #include <zephyr/kernel.h>
26 #include <zephyr/net_buf.h>
27 #include <zephyr/sys/__assert.h>
28 #include <zephyr/sys/printk.h>
29 #include <zephyr/sys/util.h>
30 #include <zephyr/sys_clock.h>
31 #include <zephyr/toolchain.h>
32 #include <zephyr/usb/class/usbd_uac2.h>
33 #include <zephyr/usb/usbd.h>
34 
35 BUILD_ASSERT(strlen(CONFIG_BROADCAST_CODE) <= BT_ISO_BROADCAST_CODE_SIZE, "Invalid broadcast code");
36 
37 /* When BROADCAST_ENQUEUE_COUNT > 1 we can enqueue enough buffers to ensure that
38  * the controller is never idle
39  */
40 #define BROADCAST_ENQUEUE_COUNT 3U
41 #define TOTAL_BUF_NEEDED        (BROADCAST_ENQUEUE_COUNT * CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT)
42 
43 BUILD_ASSERT(CONFIG_BT_ISO_TX_BUF_COUNT >= TOTAL_BUF_NEEDED,
44 	     "CONFIG_BT_ISO_TX_BUF_COUNT should be at least "
45 	     "BROADCAST_ENQUEUE_COUNT * CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT");
46 
47 #if defined(CONFIG_BAP_BROADCAST_16_2_1)
48 
49 static struct bt_bap_lc3_preset preset_active = BT_BAP_LC3_BROADCAST_PRESET_16_2_1(
50 	BT_AUDIO_LOCATION_FRONT_LEFT | BT_AUDIO_LOCATION_FRONT_RIGHT,
51 	BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
52 
53 #define BROADCAST_SAMPLE_RATE 16000
54 
55 #elif defined(CONFIG_BAP_BROADCAST_24_2_1)
56 
57 static struct bt_bap_lc3_preset preset_active = BT_BAP_LC3_BROADCAST_PRESET_24_2_1(
58 	BT_AUDIO_LOCATION_FRONT_LEFT | BT_AUDIO_LOCATION_FRONT_RIGHT,
59 	BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
60 
61 #define BROADCAST_SAMPLE_RATE 24000
62 
63 #endif
64 
65 #if defined(CONFIG_BAP_BROADCAST_16_2_1)
66 #define MAX_SAMPLE_RATE 16000
67 #elif defined(CONFIG_BAP_BROADCAST_24_2_1)
68 #define MAX_SAMPLE_RATE 24000
69 #endif
70 #define MAX_FRAME_DURATION_US 10000
71 #define MAX_NUM_SAMPLES       ((MAX_FRAME_DURATION_US * MAX_SAMPLE_RATE) / USEC_PER_SEC)
72 
73 #if defined(CONFIG_LIBLC3)
74 #include "lc3.h"
75 
76 #if defined(CONFIG_USE_USB_AUDIO_INPUT)
77 #include <zephyr/usb/usb_device.h>
78 #include <zephyr/usb/class/usb_audio.h>
79 #include <zephyr/sys/ring_buffer.h>
80 
81 #include <sample_usbd.h>
82 
83 /* USB Audio Data is downsampled from 48kHz to match broadcast preset when receiving data */
84 #define USB_SAMPLE_RATE           48000
85 #define USB_DOWNSAMPLE_RATE       BROADCAST_SAMPLE_RATE
86 #define USB_FRAME_DURATION_US     1000
87 #define USB_SAMPLE_CNT            ((USB_FRAME_DURATION_US * USB_SAMPLE_RATE) / USEC_PER_SEC)
88 #define USB_DOWNSSAMPLE_CNT       ((USB_FRAME_DURATION_US * USB_DOWNSAMPLE_RATE) / USEC_PER_SEC)
89 #define USB_BYTES_PER_SAMPLE      2
90 #define USB_CHANNELS              2
91 #define USB_MONO_FRAME_SIZE       (USB_SAMPLE_CNT * USB_BYTES_PER_SAMPLE)
92 /* The number of samples received may be USB_SAMPLE_CNT -+ 1 */
93 #define USB_MAX_MONO_FRAME_SIZE   ((USB_SAMPLE_CNT + 1) * USB_BYTES_PER_SAMPLE)
94 #define USB_STEREO_FRAME_SIZE     (USB_MONO_FRAME_SIZE * USB_CHANNELS)
95 #define USB_MAX_STEREO_FRAME_SIZE (USB_MAX_MONO_FRAME_SIZE * USB_CHANNELS)
96 #define USB_ENQUEUE_COUNT         30U /* 30 times 1ms frames => 30ms */
97 
98 #define RING_BUF_USB_FRAMES  20
99 #define AUDIO_RING_BUF_BYTES (USB_DOWNSSAMPLE_CNT * USB_BYTES_PER_SAMPLE * RING_BUF_USB_FRAMES)
100 #else /* !defined(CONFIG_USE_USB_AUDIO_INPUT) */
101 
102 #include <math.h>
103 
104 #define AUDIO_VOLUME            (INT16_MAX - 3000) /* codec does clipping above INT16_MAX - 3000 */
105 #define AUDIO_TONE_FREQUENCY_HZ 400
106 
107 /**
108  * Use the math lib to generate a sine-wave using 16 bit samples into a buffer.
109  *
110  * @param buf Destination buffer
111  * @param length_us Length of the buffer in microseconds
112  * @param frequency_hz frequency in Hz
113  * @param sample_rate_hz sample-rate in Hz.
114  */
fill_audio_buf_sin(int16_t * buf,int length_us,int frequency_hz,int sample_rate_hz)115 static void fill_audio_buf_sin(int16_t *buf, int length_us, int frequency_hz, int sample_rate_hz)
116 {
117 	const int sine_period_samples = sample_rate_hz / frequency_hz;
118 	const unsigned int num_samples = (length_us * sample_rate_hz) / USEC_PER_SEC;
119 	const float step = 2 * 3.1415f / sine_period_samples;
120 
121 	for (unsigned int i = 0; i < num_samples; i++) {
122 		const float sample = sinf(i * step);
123 
124 		buf[i] = (int16_t)(AUDIO_VOLUME * sample);
125 	}
126 }
127 #endif /* defined(CONFIG_USE_USB_AUDIO_INPUT) */
128 #endif /* defined(CONFIG_LIBLC3) */
129 
130 static struct broadcast_source_stream {
131 	struct bt_bap_stream stream;
132 	uint16_t seq_num;
133 	size_t sent_cnt;
134 #if defined(CONFIG_LIBLC3)
135 	lc3_encoder_t lc3_encoder;
136 #if defined(CONFIG_BAP_BROADCAST_16_2_1)
137 	lc3_encoder_mem_16k_t lc3_encoder_mem;
138 #elif defined(CONFIG_BAP_BROADCAST_24_2_1)
139 	lc3_encoder_mem_48k_t lc3_encoder_mem;
140 #endif
141 #if defined(CONFIG_USE_USB_AUDIO_INPUT)
142 	struct ring_buf audio_ring_buf;
143 	uint8_t _ring_buffer_memory[AUDIO_RING_BUF_BYTES];
144 #endif /* defined(CONFIG_USE_USB_AUDIO_INPUT) */
145 #endif /* defined(CONFIG_LIBLC3) */
146 } streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT];
147 static struct bt_bap_broadcast_source *broadcast_source;
148 
149 NET_BUF_POOL_FIXED_DEFINE(tx_pool, TOTAL_BUF_NEEDED, BT_ISO_SDU_BUF_SIZE(CONFIG_BT_ISO_TX_MTU),
150 			  CONFIG_BT_CONN_TX_USER_DATA_SIZE, NULL);
151 
152 static int16_t send_pcm_data[MAX_NUM_SAMPLES];
153 static uint16_t seq_num;
154 static bool stopping;
155 
156 static K_SEM_DEFINE(sem_started, 0U, 1U);
157 static K_SEM_DEFINE(sem_stopped, 0U, 1U);
158 
159 #define BROADCAST_SOURCE_LIFETIME 120U /* seconds */
160 
161 #if defined(CONFIG_LIBLC3)
162 static int freq_hz;
163 static int frame_duration_us;
164 static int frames_per_sdu;
165 static int octets_per_frame;
166 
167 static K_SEM_DEFINE(lc3_encoder_sem, 0U, TOTAL_BUF_NEEDED);
168 #endif
169 
send_data(struct broadcast_source_stream * source_stream)170 static void send_data(struct broadcast_source_stream *source_stream)
171 {
172 	struct bt_bap_stream *stream = &source_stream->stream;
173 	struct net_buf *buf;
174 	int ret;
175 
176 	if (stopping) {
177 		return;
178 	}
179 
180 	buf = net_buf_alloc(&tx_pool, K_FOREVER);
181 	if (buf == NULL) {
182 		printk("Could not allocate buffer when sending on %p\n", stream);
183 		return;
184 	}
185 
186 	net_buf_reserve(buf, BT_ISO_CHAN_SEND_RESERVE);
187 #if defined(CONFIG_LIBLC3)
188 	uint8_t lc3_encoded_buffer[preset_active.qos.sdu];
189 
190 	if (source_stream->lc3_encoder == NULL) {
191 		printk("LC3 encoder not setup, cannot encode data.\n");
192 		net_buf_unref(buf);
193 		return;
194 	}
195 
196 #if defined(CONFIG_USE_USB_AUDIO_INPUT)
197 	uint32_t size = ring_buf_get(&source_stream->audio_ring_buf, (uint8_t *)send_pcm_data,
198 				     sizeof(send_pcm_data));
199 
200 	if (size < sizeof(send_pcm_data)) {
201 		const size_t padding_size = sizeof(send_pcm_data) - size;
202 
203 		printk("Not enough bytes ready, padding %d!\n", padding_size);
204 		memset(&((uint8_t *)send_pcm_data)[size], 0, padding_size);
205 	}
206 #endif
207 
208 	ret = lc3_encode(source_stream->lc3_encoder, LC3_PCM_FORMAT_S16, send_pcm_data, 1,
209 			 octets_per_frame, lc3_encoded_buffer);
210 	if (ret == -1) {
211 		printk("LC3 encoder failed - wrong parameters?: %d", ret);
212 		net_buf_unref(buf);
213 		return;
214 	}
215 
216 	net_buf_add_mem(buf, lc3_encoded_buffer, preset_active.qos.sdu);
217 #else
218 	net_buf_add_mem(buf, send_pcm_data, preset_active.qos.sdu);
219 #endif /* defined(CONFIG_LIBLC3) */
220 
221 	ret = bt_bap_stream_send(stream, buf, source_stream->seq_num++);
222 	if (ret < 0) {
223 		/* This will end broadcasting on this stream. */
224 		printk("Unable to broadcast data on %p: %d\n", stream, ret);
225 		net_buf_unref(buf);
226 		return;
227 	}
228 
229 	source_stream->sent_cnt++;
230 	if ((source_stream->sent_cnt % 1000U) == 0U) {
231 		printk("Stream %p: Sent %u total ISO packets\n", stream, source_stream->sent_cnt);
232 	}
233 }
234 
235 #if defined(CONFIG_LIBLC3)
init_lc3_thread(void * arg1,void * arg2,void * arg3)236 static void init_lc3_thread(void *arg1, void *arg2, void *arg3)
237 {
238 	const struct bt_audio_codec_cfg *codec_cfg = &preset_active.codec_cfg;
239 	int ret;
240 
241 	ret = bt_audio_codec_cfg_get_freq(codec_cfg);
242 	if (ret > 0) {
243 		freq_hz = bt_audio_codec_cfg_freq_to_freq_hz(ret);
244 	} else {
245 		return;
246 	}
247 
248 	ret = bt_audio_codec_cfg_get_frame_dur(codec_cfg);
249 	if (ret > 0) {
250 		frame_duration_us = bt_audio_codec_cfg_frame_dur_to_frame_dur_us(ret);
251 	} else {
252 		printk("Error: Frame duration not set, cannot start codec.");
253 		return;
254 	}
255 
256 	octets_per_frame = bt_audio_codec_cfg_get_octets_per_frame(codec_cfg);
257 	frames_per_sdu = bt_audio_codec_cfg_get_frame_blocks_per_sdu(codec_cfg, true);
258 
259 	if (freq_hz < 0) {
260 		printk("Error: Codec frequency not set, cannot start codec.");
261 		return;
262 	}
263 
264 	if (frame_duration_us < 0) {
265 		printk("Error: Frame duration not set, cannot start codec.");
266 		return;
267 	}
268 
269 	if (octets_per_frame < 0) {
270 		printk("Error: Octets per frame not set, cannot start codec.");
271 		return;
272 	}
273 
274 #if !defined(CONFIG_USE_USB_AUDIO_INPUT)
275 	/* If USB is not used as a sound source, generate a sine wave */
276 	fill_audio_buf_sin(send_pcm_data, frame_duration_us, AUDIO_TONE_FREQUENCY_HZ, freq_hz);
277 #endif
278 
279 	/* Create the encoder instance. This shall complete before stream_started() is called. */
280 	for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) {
281 		printk("Initializing lc3 encoder for stream %zu\n", i);
282 		streams[i].lc3_encoder = lc3_setup_encoder(frame_duration_us, freq_hz, 0,
283 							   &streams[i].lc3_encoder_mem);
284 
285 		if (streams[i].lc3_encoder == NULL) {
286 			printk("ERROR: Failed to setup LC3 encoder - wrong parameters?\n");
287 		}
288 	}
289 
290 	while (true) {
291 		for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) {
292 			k_sem_take(&lc3_encoder_sem, K_FOREVER);
293 		}
294 		for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) {
295 			send_data(&streams[i]);
296 		}
297 	}
298 }
299 
300 #define LC3_ENCODER_STACK_SIZE 4 * 4096
301 #define LC3_ENCODER_PRIORITY   5
302 
303 K_THREAD_DEFINE(encoder, LC3_ENCODER_STACK_SIZE, init_lc3_thread, NULL, NULL, NULL,
304 		LC3_ENCODER_PRIORITY, 0, -1);
305 
306 #if defined(CONFIG_USE_USB_AUDIO_INPUT)
307 /* Allocate 3: 1 for USB to receive data to and 2 additional buffers to prevent out of memory
308  * errors when USB host decides to perform rapid terminal enable/disable cycles.
309  */
310 K_MEM_SLAB_DEFINE_STATIC(usb_in_buf_pool, USB_MAX_STEREO_FRAME_SIZE, 3, UDC_BUF_ALIGN);
311 static bool terminal_enabled;
312 
terminal_update_cb(const struct device * dev,uint8_t terminal,bool enabled,bool microframes,void * user_data)313 static void terminal_update_cb(const struct device *dev, uint8_t terminal, bool enabled,
314 			       bool microframes, void *user_data)
315 {
316 	terminal_enabled = enabled;
317 }
318 
uac2_sof_cb(const struct device * dev,void * user_data)319 static void uac2_sof_cb(const struct device *dev, void *user_data)
320 {
321 	/* no-op, but has to be registered */
322 }
323 
get_recv_buf_cb(const struct device * dev,uint8_t terminal,uint16_t size,void * user_data)324 static void *get_recv_buf_cb(const struct device *dev, uint8_t terminal, uint16_t size,
325 			     void *user_data)
326 {
327 	void *buf = NULL;
328 	int ret;
329 
330 	if (!terminal_enabled) {
331 		return NULL;
332 	}
333 
334 	__ASSERT(size <= USB_MAX_STEREO_FRAME_SIZE, "%u was not <= %d", size,
335 		 USB_MAX_STEREO_FRAME_SIZE);
336 
337 	ret = k_mem_slab_alloc(&usb_in_buf_pool, &buf, K_NO_WAIT);
338 	if (ret != 0) {
339 		printk("Failed to allocate buffer: %d\n", ret);
340 	}
341 
342 	return buf;
343 }
344 
data_recv_cb(const struct device * dev,uint8_t terminal,void * buf,uint16_t size,void * user_data)345 static void data_recv_cb(const struct device *dev, uint8_t terminal, void *buf, uint16_t size,
346 			 void *user_data)
347 {
348 	int16_t usb_pcm_data[USB_CHANNELS][USB_DOWNSSAMPLE_CNT];
349 	int nsamples, ratio;
350 	static int count;
351 	int16_t *pcm;
352 
353 	if (!terminal_enabled || buf == NULL || size == 0U) {
354 		k_mem_slab_free(&usb_in_buf_pool, buf);
355 		return;
356 	}
357 
358 	pcm = (int16_t *)buf;
359 
360 	/* 'size' is in bytes, containing 1ms, 48kHz, stereo, 2 bytes per sample.
361 	 * Do a simple downsample to 16kHz/24Khz matching the broadcast preset.
362 	 */
363 
364 	ratio = USB_SAMPLE_RATE / USB_DOWNSAMPLE_RATE;
365 	nsamples = size / (sizeof(int16_t) * USB_CHANNELS * ratio);
366 	for (size_t i = 0, j = 0; i < nsamples; i++, j += USB_CHANNELS * ratio) {
367 		usb_pcm_data[0][i] = pcm[j];
368 		usb_pcm_data[1][i] = pcm[j + 1];
369 	}
370 
371 	for (size_t i = 0U; i < MIN(ARRAY_SIZE(streams), 2); i++) {
372 		const uint32_t size_put =
373 			ring_buf_put(&(streams[i].audio_ring_buf), (uint8_t *)(usb_pcm_data[i]),
374 				     nsamples * USB_BYTES_PER_SAMPLE);
375 		if (size_put < nsamples * USB_BYTES_PER_SAMPLE) {
376 			printk("Not enough room for samples in %s buffer: %u < %u, total capacity: "
377 			       "%u\n",
378 			       i == 0 ? "left" : "right", size_put, nsamples * USB_BYTES_PER_SAMPLE,
379 			       ring_buf_capacity_get(&(streams[i].audio_ring_buf)));
380 		}
381 	}
382 
383 	count++;
384 	if ((count % 10000) == 0) {
385 		printk("USB Data received (count = %d)\n", count);
386 	}
387 
388 	k_mem_slab_free(&usb_in_buf_pool, buf);
389 }
390 #endif /* defined(CONFIG_USE_USB_AUDIO_INPUT) */
391 #endif /* defined(CONFIG_LIBLC3) */
392 
stream_started_cb(struct bt_bap_stream * stream)393 static void stream_started_cb(struct bt_bap_stream *stream)
394 {
395 	struct broadcast_source_stream *source_stream =
396 		CONTAINER_OF(stream, struct broadcast_source_stream, stream);
397 
398 	source_stream->seq_num = 0U;
399 	source_stream->sent_cnt = 0U;
400 }
401 
stream_sent_cb(struct bt_bap_stream * stream)402 static void stream_sent_cb(struct bt_bap_stream *stream)
403 {
404 #if defined(CONFIG_LIBLC3)
405 	k_sem_give(&lc3_encoder_sem);
406 #else
407 	/* If no LC3 encoder is used, just send mock data directly */
408 	struct broadcast_source_stream *source_stream =
409 		CONTAINER_OF(stream, struct broadcast_source_stream, stream);
410 
411 	send_data(source_stream);
412 #endif
413 }
414 
415 static struct bt_bap_stream_ops stream_ops = {
416 	.started = stream_started_cb,
417 	.sent = stream_sent_cb,
418 };
419 
setup_broadcast_source(struct bt_bap_broadcast_source ** source)420 static int setup_broadcast_source(struct bt_bap_broadcast_source **source)
421 {
422 	struct bt_bap_broadcast_source_stream_param
423 		stream_params[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT];
424 	struct bt_bap_broadcast_source_subgroup_param
425 		subgroup_param[CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT];
426 	struct bt_bap_broadcast_source_param create_param = {0};
427 	const size_t streams_per_subgroup = ARRAY_SIZE(stream_params) / ARRAY_SIZE(subgroup_param);
428 	uint8_t left[] = {BT_AUDIO_CODEC_DATA(BT_AUDIO_CODEC_CFG_CHAN_ALLOC,
429 					      BT_BYTES_LIST_LE32(BT_AUDIO_LOCATION_FRONT_LEFT))};
430 	uint8_t right[] = {BT_AUDIO_CODEC_DATA(BT_AUDIO_CODEC_CFG_CHAN_ALLOC,
431 					       BT_BYTES_LIST_LE32(BT_AUDIO_LOCATION_FRONT_RIGHT))};
432 	int err;
433 
434 	for (size_t i = 0U; i < ARRAY_SIZE(subgroup_param); i++) {
435 		subgroup_param[i].params_count = streams_per_subgroup;
436 		subgroup_param[i].params = stream_params + i * streams_per_subgroup;
437 		subgroup_param[i].codec_cfg = &preset_active.codec_cfg;
438 	}
439 
440 	for (size_t j = 0U; j < ARRAY_SIZE(stream_params); j++) {
441 		stream_params[j].stream = &streams[j].stream;
442 		stream_params[j].data = j == 0 ? left : right;
443 		stream_params[j].data_len = j == 0 ? sizeof(left) : sizeof(right);
444 		bt_bap_stream_cb_register(stream_params[j].stream, &stream_ops);
445 	}
446 
447 	create_param.params_count = ARRAY_SIZE(subgroup_param);
448 	create_param.params = subgroup_param;
449 	create_param.qos = &preset_active.qos;
450 	create_param.encryption = strlen(CONFIG_BROADCAST_CODE) > 0;
451 	create_param.packing = (IS_ENABLED(CONFIG_ISO_PACKING_INTERLEAVED) ?
452 				BT_ISO_PACKING_INTERLEAVED :
453 				BT_ISO_PACKING_SEQUENTIAL);
454 
455 	if (create_param.encryption) {
456 		memcpy(create_param.broadcast_code, CONFIG_BROADCAST_CODE,
457 		       strlen(CONFIG_BROADCAST_CODE));
458 	}
459 
460 	printk("Creating broadcast source with %zu subgroups with %zu streams\n",
461 	       ARRAY_SIZE(subgroup_param), ARRAY_SIZE(subgroup_param) * streams_per_subgroup);
462 
463 	err = bt_bap_broadcast_source_create(&create_param, source);
464 	if (err != 0) {
465 		printk("Unable to create broadcast source: %d\n", err);
466 		return err;
467 	}
468 
469 	return 0;
470 }
471 
source_started_cb(struct bt_bap_broadcast_source * source)472 static void source_started_cb(struct bt_bap_broadcast_source *source)
473 {
474 	printk("Broadcast source %p started\n", source);
475 	k_sem_give(&sem_started);
476 }
477 
source_stopped_cb(struct bt_bap_broadcast_source * source,uint8_t reason)478 static void source_stopped_cb(struct bt_bap_broadcast_source *source, uint8_t reason)
479 {
480 	printk("Broadcast source %p stopped with reason 0x%02X\n", source, reason);
481 	k_sem_give(&sem_stopped);
482 }
483 
main(void)484 int main(void)
485 {
486 	static struct bt_bap_broadcast_source_cb broadcast_source_cb = {
487 		.started = source_started_cb,
488 		.stopped = source_stopped_cb,
489 	};
490 	struct bt_le_ext_adv *adv;
491 	int err;
492 
493 	err = bt_enable(NULL);
494 	if (err) {
495 		printk("Bluetooth init failed (err %d)\n", err);
496 		return 0;
497 	}
498 	printk("Bluetooth initialized\n");
499 
500 	err = bt_bap_broadcast_source_register_cb(&broadcast_source_cb);
501 	if (err != 0) {
502 		printk("Failed to register broadcast source callbacks (err %d)\n", err);
503 		return 0;
504 	}
505 
506 	for (size_t i = 0U; i < ARRAY_SIZE(send_pcm_data); i++) {
507 		/* Initialize mock data */
508 		send_pcm_data[i] = i;
509 	}
510 
511 #if defined(CONFIG_LIBLC3)
512 #if defined(CONFIG_USE_USB_AUDIO_INPUT)
513 	const struct device *broadcaster_dev = DEVICE_DT_GET(DT_NODELABEL(uac2_broadcaster));
514 	static struct uac2_ops usb_audio_ops = {
515 		.terminal_update_cb = terminal_update_cb,
516 		.get_recv_buf = get_recv_buf_cb,
517 		.data_recv_cb = data_recv_cb,
518 		.sof_cb = uac2_sof_cb,
519 	};
520 	struct usbd_context *sample_usbd;
521 
522 	if (!device_is_ready(broadcaster_dev)) {
523 		printk("Cannot get USB Broadcaster Device\n");
524 		return -EIO;
525 	}
526 
527 	printk("Found USB Headset Device\n");
528 
529 	(void)memset(streams, 0, sizeof(streams));
530 
531 	for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) {
532 		ring_buf_init(&(streams[i].audio_ring_buf), sizeof(streams[i]._ring_buffer_memory),
533 			      streams[i]._ring_buffer_memory);
534 		printk("Initialized ring buf %zu: capacity: %u\n", i,
535 		       ring_buf_capacity_get(&(streams[i].audio_ring_buf)));
536 	}
537 
538 	usbd_uac2_set_ops(broadcaster_dev, &usb_audio_ops, NULL);
539 
540 	sample_usbd = sample_usbd_init_device(NULL);
541 	if (sample_usbd == NULL) {
542 		printk("Failed to init USBD device: %d\n", err);
543 		return -ENODEV;
544 	}
545 
546 	err = usbd_enable(sample_usbd);
547 	if (err != 0) {
548 		printk("Failed to enable USBD: %d\n", err);
549 		return err;
550 	}
551 
552 	printk("USB initialized\n");
553 
554 #endif /* defined(CONFIG_USE_USB_AUDIO_INPUT) */
555 	k_thread_start(encoder);
556 #endif /* defined(CONFIG_LIBLC3) */
557 
558 	while (true) {
559 		/* Broadcast Audio Streaming Endpoint advertising data */
560 		NET_BUF_SIMPLE_DEFINE(ad_buf, BT_UUID_SIZE_16 + BT_AUDIO_BROADCAST_ID_SIZE);
561 		NET_BUF_SIMPLE_DEFINE(base_buf, 128);
562 		struct bt_data ext_ad[2];
563 		struct bt_data per_ad;
564 		uint32_t broadcast_id;
565 
566 		/* Create a connectable advertising set */
567 		err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_BROADCAST_FAST, NULL, &adv);
568 		if (err != 0) {
569 			printk("Unable to create extended advertising set: %d\n", err);
570 			return 0;
571 		}
572 
573 		/* Set periodic advertising parameters */
574 		err = bt_le_per_adv_set_param(adv, BT_BAP_PER_ADV_PARAM_BROADCAST_FAST);
575 		if (err) {
576 			printk("Failed to set periodic advertising parameters (err %d)\n", err);
577 			return 0;
578 		}
579 
580 		printk("Creating broadcast source\n");
581 		err = setup_broadcast_source(&broadcast_source);
582 		if (err != 0) {
583 			printk("Unable to setup broadcast source: %d\n", err);
584 			return 0;
585 		}
586 
587 #if defined(CONFIG_STATIC_BROADCAST_ID)
588 		broadcast_id = CONFIG_BROADCAST_ID;
589 #else
590 		err = bt_rand(&broadcast_id, BT_AUDIO_BROADCAST_ID_SIZE);
591 		if (err) {
592 			printk("Unable to generate broadcast ID: %d\n", err);
593 			return err;
594 		}
595 #endif /* CONFIG_STATIC_BROADCAST_ID */
596 
597 		/* Setup extended advertising data */
598 		net_buf_simple_add_le16(&ad_buf, BT_UUID_BROADCAST_AUDIO_VAL);
599 		net_buf_simple_add_le24(&ad_buf, broadcast_id);
600 		ext_ad[0].type = BT_DATA_SVC_DATA16;
601 		ext_ad[0].data_len = ad_buf.len;
602 		ext_ad[0].data = ad_buf.data;
603 		ext_ad[1] = (struct bt_data)BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME,
604 						    sizeof(CONFIG_BT_DEVICE_NAME) - 1);
605 		err = bt_le_ext_adv_set_data(adv, ext_ad, 2, NULL, 0);
606 		if (err != 0) {
607 			printk("Failed to set extended advertising data: %d\n", err);
608 			return 0;
609 		}
610 
611 		/* Setup periodic advertising data */
612 		err = bt_bap_broadcast_source_get_base(broadcast_source, &base_buf);
613 		if (err != 0) {
614 			printk("Failed to get encoded BASE: %d\n", err);
615 			return 0;
616 		}
617 
618 		per_ad.type = BT_DATA_SVC_DATA16;
619 		per_ad.data_len = base_buf.len;
620 		per_ad.data = base_buf.data;
621 		err = bt_le_per_adv_set_data(adv, &per_ad, 1);
622 		if (err != 0) {
623 			printk("Failed to set periodic advertising data: %d\n", err);
624 			return 0;
625 		}
626 
627 		/* Start extended advertising */
628 		err = bt_le_ext_adv_start(adv, BT_LE_EXT_ADV_START_DEFAULT);
629 		if (err) {
630 			printk("Failed to start extended advertising: %d\n", err);
631 			return 0;
632 		}
633 
634 		/* Enable Periodic Advertising */
635 		err = bt_le_per_adv_start(adv);
636 		if (err) {
637 			printk("Failed to enable periodic advertising: %d\n", err);
638 			return 0;
639 		}
640 
641 		printk("Starting broadcast source\n");
642 		stopping = false;
643 		err = bt_bap_broadcast_source_start(broadcast_source, adv);
644 		if (err != 0) {
645 			printk("Unable to start broadcast source: %d\n", err);
646 			return 0;
647 		}
648 
649 		/* Wait for broadcast source to be started */
650 		k_sem_take(&sem_started, K_FOREVER);
651 		printk("Broadcast source started\n");
652 
653 		/* Initialize sending */
654 		for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) {
655 			for (unsigned int j = 0U; j < BROADCAST_ENQUEUE_COUNT; j++) {
656 				stream_sent_cb(&streams[i].stream);
657 			}
658 		}
659 
660 #if defined(CONFIG_LIBLC3) && defined(CONFIG_USE_USB_AUDIO_INPUT)
661 		/* Never stop streaming when using USB Audio as input */
662 		k_sleep(K_FOREVER);
663 #endif /* defined(CONFIG_LIBLC3) && defined(CONFIG_USE_USB_AUDIO_INPUT) */
664 		printk("Waiting %u seconds before stopped\n", BROADCAST_SOURCE_LIFETIME);
665 		k_sleep(K_SECONDS(BROADCAST_SOURCE_LIFETIME));
666 		printk("Stopping broadcast source\n");
667 		stopping = true;
668 		err = bt_bap_broadcast_source_stop(broadcast_source);
669 		if (err != 0) {
670 			printk("Unable to stop broadcast source: %d\n", err);
671 			return 0;
672 		}
673 
674 		/* Wait for broadcast source to be stopped */
675 		k_sem_take(&sem_stopped, K_FOREVER);
676 		printk("Broadcast source stopped\n");
677 
678 		printk("Deleting broadcast source\n");
679 		err = bt_bap_broadcast_source_delete(broadcast_source);
680 		if (err != 0) {
681 			printk("Unable to delete broadcast source: %d\n", err);
682 			return 0;
683 		}
684 		printk("Broadcast source deleted\n");
685 		broadcast_source = NULL;
686 		seq_num = 0;
687 
688 		err = bt_le_per_adv_stop(adv);
689 		if (err) {
690 			printk("Failed to stop periodic advertising (err %d)\n", err);
691 			return 0;
692 		}
693 
694 		err = bt_le_ext_adv_stop(adv);
695 		if (err) {
696 			printk("Failed to stop extended advertising (err %d)\n", err);
697 			return 0;
698 		}
699 
700 		err = bt_le_ext_adv_delete(adv);
701 		if (err) {
702 			printk("Failed to delete extended advertising (err %d)\n", err);
703 			return 0;
704 		}
705 	}
706 	return 0;
707 }
708