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