1 /**
2 * @file
3 * @brief Bluetooth Audio handling
4 */
5
6 /*
7 * Copyright (c) 2020 Intel Corporation
8 * Copyright (c) 2020-2024 Nordic Semiconductor ASA
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AUDIO_H_
13 #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AUDIO_H_
14
15 /**
16 * @brief Bluetooth Audio
17 * @defgroup bt_audio Bluetooth Audio
18 * @ingroup bluetooth
19 * @{
20 */
21
22 #include <stdbool.h>
23 #include <stddef.h>
24 #include <stdint.h>
25
26 #include <zephyr/autoconf.h>
27 #include <zephyr/bluetooth/audio/lc3.h>
28 #include <zephyr/bluetooth/bluetooth.h>
29 #include <zephyr/bluetooth/buf.h>
30 #include <zephyr/bluetooth/conn.h>
31 #include <zephyr/bluetooth/gatt.h>
32 #include <zephyr/bluetooth/hci.h>
33 #include <zephyr/bluetooth/iso.h>
34 #include <zephyr/sys/atomic.h>
35 #include <zephyr/sys/util.h>
36 #include <zephyr/sys/util_macro.h>
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 /** Size of the broadcast ID in octets */
43 #define BT_AUDIO_BROADCAST_ID_SIZE 3
44 /** Maximum broadcast ID value */
45 #define BT_AUDIO_BROADCAST_ID_MAX 0xFFFFFFU
46 /** Indicates that the server have no preference for the presentation delay */
47 #define BT_AUDIO_PD_PREF_NONE 0x000000U
48 /** Maximum presentation delay in microseconds */
49 #define BT_AUDIO_PD_MAX 0xFFFFFFU
50 /** Indicates that the unicast server does not have a preference for any retransmission number */
51 #define BT_AUDIO_RTN_PREF_NONE 0xFFU
52 /** The minimum size of a Broadcast Name as defined by Bluetooth Assigned Numbers */
53 #define BT_AUDIO_BROADCAST_NAME_LEN_MIN 4
54 /** The maximum size of a Broadcast Name as defined by Bluetooth Assigned Numbers */
55 #define BT_AUDIO_BROADCAST_NAME_LEN_MAX 128
56
57 /** Size of the stream language value, e.g. "eng" */
58 #define BT_AUDIO_LANG_SIZE 3
59
60 /**
61 * @brief Codec capability types
62 *
63 * Used to build and parse codec capabilities as specified in the PAC specification.
64 * Source is assigned numbers for Generic Audio, bluetooth.com.
65 */
66 enum bt_audio_codec_cap_type {
67 /** Supported sampling frequencies */
68 BT_AUDIO_CODEC_CAP_TYPE_FREQ = 0x01,
69
70 /** Supported frame durations */
71 BT_AUDIO_CODEC_CAP_TYPE_DURATION = 0x02,
72
73 /** Supported audio channel counts */
74 BT_AUDIO_CODEC_CAP_TYPE_CHAN_COUNT = 0x03,
75
76 /** Supported octets per codec frame */
77 BT_AUDIO_CODEC_CAP_TYPE_FRAME_LEN = 0x04,
78
79 /** Supported maximum codec frames per SDU */
80 BT_AUDIO_CODEC_CAP_TYPE_FRAME_COUNT = 0x05,
81 };
82
83 /** @brief Supported frequencies bitfield */
84 enum bt_audio_codec_cap_freq {
85 /** 8 Khz sampling frequency */
86 BT_AUDIO_CODEC_CAP_FREQ_8KHZ = BIT(0),
87
88 /** 11.025 Khz sampling frequency */
89 BT_AUDIO_CODEC_CAP_FREQ_11KHZ = BIT(1),
90
91 /** 16 Khz sampling frequency */
92 BT_AUDIO_CODEC_CAP_FREQ_16KHZ = BIT(2),
93
94 /** 22.05 Khz sampling frequency */
95 BT_AUDIO_CODEC_CAP_FREQ_22KHZ = BIT(3),
96
97 /** 24 Khz sampling frequency */
98 BT_AUDIO_CODEC_CAP_FREQ_24KHZ = BIT(4),
99
100 /** 32 Khz sampling frequency */
101 BT_AUDIO_CODEC_CAP_FREQ_32KHZ = BIT(5),
102
103 /** 44.1 Khz sampling frequency */
104 BT_AUDIO_CODEC_CAP_FREQ_44KHZ = BIT(6),
105
106 /** 48 Khz sampling frequency */
107 BT_AUDIO_CODEC_CAP_FREQ_48KHZ = BIT(7),
108
109 /** 88.2 Khz sampling frequency */
110 BT_AUDIO_CODEC_CAP_FREQ_88KHZ = BIT(8),
111
112 /** 96 Khz sampling frequency */
113 BT_AUDIO_CODEC_CAP_FREQ_96KHZ = BIT(9),
114
115 /** 176.4 Khz sampling frequency */
116 BT_AUDIO_CODEC_CAP_FREQ_176KHZ = BIT(10),
117
118 /** 192 Khz sampling frequency */
119 BT_AUDIO_CODEC_CAP_FREQ_192KHZ = BIT(11),
120
121 /** 384 Khz sampling frequency */
122 BT_AUDIO_CODEC_CAP_FREQ_384KHZ = BIT(12),
123
124 /** Any frequency capability */
125 BT_AUDIO_CODEC_CAP_FREQ_ANY =
126 (BT_AUDIO_CODEC_CAP_FREQ_8KHZ | BT_AUDIO_CODEC_CAP_FREQ_11KHZ |
127 BT_AUDIO_CODEC_CAP_FREQ_16KHZ | BT_AUDIO_CODEC_CAP_FREQ_22KHZ |
128 BT_AUDIO_CODEC_CAP_FREQ_24KHZ | BT_AUDIO_CODEC_CAP_FREQ_32KHZ |
129 BT_AUDIO_CODEC_CAP_FREQ_44KHZ | BT_AUDIO_CODEC_CAP_FREQ_48KHZ |
130 BT_AUDIO_CODEC_CAP_FREQ_88KHZ | BT_AUDIO_CODEC_CAP_FREQ_96KHZ |
131 BT_AUDIO_CODEC_CAP_FREQ_176KHZ | BT_AUDIO_CODEC_CAP_FREQ_192KHZ |
132 BT_AUDIO_CODEC_CAP_FREQ_384KHZ),
133 };
134
135 /** @brief Supported frame durations bitfield */
136 enum bt_audio_codec_cap_frame_dur {
137 /** 7.5 msec frame duration capability */
138 BT_AUDIO_CODEC_CAP_DURATION_7_5 = BIT(0),
139
140 /** 10 msec frame duration capability */
141 BT_AUDIO_CODEC_CAP_DURATION_10 = BIT(1),
142
143 /** Any frame duration capability */
144 BT_AUDIO_CODEC_CAP_DURATION_ANY =
145 (BT_AUDIO_CODEC_CAP_DURATION_7_5 | BT_AUDIO_CODEC_CAP_DURATION_10),
146
147 /**
148 * @brief 7.5 msec preferred frame duration capability.
149 *
150 * This shall only be set if @ref BT_AUDIO_CODEC_CAP_DURATION_7_5 is also set, and if @ref
151 * BT_AUDIO_CODEC_CAP_DURATION_PREFER_10 is not set.
152 */
153 BT_AUDIO_CODEC_CAP_DURATION_PREFER_7_5 = BIT(4),
154
155 /**
156 * @brief 10 msec preferred frame duration capability
157 *
158 * This shall only be set if @ref BT_AUDIO_CODEC_CAP_DURATION_10 is also set, and if @ref
159 * BT_AUDIO_CODEC_CAP_DURATION_PREFER_7_5 is not set.
160 */
161 BT_AUDIO_CODEC_CAP_DURATION_PREFER_10 = BIT(5),
162 };
163
164 /** Supported audio capabilities channel count bitfield */
165 enum bt_audio_codec_cap_chan_count {
166 /** Supporting 1 channel */
167 BT_AUDIO_CODEC_CAP_CHAN_COUNT_1 = BIT(0),
168
169 /** Supporting 2 channel */
170 BT_AUDIO_CODEC_CAP_CHAN_COUNT_2 = BIT(1),
171
172 /** Supporting 3 channel */
173 BT_AUDIO_CODEC_CAP_CHAN_COUNT_3 = BIT(2),
174
175 /** Supporting 4 channel */
176 BT_AUDIO_CODEC_CAP_CHAN_COUNT_4 = BIT(3),
177
178 /** Supporting 5 channel */
179 BT_AUDIO_CODEC_CAP_CHAN_COUNT_5 = BIT(4),
180
181 /** Supporting 6 channel */
182 BT_AUDIO_CODEC_CAP_CHAN_COUNT_6 = BIT(5),
183
184 /** Supporting 7 channel */
185 BT_AUDIO_CODEC_CAP_CHAN_COUNT_7 = BIT(6),
186
187 /** Supporting 8 channel */
188 BT_AUDIO_CODEC_CAP_CHAN_COUNT_8 = BIT(7),
189
190 /** Supporting all channels */
191 BT_AUDIO_CODEC_CAP_CHAN_COUNT_ANY =
192 (BT_AUDIO_CODEC_CAP_CHAN_COUNT_1 | BT_AUDIO_CODEC_CAP_CHAN_COUNT_2 |
193 BT_AUDIO_CODEC_CAP_CHAN_COUNT_3 | BT_AUDIO_CODEC_CAP_CHAN_COUNT_4 |
194 BT_AUDIO_CODEC_CAP_CHAN_COUNT_5 | BT_AUDIO_CODEC_CAP_CHAN_COUNT_6 |
195 BT_AUDIO_CODEC_CAP_CHAN_COUNT_7 | BT_AUDIO_CODEC_CAP_CHAN_COUNT_8),
196 };
197
198 /** Minimum supported channel counts */
199 #define BT_AUDIO_CODEC_CAP_CHAN_COUNT_MIN 1
200 /** Maximum supported channel counts */
201 #define BT_AUDIO_CODEC_CAP_CHAN_COUNT_MAX 8
202
203 /**
204 * @brief Channel count support capability
205 *
206 * Macro accepts variable number of channel counts.
207 * The allowed channel counts are defined by specification and have to be in range from
208 * @ref BT_AUDIO_CODEC_CAP_CHAN_COUNT_MIN to @ref BT_AUDIO_CODEC_CAP_CHAN_COUNT_MAX inclusive.
209 *
210 * Example to support 1 and 3 channels:
211 * BT_AUDIO_CODEC_CAP_CHAN_COUNT_SUPPORT(1, 3)
212 */
213 #define BT_AUDIO_CODEC_CAP_CHAN_COUNT_SUPPORT(...) \
214 ((enum bt_audio_codec_cap_chan_count)((FOR_EACH(BIT, (|), __VA_ARGS__)) >> 1))
215
216 /** struct to hold minimum and maximum supported codec frame sizes */
217 struct bt_audio_codec_octets_per_codec_frame {
218 /** Minimum number of octets supported per codec frame */
219 uint16_t min;
220 /** Maximum number of octets supported per codec frame */
221 uint16_t max;
222 };
223
224 /**
225 * @brief Codec configuration types
226 *
227 * Used to build and parse codec configurations as specified in the ASCS and BAP specifications.
228 * Source is assigned numbers for Generic Audio, bluetooth.com.
229 */
230 enum bt_audio_codec_cfg_type {
231 /** Sampling frequency */
232 BT_AUDIO_CODEC_CFG_FREQ = 0x01,
233
234 /** Frame duration */
235 BT_AUDIO_CODEC_CFG_DURATION = 0x02,
236
237 /** Audio channel allocation */
238 BT_AUDIO_CODEC_CFG_CHAN_ALLOC = 0x03,
239
240 /** Octets per codec frame */
241 BT_AUDIO_CODEC_CFG_FRAME_LEN = 0x04,
242
243 /** Codec frame blocks per SDU */
244 BT_AUDIO_CODEC_CFG_FRAME_BLKS_PER_SDU = 0x05,
245 };
246
247 /** Codec configuration sampling freqency */
248 enum bt_audio_codec_cfg_freq {
249 /** 8 Khz codec sampling frequency */
250 BT_AUDIO_CODEC_CFG_FREQ_8KHZ = 0x01,
251
252 /** 11.025 Khz codec sampling frequency */
253 BT_AUDIO_CODEC_CFG_FREQ_11KHZ = 0x02,
254
255 /** 16 Khz codec sampling frequency */
256 BT_AUDIO_CODEC_CFG_FREQ_16KHZ = 0x03,
257
258 /** 22.05 Khz codec sampling frequency */
259 BT_AUDIO_CODEC_CFG_FREQ_22KHZ = 0x04,
260
261 /** 24 Khz codec sampling frequency */
262 BT_AUDIO_CODEC_CFG_FREQ_24KHZ = 0x05,
263
264 /** 32 Khz codec sampling frequency */
265 BT_AUDIO_CODEC_CFG_FREQ_32KHZ = 0x06,
266
267 /** 44.1 Khz codec sampling frequency */
268 BT_AUDIO_CODEC_CFG_FREQ_44KHZ = 0x07,
269
270 /** 48 Khz codec sampling frequency */
271 BT_AUDIO_CODEC_CFG_FREQ_48KHZ = 0x08,
272
273 /** 88.2 Khz codec sampling frequency */
274 BT_AUDIO_CODEC_CFG_FREQ_88KHZ = 0x09,
275
276 /** 96 Khz codec sampling frequency */
277 BT_AUDIO_CODEC_CFG_FREQ_96KHZ = 0x0a,
278
279 /** 176.4 Khz codec sampling frequency */
280 BT_AUDIO_CODEC_CFG_FREQ_176KHZ = 0x0b,
281
282 /** 192 Khz codec sampling frequency */
283 BT_AUDIO_CODEC_CFG_FREQ_192KHZ = 0x0c,
284
285 /** 384 Khz codec sampling frequency */
286 BT_AUDIO_CODEC_CFG_FREQ_384KHZ = 0x0d,
287 };
288
289 /** Codec configuration frame duration */
290 enum bt_audio_codec_cfg_frame_dur {
291 /** 7.5 msec Frame Duration configuration */
292 BT_AUDIO_CODEC_CFG_DURATION_7_5 = 0x00,
293
294 /** 10 msec Frame Duration configuration */
295 BT_AUDIO_CODEC_CFG_DURATION_10 = 0x01,
296 };
297
298 /**
299 * @brief Audio Context Type for Generic Audio
300 *
301 * These values are defined by the Generic Audio Assigned Numbers, bluetooth.com
302 */
303 enum bt_audio_context {
304 /** Prohibited */
305 BT_AUDIO_CONTEXT_TYPE_PROHIBITED = 0,
306 /**
307 * Identifies audio where the use case context does not match any other defined value,
308 * or where the context is unknown or cannot be determined.
309 */
310 BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED = BIT(0),
311 /**
312 * Conversation between humans, for example, in telephony or video calls, including
313 * traditional cellular as well as VoIP and Push-to-Talk
314 */
315 BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL = BIT(1),
316 /** Media, for example, music playback, radio, podcast or movie soundtrack, or tv audio */
317 BT_AUDIO_CONTEXT_TYPE_MEDIA = BIT(2),
318 /**
319 * Audio associated with video gaming, for example gaming media; gaming effects; music
320 * and in-game voice chat between participants; or a mix of all the above
321 */
322 BT_AUDIO_CONTEXT_TYPE_GAME = BIT(3),
323 /** Instructional audio, for example, in navigation, announcements, or user guidance */
324 BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL = BIT(4),
325 /** Man-machine communication, for example, with voice recognition or virtual assistants */
326 BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS = BIT(5),
327 /**
328 * Live audio, for example, from a microphone where audio is perceived both through a
329 * direct acoustic path and through an LE Audio Stream
330 */
331 BT_AUDIO_CONTEXT_TYPE_LIVE = BIT(6),
332 /**
333 * Sound effects including keyboard and touch feedback; menu and user interface sounds;
334 * and other system sounds
335 */
336 BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS = BIT(7),
337 /**
338 * Notification and reminder sounds; attention-seeking audio, for example,
339 * in beeps signaling the arrival of a message
340 */
341 BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS = BIT(8),
342 /**
343 * Alerts the user to an incoming call, for example, an incoming telephony or video call,
344 * including traditional cellular as well as VoIP and Push-to-Talk
345 */
346 BT_AUDIO_CONTEXT_TYPE_RINGTONE = BIT(9),
347 /**
348 * Alarms and timers; immediate alerts, for example, in a critical battery alarm,
349 * timer expiry or alarm clock, toaster, cooker, kettle, microwave, etc.
350 */
351 BT_AUDIO_CONTEXT_TYPE_ALERTS = BIT(10),
352 /** Emergency alarm Emergency sounds, for example, fire alarms or other urgent alerts */
353 BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM = BIT(11),
354 };
355
356 /**
357 * Any known context.
358 */
359 #define BT_AUDIO_CONTEXT_TYPE_ANY (BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED | \
360 BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL | \
361 BT_AUDIO_CONTEXT_TYPE_MEDIA | \
362 BT_AUDIO_CONTEXT_TYPE_GAME | \
363 BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL | \
364 BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS | \
365 BT_AUDIO_CONTEXT_TYPE_LIVE | \
366 BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS | \
367 BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS | \
368 BT_AUDIO_CONTEXT_TYPE_RINGTONE | \
369 BT_AUDIO_CONTEXT_TYPE_ALERTS | \
370 BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM)
371
372 /**
373 * @brief Parental rating defined by the Generic Audio assigned numbers (bluetooth.com).
374 *
375 * The numbering scheme is aligned with Annex F of EN 300 707 v1.2.1 which
376 * defined parental rating for viewing.
377 */
378 enum bt_audio_parental_rating {
379 /** No rating */
380 BT_AUDIO_PARENTAL_RATING_NO_RATING = 0x00,
381 /** For all ages */
382 BT_AUDIO_PARENTAL_RATING_AGE_ANY = 0x01,
383 /** Recommended for listeners of age 5 and above */
384 BT_AUDIO_PARENTAL_RATING_AGE_5_OR_ABOVE = 0x02,
385 /** Recommended for listeners of age 6 and above */
386 BT_AUDIO_PARENTAL_RATING_AGE_6_OR_ABOVE = 0x03,
387 /** Recommended for listeners of age 7 and above */
388 BT_AUDIO_PARENTAL_RATING_AGE_7_OR_ABOVE = 0x04,
389 /** Recommended for listeners of age 8 and above */
390 BT_AUDIO_PARENTAL_RATING_AGE_8_OR_ABOVE = 0x05,
391 /** Recommended for listeners of age 9 and above */
392 BT_AUDIO_PARENTAL_RATING_AGE_9_OR_ABOVE = 0x06,
393 /** Recommended for listeners of age 10 and above */
394 BT_AUDIO_PARENTAL_RATING_AGE_10_OR_ABOVE = 0x07,
395 /** Recommended for listeners of age 11 and above */
396 BT_AUDIO_PARENTAL_RATING_AGE_11_OR_ABOVE = 0x08,
397 /** Recommended for listeners of age 12 and above */
398 BT_AUDIO_PARENTAL_RATING_AGE_12_OR_ABOVE = 0x09,
399 /** Recommended for listeners of age 13 and above */
400 BT_AUDIO_PARENTAL_RATING_AGE_13_OR_ABOVE = 0x0A,
401 /** Recommended for listeners of age 14 and above */
402 BT_AUDIO_PARENTAL_RATING_AGE_14_OR_ABOVE = 0x0B,
403 /** Recommended for listeners of age 15 and above */
404 BT_AUDIO_PARENTAL_RATING_AGE_15_OR_ABOVE = 0x0C,
405 /** Recommended for listeners of age 16 and above */
406 BT_AUDIO_PARENTAL_RATING_AGE_16_OR_ABOVE = 0x0D,
407 /** Recommended for listeners of age 17 and above */
408 BT_AUDIO_PARENTAL_RATING_AGE_17_OR_ABOVE = 0x0E,
409 /** Recommended for listeners of age 18 and above */
410 BT_AUDIO_PARENTAL_RATING_AGE_18_OR_ABOVE = 0x0F
411 };
412
413 /** @brief Audio Active State defined by the Generic Audio assigned numbers (bluetooth.com). */
414 enum bt_audio_active_state {
415 /** No audio data is being transmitted */
416 BT_AUDIO_ACTIVE_STATE_DISABLED = 0x00,
417 /** Audio data is being transmitted */
418 BT_AUDIO_ACTIVE_STATE_ENABLED = 0x01,
419 };
420
421 /** Assisted Listening Stream defined by the Generic Audio assigned numbers (bluetooth.com). */
422 enum bt_audio_assisted_listening_stream {
423 /** Unspecified audio enhancement */
424 BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED = 0x00,
425 };
426
427 /**
428 * @brief Codec metadata type IDs
429 *
430 * Metadata types defined by the Generic Audio assigned numbers (bluetooth.com).
431 */
432 enum bt_audio_metadata_type {
433 /**
434 * @brief Preferred audio context.
435 *
436 * Bitfield of preferred audio contexts.
437 *
438 * If 0, the context type is not a preferred use case for this codec
439 * configuration.
440 *
441 * See the BT_AUDIO_CONTEXT_* for valid values.
442 */
443 BT_AUDIO_METADATA_TYPE_PREF_CONTEXT = 0x01,
444
445 /**
446 * @brief Streaming audio context.
447 *
448 * Bitfield of streaming audio contexts.
449 *
450 * If 0, the context type is not a preferred use case for this codec
451 * configuration.
452 *
453 * See the BT_AUDIO_CONTEXT_* for valid values.
454 */
455 BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT = 0x02,
456
457 /** UTF-8 encoded title or summary of stream content */
458 BT_AUDIO_METADATA_TYPE_PROGRAM_INFO = 0x03,
459
460 /**
461 * @brief Language
462 *
463 * 3 octet lower case language code defined by ISO 639-3
464 * Possible values can be found at https://iso639-3.sil.org/code_tables/639/data
465 */
466 BT_AUDIO_METADATA_TYPE_LANG = 0x04,
467
468 /** Array of 8-bit CCID values */
469 BT_AUDIO_METADATA_TYPE_CCID_LIST = 0x05,
470
471 /**
472 * @brief Parental rating
473 *
474 * See @ref bt_audio_parental_rating for valid values.
475 */
476 BT_AUDIO_METADATA_TYPE_PARENTAL_RATING = 0x06,
477
478 /** UTF-8 encoded URI for additional Program information */
479 BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI = 0x07,
480
481 /**
482 * @brief Audio active state
483 *
484 * See @ref bt_audio_active_state for valid values.
485 */
486 BT_AUDIO_METADATA_TYPE_AUDIO_STATE = 0x08,
487
488 /** Broadcast Audio Immediate Rendering flag */
489 BT_AUDIO_METADATA_TYPE_BROADCAST_IMMEDIATE = 0x09,
490
491 /**
492 * @brief Assisted listening stream
493 *
494 * See @ref bt_audio_assisted_listening_stream for valid values.
495 */
496 BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM = 0x0A,
497
498 /** UTF-8 encoded Broadcast name */
499 BT_AUDIO_METADATA_TYPE_BROADCAST_NAME = 0x0B,
500
501 /** Extended metadata */
502 BT_AUDIO_METADATA_TYPE_EXTENDED = 0xFE,
503
504 /** Vendor specific metadata */
505 BT_AUDIO_METADATA_TYPE_VENDOR = 0xFF,
506 };
507
508 /**
509 * @brief Helper to check whether metadata type is known by the stack.
510 *
511 * @note @p _type is evaluated thrice.
512 */
513 #define BT_AUDIO_METADATA_TYPE_IS_KNOWN(_type) \
514 (IN_RANGE((_type), BT_AUDIO_METADATA_TYPE_PREF_CONTEXT, \
515 BT_AUDIO_METADATA_TYPE_BROADCAST_IMMEDIATE) || \
516 (_type) == BT_AUDIO_METADATA_TYPE_EXTENDED || (_type) == BT_AUDIO_METADATA_TYPE_VENDOR)
517
518 /**
519 * @name Unicast Announcement Type
520 * @{
521 */
522 /** Unicast Server is connectable and is requesting a connection. */
523 #define BT_AUDIO_UNICAST_ANNOUNCEMENT_GENERAL 0x00
524 /** Unicast Server is connectable but is not requesting a connection. */
525 #define BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED 0x01
526 /** @} */
527
528 /**
529 * @brief Helper to declare elements of bt_audio_codec_cap arrays
530 *
531 * This macro is mainly for creating an array of struct bt_audio_codec_cap data arrays.
532 *
533 * @param _type Type of advertising data field
534 * @param _bytes Variable number of single-byte parameters
535 */
536 #define BT_AUDIO_CODEC_DATA(_type, _bytes...) \
537 (sizeof((uint8_t)_type) + sizeof((uint8_t[]){_bytes})), (_type), _bytes
538
539 /**
540 * @brief Helper to declare @ref bt_audio_codec_cfg
541 *
542 * @param _id Codec ID
543 * @param _cid Company ID
544 * @param _vid Vendor ID
545 * @param _data Codec Specific Data in LVT format
546 * @param _meta Codec Specific Metadata in LVT format
547 */
548 #define BT_AUDIO_CODEC_CFG(_id, _cid, _vid, _data, _meta) \
549 ((struct bt_audio_codec_cfg){ \
550 /* Use HCI data path as default, can be overwritten by application */ \
551 .path_id = BT_ISO_DATA_PATH_HCI, \
552 .ctlr_transcode = false, \
553 .id = _id, \
554 .cid = _cid, \
555 .vid = _vid, \
556 .data_len = sizeof((uint8_t[])_data), \
557 .data = _data, \
558 .meta_len = sizeof((uint8_t[])_meta), \
559 .meta = _meta, \
560 })
561
562 /**
563 * @brief Helper to declare @ref bt_audio_codec_cap structure
564 *
565 * @param _id Codec ID
566 * @param _cid Company ID
567 * @param _vid Vendor ID
568 * @param _data Codec Specific Data in LVT format
569 * @param _meta Codec Specific Metadata in LVT format
570 */
571 #define BT_AUDIO_CODEC_CAP(_id, _cid, _vid, _data, _meta) \
572 ((struct bt_audio_codec_cap){ \
573 /* Use HCI data path as default, can be overwritten by application */ \
574 .path_id = BT_ISO_DATA_PATH_HCI, \
575 .ctlr_transcode = false, \
576 .id = (_id), \
577 .cid = (_cid), \
578 .vid = (_vid), \
579 .data_len = sizeof((uint8_t[])_data), \
580 .data = _data, \
581 .meta_len = sizeof((uint8_t[])_meta), \
582 .meta = _meta, \
583 })
584
585 /**
586 * @brief Location values for BT Audio.
587 *
588 * These values are defined by the Generic Audio Assigned Numbers, bluetooth.com
589 */
590 enum bt_audio_location {
591 /** Mono Audio (no specified Audio Location) */
592 BT_AUDIO_LOCATION_MONO_AUDIO = 0,
593 /** Front Left */
594 BT_AUDIO_LOCATION_FRONT_LEFT = BIT(0),
595 /** Front Right */
596 BT_AUDIO_LOCATION_FRONT_RIGHT = BIT(1),
597 /** Front Center */
598 BT_AUDIO_LOCATION_FRONT_CENTER = BIT(2),
599 /** Low Frequency Effects 1 */
600 BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_1 = BIT(3),
601 /** Back Left */
602 BT_AUDIO_LOCATION_BACK_LEFT = BIT(4),
603 /** Back Right */
604 BT_AUDIO_LOCATION_BACK_RIGHT = BIT(5),
605 /** Front Left of Center */
606 BT_AUDIO_LOCATION_FRONT_LEFT_OF_CENTER = BIT(6),
607 /** Front Right of Center */
608 BT_AUDIO_LOCATION_FRONT_RIGHT_OF_CENTER = BIT(7),
609 /** Back Center */
610 BT_AUDIO_LOCATION_BACK_CENTER = BIT(8),
611 /** Low Frequency Effects 2 */
612 BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_2 = BIT(9),
613 /** Side Left */
614 BT_AUDIO_LOCATION_SIDE_LEFT = BIT(10),
615 /** Side Right */
616 BT_AUDIO_LOCATION_SIDE_RIGHT = BIT(11),
617 /** Top Front Left */
618 BT_AUDIO_LOCATION_TOP_FRONT_LEFT = BIT(12),
619 /** Top Front Right */
620 BT_AUDIO_LOCATION_TOP_FRONT_RIGHT = BIT(13),
621 /** Top Front Center */
622 BT_AUDIO_LOCATION_TOP_FRONT_CENTER = BIT(14),
623 /** Top Center */
624 BT_AUDIO_LOCATION_TOP_CENTER = BIT(15),
625 /** Top Back Left */
626 BT_AUDIO_LOCATION_TOP_BACK_LEFT = BIT(16),
627 /** Top Back Right */
628 BT_AUDIO_LOCATION_TOP_BACK_RIGHT = BIT(17),
629 /** Top Side Left */
630 BT_AUDIO_LOCATION_TOP_SIDE_LEFT = BIT(18),
631 /** Top Side Right */
632 BT_AUDIO_LOCATION_TOP_SIDE_RIGHT = BIT(19),
633 /** Top Back Center */
634 BT_AUDIO_LOCATION_TOP_BACK_CENTER = BIT(20),
635 /** Bottom Front Center */
636 BT_AUDIO_LOCATION_BOTTOM_FRONT_CENTER = BIT(21),
637 /** Bottom Front Left */
638 BT_AUDIO_LOCATION_BOTTOM_FRONT_LEFT = BIT(22),
639 /** Bottom Front Right */
640 BT_AUDIO_LOCATION_BOTTOM_FRONT_RIGHT = BIT(23),
641 /** Front Left Wide */
642 BT_AUDIO_LOCATION_FRONT_LEFT_WIDE = BIT(24),
643 /** Front Right Wide */
644 BT_AUDIO_LOCATION_FRONT_RIGHT_WIDE = BIT(25),
645 /** Left Surround */
646 BT_AUDIO_LOCATION_LEFT_SURROUND = BIT(26),
647 /** Right Surround */
648 BT_AUDIO_LOCATION_RIGHT_SURROUND = BIT(27),
649 };
650
651 /**
652 * Any known location.
653 */
654 #define BT_AUDIO_LOCATION_ANY (BT_AUDIO_LOCATION_FRONT_LEFT | \
655 BT_AUDIO_LOCATION_FRONT_RIGHT | \
656 BT_AUDIO_LOCATION_FRONT_CENTER | \
657 BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_1 | \
658 BT_AUDIO_LOCATION_BACK_LEFT | \
659 BT_AUDIO_LOCATION_BACK_RIGHT | \
660 BT_AUDIO_LOCATION_FRONT_LEFT_OF_CENTER | \
661 BT_AUDIO_LOCATION_FRONT_RIGHT_OF_CENTER | \
662 BT_AUDIO_LOCATION_BACK_CENTER | \
663 BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_2 | \
664 BT_AUDIO_LOCATION_SIDE_LEFT | \
665 BT_AUDIO_LOCATION_SIDE_RIGHT | \
666 BT_AUDIO_LOCATION_TOP_FRONT_LEFT | \
667 BT_AUDIO_LOCATION_TOP_FRONT_RIGHT | \
668 BT_AUDIO_LOCATION_TOP_FRONT_CENTER | \
669 BT_AUDIO_LOCATION_TOP_CENTER | \
670 BT_AUDIO_LOCATION_TOP_BACK_LEFT | \
671 BT_AUDIO_LOCATION_TOP_BACK_RIGHT | \
672 BT_AUDIO_LOCATION_TOP_SIDE_LEFT | \
673 BT_AUDIO_LOCATION_TOP_SIDE_RIGHT | \
674 BT_AUDIO_LOCATION_TOP_BACK_CENTER | \
675 BT_AUDIO_LOCATION_BOTTOM_FRONT_CENTER | \
676 BT_AUDIO_LOCATION_BOTTOM_FRONT_LEFT | \
677 BT_AUDIO_LOCATION_BOTTOM_FRONT_RIGHT | \
678 BT_AUDIO_LOCATION_FRONT_LEFT_WIDE | \
679 BT_AUDIO_LOCATION_FRONT_RIGHT_WIDE | \
680 BT_AUDIO_LOCATION_LEFT_SURROUND | \
681 BT_AUDIO_LOCATION_RIGHT_SURROUND)
682
683 /** @brief Codec capability structure. */
684 struct bt_audio_codec_cap {
685 /** Data path ID
686 *
687 * @ref BT_ISO_DATA_PATH_HCI for HCI path, or any other value for
688 * vendor specific ID.
689 */
690 uint8_t path_id;
691 /** Whether or not the local controller should transcode
692 *
693 * This effectively sets the coding format for the ISO data path to @ref
694 * BT_HCI_CODING_FORMAT_TRANSPARENT if false, else uses the @ref bt_audio_codec_cfg.id.
695 */
696 bool ctlr_transcode;
697 /** Codec ID */
698 uint8_t id;
699 /** Codec Company ID */
700 uint16_t cid;
701 /** Codec Company Vendor ID */
702 uint16_t vid;
703 #if CONFIG_BT_AUDIO_CODEC_CAP_MAX_DATA_SIZE > 0 || defined(__DOXYGEN__)
704 /** Codec Specific Capabilities Data count */
705 size_t data_len;
706 /** Codec Specific Capabilities Data */
707 uint8_t data[CONFIG_BT_AUDIO_CODEC_CAP_MAX_DATA_SIZE];
708 #endif /* CONFIG_BT_AUDIO_CODEC_CAP_MAX_DATA_SIZE > 0 */
709 #if defined(CONFIG_BT_AUDIO_CODEC_CAP_MAX_METADATA_SIZE) || defined(__DOXYGEN__)
710 /** Codec Specific Capabilities Metadata count */
711 size_t meta_len;
712 /** Codec Specific Capabilities Metadata */
713 uint8_t meta[CONFIG_BT_AUDIO_CODEC_CAP_MAX_METADATA_SIZE];
714 #endif /* CONFIG_BT_AUDIO_CODEC_CAP_MAX_METADATA_SIZE */
715 };
716
717 /** @brief Codec specific configuration structure. */
718 struct bt_audio_codec_cfg {
719 /** Data path ID
720 *
721 * @ref BT_ISO_DATA_PATH_HCI for HCI path, or any other value for
722 * vendor specific ID.
723 */
724 uint8_t path_id;
725 /** Whether or not the local controller should transcode
726 *
727 * This effectively sets the coding format for the ISO data path to @ref
728 * BT_HCI_CODING_FORMAT_TRANSPARENT if false, else uses the @ref bt_audio_codec_cfg.id.
729 */
730 bool ctlr_transcode;
731 /** Codec ID */
732 uint8_t id;
733 /** Codec Company ID */
734 uint16_t cid;
735 /** Codec Company Vendor ID */
736 uint16_t vid;
737 #if CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 || defined(__DOXYGEN__)
738 /** Codec Specific Capabilities Data count */
739 size_t data_len;
740 /** Codec Specific Capabilities Data */
741 uint8_t data[CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE];
742 #endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 */
743 #if CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE > 0 || defined(__DOXYGEN__)
744 /** Codec Specific Capabilities Metadata count */
745 size_t meta_len;
746 /** Codec Specific Capabilities Metadata */
747 uint8_t meta[CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE];
748 #endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE > 0 */
749 };
750
751 /**
752 * @brief Helper for parsing length-type-value data.
753 *
754 * @param ltv Length-type-value (LTV) encoded data.
755 * @param size Size of the @p ltv data.
756 * @param func Callback function which will be called for each element
757 * that's found in the data. The callback should return
758 * true to continue parsing, or false to stop parsing.
759 * @param user_data User data to be passed to the callback.
760 *
761 * @retval 0 All entries were parsed.
762 * @retval -EINVAL The data is incorrectly encoded
763 * @retval -ECANCELED Parsing was prematurely cancelled by the callback
764 */
765 int bt_audio_data_parse(const uint8_t ltv[], size_t size,
766 bool (*func)(struct bt_data *data, void *user_data), void *user_data);
767
768 /**
769 * @brief Get the value of a specific data type in an length-type-value data array
770 *
771 * @param[in] ltv_data The array containing the length-type-value tuples
772 * @param[in] size The size of @p ltv_data
773 * @param[in] type The type to get the value for. May be any type, but typically either
774 * @ref bt_audio_codec_cap_type, @ref bt_audio_codec_cfg_type or
775 * @ref bt_audio_metadata_type.
776 * @param[out] data Pointer to the data-pointer to update when item is found.
777 * Any found data will be little endian.
778 *
779 * @retval length The length of found @p data (may be 0).
780 * @retval -EINVAL Arguments are invalid
781 * @retval -ENODATA Data not found
782 */
783 int bt_audio_data_get_val(const uint8_t ltv_data[], size_t size, uint8_t type,
784 const uint8_t **data);
785
786 /**
787 * @brief Function to get the number of channels from the channel allocation
788 *
789 * @param chan_allocation The channel allocation
790 *
791 * @return The number of channels
792 */
793 uint8_t bt_audio_get_chan_count(enum bt_audio_location chan_allocation);
794
795 /** @brief Audio direction from the perspective of the BAP Unicast Server / BAP Broadcast Sink */
796 enum bt_audio_dir {
797 /**
798 * @brief Audio direction sink
799 *
800 * For a BAP Unicast Client or Broadcast Source this is considered outgoing audio (TX).
801 * For a BAP Unicast Server or Broadcast Sink this is considered incoming audio (RX).
802 */
803 BT_AUDIO_DIR_SINK = 0x01,
804 /**
805 * @brief Audio direction source
806 *
807 * For a BAP Unicast Client or Broadcast Source this is considered incoming audio (RX).
808 * For a BAP Unicast Server or Broadcast Sink this is considered outgoing audio (TX).
809 */
810 BT_AUDIO_DIR_SOURCE = 0x02,
811 };
812
813 /**
814 * @brief Audio codec Config APIs
815 * @defgroup bt_audio_codec_cfg Codec config parsing APIs
816 *
817 * Functions to parse codec config data when formatted as LTV wrapped into @ref bt_audio_codec_cfg.
818 *
819 * @{
820 */
821
822 /**
823 * @brief Convert assigned numbers frequency to frequency value.
824 *
825 * @param freq The assigned numbers frequency to convert.
826 *
827 * @retval frequency The converted frequency value in Hz.
828 * @retval -EINVAL Arguments are invalid.
829 */
830 int bt_audio_codec_cfg_freq_to_freq_hz(enum bt_audio_codec_cfg_freq freq);
831
832 /**
833 * @brief Convert frequency value to assigned numbers frequency.
834 *
835 * @param freq_hz The frequency value to convert.
836 *
837 * @retval frequency The assigned numbers frequency (@ref bt_audio_codec_cfg_freq).
838 * @retval -EINVAL Arguments are invalid.
839 */
840 int bt_audio_codec_cfg_freq_hz_to_freq(uint32_t freq_hz);
841
842 /**
843 * @brief Extract the frequency from a codec configuration.
844 *
845 * @param codec_cfg The codec configuration to extract data from.
846 *
847 * @retval frequency A @ref bt_audio_codec_cfg_freq value
848 * @retval -EINVAL Arguments are invalid
849 * @retval -ENODATA Data not found
850 * @retval -EBADMSG The found value has invalid size or value
851 */
852 int bt_audio_codec_cfg_get_freq(const struct bt_audio_codec_cfg *codec_cfg);
853
854 /**
855 * @brief Set the frequency of a codec configuration.
856 *
857 * @param codec_cfg The codec configuration to set data for.
858 * @param freq The assigned numbers frequency to set.
859 *
860 * @retval data_len The @p codec_cfg.data_len on success
861 * @retval -EINVAL Arguments are invalid
862 * @retval -ENOMEM The new value could not be set or added due to lack of memory
863 */
864 int bt_audio_codec_cfg_set_freq(struct bt_audio_codec_cfg *codec_cfg,
865 enum bt_audio_codec_cfg_freq freq);
866
867 /**
868 * @brief Convert assigned numbers frame duration to duration in microseconds.
869 *
870 * @param frame_dur The assigned numbers frame duration to convert.
871 *
872 * @retval duration The converted frame duration value in microseconds.
873 * @retval -EINVAL Arguments are invalid.
874 */
875 int bt_audio_codec_cfg_frame_dur_to_frame_dur_us(enum bt_audio_codec_cfg_frame_dur frame_dur);
876
877 /**
878 * @brief Convert frame duration in microseconds to assigned numbers frame duration.
879 *
880 * @param frame_dur_us The frame duration in microseconds to convert.
881 *
882 * @retval duration The assigned numbers frame duration (@ref bt_audio_codec_cfg_frame_dur).
883 * @retval -EINVAL Arguments are invalid.
884 */
885 int bt_audio_codec_cfg_frame_dur_us_to_frame_dur(uint32_t frame_dur_us);
886
887 /**
888 * @brief Extract frame duration from BT codec config
889 *
890 * @param codec_cfg The codec configuration to extract data from.
891 *
892 * @retval frequency A @ref bt_audio_codec_cfg_frame_dur value
893 * @retval -EINVAL Arguments are invalid
894 * @retval -ENODATA Data not found
895 * @retval -EBADMSG The found value has invalid size or value
896 */
897 int bt_audio_codec_cfg_get_frame_dur(const struct bt_audio_codec_cfg *codec_cfg);
898
899 /**
900 * @brief Set the frame duration of a codec configuration.
901 *
902 * @param codec_cfg The codec configuration to set data for.
903 * @param frame_dur The assigned numbers frame duration to set.
904 *
905 * @retval data_len The @p codec_cfg.data_len on success
906 * @retval -EINVAL Arguments are invalid
907 * @retval -ENOMEM The new value could not be set or added due to lack of memory
908 */
909 int bt_audio_codec_cfg_set_frame_dur(struct bt_audio_codec_cfg *codec_cfg,
910 enum bt_audio_codec_cfg_frame_dur frame_dur);
911
912 /**
913 * @brief Extract channel allocation from BT codec config
914 *
915 * The value returned is a bit field representing one or more audio locations as
916 * specified by @ref bt_audio_location
917 * Shall match one or more of the bits set in BT_PAC_SNK_LOC/BT_PAC_SRC_LOC.
918 *
919 * Up to the configured @ref BT_AUDIO_CODEC_CAP_TYPE_CHAN_COUNT number of channels can be present.
920 *
921 * @param codec_cfg The codec configuration to extract data from.
922 * @param chan_allocation Pointer to the variable to store the extracted value in.
923 * @param fallback_to_default If true this function will provide the default value of
924 * @ref BT_AUDIO_LOCATION_MONO_AUDIO if the type is not found when @p codec_cfg.id is @ref
925 * BT_HCI_CODING_FORMAT_LC3.
926 *
927 * @retval 0 Value is found and stored in the pointer provided
928 * @retval -EINVAL Arguments are invalid
929 * @retval -ENODATA Data not found
930 * @retval -EBADMSG The found value has invalid size or value
931 */
932 int bt_audio_codec_cfg_get_chan_allocation(const struct bt_audio_codec_cfg *codec_cfg,
933 enum bt_audio_location *chan_allocation,
934 bool fallback_to_default);
935
936 /**
937 * @brief Set the channel allocation of a codec configuration.
938 *
939 * @param codec_cfg The codec configuration to set data for.
940 * @param chan_allocation The channel allocation to set.
941 *
942 * @retval data_len The @p codec_cfg.data_len on success
943 * @retval -EINVAL Arguments are invalid
944 * @retval -ENOMEM The new value could not be set or added due to lack of memory
945 */
946 int bt_audio_codec_cfg_set_chan_allocation(struct bt_audio_codec_cfg *codec_cfg,
947 enum bt_audio_location chan_allocation);
948
949 /**
950 * @brief Extract frame size in octets from BT codec config
951 *
952 * The overall SDU size will be octets_per_frame * blocks_per_sdu.
953 *
954 * The Bluetooth specifications are not clear about this value - it does not state that
955 * the codec shall use this SDU size only. A codec like LC3 supports variable bit-rate
956 * (per SDU) hence it might be allowed for an encoder to reduce the frame size below this
957 * value.
958 * Hence it is recommended to use the received SDU size and divide by
959 * blocks_per_sdu rather than relying on this octets_per_sdu value to be fixed.
960 *
961 * @param codec_cfg The codec configuration to extract data from.
962 *
963 * @retval frame_length Frame length in octets
964 * @retval -EINVAL Arguments are invalid
965 * @retval -ENODATA Data not found
966 * @retval -EBADMSG The found value has invalid size or value
967 */
968 int bt_audio_codec_cfg_get_octets_per_frame(const struct bt_audio_codec_cfg *codec_cfg);
969
970 /**
971 * @brief Set the octets per codec frame of a codec configuration.
972 *
973 * @param codec_cfg The codec configuration to set data for.
974 * @param octets_per_frame The octets per codec frame to set.
975 *
976 * @retval data_len The @p codec_cfg.data_len on success
977 * @retval -EINVAL Arguments are invalid
978 * @retval -ENOMEM The new value could not be set or added due to lack of memory
979 */
980 int bt_audio_codec_cfg_set_octets_per_frame(struct bt_audio_codec_cfg *codec_cfg,
981 uint16_t octets_per_frame);
982
983 /**
984 * @brief Extract number of audio frame blocks in each SDU from BT codec config
985 *
986 * The overall SDU size will be octets_per_frame * frame_blocks_per_sdu * number-of-channels.
987 *
988 * If this value is not present a default value of 1 shall be used.
989 *
990 * A frame block is one or more frames that represents data for the same period of time but
991 * for different channels. If the stream have two audio channels and this value is two
992 * there will be four frames in the SDU.
993 *
994 * @param codec_cfg The codec configuration to extract data from.
995 * @param fallback_to_default If true this function will return the default value of 1
996 * if the type is not found when @p codec_cfg.id is @ref BT_HCI_CODING_FORMAT_LC3.
997 *
998 * @retval frame_blocks_per_sdu The count of codec frame blocks in each SDU.
999 * @retval -EINVAL Arguments are invalid
1000 * @retval -ENODATA Data not found
1001 * @retval -EBADMSG The found value has invalid size or value
1002 */
1003 int bt_audio_codec_cfg_get_frame_blocks_per_sdu(const struct bt_audio_codec_cfg *codec_cfg,
1004 bool fallback_to_default);
1005
1006 /**
1007 * @brief Set the frame blocks per SDU of a codec configuration.
1008 *
1009 * @param codec_cfg The codec configuration to set data for.
1010 * @param frame_blocks The frame blocks per SDU to set.
1011 *
1012 * @retval data_len The @p codec_cfg.data_len on success
1013 * @retval -EINVAL Arguments are invalid
1014 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1015 */
1016 int bt_audio_codec_cfg_set_frame_blocks_per_sdu(struct bt_audio_codec_cfg *codec_cfg,
1017 uint8_t frame_blocks);
1018
1019 /**
1020 * @brief Lookup a specific codec configuration value
1021 *
1022 * @param[in] codec_cfg The codec data to search in.
1023 * @param[in] type The type id to look for
1024 * @param[out] data Pointer to the data-pointer to update when item is found
1025 *
1026 * @retval len Length of found @p data (may be 0)
1027 * @retval -EINVAL Arguments are invalid
1028 * @retval -ENODATA Data not found
1029 */
1030 int bt_audio_codec_cfg_get_val(const struct bt_audio_codec_cfg *codec_cfg,
1031 enum bt_audio_codec_cfg_type type, const uint8_t **data);
1032
1033 /**
1034 * @brief Set or add a specific codec configuration value
1035 *
1036 * @param codec_cfg The codec data to set the value in.
1037 * @param type The type id to set
1038 * @param data Pointer to the data-pointer to set
1039 * @param data_len Length of @p data
1040 *
1041 * @retval data_len The @p codec_cfg.data_len on success
1042 * @retval -EINVAL Arguments are invalid
1043 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1044 */
1045 int bt_audio_codec_cfg_set_val(struct bt_audio_codec_cfg *codec_cfg,
1046 enum bt_audio_codec_cfg_type type, const uint8_t *data,
1047 size_t data_len);
1048
1049 /**
1050 * @brief Unset a specific codec configuration value
1051 *
1052 * The type and the value will be removed from the codec configuration.
1053 *
1054 * @param codec_cfg The codec data to set the value in.
1055 * @param type The type id to unset.
1056 *
1057 * @retval data_len The @p codec_cfg.data_len on success
1058 * @retval -EINVAL Arguments are invalid
1059 */
1060 int bt_audio_codec_cfg_unset_val(struct bt_audio_codec_cfg *codec_cfg,
1061 enum bt_audio_codec_cfg_type type);
1062
1063 /**
1064 * @brief Lookup a specific metadata value based on type
1065 *
1066 *
1067 * @param[in] codec_cfg The codec data to search in.
1068 * @param[in] type The type id to look for
1069 * @param[out] data Pointer to the data-pointer to update when item is found
1070 *
1071 * @retval len Length of found @p data (may be 0)
1072 * @retval -EINVAL Arguments are invalid
1073 * @retval -ENODATA Data not found
1074 */
1075 int bt_audio_codec_cfg_meta_get_val(const struct bt_audio_codec_cfg *codec_cfg, uint8_t type,
1076 const uint8_t **data);
1077
1078 /**
1079 * @brief Set or add a specific codec configuration metadata value.
1080 *
1081 * @param codec_cfg The codec configuration to set the value in.
1082 * @param type The type id to set.
1083 * @param data Pointer to the data-pointer to set.
1084 * @param data_len Length of @p data.
1085 *
1086 * @retval meta_len The @p codec_cfg.meta_len on success
1087 * @retval -EINVAL Arguments are invalid
1088 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1089 */
1090 int bt_audio_codec_cfg_meta_set_val(struct bt_audio_codec_cfg *codec_cfg,
1091 enum bt_audio_metadata_type type, const uint8_t *data,
1092 size_t data_len);
1093
1094 /**
1095 * @brief Unset a specific codec configuration metadata value
1096 *
1097 * The type and the value will be removed from the codec configuration metadata.
1098 *
1099 * @param codec_cfg The codec data to set the value in.
1100 * @param type The type id to unset.
1101 *
1102 * @retval meta_len The of @p codec_cfg.meta_len success
1103 * @retval -EINVAL Arguments are invalid
1104 */
1105 int bt_audio_codec_cfg_meta_unset_val(struct bt_audio_codec_cfg *codec_cfg,
1106 enum bt_audio_metadata_type type);
1107 /**
1108 * @brief Extract preferred contexts
1109 *
1110 * See @ref BT_AUDIO_METADATA_TYPE_PREF_CONTEXT for more information about this value.
1111 *
1112 * @param codec_cfg The codec data to search in.
1113 * @param fallback_to_default If true this function will provide the default value of
1114 * @ref BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED if the type is not found when @p codec_cfg.id is
1115 * @ref BT_HCI_CODING_FORMAT_LC3.
1116 *
1117 * @retval context The preferred context type if positive or 0
1118 * @retval -EINVAL Arguments are invalid
1119 * @retval -ENODATA Data not found
1120 * @retval -EBADMSG The found value has invalid size
1121 */
1122 int bt_audio_codec_cfg_meta_get_pref_context(const struct bt_audio_codec_cfg *codec_cfg,
1123 bool fallback_to_default);
1124
1125 /**
1126 * @brief Set the preferred context of a codec configuration metadata.
1127 *
1128 * @param codec_cfg The codec configuration to set data for.
1129 * @param ctx The preferred context to set.
1130 *
1131 * @retval data_len The @p codec_cfg.data_len on success
1132 * @retval -EINVAL Arguments are invalid
1133 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1134 */
1135 int bt_audio_codec_cfg_meta_set_pref_context(struct bt_audio_codec_cfg *codec_cfg,
1136 enum bt_audio_context ctx);
1137
1138 /**
1139 * @brief Extract stream contexts
1140 *
1141 * See @ref BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT for more information about this value.
1142 *
1143 * @param codec_cfg The codec data to search in.
1144 *
1145 * @retval context The stream context type if positive or 0
1146 * @retval -EINVAL Arguments are invalid
1147 * @retval -ENODATA Data not found
1148 * @retval -EBADMSG The found value has invalid size
1149 */
1150 int bt_audio_codec_cfg_meta_get_stream_context(const struct bt_audio_codec_cfg *codec_cfg);
1151
1152 /**
1153 * @brief Set the stream context of a codec configuration metadata.
1154 *
1155 * @param codec_cfg The codec configuration to set data for.
1156 * @param ctx The stream context to set.
1157 *
1158 * @retval data_len The @p codec_cfg.data_len on success
1159 * @retval -EINVAL Arguments are invalid
1160 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1161 */
1162 int bt_audio_codec_cfg_meta_set_stream_context(struct bt_audio_codec_cfg *codec_cfg,
1163 enum bt_audio_context ctx);
1164
1165 /**
1166 * @brief Extract program info
1167 *
1168 * See @ref BT_AUDIO_METADATA_TYPE_PROGRAM_INFO for more information about this value.
1169 *
1170 * @param[in] codec_cfg The codec data to search in.
1171 * @param[out] program_info Pointer to the UTF-8 formatted program info.
1172 *
1173 * @retval len The length of the @p program_info (may be 0)
1174 * @retval -EINVAL Arguments are invalid
1175 * @retval -ENODATA Data not found
1176 */
1177 int bt_audio_codec_cfg_meta_get_program_info(const struct bt_audio_codec_cfg *codec_cfg,
1178 const uint8_t **program_info);
1179
1180 /**
1181 * @brief Set the program info of a codec configuration metadata.
1182 *
1183 * @param codec_cfg The codec configuration to set data for.
1184 * @param program_info The program info to set.
1185 * @param program_info_len The length of @p program_info.
1186 *
1187 * @retval data_len The @p codec_cfg.data_len on success
1188 * @retval -EINVAL Arguments are invalid
1189 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1190 */
1191 int bt_audio_codec_cfg_meta_set_program_info(struct bt_audio_codec_cfg *codec_cfg,
1192 const uint8_t *program_info, size_t program_info_len);
1193
1194 /**
1195 * @brief Extract language
1196 *
1197 * See @ref BT_AUDIO_METADATA_TYPE_LANG for more information about this value.
1198 *
1199 * @param[in] codec_cfg The codec data to search in.
1200 * @param[out] lang Pointer to the language bytes (of length BT_AUDIO_LANG_SIZE)
1201 *
1202 * @retval 0 Success
1203 * @retval -EINVAL Arguments are invalid
1204 * @retval -ENODATA Data not found
1205 * @retval -EBADMSG The found value has invalid size
1206 */
1207 int bt_audio_codec_cfg_meta_get_lang(const struct bt_audio_codec_cfg *codec_cfg,
1208 const uint8_t **lang);
1209
1210 /**
1211 * @brief Set the language of a codec configuration metadata.
1212 *
1213 * @param codec_cfg The codec configuration to set data for.
1214 * @param lang The 24-bit language to set.
1215 *
1216 * @retval data_len The @p codec_cfg.data_len on success
1217 * @retval -EINVAL Arguments are invalid
1218 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1219 */
1220 int bt_audio_codec_cfg_meta_set_lang(struct bt_audio_codec_cfg *codec_cfg,
1221 const uint8_t lang[BT_AUDIO_LANG_SIZE]);
1222
1223 /**
1224 * @brief Extract CCID list
1225 *
1226 * See @ref BT_AUDIO_METADATA_TYPE_CCID_LIST for more information about this value.
1227 *
1228 * @param[in] codec_cfg The codec data to search in.
1229 * @param[out] ccid_list Pointer to the array containing 8-bit CCIDs.
1230 *
1231 * @retval len The length of the @p ccid_list (may be 0)
1232 * @retval -EINVAL Arguments are invalid
1233 * @retval -ENODATA Data not found
1234 */
1235 int bt_audio_codec_cfg_meta_get_ccid_list(const struct bt_audio_codec_cfg *codec_cfg,
1236 const uint8_t **ccid_list);
1237
1238 /**
1239 * @brief Set the CCID list of a codec configuration metadata.
1240 *
1241 * @param codec_cfg The codec configuration to set data for.
1242 * @param ccid_list The program info to set.
1243 * @param ccid_list_len The length of @p ccid_list.
1244 *
1245 * @retval data_len The @p codec_cfg.data_len on success
1246 * @retval -EINVAL Arguments are invalid
1247 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1248 */
1249 int bt_audio_codec_cfg_meta_set_ccid_list(struct bt_audio_codec_cfg *codec_cfg,
1250 const uint8_t *ccid_list, size_t ccid_list_len);
1251
1252 /**
1253 * @brief Extract parental rating
1254 *
1255 * See @ref BT_AUDIO_METADATA_TYPE_PARENTAL_RATING for more information about this value.
1256 *
1257 * @param codec_cfg The codec data to search in.
1258 *
1259 * @retval parental_rating The parental rating if positive or 0
1260 * @retval -EINVAL Arguments are invalid
1261 * @retval -ENODATA Data not found
1262 * @retval -EBADMSG The found value has invalid size
1263 */
1264 int bt_audio_codec_cfg_meta_get_parental_rating(const struct bt_audio_codec_cfg *codec_cfg);
1265
1266 /**
1267 * @brief Set the parental rating of a codec configuration metadata.
1268 *
1269 * @param codec_cfg The codec configuration to set data for.
1270 * @param parental_rating The parental rating to set.
1271 *
1272 * @retval data_len The @p codec_cfg.data_len on success
1273 * @retval -EINVAL Arguments are invalid
1274 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1275 */
1276 int bt_audio_codec_cfg_meta_set_parental_rating(struct bt_audio_codec_cfg *codec_cfg,
1277 enum bt_audio_parental_rating parental_rating);
1278
1279 /**
1280 * @brief Extract program info URI
1281 *
1282 * See @ref BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI for more information about this value.
1283 *
1284 * @param[in] codec_cfg The codec data to search in.
1285 * @param[out] program_info_uri Pointer to the UTF-8 formatted program info URI.
1286 *
1287 * @retval len The length of the @p program_info_uri (may be 0)
1288 * @retval -EINVAL Arguments are invalid
1289 * @retval -ENODATA Data not found
1290 */
1291 int bt_audio_codec_cfg_meta_get_program_info_uri(const struct bt_audio_codec_cfg *codec_cfg,
1292 const uint8_t **program_info_uri);
1293
1294 /**
1295 * @brief Set the program info URI of a codec configuration metadata.
1296 *
1297 * @param codec_cfg The codec configuration to set data for.
1298 * @param program_info_uri The program info URI to set.
1299 * @param program_info_uri_len The length of @p program_info_uri.
1300 *
1301 * @retval data_len The @p codec_cfg.data_len on success
1302 * @retval -EINVAL Arguments are invalid
1303 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1304 */
1305 int bt_audio_codec_cfg_meta_set_program_info_uri(struct bt_audio_codec_cfg *codec_cfg,
1306 const uint8_t *program_info_uri,
1307 size_t program_info_uri_len);
1308
1309 /**
1310 * @brief Extract audio active state
1311 *
1312 * See @ref BT_AUDIO_METADATA_TYPE_AUDIO_STATE for more information about this value.
1313 *
1314 * @param codec_cfg The codec data to search in.
1315 *
1316 * @retval context The preferred context type if positive or 0
1317 * @retval -EINVAL Arguments are invalid
1318 * @retval -ENODATA Data not found
1319 * @retval -EBADMSG The found value has invalid size
1320 */
1321 int bt_audio_codec_cfg_meta_get_audio_active_state(const struct bt_audio_codec_cfg *codec_cfg);
1322
1323 /**
1324 * @brief Set the audio active state of a codec configuration metadata.
1325 *
1326 * @param codec_cfg The codec configuration to set data for.
1327 * @param state The audio active state to set.
1328 *
1329 * @retval data_len The @p codec_cfg.data_len on success
1330 * @retval -EINVAL Arguments are invalid
1331 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1332 */
1333 int bt_audio_codec_cfg_meta_set_audio_active_state(struct bt_audio_codec_cfg *codec_cfg,
1334 enum bt_audio_active_state state);
1335
1336 /**
1337 * @brief Extract broadcast audio immediate rendering flag
1338 *
1339 * See @ref BT_AUDIO_METADATA_TYPE_BROADCAST_IMMEDIATE for more information about this value.
1340 *
1341 * @param codec_cfg The codec data to search in.
1342 *
1343 * @retval 0 The flag was found
1344 * @retval -EINVAL Arguments are invalid
1345 * @retval -ENODATA The flag was not found
1346 */
1347 int bt_audio_codec_cfg_meta_get_bcast_audio_immediate_rend_flag(
1348 const struct bt_audio_codec_cfg *codec_cfg);
1349
1350 /**
1351 * @brief Set the broadcast audio immediate rendering flag of a codec configuration metadata.
1352 *
1353 * @param codec_cfg The codec configuration to set data for.
1354 *
1355 * @retval data_len The @p codec_cfg.data_len on success
1356 * @retval -EINVAL Arguments are invalid
1357 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1358 */
1359 int bt_audio_codec_cfg_meta_set_bcast_audio_immediate_rend_flag(
1360 struct bt_audio_codec_cfg *codec_cfg);
1361
1362 /**
1363 * @brief Extract assisted listening stream
1364 *
1365 * See @ref BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM for more information about this value.
1366 *
1367 * @param codec_cfg The codec data to search in.
1368 *
1369 * @retval value The assisted listening stream value if positive or 0
1370 * @retval -EINVAL Arguments are invalid
1371 * @retval -ENODATA Data not found
1372 * @retval -EBADMSG The found value has invalid size
1373 */
1374 int bt_audio_codec_cfg_meta_get_assisted_listening_stream(
1375 const struct bt_audio_codec_cfg *codec_cfg);
1376
1377 /**
1378 * @brief Set the assisted listening stream value of a codec configuration metadata.
1379 *
1380 * @param codec_cfg The codec configuration to set data for.
1381 * @param val The assisted listening stream value to set.
1382 *
1383 * @retval data_len The @p codec_cap.data_len on success
1384 * @retval -EINVAL Arguments are invalid
1385 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1386 */
1387 int bt_audio_codec_cfg_meta_set_assisted_listening_stream(
1388 struct bt_audio_codec_cfg *codec_cfg, enum bt_audio_assisted_listening_stream val);
1389
1390 /**
1391 * @brief Extract broadcast name
1392 *
1393 * See @ref BT_AUDIO_METADATA_TYPE_BROADCAST_NAME for more information about this value.
1394 *
1395 * @param[in] codec_cfg The codec data to search in.
1396 * @param[out] broadcast_name Pointer to the UTF-8 formatted broadcast name.
1397 *
1398 * @retval length The length of the @p broadcast_name (may be 0)
1399 * @retval -EINVAL Arguments are invalid
1400 * @retval -ENODATA Data not found
1401 */
1402 int bt_audio_codec_cfg_meta_get_broadcast_name(const struct bt_audio_codec_cfg *codec_cfg,
1403 const uint8_t **broadcast_name);
1404
1405 /**
1406 * @brief Set the broadcast name of a codec configuration metadata.
1407 *
1408 * @param codec_cfg The codec configuration to set data for.
1409 * @param broadcast_name The broadcast name to set.
1410 * @param broadcast_name_len The length of @p broadcast_name.
1411 *
1412 * @retval data_len The @p codec_cfg.data_len on success
1413 * @retval -EINVAL Arguments are invalid
1414 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1415 */
1416 int bt_audio_codec_cfg_meta_set_broadcast_name(struct bt_audio_codec_cfg *codec_cfg,
1417 const uint8_t *broadcast_name,
1418 size_t broadcast_name_len);
1419
1420 /**
1421 * @brief Extract extended metadata
1422 *
1423 * See @ref BT_AUDIO_METADATA_TYPE_EXTENDED for more information about this value.
1424 *
1425 * @param[in] codec_cfg The codec data to search in.
1426 * @param[out] extended_meta Pointer to the extended metadata.
1427 *
1428 * @retval len The length of the @p extended_meta (may be 0)
1429 * @retval -EINVAL Arguments are invalid
1430 * @retval -ENODATA Data not found
1431 */
1432 int bt_audio_codec_cfg_meta_get_extended(const struct bt_audio_codec_cfg *codec_cfg,
1433 const uint8_t **extended_meta);
1434
1435 /**
1436 * @brief Set the extended metadata of a codec configuration metadata.
1437 *
1438 * @param codec_cfg The codec configuration to set data for.
1439 * @param extended_meta The extended metadata to set.
1440 * @param extended_meta_len The length of @p extended_meta.
1441 *
1442 * @retval data_len The @p codec_cfg.data_len on success
1443 * @retval -EINVAL Arguments are invalid
1444 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1445 */
1446 int bt_audio_codec_cfg_meta_set_extended(struct bt_audio_codec_cfg *codec_cfg,
1447 const uint8_t *extended_meta, size_t extended_meta_len);
1448
1449 /**
1450 * @brief Extract vendor specific metadata
1451 *
1452 * See @ref BT_AUDIO_METADATA_TYPE_VENDOR for more information about this value.
1453 *
1454 * @param[in] codec_cfg The codec data to search in.
1455 * @param[out] vendor_meta Pointer to the vendor specific metadata.
1456 *
1457 * @retval len The length of the @p vendor_meta (may be 0)
1458 * @retval -EINVAL Arguments are invalid
1459 * @retval -ENODATA Data not found
1460 */
1461 int bt_audio_codec_cfg_meta_get_vendor(const struct bt_audio_codec_cfg *codec_cfg,
1462 const uint8_t **vendor_meta);
1463
1464 /**
1465 * @brief Set the vendor specific metadata of a codec configuration metadata.
1466 *
1467 * @param codec_cfg The codec configuration to set data for.
1468 * @param vendor_meta The vendor specific metadata to set.
1469 * @param vendor_meta_len The length of @p vendor_meta.
1470 *
1471 * @retval data_len The @p codec_cfg.data_len on success
1472 * @retval -EINVAL Arguments are invalid
1473 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1474 */
1475 int bt_audio_codec_cfg_meta_set_vendor(struct bt_audio_codec_cfg *codec_cfg,
1476 const uint8_t *vendor_meta, size_t vendor_meta_len);
1477 /** @} */ /* End of bt_audio_codec_cfg */
1478
1479 /**
1480 * @brief Audio codec capabilities APIs
1481 * @defgroup bt_audio_codec_cap Codec capability parsing APIs
1482 *
1483 * Functions to parse codec capability data when formatted as LTV wrapped into @ref
1484 * bt_audio_codec_cap.
1485 *
1486 * @{
1487 */
1488
1489 /**
1490 * @brief Lookup a specific value based on type
1491 *
1492 * @param[in] codec_cap The codec data to search in.
1493 * @param[in] type The type id to look for
1494 * @param[out] data Pointer to the data-pointer to update when item is found
1495 *
1496 * @retval len Length of found @p data (may be 0)
1497 * @retval -EINVAL Arguments are invalid
1498 * @retval -ENODATA Data not found
1499 */
1500 int bt_audio_codec_cap_get_val(const struct bt_audio_codec_cap *codec_cap,
1501 enum bt_audio_codec_cap_type type, const uint8_t **data);
1502
1503 /**
1504 * @brief Set or add a specific codec capability value
1505 *
1506 * @param codec_cap The codec data to set the value in.
1507 * @param type The type id to set
1508 * @param data Pointer to the data-pointer to set
1509 * @param data_len Length of @p data
1510 *
1511 * @retval data_len The @p codec_cap.data_len on success
1512 * @retval -EINVAL Arguments are invalid
1513 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1514 */
1515 int bt_audio_codec_cap_set_val(struct bt_audio_codec_cap *codec_cap,
1516 enum bt_audio_codec_cap_type type, const uint8_t *data,
1517 size_t data_len);
1518
1519 /**
1520 * @brief Unset a specific codec capability value
1521 *
1522 * The type and the value will be removed from the codec capability.
1523 *
1524 * @param codec_cap The codec data to set the value in.
1525 * @param type The type id to unset.
1526 *
1527 * @retval data_len The @p codec_cap.data_len on success
1528 * @retval -EINVAL Arguments are invalid
1529 */
1530 int bt_audio_codec_cap_unset_val(struct bt_audio_codec_cap *codec_cap,
1531 enum bt_audio_codec_cap_type type);
1532
1533 /**
1534 * @brief Extract the frequency from a codec capability.
1535 *
1536 * @param codec_cap The codec capabilities to extract data from.
1537 *
1538 * @retval frequencies Bitfield of supported frequencies (@ref bt_audio_codec_cap_freq) if 0 or
1539 * positive
1540 * @retval -EINVAL Arguments are invalid
1541 * @retval -ENODATA Data not found
1542 * @retval -EBADMSG The found value has invalid size or value
1543 */
1544 int bt_audio_codec_cap_get_freq(const struct bt_audio_codec_cap *codec_cap);
1545
1546 /**
1547 * @brief Set the supported frequencies of a codec capability.
1548 *
1549 * @param codec_cap The codec capabilities to set data for.
1550 * @param freq The supported frequencies to set.
1551 *
1552 * @retval data_len The @p codec_cap.data_len on success
1553 * @retval -EINVAL Arguments are invalid
1554 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1555 */
1556 int bt_audio_codec_cap_set_freq(struct bt_audio_codec_cap *codec_cap,
1557 enum bt_audio_codec_cap_freq freq);
1558
1559 /**
1560 * @brief Extract the frequency from a codec capability.
1561 *
1562 * @param codec_cap The codec capabilities to extract data from.
1563 *
1564 * @retval durations Bitfield of supported frame durations if 0 or positive
1565 * @retval -EINVAL Arguments are invalid
1566 * @retval -ENODATA Data not found
1567 * @retval -EBADMSG The found value has invalid size or value
1568 */
1569 int bt_audio_codec_cap_get_frame_dur(const struct bt_audio_codec_cap *codec_cap);
1570
1571 /**
1572 * @brief Set the frame duration of a codec capability.
1573 *
1574 * @param codec_cap The codec capabilities to set data for.
1575 * @param frame_dur The frame duration to set.
1576 *
1577 * @retval data_len The @p codec_cap.data_len on success
1578 * @retval -EINVAL Arguments are invalid
1579 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1580 */
1581 int bt_audio_codec_cap_set_frame_dur(struct bt_audio_codec_cap *codec_cap,
1582 enum bt_audio_codec_cap_frame_dur frame_dur);
1583
1584 /**
1585 * @brief Extract the frequency from a codec capability.
1586 *
1587 * @param codec_cap The codec capabilities to extract data from.
1588 * @param fallback_to_default If true this function will provide the default value of 1
1589 * if the type is not found when @p codec_cap.id is @ref BT_HCI_CODING_FORMAT_LC3.
1590 *
1591 * @retval channel_counts Number of supported channel counts if 0 or positive
1592 * @retval -EINVAL Arguments are invalid
1593 * @retval -ENODATA Data not found
1594 * @retval -EBADMSG The found value has invalid size or value
1595 */
1596 int bt_audio_codec_cap_get_supported_audio_chan_counts(const struct bt_audio_codec_cap *codec_cap,
1597 bool fallback_to_default);
1598
1599 /**
1600 * @brief Set the channel count of a codec capability.
1601 *
1602 * @param codec_cap The codec capabilities to set data for.
1603 * @param chan_count The channel count frequency to set.
1604 *
1605 * @retval data_len The @p codec_cap.data_len on success
1606 * @retval -EINVAL Arguments are invalid
1607 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1608 */
1609 int bt_audio_codec_cap_set_supported_audio_chan_counts(
1610 struct bt_audio_codec_cap *codec_cap, enum bt_audio_codec_cap_chan_count chan_count);
1611
1612 /**
1613 * @brief Extract the supported octets per codec frame from a codec capability.
1614 *
1615 * @param[in] codec_cap The codec capabilities to extract data from.
1616 * @param[out] codec_frame Struct to place the resulting values in
1617 *
1618 * @retval 0 Success
1619 * @retval -EINVAL Arguments are invalid
1620 * @retval -ENODATA Data not found
1621 * @retval -EBADMSG The found value has invalid size or value
1622 */
1623 int bt_audio_codec_cap_get_octets_per_frame(
1624 const struct bt_audio_codec_cap *codec_cap,
1625 struct bt_audio_codec_octets_per_codec_frame *codec_frame);
1626
1627 /**
1628 * @brief Set the octets per codec frame of a codec capability.
1629 *
1630 * @param codec_cap The codec capabilities to set data for.
1631 * @param codec_frame The octets per codec frame to set.
1632 *
1633 * @retval data_len The @p codec_cap.data_len on success
1634 * @retval -EINVAL Arguments are invalid
1635 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1636 */
1637 int bt_audio_codec_cap_set_octets_per_frame(
1638 struct bt_audio_codec_cap *codec_cap,
1639 const struct bt_audio_codec_octets_per_codec_frame *codec_frame);
1640
1641 /**
1642 * @brief Extract the maximum codec frames per SDU from a codec capability.
1643 *
1644 * @param codec_cap The codec capabilities to extract data from.
1645 * @param fallback_to_default If true this function will provide the default value of 1
1646 * if the type is not found when @p codec_cap.id is @ref BT_HCI_CODING_FORMAT_LC3.
1647 *
1648 * @retval codec_frames_per_sdu Maximum number of codec frames per SDU supported
1649 * @retval -EINVAL Arguments are invalid
1650 * @retval -ENODATA Data not found
1651 * @retval -EBADMSG The found value has invalid size or value
1652 */
1653 int bt_audio_codec_cap_get_max_codec_frames_per_sdu(const struct bt_audio_codec_cap *codec_cap,
1654 bool fallback_to_default);
1655
1656 /**
1657 * @brief Set the maximum codec frames per SDU of a codec capability.
1658 *
1659 * @param codec_cap The codec capabilities to set data for.
1660 * @param codec_frames_per_sdu The maximum codec frames per SDU to set.
1661 *
1662 * @retval data_len The @p codec_cap.data_len on success
1663 * @retval -EINVAL Arguments are invalid
1664 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1665 */
1666 int bt_audio_codec_cap_set_max_codec_frames_per_sdu(struct bt_audio_codec_cap *codec_cap,
1667 uint8_t codec_frames_per_sdu);
1668
1669 /**
1670 * @brief Lookup a specific metadata value based on type
1671 *
1672 * @param[in] codec_cap The codec data to search in.
1673 * @param[in] type The type id to look for
1674 * @param[out] data Pointer to the data-pointer to update when item is found
1675 *
1676 * @retval len Length of found @p data (may be 0)
1677 * @retval -EINVAL Arguments are invalid
1678 * @retval -ENODATA Data not found
1679 */
1680 int bt_audio_codec_cap_meta_get_val(const struct bt_audio_codec_cap *codec_cap, uint8_t type,
1681 const uint8_t **data);
1682
1683 /**
1684 * @brief Set or add a specific codec capability metadata value.
1685 *
1686 * @param codec_cap The codec capability to set the value in.
1687 * @param type The type id to set.
1688 * @param data Pointer to the data-pointer to set.
1689 * @param data_len Length of @p data.
1690 *
1691 * @retval meta_len The @p codec_cap.meta_len on success
1692 * @retval -EINVAL Arguments are invalid
1693 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1694 */
1695 int bt_audio_codec_cap_meta_set_val(struct bt_audio_codec_cap *codec_cap,
1696 enum bt_audio_metadata_type type, const uint8_t *data,
1697 size_t data_len);
1698
1699 /**
1700 * @brief Unset a specific codec capability metadata value
1701 *
1702 * The type and the value will be removed from the codec capability metadata.
1703 *
1704 * @param codec_cap The codec data to set the value in.
1705 * @param type The type id to unset.
1706 *
1707 * @retval meta_len The of @p codec_cap.meta_len on success
1708 * @retval -EINVAL Arguments are invalid
1709 */
1710 int bt_audio_codec_cap_meta_unset_val(struct bt_audio_codec_cap *codec_cap,
1711 enum bt_audio_metadata_type type);
1712
1713 /**
1714 * @brief Extract preferred contexts
1715 *
1716 * See @ref BT_AUDIO_METADATA_TYPE_PREF_CONTEXT for more information about this value.
1717 *
1718 * @param codec_cap The codec data to search in.
1719 *
1720 * @retval The preferred context type if positive or 0
1721 * @retval -EINVAL Arguments are invalid
1722 * @retval -ENODATA Data not found
1723 * @retval -EBADMSG The found value has invalid size
1724 */
1725 int bt_audio_codec_cap_meta_get_pref_context(const struct bt_audio_codec_cap *codec_cap);
1726
1727 /**
1728 * @brief Set the preferred context of a codec capability metadata.
1729 *
1730 * @param codec_cap The codec capability to set data for.
1731 * @param ctx The preferred context to set.
1732 *
1733 * @retval data_len The @p codec_cap.data_len on success
1734 * @retval -EINVAL Arguments are invalid
1735 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1736 */
1737 int bt_audio_codec_cap_meta_set_pref_context(struct bt_audio_codec_cap *codec_cap,
1738 enum bt_audio_context ctx);
1739
1740 /**
1741 * @brief Extract stream contexts
1742 *
1743 * See @ref BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT for more information about this value.
1744 *
1745 * @param codec_cap The codec data to search in.
1746 *
1747 * @retval context The stream context type if positive or 0
1748 * @retval -EINVAL Arguments are invalid
1749 * @retval -ENODATA Data not found
1750 * @retval -EBADMSG The found value has invalid size
1751 */
1752 int bt_audio_codec_cap_meta_get_stream_context(const struct bt_audio_codec_cap *codec_cap);
1753
1754 /**
1755 * @brief Set the stream context of a codec capability metadata.
1756 *
1757 * @param codec_cap The codec capability to set data for.
1758 * @param ctx The stream context to set.
1759 *
1760 * @retval data_len The @p codec_cap.data_len on success
1761 * @retval -EINVAL Arguments are invalid
1762 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1763 */
1764 int bt_audio_codec_cap_meta_set_stream_context(struct bt_audio_codec_cap *codec_cap,
1765 enum bt_audio_context ctx);
1766
1767 /**
1768 * @brief Extract program info
1769 *
1770 * See @ref BT_AUDIO_METADATA_TYPE_PROGRAM_INFO for more information about this value.
1771 *
1772 * @param[in] codec_cap The codec data to search in.
1773 * @param[out] program_info Pointer to the UTF-8 formatted program info.
1774 *
1775 * @retval len The length of the @p program_info (may be 0)
1776 * @retval -EINVAL Arguments are invalid
1777 * @retval -ENODATA Data not found
1778 */
1779 int bt_audio_codec_cap_meta_get_program_info(const struct bt_audio_codec_cap *codec_cap,
1780 const uint8_t **program_info);
1781
1782 /**
1783 * @brief Set the program info of a codec capability metadata.
1784 *
1785 * @param codec_cap The codec capability to set data for.
1786 * @param program_info The program info to set.
1787 * @param program_info_len The length of @p program_info.
1788 *
1789 * @retval data_len The @p codec_cap.data_len on success
1790 * @retval -EINVAL Arguments are invalid
1791 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1792 */
1793 int bt_audio_codec_cap_meta_set_program_info(struct bt_audio_codec_cap *codec_cap,
1794 const uint8_t *program_info, size_t program_info_len);
1795
1796 /**
1797 * @brief Extract language
1798 *
1799 * See @ref BT_AUDIO_METADATA_TYPE_LANG for more information about this value.
1800 *
1801 * @param[in] codec_cap The codec data to search in.
1802 * @param[out] lang Pointer to the language bytes (of length BT_AUDIO_LANG_SIZE)
1803 *
1804 * @retval 0 Success
1805 * @retval -EINVAL Arguments are invalid
1806 * @retval -ENODATA Data not found
1807 * @retval -EBADMSG The found value has invalid size
1808 */
1809 int bt_audio_codec_cap_meta_get_lang(const struct bt_audio_codec_cap *codec_cap,
1810 const uint8_t **lang);
1811
1812 /**
1813 * @brief Set the language of a codec capability metadata.
1814 *
1815 * @param codec_cap The codec capability to set data for.
1816 * @param lang The 24-bit language to set.
1817 *
1818 * @retval data_len The @p codec_cap.data_len on success
1819 * @retval -EINVAL Arguments are invalid
1820 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1821 */
1822 int bt_audio_codec_cap_meta_set_lang(struct bt_audio_codec_cap *codec_cap,
1823 const uint8_t lang[BT_AUDIO_LANG_SIZE]);
1824
1825 /**
1826 * @brief Extract CCID list
1827 *
1828 * See @ref BT_AUDIO_METADATA_TYPE_CCID_LIST for more information about this value.
1829 *
1830 * @param[in] codec_cap The codec data to search in.
1831 * @param[out] ccid_list Pointer to the array containing 8-bit CCIDs.
1832 *
1833 * @retval len The length of the @p ccid_list (may be 0)
1834 * @retval -EINVAL Arguments are invalid
1835 * @retval -ENODATA Data not found
1836 */
1837 int bt_audio_codec_cap_meta_get_ccid_list(const struct bt_audio_codec_cap *codec_cap,
1838 const uint8_t **ccid_list);
1839
1840 /**
1841 * @brief Set the CCID list of a codec capability metadata.
1842 *
1843 * @param codec_cap The codec capability to set data for.
1844 * @param ccid_list The program info to set.
1845 * @param ccid_list_len The length of @p ccid_list.
1846 *
1847 * @retval data_len The @p codec_cap.data_len on success
1848 * @retval -EINVAL Arguments are invalid
1849 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1850 */
1851 int bt_audio_codec_cap_meta_set_ccid_list(struct bt_audio_codec_cap *codec_cap,
1852 const uint8_t *ccid_list, size_t ccid_list_len);
1853
1854 /**
1855 * @brief Extract parental rating
1856 *
1857 * See @ref BT_AUDIO_METADATA_TYPE_PARENTAL_RATING for more information about this value.
1858 *
1859 * @param codec_cap The codec data to search in.
1860 *
1861 * @retval The parental rating if positive or 0
1862 * @retval -EINVAL Arguments are invalid
1863 * @retval -ENODATA Data not found
1864 * @retval -EBADMSG The found value has invalid size
1865 */
1866 int bt_audio_codec_cap_meta_get_parental_rating(const struct bt_audio_codec_cap *codec_cap);
1867
1868 /**
1869 * @brief Set the parental rating of a codec capability metadata.
1870 *
1871 * @param codec_cap The codec capability to set data for.
1872 * @param parental_rating The parental rating to set.
1873 *
1874 * @retval data_len The @p codec_cap.data_len on success
1875 * @retval -EINVAL Arguments are invalid
1876 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1877 */
1878 int bt_audio_codec_cap_meta_set_parental_rating(struct bt_audio_codec_cap *codec_cap,
1879 enum bt_audio_parental_rating parental_rating);
1880
1881 /**
1882 * @brief Extract program info URI
1883 *
1884 * See @ref BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI for more information about this value.
1885 *
1886 * @param[in] codec_cap The codec data to search in.
1887 * @param[out] program_info_uri Pointer to the UTF-8 formatted program info URI.
1888 *
1889 * @retval len The length of the @p program_info_uri (may be 0)
1890 * @retval -EINVAL Arguments are invalid
1891 * @retval -ENODATA Data not found
1892 */
1893 int bt_audio_codec_cap_meta_get_program_info_uri(const struct bt_audio_codec_cap *codec_cap,
1894 const uint8_t **program_info_uri);
1895
1896 /**
1897 * @brief Set the program info URI of a codec capability metadata.
1898 *
1899 * @param codec_cap The codec capability to set data for.
1900 * @param program_info_uri The program info URI to set.
1901 * @param program_info_uri_len The length of @p program_info_uri.
1902 *
1903 * @retval data_len The @p codec_cap.data_len on success
1904 * @retval -EINVAL Arguments are invalid
1905 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1906 */
1907 int bt_audio_codec_cap_meta_set_program_info_uri(struct bt_audio_codec_cap *codec_cap,
1908 const uint8_t *program_info_uri,
1909 size_t program_info_uri_len);
1910
1911 /**
1912 * @brief Extract audio active state
1913 *
1914 * See @ref BT_AUDIO_METADATA_TYPE_AUDIO_STATE for more information about this value.
1915 *
1916 * @param codec_cap The codec data to search in.
1917 *
1918 * @retval context The preferred context type if positive or 0
1919 * @retval -EINVAL Arguments are invalid
1920 * @retval -ENODATA Data not found
1921 * @retval -EBADMSG The found value has invalid size
1922 */
1923 int bt_audio_codec_cap_meta_get_audio_active_state(const struct bt_audio_codec_cap *codec_cap);
1924
1925 /**
1926 * @brief Set the audio active state of a codec capability metadata.
1927 *
1928 * @param codec_cap The codec capability to set data for.
1929 * @param state The audio active state to set.
1930 *
1931 * @retval data_len The @p codec_cap.data_len on success
1932 * @retval -EINVAL Arguments are invalid
1933 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1934 */
1935 int bt_audio_codec_cap_meta_set_audio_active_state(struct bt_audio_codec_cap *codec_cap,
1936 enum bt_audio_active_state state);
1937
1938 /**
1939 * @brief Extract broadcast audio immediate rendering flag
1940 *
1941 * See @ref BT_AUDIO_METADATA_TYPE_BROADCAST_IMMEDIATE for more information about this value.
1942 *
1943 * @param codec_cap The codec data to search in.
1944 *
1945 * @retval 0 The flag was found
1946 * @retval -EINVAL Arguments are invalid
1947 * @retval -ENODATA The flag was not found
1948 */
1949 int bt_audio_codec_cap_meta_get_bcast_audio_immediate_rend_flag(
1950 const struct bt_audio_codec_cap *codec_cap);
1951
1952 /**
1953 * @brief Set the broadcast audio immediate rendering flag of a codec capability metadata.
1954 *
1955 * @param codec_cap The codec capability to set data for.
1956 *
1957 * @retval data_len The @p codec_cap.data_len on success
1958 * @retval -EINVAL Arguments are invalid
1959 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1960 */
1961 int bt_audio_codec_cap_meta_set_bcast_audio_immediate_rend_flag(
1962 struct bt_audio_codec_cap *codec_cap);
1963
1964 /**
1965 * @brief Extract assisted listening stream
1966 *
1967 * See @ref BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM for more information about this value.
1968 *
1969 * @param codec_cap The codec data to search in.
1970 *
1971 * @retval value The assisted listening stream value if positive or 0
1972 * @retval -EINVAL Arguments are invalid
1973 * @retval -ENODATA Data not found
1974 * @retval -EBADMSG The found value has invalid size
1975 */
1976 int bt_audio_codec_cap_meta_get_assisted_listening_stream(
1977 const struct bt_audio_codec_cap *codec_cap);
1978
1979 /**
1980 * @brief Set the assisted listening stream value of a codec capability metadata.
1981 *
1982 * @param codec_cap The codec capability to set data for.
1983 * @param val The assisted listening stream value to set.
1984 *
1985 * @retval data_len The @p codec_cap.data_len on success
1986 * @retval -EINVAL Arguments are invalid
1987 * @retval -ENOMEM The new value could not be set or added due to lack of memory
1988 */
1989 int bt_audio_codec_cap_meta_set_assisted_listening_stream(
1990 struct bt_audio_codec_cap *codec_cap, enum bt_audio_assisted_listening_stream val);
1991
1992 /**
1993 * @brief Extract broadcast name
1994 *
1995 * See @ref BT_AUDIO_METADATA_TYPE_BROADCAST_NAME for more information about this value.
1996 *
1997 * @param[in] codec_cap The codec data to search in.
1998 * @param[out] broadcast_name Pointer to the UTF-8 formatted broadcast name.
1999 *
2000 * @retval length The length of the @p broadcast_name (may be 0)
2001 * @retval -EINVAL Arguments are invalid
2002 * @retval -ENODATA Data not found
2003 */
2004 int bt_audio_codec_cap_meta_get_broadcast_name(const struct bt_audio_codec_cap *codec_cap,
2005 const uint8_t **broadcast_name);
2006
2007 /**
2008 * @brief Set the broadcast name of a codec capability metadata.
2009 *
2010 * @param codec_cap The codec capability to set data for.
2011 * @param broadcast_name The broadcast name to set.
2012 * @param broadcast_name_len The length of @p broadcast_name.
2013 *
2014 * @retval data_len The @p codec_cap.data_len on success
2015 * @retval -EINVAL Arguments are invalid
2016 * @retval -ENOMEM The new value could not be set or added due to lack of memory
2017 */
2018 int bt_audio_codec_cap_meta_set_broadcast_name(struct bt_audio_codec_cap *codec_cap,
2019 const uint8_t *broadcast_name,
2020 size_t broadcast_name_len);
2021 /**
2022 * @brief Extract extended metadata
2023 *
2024 * See @ref BT_AUDIO_METADATA_TYPE_EXTENDED for more information about this value.
2025 *
2026 * @param[in] codec_cap The codec data to search in.
2027 * @param[out] extended_meta Pointer to the extended metadata.
2028 *
2029 * @retval len The length of the @p extended_meta (may be 0)
2030 * @retval -EINVAL Arguments are invalid
2031 * @retval -ENODATA Data not found
2032 */
2033 int bt_audio_codec_cap_meta_get_extended(const struct bt_audio_codec_cap *codec_cap,
2034 const uint8_t **extended_meta);
2035
2036 /**
2037 * @brief Set the extended metadata of a codec capability metadata.
2038 *
2039 * @param codec_cap The codec capability to set data for.
2040 * @param extended_meta The extended metadata to set.
2041 * @param extended_meta_len The length of @p extended_meta.
2042 *
2043 * @retval data_len The @p codec_cap.data_len on success
2044 * @retval -EINVAL Arguments are invalid
2045 * @retval -ENOMEM The new value could not be set or added due to lack of memory
2046 */
2047 int bt_audio_codec_cap_meta_set_extended(struct bt_audio_codec_cap *codec_cap,
2048 const uint8_t *extended_meta, size_t extended_meta_len);
2049
2050 /**
2051 * @brief Extract vendor specific metadata
2052 *
2053 * See @ref BT_AUDIO_METADATA_TYPE_VENDOR for more information about this value.
2054 *
2055 * @param[in] codec_cap The codec data to search in.
2056 * @param[out] vendor_meta Pointer to the vendor specific metadata.
2057 *
2058 * @retval len The length of the @p vendor_meta (may be 0)
2059 * @retval -EINVAL Arguments are invalid
2060 * @retval -ENODATA Data not found
2061 */
2062 int bt_audio_codec_cap_meta_get_vendor(const struct bt_audio_codec_cap *codec_cap,
2063 const uint8_t **vendor_meta);
2064
2065 /**
2066 * @brief Set the vendor specific metadata of a codec capability metadata.
2067 *
2068 * @param codec_cap The codec capability to set data for.
2069 * @param vendor_meta The vendor specific metadata to set.
2070 * @param vendor_meta_len The length of @p vendor_meta.
2071 *
2072 * @retval data_len The @p codec_cap.data_len on success
2073 * @retval -EINVAL Arguments are invalid
2074 * @retval -ENOMEM The new value could not be set or added due to lack of memory
2075 */
2076 int bt_audio_codec_cap_meta_set_vendor(struct bt_audio_codec_cap *codec_cap,
2077 const uint8_t *vendor_meta, size_t vendor_meta_len);
2078
2079 /** @} */ /* End of bt_audio_codec_cap */
2080
2081 /**
2082 * @brief Assigned numbers to string API
2083 * @defgroup bt_audio_to_str Assigned numbers to string API
2084 *
2085 * Functions to return string representation of Bluetooth Audio assigned number values.
2086 *
2087 * @{
2088 */
2089
2090 /**
2091 * @brief Returns a string representation of a specific @ref bt_audio_context bit
2092 *
2093 * If @p context contains multiple bits, it will return "Unknown context"
2094 *
2095 * @param context A single context bit
2096 *
2097 * @return String representation of the supplied bit
2098 */
bt_audio_context_bit_to_str(enum bt_audio_context context)2099 static inline char *bt_audio_context_bit_to_str(enum bt_audio_context context)
2100 {
2101 switch (context) {
2102 case BT_AUDIO_CONTEXT_TYPE_PROHIBITED:
2103 return "Prohibited";
2104 case BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED:
2105 return "Unspecified";
2106 case BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL:
2107 return "Conversational";
2108 case BT_AUDIO_CONTEXT_TYPE_MEDIA:
2109 return "Media";
2110 case BT_AUDIO_CONTEXT_TYPE_GAME:
2111 return "Game";
2112 case BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL:
2113 return "Instructional";
2114 case BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS:
2115 return "Voice assistant";
2116 case BT_AUDIO_CONTEXT_TYPE_LIVE:
2117 return "Live";
2118 case BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS:
2119 return "Sound effects";
2120 case BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS:
2121 return "Notifications";
2122 case BT_AUDIO_CONTEXT_TYPE_RINGTONE:
2123 return "Ringtone";
2124 case BT_AUDIO_CONTEXT_TYPE_ALERTS:
2125 return "Alerts";
2126 case BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM:
2127 return "Emergency alarm";
2128 default:
2129 return "Unknown context";
2130 }
2131 }
2132
2133 /**
2134 * @brief Returns a string representation of a @ref bt_audio_parental_rating value
2135 *
2136 * @param parental_rating The parental rating value
2137 *
2138 * @return String representation of the supplied parental rating value
2139 */
bt_audio_parental_rating_to_str(enum bt_audio_parental_rating parental_rating)2140 static inline char *bt_audio_parental_rating_to_str(enum bt_audio_parental_rating parental_rating)
2141 {
2142 switch (parental_rating) {
2143 case BT_AUDIO_PARENTAL_RATING_NO_RATING:
2144 return "No rating";
2145 case BT_AUDIO_PARENTAL_RATING_AGE_ANY:
2146 return "Any";
2147 case BT_AUDIO_PARENTAL_RATING_AGE_5_OR_ABOVE:
2148 return "Age 5 or above";
2149 case BT_AUDIO_PARENTAL_RATING_AGE_6_OR_ABOVE:
2150 return "Age 6 or above";
2151 case BT_AUDIO_PARENTAL_RATING_AGE_7_OR_ABOVE:
2152 return "Age 7 or above";
2153 case BT_AUDIO_PARENTAL_RATING_AGE_8_OR_ABOVE:
2154 return "Age 8 or above";
2155 case BT_AUDIO_PARENTAL_RATING_AGE_9_OR_ABOVE:
2156 return "Age 9 or above";
2157 case BT_AUDIO_PARENTAL_RATING_AGE_10_OR_ABOVE:
2158 return "Age 10 or above";
2159 case BT_AUDIO_PARENTAL_RATING_AGE_11_OR_ABOVE:
2160 return "Age 11 or above";
2161 case BT_AUDIO_PARENTAL_RATING_AGE_12_OR_ABOVE:
2162 return "Age 12 or above";
2163 case BT_AUDIO_PARENTAL_RATING_AGE_13_OR_ABOVE:
2164 return "Age 13 or above";
2165 case BT_AUDIO_PARENTAL_RATING_AGE_14_OR_ABOVE:
2166 return "Age 14 or above";
2167 case BT_AUDIO_PARENTAL_RATING_AGE_15_OR_ABOVE:
2168 return "Age 15 or above";
2169 case BT_AUDIO_PARENTAL_RATING_AGE_16_OR_ABOVE:
2170 return "Age 16 or above";
2171 case BT_AUDIO_PARENTAL_RATING_AGE_17_OR_ABOVE:
2172 return "Age 17 or above";
2173 case BT_AUDIO_PARENTAL_RATING_AGE_18_OR_ABOVE:
2174 return "Age 18 or above";
2175 default:
2176 return "Unknown rating";
2177 }
2178 }
2179
2180 /**
2181 * @brief Returns a string representation of a @ref bt_audio_active_state value
2182 *
2183 * @param state The active state value
2184 *
2185 * @return String representation of the supplied active state value
2186 */
bt_audio_active_state_to_str(enum bt_audio_active_state state)2187 static inline char *bt_audio_active_state_to_str(enum bt_audio_active_state state)
2188 {
2189 switch (state) {
2190 case BT_AUDIO_ACTIVE_STATE_DISABLED:
2191 return "Disabled";
2192 case BT_AUDIO_ACTIVE_STATE_ENABLED:
2193 return "Enabled";
2194 default:
2195 return "Unknown active state";
2196 }
2197 }
2198
2199 /**
2200 * @brief Returns a string representation of a specific @ref bt_audio_codec_cap_freq bit
2201 *
2202 * If @p freq contains multiple bits, it will return "Unknown supported frequency"
2203 *
2204 * @param freq A single frequency bit
2205 *
2206 * @return String representation of the supplied bit
2207 */
bt_audio_codec_cap_freq_bit_to_str(enum bt_audio_codec_cap_freq freq)2208 static inline char *bt_audio_codec_cap_freq_bit_to_str(enum bt_audio_codec_cap_freq freq)
2209 {
2210 switch (freq) {
2211 case BT_AUDIO_CODEC_CAP_FREQ_8KHZ:
2212 return "8000 Hz";
2213 case BT_AUDIO_CODEC_CAP_FREQ_11KHZ:
2214 return "11025 Hz";
2215 case BT_AUDIO_CODEC_CAP_FREQ_16KHZ:
2216 return "16000 Hz";
2217 case BT_AUDIO_CODEC_CAP_FREQ_22KHZ:
2218 return "22050 Hz";
2219 case BT_AUDIO_CODEC_CAP_FREQ_24KHZ:
2220 return "24000 Hz";
2221 case BT_AUDIO_CODEC_CAP_FREQ_32KHZ:
2222 return "32000 Hz";
2223 case BT_AUDIO_CODEC_CAP_FREQ_44KHZ:
2224 return "44100 Hz";
2225 case BT_AUDIO_CODEC_CAP_FREQ_48KHZ:
2226 return "48000 Hz";
2227 case BT_AUDIO_CODEC_CAP_FREQ_88KHZ:
2228 return "88200 Hz";
2229 case BT_AUDIO_CODEC_CAP_FREQ_96KHZ:
2230 return "96000 Hz";
2231 case BT_AUDIO_CODEC_CAP_FREQ_176KHZ:
2232 return "176400 Hz";
2233 case BT_AUDIO_CODEC_CAP_FREQ_192KHZ:
2234 return "192000 Hz";
2235 case BT_AUDIO_CODEC_CAP_FREQ_384KHZ:
2236 return "384000 Hz";
2237 default:
2238 return "Unknown supported frequency";
2239 }
2240 }
2241
2242 /**
2243 * @brief Returns a string representation of a specific @ref bt_audio_codec_cap_frame_dur bit
2244 *
2245 * If @p frame_dur contains multiple bits, it will return "Unknown frame duration"
2246 *
2247 * @param frame_dur A single frame duration bit
2248 *
2249 * @return String representation of the supplied bit
2250 */
2251 static inline char *
bt_audio_codec_cap_frame_dur_bit_to_str(enum bt_audio_codec_cap_frame_dur frame_dur)2252 bt_audio_codec_cap_frame_dur_bit_to_str(enum bt_audio_codec_cap_frame_dur frame_dur)
2253 {
2254 switch (frame_dur) {
2255 case BT_AUDIO_CODEC_CAP_DURATION_7_5:
2256 return "7.5 ms";
2257 case BT_AUDIO_CODEC_CAP_DURATION_10:
2258 return "10 ms";
2259 case BT_AUDIO_CODEC_CAP_DURATION_PREFER_7_5:
2260 return "7.5 ms preferred";
2261 case BT_AUDIO_CODEC_CAP_DURATION_PREFER_10:
2262 return "10 ms preferred";
2263 default:
2264 return "Unknown frame duration";
2265 }
2266 }
2267
2268 /**
2269 * @brief Returns a string representation of a specific @ref bt_audio_codec_cap_chan_count bit
2270 *
2271 * If @p chan_count contains multiple bits, it will return "Unknown channel count"
2272 *
2273 * @param chan_count A single frame channel count bit
2274 *
2275 * @return String representation of the supplied bit
2276 */
2277 static inline char *
bt_audio_codec_cap_chan_count_bit_to_str(enum bt_audio_codec_cap_chan_count chan_count)2278 bt_audio_codec_cap_chan_count_bit_to_str(enum bt_audio_codec_cap_chan_count chan_count)
2279 {
2280 switch (chan_count) {
2281 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_1:
2282 return "1 channel";
2283 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_2:
2284 return "2 channels";
2285 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_3:
2286 return "3 channels";
2287 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_4:
2288 return "4 channels";
2289 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_5:
2290 return "5 channels";
2291 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_6:
2292 return "6 channels";
2293 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_7:
2294 return "7 channels";
2295 case BT_AUDIO_CODEC_CAP_CHAN_COUNT_8:
2296 return "8 channels";
2297 default:
2298 return "Unknown channel count";
2299 }
2300 }
2301
2302 /**
2303 * @brief Returns a string representation of a specific @ref bt_audio_location bit
2304 *
2305 * If @p location contains multiple bits, it will return "Unknown location"
2306 *
2307 * @param location A single location bit
2308 *
2309 * @return String representation of the supplied bit
2310 */
bt_audio_location_bit_to_str(enum bt_audio_location location)2311 static inline char *bt_audio_location_bit_to_str(enum bt_audio_location location)
2312 {
2313 switch (location) {
2314 case BT_AUDIO_LOCATION_MONO_AUDIO:
2315 return "Mono";
2316 case BT_AUDIO_LOCATION_FRONT_LEFT:
2317 return "Front left";
2318 case BT_AUDIO_LOCATION_FRONT_RIGHT:
2319 return "Front right";
2320 case BT_AUDIO_LOCATION_FRONT_CENTER:
2321 return "Front center";
2322 case BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_1:
2323 return "Low frequency effects 1";
2324 case BT_AUDIO_LOCATION_BACK_LEFT:
2325 return "Back left";
2326 case BT_AUDIO_LOCATION_BACK_RIGHT:
2327 return "Back right";
2328 case BT_AUDIO_LOCATION_FRONT_LEFT_OF_CENTER:
2329 return "Front left of center";
2330 case BT_AUDIO_LOCATION_FRONT_RIGHT_OF_CENTER:
2331 return "Front right of center";
2332 case BT_AUDIO_LOCATION_BACK_CENTER:
2333 return "Back center";
2334 case BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_2:
2335 return "Low frequency effects 2";
2336 case BT_AUDIO_LOCATION_SIDE_LEFT:
2337 return "Side left";
2338 case BT_AUDIO_LOCATION_SIDE_RIGHT:
2339 return "Side right";
2340 case BT_AUDIO_LOCATION_TOP_FRONT_LEFT:
2341 return "Top front left";
2342 case BT_AUDIO_LOCATION_TOP_FRONT_RIGHT:
2343 return "Top front right";
2344 case BT_AUDIO_LOCATION_TOP_FRONT_CENTER:
2345 return "Top front center";
2346 case BT_AUDIO_LOCATION_TOP_CENTER:
2347 return "Top center";
2348 case BT_AUDIO_LOCATION_TOP_BACK_LEFT:
2349 return "Top back left";
2350 case BT_AUDIO_LOCATION_TOP_BACK_RIGHT:
2351 return "Top back right";
2352 case BT_AUDIO_LOCATION_TOP_SIDE_LEFT:
2353 return "Top side left";
2354 case BT_AUDIO_LOCATION_TOP_SIDE_RIGHT:
2355 return "Top side right";
2356 case BT_AUDIO_LOCATION_TOP_BACK_CENTER:
2357 return "Top back center";
2358 case BT_AUDIO_LOCATION_BOTTOM_FRONT_CENTER:
2359 return "Bottom front center";
2360 case BT_AUDIO_LOCATION_BOTTOM_FRONT_LEFT:
2361 return "Bottom front left";
2362 case BT_AUDIO_LOCATION_BOTTOM_FRONT_RIGHT:
2363 return "Bottom front right";
2364 case BT_AUDIO_LOCATION_FRONT_LEFT_WIDE:
2365 return "Front left wide";
2366 case BT_AUDIO_LOCATION_FRONT_RIGHT_WIDE:
2367 return "Front right wde";
2368 case BT_AUDIO_LOCATION_LEFT_SURROUND:
2369 return "Left surround";
2370 case BT_AUDIO_LOCATION_RIGHT_SURROUND:
2371 return "Right surround";
2372 default:
2373 return "Unknown location";
2374 }
2375 }
2376
2377 /** @} */ /* End of bt_audio_to_str */
2378 #ifdef __cplusplus
2379 }
2380 #endif
2381
2382 /** @} */ /* end of bt_audio */
2383
2384 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_H_ */
2385