Line data Source code
1 1 : /**
2 : * @file
3 : * @brief Header for Bluetooth BAP.
4 : *
5 : * Copyright (c) 2020 Bose Corporation
6 : * Copyright (c) 2021-2024 Nordic Semiconductor ASA
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : */
10 :
11 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_BAP_
12 : #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_BAP_
13 :
14 : /**
15 : * @brief Bluetooth Basic Audio Profile (BAP)
16 : * @defgroup bt_bap Bluetooth Basic Audio Profile
17 : *
18 : * @since 3.0
19 : * @version 0.8.0
20 : *
21 : * @ingroup bluetooth
22 : * @{
23 : *
24 : * The Basic Audio Profile (BAP) allows for both unicast and broadcast Audio Stream control.
25 : */
26 :
27 : #include <stdbool.h>
28 : #include <stddef.h>
29 : #include <stdint.h>
30 :
31 : #include <zephyr/bluetooth/audio/audio.h>
32 : #include <zephyr/bluetooth/addr.h>
33 : #include <zephyr/bluetooth/bluetooth.h>
34 : #include <zephyr/bluetooth/conn.h>
35 : #include <zephyr/bluetooth/iso.h>
36 : #include <zephyr/net_buf.h>
37 : #include <zephyr/sys/slist.h>
38 : #include <zephyr/sys/util_macro.h>
39 :
40 : #ifdef __cplusplus
41 : extern "C" {
42 : #endif
43 :
44 : #if defined(CONFIG_BT_BAP_BASS_MAX_SUBGROUPS)
45 : #define BT_BAP_BASS_MAX_SUBGROUPS CONFIG_BT_BAP_BASS_MAX_SUBGROUPS
46 : #else
47 0 : #define BT_BAP_BASS_MAX_SUBGROUPS 0
48 : #endif /* CONFIG_BT_BAP_BASS_MAX_SUBGROUPS*/
49 :
50 : /** An invalid Broadcast ID */
51 1 : #define BT_BAP_INVALID_BROADCAST_ID 0xFFFFFFFFU
52 :
53 : /**
54 : * @brief Check if a BAP BASS BIS_Sync bitfield is valid
55 : *
56 : * Valid options are eiter a bitmask of valid BIS indices, including none (0x00000000)
57 : * or @ref BT_BAP_BIS_SYNC_NO_PREF (0xFFFFFFFF).
58 : *
59 : * @param _bis_bitfield BIS_Sync bitfield (uint32)
60 : */
61 1 : #define BT_BAP_BASS_VALID_BIT_BITFIELD(_bis_bitfield) \
62 : ((_bis_bitfield) == 0U || (_bis_bitfield) == BT_BAP_BIS_SYNC_NO_PREF || \
63 : BT_ISO_VALID_BIS_BITFIELD(_bis_bitfield))
64 :
65 : /**
66 : * @brief Helper to declare elements of bt_bap_qos_cfg
67 : *
68 : * @param _interval SDU interval (usec)
69 : * @param _framing Framing
70 : * @param _phy Target PHY
71 : * @param _sdu Maximum SDU Size
72 : * @param _rtn Retransmission number
73 : * @param _latency Maximum Transport Latency (msec)
74 : * @param _pd Presentation Delay (usec)
75 : */
76 1 : #define BT_BAP_QOS_CFG(_interval, _framing, _phy, _sdu, _rtn, _latency, _pd) \
77 : ((struct bt_bap_qos_cfg){ \
78 : .interval = _interval, \
79 : .framing = _framing, \
80 : .phy = _phy, \
81 : .sdu = _sdu, \
82 : .rtn = _rtn, \
83 : IF_ENABLED(UTIL_OR(IS_ENABLED(CONFIG_BT_BAP_BROADCAST_SOURCE), \
84 : IS_ENABLED(CONFIG_BT_BAP_UNICAST)), \
85 : (.latency = _latency,)) \
86 : .pd = _pd, \
87 : })
88 :
89 : /** @brief QoS Framing */
90 1 : enum bt_bap_qos_cfg_framing {
91 : /** Packets may be framed or unframed */
92 : BT_BAP_QOS_CFG_FRAMING_UNFRAMED = 0x00,
93 : /** Packets are always framed */
94 : BT_BAP_QOS_CFG_FRAMING_FRAMED = 0x01,
95 : };
96 :
97 : /** @brief QoS Preferred PHY */
98 1 : enum {
99 : /** LE 1M PHY */
100 : BT_BAP_QOS_CFG_1M = BIT(0),
101 : /** LE 2M PHY */
102 : BT_BAP_QOS_CFG_2M = BIT(1),
103 : /** LE Coded PHY */
104 : BT_BAP_QOS_CFG_CODED = BIT(2),
105 : };
106 :
107 : /**
108 : * @brief Helper to declare Input Unframed bt_bap_qos_cfg
109 : *
110 : * @param _interval SDU interval (usec)
111 : * @param _sdu Maximum SDU Size
112 : * @param _rtn Retransmission number
113 : * @param _latency Maximum Transport Latency (msec)
114 : * @param _pd Presentation Delay (usec)
115 : */
116 1 : #define BT_BAP_QOS_CFG_UNFRAMED(_interval, _sdu, _rtn, _latency, _pd) \
117 : BT_BAP_QOS_CFG(_interval, BT_BAP_QOS_CFG_FRAMING_UNFRAMED, BT_BAP_QOS_CFG_2M, _sdu, _rtn, \
118 : _latency, _pd)
119 :
120 : /**
121 : * @brief Helper to declare Input Framed bt_bap_qos_cfg
122 : *
123 : * @param _interval SDU interval (usec)
124 : * @param _sdu Maximum SDU Size
125 : * @param _rtn Retransmission number
126 : * @param _latency Maximum Transport Latency (msec)
127 : * @param _pd Presentation Delay (usec)
128 : */
129 1 : #define BT_BAP_QOS_CFG_FRAMED(_interval, _sdu, _rtn, _latency, _pd) \
130 : BT_BAP_QOS_CFG(_interval, BT_BAP_QOS_CFG_FRAMING_FRAMED, BT_BAP_QOS_CFG_2M, _sdu, _rtn, \
131 : _latency, _pd)
132 :
133 : /** @brief QoS configuration structure. */
134 1 : struct bt_bap_qos_cfg {
135 : /**
136 : * @brief Presentation Delay in microseconds
137 : *
138 : * This value can be changed up and until bt_bap_stream_qos() has been called.
139 : * Once a stream has been QoS configured, modifying this field does not modify the value.
140 : * It is however possible to modify this field and call bt_bap_stream_qos() again to update
141 : * the value, assuming that the stream is in the correct state.
142 : *
143 : * Value range 0 to @ref BT_AUDIO_PD_MAX.
144 : */
145 1 : uint32_t pd;
146 :
147 : /**
148 : * @brief Connected Isochronous Group (CIG) parameters
149 : *
150 : * The fields in this struct affect the value sent to the controller via HCI
151 : * when creating the CIG. Once the group has been created with
152 : * bt_bap_unicast_group_create(), modifying these fields will not affect the group.
153 : */
154 : struct {
155 : /** QoS Framing */
156 1 : enum bt_bap_qos_cfg_framing framing;
157 :
158 : /**
159 : * @brief PHY
160 : *
161 : * Allowed values are @ref BT_BAP_QOS_CFG_1M, @ref BT_BAP_QOS_CFG_2M and
162 : * @ref BT_BAP_QOS_CFG_CODED.
163 : */
164 1 : uint8_t phy;
165 :
166 : /**
167 : * @brief Retransmission Number
168 : *
169 : * This a recommendation to the controller, and the actual retransmission number
170 : * may be different than this.
171 : */
172 1 : uint8_t rtn;
173 :
174 : /**
175 : * @brief Maximum SDU size
176 : *
177 : * Value range @ref BT_ISO_MIN_SDU to @ref BT_ISO_MAX_SDU.
178 : */
179 1 : uint16_t sdu;
180 :
181 : #if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) || defined(CONFIG_BT_BAP_UNICAST) || \
182 : defined(__DOXYGEN__)
183 : /**
184 : * @brief Maximum Transport Latency
185 : *
186 : * Not used for the @kconfig{CONFIG_BT_BAP_BROADCAST_SINK} role.
187 : */
188 1 : uint16_t latency;
189 : #endif /* CONFIG_BT_BAP_BROADCAST_SOURCE || CONFIG_BT_BAP_UNICAST */
190 :
191 : /**
192 : * @brief SDU Interval
193 : *
194 : * Value range @ref BT_ISO_SDU_INTERVAL_MIN to @ref BT_ISO_SDU_INTERVAL_MAX
195 : */
196 1 : uint32_t interval;
197 :
198 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
199 : /**
200 : * @brief Maximum PDU size
201 : *
202 : * Maximum size, in octets, of the payload from link layer to link layer.
203 : *
204 : * Value range @ref BT_ISO_CONNECTED_PDU_MIN to @ref BT_ISO_PDU_MAX for
205 : * connected ISO.
206 : *
207 : * Value range @ref BT_ISO_BROADCAST_PDU_MIN to @ref BT_ISO_PDU_MAX for
208 : * broadcast ISO.
209 : */
210 1 : uint16_t max_pdu;
211 :
212 : /**
213 : * @brief Burst number
214 : *
215 : * Value range @ref BT_ISO_BN_MIN to @ref BT_ISO_BN_MAX.
216 : */
217 1 : uint8_t burst_number;
218 :
219 : /**
220 : * @brief Number of subevents
221 : *
222 : * Maximum number of subevents in each CIS or BIS event.
223 : *
224 : * Value range @ref BT_ISO_NSE_MIN to @ref BT_ISO_NSE_MAX.
225 : */
226 1 : uint8_t num_subevents;
227 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
228 1 : };
229 : };
230 :
231 : /**
232 : * @brief Helper to declare elements of @ref bt_bap_qos_cfg_pref
233 : *
234 : * @param _unframed_supported Unframed PDUs supported
235 : * @param _phy Preferred Target PHY
236 : * @param _rtn Preferred Retransmission number
237 : * @param _latency Preferred Maximum Transport Latency (msec)
238 : * @param _pd_min Minimum Presentation Delay (usec)
239 : * @param _pd_max Maximum Presentation Delay (usec)
240 : * @param _pref_pd_min Preferred Minimum Presentation Delay (usec)
241 : * @param _pref_pd_max Preferred Maximum Presentation Delay (usec)
242 : */
243 : #define BT_BAP_QOS_CFG_PREF(_unframed_supported, _phy, _rtn, _latency, _pd_min, _pd_max, \
244 1 : _pref_pd_min, _pref_pd_max) \
245 : { \
246 : .unframed_supported = _unframed_supported, .phy = _phy, .rtn = _rtn, \
247 : .latency = _latency, .pd_min = _pd_min, .pd_max = _pd_max, \
248 : .pref_pd_min = _pref_pd_min, .pref_pd_max = _pref_pd_max, \
249 : }
250 :
251 : /** @brief Audio Stream Quality of Service Preference structure. */
252 1 : struct bt_bap_qos_cfg_pref {
253 : /**
254 : * @brief Unframed PDUs supported
255 : *
256 : * Unlike the other fields, this is not a preference but whether
257 : * the codec supports unframed ISOAL PDUs.
258 : */
259 1 : bool unframed_supported;
260 :
261 : /**
262 : * @brief Preferred PHY bitfield
263 : *
264 : * Bitfield consisting of one or more of @ref BT_GAP_LE_PHY_1M, @ref BT_GAP_LE_PHY_2M and
265 : * @ref BT_GAP_LE_PHY_CODED.
266 : */
267 1 : uint8_t phy;
268 :
269 : /**
270 : * @brief Preferred Retransmission Number
271 : *
272 : * @ref BT_AUDIO_RTN_PREF_NONE indicates no preference.
273 : */
274 1 : uint8_t rtn;
275 :
276 : /**
277 : * Preferred Transport Latency
278 : *
279 : * Value range @ref BT_ISO_LATENCY_MIN to @ref BT_ISO_LATENCY_MAX
280 : */
281 1 : uint16_t latency;
282 :
283 : /**
284 : * @brief Minimum Presentation Delay in microseconds
285 : *
286 : * Unlike the other fields, this is not a preference but a minimum requirement.
287 : *
288 : * Value range 0 to @ref BT_AUDIO_PD_MAX
289 : */
290 1 : uint32_t pd_min;
291 :
292 : /**
293 : * @brief Maximum Presentation Delay in microseconds
294 : *
295 : * Unlike the other fields, this is not a preference but a maximum requirement.
296 : *
297 : * Value range @ref bt_bap_qos_cfg_pref.pd_min to @ref BT_AUDIO_PD_MAX
298 : */
299 1 : uint32_t pd_max;
300 :
301 : /**
302 : * @brief Preferred minimum Presentation Delay in microseconds
303 : *
304 : * Value range @ref bt_bap_qos_cfg_pref.pd_min to @ref bt_bap_qos_cfg_pref.pd_max, or
305 : * @ref BT_AUDIO_PD_PREF_NONE to indicate no preference.
306 : */
307 1 : uint32_t pref_pd_min;
308 :
309 : /**
310 : * @brief Preferred maximum Presentation Delay in microseconds
311 : *
312 : * Value range @ref bt_bap_qos_cfg_pref.pd_min to @ref bt_bap_qos_cfg_pref.pd_max,
313 : * and higher than or equal to @ref bt_bap_qos_cfg_pref.pref_pd_min, or
314 : * @ref BT_AUDIO_PD_PREF_NONE to indicate no preference.
315 : */
316 1 : uint32_t pref_pd_max;
317 : };
318 :
319 : /** Periodic advertising state reported by the Scan Delegator */
320 1 : enum bt_bap_pa_state {
321 : /** The periodic advertising has not been synchronized */
322 : BT_BAP_PA_STATE_NOT_SYNCED = 0x00,
323 :
324 : /** Waiting for SyncInfo from Broadcast Assistant */
325 : BT_BAP_PA_STATE_INFO_REQ = 0x01,
326 :
327 : /** Synchronized to periodic advertising */
328 : BT_BAP_PA_STATE_SYNCED = 0x02,
329 :
330 : /** Failed to synchronized to periodic advertising */
331 : BT_BAP_PA_STATE_FAILED = 0x03,
332 :
333 : /** No periodic advertising sync transfer receiver from Broadcast Assistant */
334 : BT_BAP_PA_STATE_NO_PAST = 0x04,
335 : };
336 :
337 : /** Broadcast Isochronous Group encryption state reported by the Scan Delegator */
338 1 : enum bt_bap_big_enc_state {
339 : /** The Broadcast Isochronous Group not encrypted */
340 : BT_BAP_BIG_ENC_STATE_NO_ENC = 0x00,
341 :
342 : /** The Broadcast Isochronous Group broadcast code requested */
343 : BT_BAP_BIG_ENC_STATE_BCODE_REQ = 0x01,
344 :
345 : /** The Broadcast Isochronous Group decrypted */
346 : BT_BAP_BIG_ENC_STATE_DEC = 0x02,
347 :
348 : /** The Broadcast Isochronous Group bad broadcast code */
349 : BT_BAP_BIG_ENC_STATE_BAD_CODE = 0x03,
350 : };
351 :
352 : /** Broadcast Audio Scan Service (BASS) specific ATT error codes */
353 1 : enum bt_bap_bass_att_err {
354 : /** Opcode not supported */
355 : BT_BAP_BASS_ERR_OPCODE_NOT_SUPPORTED = 0x80,
356 :
357 : /** Invalid source ID supplied */
358 : BT_BAP_BASS_ERR_INVALID_SRC_ID = 0x81,
359 : };
360 :
361 : /** Value indicating that the periodic advertising interval is unknown */
362 1 : #define BT_BAP_PA_INTERVAL_UNKNOWN 0xFFFF
363 :
364 : /**
365 : * @brief Broadcast Assistant no BIS sync preference
366 : *
367 : * Value indicating that the Broadcast Assistant has no preference to which BIS
368 : * the Scan Delegator syncs to
369 : */
370 1 : #define BT_BAP_BIS_SYNC_NO_PREF 0xFFFFFFFF
371 : /** BIS sync value indicating that the BIG sync has failed for any reason */
372 1 : #define BT_BAP_BIS_SYNC_FAILED 0xFFFFFFFF
373 :
374 : /** Endpoint states */
375 1 : enum bt_bap_ep_state {
376 : /** Audio Stream Endpoint Idle state */
377 : BT_BAP_EP_STATE_IDLE = 0x00,
378 :
379 : /** Audio Stream Endpoint Codec Configured state */
380 : BT_BAP_EP_STATE_CODEC_CONFIGURED = 0x01,
381 :
382 : /** Audio Stream Endpoint QoS Configured state */
383 : BT_BAP_EP_STATE_QOS_CONFIGURED = 0x02,
384 :
385 : /** Audio Stream Endpoint Enabling state */
386 : BT_BAP_EP_STATE_ENABLING = 0x03,
387 :
388 : /** Audio Stream Endpoint Streaming state */
389 : BT_BAP_EP_STATE_STREAMING = 0x04,
390 :
391 : /** Audio Stream Endpoint Disabling state */
392 : BT_BAP_EP_STATE_DISABLING = 0x05,
393 :
394 : /** Audio Stream Endpoint Streaming state */
395 : BT_BAP_EP_STATE_RELEASING = 0x06,
396 : };
397 :
398 : /**
399 : * @brief Response Status Code
400 : *
401 : * These are sent by the server to the client when a stream operation is
402 : * requested.
403 : */
404 1 : enum bt_bap_ascs_rsp_code {
405 : /** Server completed operation successfully */
406 : BT_BAP_ASCS_RSP_CODE_SUCCESS = 0x00,
407 : /** Server did not support operation by client */
408 : BT_BAP_ASCS_RSP_CODE_NOT_SUPPORTED = 0x01,
409 : /** Server rejected due to invalid operation length */
410 : BT_BAP_ASCS_RSP_CODE_INVALID_LENGTH = 0x02,
411 : /** Invalid ASE ID */
412 : BT_BAP_ASCS_RSP_CODE_INVALID_ASE = 0x03,
413 : /** Invalid ASE state */
414 : BT_BAP_ASCS_RSP_CODE_INVALID_ASE_STATE = 0x04,
415 : /** Invalid operation for direction */
416 : BT_BAP_ASCS_RSP_CODE_INVALID_DIR = 0x05,
417 : /** Capabilities not supported by server */
418 : BT_BAP_ASCS_RSP_CODE_CAP_UNSUPPORTED = 0x06,
419 : /** Configuration parameters not supported by server */
420 : BT_BAP_ASCS_RSP_CODE_CONF_UNSUPPORTED = 0x07,
421 : /** Configuration parameters rejected by server */
422 : BT_BAP_ASCS_RSP_CODE_CONF_REJECTED = 0x08,
423 : /** Invalid Configuration parameters */
424 : BT_BAP_ASCS_RSP_CODE_CONF_INVALID = 0x09,
425 : /** Unsupported metadata */
426 : BT_BAP_ASCS_RSP_CODE_METADATA_UNSUPPORTED = 0x0a,
427 : /** Metadata rejected by server */
428 : BT_BAP_ASCS_RSP_CODE_METADATA_REJECTED = 0x0b,
429 : /** Invalid metadata */
430 : BT_BAP_ASCS_RSP_CODE_METADATA_INVALID = 0x0c,
431 : /** Server has insufficient resources */
432 : BT_BAP_ASCS_RSP_CODE_NO_MEM = 0x0d,
433 : /** Unspecified error */
434 : BT_BAP_ASCS_RSP_CODE_UNSPECIFIED = 0x0e,
435 : };
436 :
437 : /**
438 : * @brief Response Reasons
439 : *
440 : * These are used if the @ref bt_bap_ascs_rsp_code value is
441 : * @ref BT_BAP_ASCS_RSP_CODE_CONF_UNSUPPORTED, @ref BT_BAP_ASCS_RSP_CODE_CONF_REJECTED or
442 : * @ref BT_BAP_ASCS_RSP_CODE_CONF_INVALID.
443 : */
444 1 : enum bt_bap_ascs_reason {
445 : /** No reason */
446 : BT_BAP_ASCS_REASON_NONE = 0x00,
447 : /** Codec ID */
448 : BT_BAP_ASCS_REASON_CODEC = 0x01,
449 : /** Codec configuration */
450 : BT_BAP_ASCS_REASON_CODEC_DATA = 0x02,
451 : /** SDU interval */
452 : BT_BAP_ASCS_REASON_INTERVAL = 0x03,
453 : /** Framing */
454 : BT_BAP_ASCS_REASON_FRAMING = 0x04,
455 : /** PHY */
456 : BT_BAP_ASCS_REASON_PHY = 0x05,
457 : /** Maximum SDU size*/
458 : BT_BAP_ASCS_REASON_SDU = 0x06,
459 : /** RTN */
460 : BT_BAP_ASCS_REASON_RTN = 0x07,
461 : /** Max transport latency */
462 : BT_BAP_ASCS_REASON_LATENCY = 0x08,
463 : /** Presendation delay */
464 : BT_BAP_ASCS_REASON_PD = 0x09,
465 : /** Invalid CIS mapping */
466 : BT_BAP_ASCS_REASON_CIS = 0x0a,
467 : };
468 :
469 : /** @brief Structure storing values of fields of ASE Control Point notification. */
470 1 : struct bt_bap_ascs_rsp {
471 : /**
472 : * @brief Value of the Response Code field.
473 : *
474 : * The following response codes are accepted:
475 : * - @ref BT_BAP_ASCS_RSP_CODE_SUCCESS
476 : * - @ref BT_BAP_ASCS_RSP_CODE_CAP_UNSUPPORTED
477 : * - @ref BT_BAP_ASCS_RSP_CODE_CONF_UNSUPPORTED
478 : * - @ref BT_BAP_ASCS_RSP_CODE_CONF_REJECTED
479 : * - @ref BT_BAP_ASCS_RSP_CODE_METADATA_UNSUPPORTED
480 : * - @ref BT_BAP_ASCS_RSP_CODE_METADATA_REJECTED
481 : * - @ref BT_BAP_ASCS_RSP_CODE_NO_MEM
482 : * - @ref BT_BAP_ASCS_RSP_CODE_UNSPECIFIED
483 : */
484 1 : enum bt_bap_ascs_rsp_code code;
485 :
486 : /**
487 : * @brief Value of the Reason field.
488 : *
489 : * The meaning of this value depend on the Response Code field.
490 : */
491 : union {
492 : /**
493 : * @brief Response reason
494 : *
495 : * If the Response Code is one of the following:
496 : * - @ref BT_BAP_ASCS_RSP_CODE_CONF_UNSUPPORTED
497 : * - @ref BT_BAP_ASCS_RSP_CODE_CONF_REJECTED
498 : * all values from @ref bt_bap_ascs_reason can be used.
499 : *
500 : * If the Response Code is one of the following:
501 : * - @ref BT_BAP_ASCS_RSP_CODE_SUCCESS
502 : * - @ref BT_BAP_ASCS_RSP_CODE_CAP_UNSUPPORTED
503 : * - @ref BT_BAP_ASCS_RSP_CODE_NO_MEM
504 : * - @ref BT_BAP_ASCS_RSP_CODE_UNSPECIFIED
505 : * only value @ref BT_BAP_ASCS_REASON_NONE shall be used.
506 : */
507 1 : enum bt_bap_ascs_reason reason;
508 :
509 : /**
510 : * @brief Response metadata type
511 : *
512 : * If the Response Code is one of the following:
513 : * - @ref BT_BAP_ASCS_RSP_CODE_METADATA_UNSUPPORTED
514 : * - @ref BT_BAP_ASCS_RSP_CODE_METADATA_REJECTED
515 : * the value of the Metadata Type shall be used.
516 : */
517 1 : enum bt_audio_metadata_type metadata_type;
518 1 : };
519 : };
520 :
521 : /**
522 : * @brief Macro used to initialise the object storing values of ASE Control Point notification.
523 : *
524 : * @param c Response Code field
525 : * @param r Reason field - @ref bt_bap_ascs_reason or @ref bt_audio_metadata_type (see notes in
526 : * @ref bt_bap_ascs_rsp).
527 : */
528 1 : #define BT_BAP_ASCS_RSP(c, r) (struct bt_bap_ascs_rsp) { .code = c, .reason = r }
529 :
530 : /** @brief Abstract Audio Broadcast Source structure. */
531 : struct bt_bap_broadcast_source;
532 :
533 : /** @brief Abstract Audio Broadcast Sink structure. */
534 : struct bt_bap_broadcast_sink;
535 :
536 : /** @brief Abstract Audio Unicast Group structure. */
537 : struct bt_bap_unicast_group;
538 :
539 : /** @brief Abstract Audio Endpoint structure. */
540 : struct bt_bap_ep;
541 :
542 : /** Struct to hold subgroup specific information for the receive state */
543 1 : struct bt_bap_bass_subgroup {
544 : /** BIS synced bitfield */
545 1 : uint32_t bis_sync;
546 :
547 : /** Length of the metadata */
548 1 : uint8_t metadata_len;
549 :
550 : #if defined(CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE) || defined(__DOXYGEN__)
551 : /** The metadata */
552 1 : uint8_t metadata[CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE];
553 : #endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE */
554 : };
555 :
556 : /** Represents the Broadcast Audio Scan Service receive state */
557 1 : struct bt_bap_scan_delegator_recv_state {
558 : /** The source ID */
559 1 : uint8_t src_id;
560 :
561 : /** The Bluetooth address */
562 1 : bt_addr_le_t addr;
563 :
564 : /** The advertising set ID*/
565 1 : uint8_t adv_sid;
566 :
567 : /** The periodic adverting sync state */
568 1 : enum bt_bap_pa_state pa_sync_state;
569 :
570 : /** The broadcast isochronous group encryption state */
571 1 : enum bt_bap_big_enc_state encrypt_state;
572 :
573 : /** The 24-bit broadcast ID */
574 1 : uint32_t broadcast_id;
575 :
576 : /**
577 : * @brief The bad broadcast code
578 : *
579 : * Only valid if encrypt_state is @ref BT_BAP_BIG_ENC_STATE_BCODE_REQ
580 : */
581 1 : uint8_t bad_code[BT_ISO_BROADCAST_CODE_SIZE];
582 :
583 : /** Number of subgroups */
584 1 : uint8_t num_subgroups;
585 :
586 : /** Subgroup specific information
587 : *
588 : * If the @ref bt_bap_bass_subgroup.bis_sync value is @ref BT_BAP_BIS_SYNC_FAILED then it
589 : * indicates that the BIG sync failed.
590 : */
591 1 : struct bt_bap_bass_subgroup subgroups[BT_BAP_BASS_MAX_SUBGROUPS];
592 : };
593 :
594 : /**
595 : * @brief Struct to hold the Basic Audio Profile Scan Delegator callbacks
596 : *
597 : * These can be registered for usage with bt_bap_scan_delegator_register().
598 : */
599 1 : struct bt_bap_scan_delegator_cb {
600 : /**
601 : * @brief Receive state updated
602 : *
603 : * @param conn Pointer to the connection to a remote device if
604 : * the change was caused by it, otherwise NULL.
605 : * @param recv_state Pointer to the receive state that was updated.
606 : *
607 : * @return 0 in case of success or negative value in case of error.
608 : */
609 1 : void (*recv_state_updated)(struct bt_conn *conn,
610 : const struct bt_bap_scan_delegator_recv_state *recv_state);
611 :
612 : /**
613 : * @brief Periodic advertising sync request
614 : *
615 : * Request from peer device to synchronize with the periodic advertiser
616 : * denoted by the @p recv_state. To notify the Broadcast Assistant about
617 : * any pending sync
618 : *
619 : * @param conn Pointer to the connection requesting the
620 : * periodic advertising sync.
621 : * @param recv_state Pointer to the receive state that is being
622 : * requested for periodic advertising sync.
623 : * @param past_avail True if periodic advertising sync transfer is available.
624 : * @param pa_interval The periodic advertising interval.
625 : *
626 : * @return 0 in case of accept, or other value to reject.
627 : */
628 1 : int (*pa_sync_req)(struct bt_conn *conn,
629 : const struct bt_bap_scan_delegator_recv_state *recv_state,
630 : bool past_avail, uint16_t pa_interval);
631 :
632 : /**
633 : * @brief Periodic advertising sync termination request
634 : *
635 : * Request from peer device to terminate the periodic advertiser sync
636 : * denoted by the @p recv_state.
637 : *
638 : * @param conn Pointer to the connection requesting the periodic
639 : * advertising sync termination.
640 : * @param recv_state Pointer to the receive state that is being
641 : * requested for periodic advertising sync.
642 : *
643 : * @return 0 in case of success or negative value in case of error.
644 : */
645 1 : int (*pa_sync_term_req)(struct bt_conn *conn,
646 : const struct bt_bap_scan_delegator_recv_state *recv_state);
647 :
648 : /**
649 : * @brief Broadcast code received
650 : *
651 : * Broadcast code received from a broadcast assistant
652 : *
653 : * @param conn Pointer to the connection providing the
654 : * broadcast code.
655 : * @param recv_state Pointer to the receive state the broadcast code
656 : * is being provided for.
657 : * @param broadcast_code The 16-octet broadcast code
658 : */
659 1 : void (*broadcast_code)(struct bt_conn *conn,
660 : const struct bt_bap_scan_delegator_recv_state *recv_state,
661 : const uint8_t broadcast_code[BT_ISO_BROADCAST_CODE_SIZE]);
662 : /**
663 : * @brief Broadcast Isochronous Stream synchronize request
664 : *
665 : * Request from Broadcast Assistant device to modify the Broadcast
666 : * Isochronous Stream states. The request shall be fulfilled with
667 : * accordance to the @p bis_sync_req within reasonable time. The
668 : * Broadcast Assistant may also request fewer, or none, indexes to
669 : * be synchronized.
670 : *
671 : * @param[in] conn Pointer to the connection of the
672 : * Broadcast Assistant requesting the sync.
673 : * @param[in] recv_state Pointer to the receive state that is being
674 : * requested for the sync.
675 : * @param[in] bis_sync_req Array of bitfields of which BIS indexes
676 : * that is requested to sync for each subgroup
677 : * by the Broadcast Assistant. A value of 0
678 : * indicates a request to terminate the BIG
679 : * sync.
680 : *
681 : * @return 0 in case of accept, or other value to reject.
682 : */
683 1 : int (*bis_sync_req)(struct bt_conn *conn,
684 : const struct bt_bap_scan_delegator_recv_state *recv_state,
685 : const uint32_t bis_sync_req[BT_BAP_BASS_MAX_SUBGROUPS]);
686 : /**
687 : * @brief Broadcast Assistant scanning state callback
688 : *
689 : * Callback triggered when a Broadcast Assistant notifies the Scan Delegator about the
690 : * assistants scanning state.
691 : *
692 : * @param conn Pointer to the connection that initiated the scan.
693 : * @param is_scanning true if scanning started, false if scanning stopped.
694 : */
695 1 : void (*scanning_state)(struct bt_conn *conn, bool is_scanning);
696 : };
697 :
698 : /** Structure holding information of audio stream endpoint */
699 1 : struct bt_bap_ep_info {
700 : /** The ID of the endpoint */
701 1 : uint8_t id;
702 :
703 : /** The state of the endpoint */
704 1 : enum bt_bap_ep_state state;
705 :
706 : /** Capabilities type */
707 1 : enum bt_audio_dir dir;
708 :
709 : /** The isochronous channel associated with the endpoint. */
710 1 : struct bt_iso_chan *iso_chan;
711 :
712 : /** @brief True if the stream associated with the endpoint is able to send data */
713 1 : bool can_send;
714 :
715 : /** @brief True if the stream associated with the endpoint is able to receive data */
716 1 : bool can_recv;
717 :
718 : /** Pointer to paired endpoint if the endpoint is part of a bidirectional CIS,
719 : * otherwise NULL
720 : */
721 1 : struct bt_bap_ep *paired_ep;
722 :
723 : /** Pointer to the preferred QoS settings associated with the endpoint */
724 1 : const struct bt_bap_qos_cfg_pref *qos_pref;
725 : };
726 :
727 : /**
728 : * @brief Return structure holding information of audio stream endpoint
729 : *
730 : * @param ep The audio stream endpoint object.
731 : * @param info The structure object to be filled with the info.
732 : *
733 : * @retval 0 in case of success
734 : * @retval -EINVAL if @p ep or @p info are NULL
735 : */
736 1 : int bt_bap_ep_get_info(const struct bt_bap_ep *ep, struct bt_bap_ep_info *info);
737 :
738 : /**
739 : * @brief Basic Audio Profile stream structure.
740 : *
741 : * Streams represents a stream configuration of a Remote Endpoint and a Local Capability.
742 : *
743 : * @note Streams are unidirectional but can be paired with other streams to use a bidirectional
744 : * connected isochronous stream.
745 : */
746 1 : struct bt_bap_stream {
747 : /** Connection reference */
748 1 : struct bt_conn *conn;
749 :
750 : /** Endpoint reference */
751 1 : struct bt_bap_ep *ep;
752 :
753 : /** Codec Configuration */
754 1 : struct bt_audio_codec_cfg *codec_cfg;
755 :
756 : /** QoS Configuration */
757 1 : struct bt_bap_qos_cfg *qos;
758 :
759 : /** Audio stream operations */
760 1 : struct bt_bap_stream_ops *ops;
761 :
762 : #if defined(CONFIG_BT_BAP_UNICAST_CLIENT) || defined(__DOXYGEN__)
763 : /**
764 : * @internal Audio ISO reference
765 : *
766 : * This is only used for Unicast Client streams, and is handled internally.
767 : */
768 0 : struct bt_bap_iso *bap_iso;
769 : #endif /* CONFIG_BT_BAP_UNICAST_CLIENT */
770 :
771 : /** @internal Unicast or Broadcast group - Used internally */
772 0 : void *group;
773 :
774 : /** Stream user data */
775 1 : void *user_data;
776 :
777 : #if defined(CONFIG_BT_BAP_DEBUG_STREAM_SEQ_NUM) || defined(__DOXYGEN__)
778 : /** @internal Previously sent sequence number */
779 : uint16_t _prev_seq_num;
780 : #endif /* CONFIG_BT_BAP_DEBUG_STREAM_SEQ_NUM */
781 :
782 : /** @internal Internally used list node */
783 : sys_snode_t _node;
784 : };
785 :
786 : /** @brief Stream operation. */
787 1 : struct bt_bap_stream_ops {
788 : #if defined(CONFIG_BT_BAP_UNICAST) || defined(__DOXYGEN__)
789 : /**
790 : * @brief Stream configured callback
791 : *
792 : * Configured callback is called whenever an Audio Stream has been configured.
793 : *
794 : * @param stream Stream object that has been configured.
795 : * @param pref Remote QoS preferences.
796 : */
797 1 : void (*configured)(struct bt_bap_stream *stream, const struct bt_bap_qos_cfg_pref *pref);
798 :
799 : /**
800 : * @brief Stream QoS set callback
801 : *
802 : * QoS set callback is called whenever an Audio Stream Quality of Service has been set or
803 : * updated.
804 : *
805 : * @param stream Stream object that had its QoS updated.
806 : */
807 1 : void (*qos_set)(struct bt_bap_stream *stream);
808 :
809 : /**
810 : * @brief Stream enabled callback
811 : *
812 : * Enabled callback is called whenever an Audio Stream has been enabled.
813 : *
814 : * @param stream Stream object that has been enabled.
815 : */
816 1 : void (*enabled)(struct bt_bap_stream *stream);
817 :
818 : /**
819 : * @brief Stream metadata updated callback
820 : *
821 : * Metadata Updated callback is called whenever an Audio Stream's metadata has been
822 : * updated.
823 : *
824 : * @param stream Stream object that had its metadata updated.
825 : */
826 1 : void (*metadata_updated)(struct bt_bap_stream *stream);
827 :
828 : /**
829 : * @brief Stream disabled callback
830 : *
831 : * Disabled callback is called whenever an Audio Stream has been disabled.
832 : *
833 : * @param stream Stream object that has been disabled.
834 : */
835 1 : void (*disabled)(struct bt_bap_stream *stream);
836 :
837 : /**
838 : * @brief Stream released callback
839 : *
840 : * Released callback is called whenever a Audio Stream has been released and can be
841 : * deallocated.
842 : *
843 : * @param stream Stream object that has been released.
844 : */
845 1 : void (*released)(struct bt_bap_stream *stream);
846 : #endif /* CONFIG_BT_BAP_UNICAST */
847 :
848 : /**
849 : * @brief Stream started callback
850 : *
851 : * Started callback is called whenever an Audio Stream has been started
852 : * and will be usable for streaming.
853 : *
854 : * @param stream Stream object that has been started.
855 : */
856 1 : void (*started)(struct bt_bap_stream *stream);
857 :
858 : /**
859 : * @brief Stream stopped callback
860 : *
861 : * Stopped callback is called whenever an Audio Stream has been stopped.
862 : *
863 : * @param stream Stream object that has been stopped.
864 : * @param reason BT_HCI_ERR_* reason for the disconnection.
865 : */
866 1 : void (*stopped)(struct bt_bap_stream *stream, uint8_t reason);
867 :
868 : #if defined(CONFIG_BT_AUDIO_RX) || defined(__DOXYGEN__)
869 : /**
870 : * @brief Stream audio HCI receive callback.
871 : *
872 : * This callback is only used if the ISO data path is HCI.
873 : *
874 : * @param stream Stream object.
875 : * @param info Pointer to the metadata for the buffer. The lifetime of the pointer is
876 : * linked to the lifetime of the net_buf. Metadata such as sequence number and
877 : * timestamp can be provided by the bluetooth controller.
878 : * @param buf Buffer containing incoming audio data.
879 : */
880 1 : void (*recv)(struct bt_bap_stream *stream, const struct bt_iso_recv_info *info,
881 : struct net_buf *buf);
882 : #endif /* CONFIG_BT_AUDIO_RX */
883 :
884 : #if defined(CONFIG_BT_AUDIO_TX) || defined(__DOXYGEN__)
885 : /**
886 : * @brief Stream audio HCI sent callback
887 : *
888 : * This callback will be called once the controller marks the SDU
889 : * as completed. When the controller does so is implementation
890 : * dependent. It could be after the SDU is enqueued for transmission,
891 : * or after it is sent on air or flushed.
892 : *
893 : * This callback is only used if the ISO data path is HCI.
894 : *
895 : * @param stream Stream object.
896 : */
897 1 : void (*sent)(struct bt_bap_stream *stream);
898 : #endif /* CONFIG_BT_AUDIO_TX */
899 :
900 : /**
901 : * @brief Isochronous channel connected callback
902 : *
903 : * If this callback is provided it will be called whenever the isochronous channel for the
904 : * stream has been connected. This does not mean that the stream is ready to be used, which
905 : * is indicated by the @ref bt_bap_stream_ops.started callback.
906 : *
907 : * If the stream shares an isochronous channel with another stream, then this callback may
908 : * still be called, without the stream going into the started state.
909 : *
910 : * @param stream Stream object.
911 : */
912 1 : void (*connected)(struct bt_bap_stream *stream);
913 :
914 : /**
915 : * @brief Isochronous channel disconnected callback
916 : *
917 : * If this callback is provided it will be called whenever the isochronous channel is
918 : * disconnected, including when a connection gets rejected.
919 : *
920 : * If the stream shares an isochronous channel with another stream, then this callback may
921 : * not be called, even if the stream is leaving the streaming state.
922 : *
923 : * @param stream Stream object.
924 : * @param reason BT_HCI_ERR_* reason for the disconnection.
925 : */
926 1 : void (*disconnected)(struct bt_bap_stream *stream, uint8_t reason);
927 : };
928 :
929 : /** Structure for registering Unicast Server */
930 1 : struct bt_bap_unicast_server_register_param {
931 : /**
932 : * @brief Sink Count to register.
933 : *
934 : * Should be in range 0 to @kconfig{CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT}
935 : */
936 1 : uint8_t snk_cnt;
937 :
938 : /** @brief Source Count to register.
939 : *
940 : * Should be in range 0 to @kconfig{CONFIG_BT_ASCS_MAX_ASE_SRC_COUNT}
941 : */
942 1 : uint8_t src_cnt;
943 : };
944 :
945 : /**
946 : * @brief Register Audio callbacks for a stream.
947 : *
948 : * Register Audio callbacks for a stream.
949 : *
950 : * @param stream Stream object.
951 : * @param ops Stream operations structure.
952 : */
953 1 : void bt_bap_stream_cb_register(struct bt_bap_stream *stream, struct bt_bap_stream_ops *ops);
954 :
955 : /**
956 : * @brief Configure Audio Stream
957 : *
958 : * This procedure is used by a client to configure a new stream using the
959 : * remote endpoint, local capability and codec configuration.
960 : *
961 : * @param conn Connection object
962 : * @param stream Stream object being configured
963 : * @param ep Remote Audio Endpoint being configured
964 : * @param codec_cfg Codec configuration
965 : *
966 : * @return Allocated Audio Stream object or NULL in case of error.
967 : */
968 1 : int bt_bap_stream_config(struct bt_conn *conn, struct bt_bap_stream *stream, struct bt_bap_ep *ep,
969 : struct bt_audio_codec_cfg *codec_cfg);
970 :
971 : /**
972 : * @brief Reconfigure Audio Stream
973 : *
974 : * This procedure is used by a unicast client or unicast server to reconfigure
975 : * a stream to use a different local codec configuration.
976 : *
977 : * This can only be done for unicast streams.
978 : *
979 : * @param stream Stream object being reconfigured
980 : * @param codec_cfg Codec configuration
981 : *
982 : * @return 0 in case of success or negative value in case of error.
983 : */
984 1 : int bt_bap_stream_reconfig(struct bt_bap_stream *stream, struct bt_audio_codec_cfg *codec_cfg);
985 :
986 : /**
987 : * @brief Configure Audio Stream QoS
988 : *
989 : * This procedure is used by a client to configure the Quality of Service of streams in a unicast
990 : * group. All streams in the group for the specified @p conn will have the Quality of Service
991 : * configured. This shall only be used to configure unicast streams.
992 : *
993 : * @param conn Connection object
994 : * @param group Unicast group object
995 : *
996 : * @return 0 in case of success or negative value in case of error.
997 : */
998 1 : int bt_bap_stream_qos(struct bt_conn *conn, struct bt_bap_unicast_group *group);
999 :
1000 : /**
1001 : * @brief Enable Audio Stream
1002 : *
1003 : * This procedure is used by a client to enable a stream.
1004 : *
1005 : * This shall only be called for unicast streams, as broadcast streams will always be enabled once
1006 : * created.
1007 : *
1008 : * @param stream Stream object
1009 : * @param meta Metadata
1010 : * @param meta_len Metadata length
1011 : *
1012 : * @return 0 in case of success or negative value in case of error.
1013 : */
1014 1 : int bt_bap_stream_enable(struct bt_bap_stream *stream, const uint8_t meta[], size_t meta_len);
1015 :
1016 : /**
1017 : * @brief Change Audio Stream Metadata
1018 : *
1019 : * This procedure is used by a unicast client or unicast server to change the metadata of a stream.
1020 : *
1021 : * @param stream Stream object
1022 : * @param meta Metadata
1023 : * @param meta_len Metadata length
1024 : *
1025 : * @return 0 in case of success or negative value in case of error.
1026 : */
1027 1 : int bt_bap_stream_metadata(struct bt_bap_stream *stream, const uint8_t meta[], size_t meta_len);
1028 :
1029 : /**
1030 : * @brief Disable Audio Stream
1031 : *
1032 : * This procedure is used by a unicast client or unicast server to disable a stream.
1033 : *
1034 : * This shall only be called for unicast streams, as broadcast streams will
1035 : * always be enabled once created.
1036 : *
1037 : * @param stream Stream object
1038 : *
1039 : * @return 0 in case of success or negative value in case of error.
1040 : */
1041 1 : int bt_bap_stream_disable(struct bt_bap_stream *stream);
1042 :
1043 : /**
1044 : * @brief Connect unicast audio stream
1045 : *
1046 : * This procedure is used by a unicast client to connect the connected isochronous stream (CIS)
1047 : * associated with the audio stream. If two audio streams share a CIS, then this only needs to be
1048 : * done once for those streams. This can only be done for streams in the QoS configured or enabled
1049 : * states.
1050 : *
1051 : * The bt_bap_stream_ops.connected() callback will be called on the streams once this has finished.
1052 : *
1053 : * This shall only be called for unicast streams, and only as the unicast client
1054 : * (@kconfig{CONFIG_BT_BAP_UNICAST_CLIENT}).
1055 : *
1056 : * @param stream Stream object
1057 : *
1058 : * @retval 0 in case of success
1059 : * @retval -EINVAL if the stream, endpoint, ISO channel or connection is NULL
1060 : * @retval -EBADMSG if the stream or ISO channel is in an invalid state for connection
1061 : * @retval -EOPNOTSUPP if the role of the stream is not @ref BT_HCI_ROLE_CENTRAL
1062 : * @retval -EALREADY if the ISO channel is already connecting or connected
1063 : * @retval -EBUSY if another ISO channel is connecting
1064 : * @retval -ENOEXEC if otherwise rejected by the ISO layer
1065 : */
1066 1 : int bt_bap_stream_connect(struct bt_bap_stream *stream);
1067 :
1068 : /**
1069 : * @brief Start Audio Stream
1070 : *
1071 : * This procedure is used by a unicast client or unicast server to make a stream start streaming.
1072 : *
1073 : * For the unicast client, this will send the receiver start ready command to the unicast server for
1074 : * @ref BT_AUDIO_DIR_SOURCE ASEs. The CIS is required to be connected first by
1075 : * bt_bap_stream_connect() before the command can be sent.
1076 : *
1077 : * For the unicast server, this will execute the receiver start ready command on the unicast server
1078 : * for @ref BT_AUDIO_DIR_SINK ASEs. If the CIS is not connected yet, the stream will go into the
1079 : * streaming state as soon as the CIS is connected.
1080 : *
1081 : * This shall only be called for unicast streams.
1082 : *
1083 : * Broadcast sinks will always be started once synchronized, and broadcast
1084 : * source streams shall be started with bt_bap_broadcast_source_start().
1085 : *
1086 : * @param stream Stream object
1087 : *
1088 : * @return 0 in case of success or negative value in case of error.
1089 : */
1090 1 : int bt_bap_stream_start(struct bt_bap_stream *stream);
1091 :
1092 : /**
1093 : * @brief Stop Audio Stream
1094 : *
1095 : * This procedure is used by a client to make a stream stop streaming.
1096 : *
1097 : * This shall only be called for unicast streams.
1098 : * Broadcast sinks cannot be stopped.
1099 : * Broadcast sources shall be stopped with bt_bap_broadcast_source_stop().
1100 : *
1101 : * @param stream Stream object
1102 : *
1103 : * @retval 0 Success
1104 : * @retval -EINVAL The @p stream does not have an endpoint or a connection, of the stream's
1105 : * connection's role is not @p BT_HCI_ROLE_CENTRAL
1106 : * @retval -EBADMSG The state of the @p stream endpoint is not @ref BT_BAP_EP_STATE_DISABLING
1107 : * @retval -EALREADY The CIS state of the @p is not in a connected state, and thus is already
1108 : * stopping
1109 : * @retval -EBUSY The @p stream is busy with another operation
1110 : * @retval -ENOTCONN The @p stream ACL connection is not connected
1111 : * @retval -ENOMEM No memory to send request
1112 : * @retval -ENOEXEC The request was rejected by GATT
1113 : * @return 0 in case of success or negative value in case of error.
1114 : */
1115 1 : int bt_bap_stream_stop(struct bt_bap_stream *stream);
1116 :
1117 : /**
1118 : * @brief Release Audio Stream
1119 : *
1120 : * This procedure is used by a unicast client or unicast server to release a unicast stream.
1121 : *
1122 : * Broadcast sink streams cannot be released, but can be deleted by bt_bap_broadcast_sink_delete().
1123 : * Broadcast source streams cannot be released, but can be deleted by
1124 : * bt_bap_broadcast_source_delete().
1125 : *
1126 : * @param stream Stream object
1127 : *
1128 : * @return 0 in case of success or negative value in case of error.
1129 : */
1130 1 : int bt_bap_stream_release(struct bt_bap_stream *stream);
1131 :
1132 : /**
1133 : * @brief Send data to Audio stream without timestamp
1134 : *
1135 : * Send data from buffer to the stream.
1136 : *
1137 : * @note Support for sending must be supported, determined by @kconfig{CONFIG_BT_AUDIO_TX}.
1138 : *
1139 : * @param stream Stream object.
1140 : * @param buf Buffer containing data to be sent.
1141 : * @param seq_num Packet Sequence number. This value shall be incremented for each call to this
1142 : * function and at least once per SDU interval for a specific channel.
1143 : *
1144 : * @return Bytes sent in case of success or negative value in case of error.
1145 : */
1146 1 : int bt_bap_stream_send(struct bt_bap_stream *stream, struct net_buf *buf, uint16_t seq_num);
1147 :
1148 : /**
1149 : * @brief Send data to Audio stream with timestamp
1150 : *
1151 : * Send data from buffer to the stream.
1152 : *
1153 : * @note Support for sending must be supported, determined by @kconfig{CONFIG_BT_AUDIO_TX}.
1154 : *
1155 : * @param stream Stream object.
1156 : * @param buf Buffer containing data to be sent.
1157 : * @param seq_num Packet Sequence number. This value shall be incremented for each call to this
1158 : * function and at least once per SDU interval for a specific channel.
1159 : * @param ts Timestamp of the SDU in microseconds (us). This value can be used to transmit
1160 : * multiple SDUs in the same SDU interval in a CIG or BIG.
1161 : *
1162 : * @return Bytes sent in case of success or negative value in case of error.
1163 : */
1164 1 : int bt_bap_stream_send_ts(struct bt_bap_stream *stream, struct net_buf *buf, uint16_t seq_num,
1165 : uint32_t ts);
1166 :
1167 : /**
1168 : * @brief Get ISO transmission timing info for a Basic Audio Profile stream
1169 : *
1170 : * Reads timing information for transmitted ISO packet on an ISO channel.
1171 : * The HCI_LE_Read_ISO_TX_Sync HCI command is used to retrieve this information from the controller.
1172 : *
1173 : * @note An SDU must have already been successfully transmitted on the ISO channel
1174 : * for this function to return successfully.
1175 : * Support for sending must be supported, determined by @kconfig{CONFIG_BT_AUDIO_TX}.
1176 : *
1177 : * @param[in] stream Stream object.
1178 : * @param[out] info Transmit info object.
1179 : *
1180 : * @retval 0 on success
1181 : * @retval -EINVAL if the stream is invalid, if the stream is not configured for sending or if it is
1182 : * not connected with a isochronous stream
1183 : * @retval Any return value from bt_iso_chan_get_tx_sync()
1184 : */
1185 1 : int bt_bap_stream_get_tx_sync(struct bt_bap_stream *stream, struct bt_iso_tx_info *info);
1186 :
1187 : /**
1188 : * @defgroup bt_bap_unicast_server BAP Unicast Server APIs
1189 : * @ingroup bt_bap
1190 : * @{
1191 : */
1192 :
1193 : /** Unicast Server callback structure */
1194 1 : struct bt_bap_unicast_server_cb {
1195 : /**
1196 : * @brief Endpoint config request callback
1197 : *
1198 : * Config callback is called whenever an endpoint is requested to be
1199 : * configured
1200 : *
1201 : * @param[in] conn Connection object.
1202 : * @param[in] ep Local Audio Endpoint being configured.
1203 : * @param[in] dir Direction of the endpoint.
1204 : * @param[in] codec_cfg Codec configuration.
1205 : * @param[out] stream Pointer to stream that will be configured for the endpoint.
1206 : * @param[out] pref Pointer to a QoS preference object that shall be populated with
1207 : * values. Invalid values will reject the codec configuration request.
1208 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1209 : * value is non-zero.
1210 : *
1211 : * @return 0 in case of success or negative value in case of error.
1212 : */
1213 1 : int (*config)(struct bt_conn *conn, const struct bt_bap_ep *ep, enum bt_audio_dir dir,
1214 : const struct bt_audio_codec_cfg *codec_cfg, struct bt_bap_stream **stream,
1215 : struct bt_bap_qos_cfg_pref *const pref, struct bt_bap_ascs_rsp *rsp);
1216 :
1217 : /**
1218 : * @brief Stream reconfig request callback
1219 : *
1220 : * Reconfig callback is called whenever an Audio Stream needs to be
1221 : * reconfigured with different codec configuration.
1222 : *
1223 : * @param[in] stream Stream object being reconfigured.
1224 : * @param[in] dir Direction of the endpoint.
1225 : * @param[in] codec_cfg Codec configuration.
1226 : * @param[out] pref Pointer to a QoS preference object that shall be populated with
1227 : * values. Invalid values will reject the codec configuration request.
1228 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1229 : * value is non-zero.
1230 : *
1231 : * @return 0 in case of success or negative value in case of error.
1232 : */
1233 1 : int (*reconfig)(struct bt_bap_stream *stream, enum bt_audio_dir dir,
1234 : const struct bt_audio_codec_cfg *codec_cfg,
1235 : struct bt_bap_qos_cfg_pref *const pref, struct bt_bap_ascs_rsp *rsp);
1236 :
1237 : /**
1238 : * @brief Stream QoS request callback
1239 : *
1240 : * QoS callback is called whenever an Audio Stream Quality of
1241 : * Service needs to be configured.
1242 : *
1243 : * @param[in] stream Stream object being reconfigured.
1244 : * @param[in] qos Quality of Service configuration.
1245 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1246 : * value is non-zero.
1247 : *
1248 : * @return 0 in case of success or negative value in case of error.
1249 : */
1250 1 : int (*qos)(struct bt_bap_stream *stream, const struct bt_bap_qos_cfg *qos,
1251 : struct bt_bap_ascs_rsp *rsp);
1252 :
1253 : /**
1254 : * @brief Stream Enable request callback
1255 : *
1256 : * Enable callback is called whenever an Audio Stream is requested to be enabled to stream.
1257 : *
1258 : * @param[in] stream Stream object being enabled.
1259 : * @param[in] meta Metadata entries.
1260 : * @param[in] meta_len Length of metadata.
1261 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1262 : * value is non-zero.
1263 : *
1264 : * @return 0 in case of success or negative value in case of error.
1265 : */
1266 1 : int (*enable)(struct bt_bap_stream *stream, const uint8_t meta[], size_t meta_len,
1267 : struct bt_bap_ascs_rsp *rsp);
1268 :
1269 : /**
1270 : * @brief Stream Start request callback
1271 : *
1272 : * Start callback is called whenever an Audio Stream is requested to start streaming.
1273 : *
1274 : * @param[in] stream Stream object.
1275 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1276 : * value is non-zero.
1277 : *
1278 : * @return 0 in case of success or negative value in case of error.
1279 : */
1280 1 : int (*start)(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp);
1281 :
1282 : /**
1283 : * @brief Stream Metadata update request callback
1284 : *
1285 : * Metadata callback is called whenever an Audio Stream is requested to update its metadata.
1286 : *
1287 : * @param[in] stream Stream object.
1288 : * @param[in] meta Metadata entries.
1289 : * @param[in] meta_len Length of metadata.
1290 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1291 : * value is non-zero.
1292 : *
1293 : * @return 0 in case of success or negative value in case of error.
1294 : */
1295 1 : int (*metadata)(struct bt_bap_stream *stream, const uint8_t meta[], size_t meta_len,
1296 : struct bt_bap_ascs_rsp *rsp);
1297 :
1298 : /**
1299 : * @brief Stream Disable request callback
1300 : *
1301 : * Disable callback is called whenever an Audio Stream is requested to disable the stream.
1302 : *
1303 : * @param[in] stream Stream object being disabled.
1304 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1305 : * value is non-zero.
1306 : *
1307 : * @return 0 in case of success or negative value in case of error.
1308 : */
1309 1 : int (*disable)(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp);
1310 :
1311 : /**
1312 : * @brief Stream Stop callback
1313 : *
1314 : * Stop callback is called whenever an Audio Stream is requested to stop streaming.
1315 : *
1316 : * @param[in] stream Stream object.
1317 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1318 : * value is non-zero.
1319 : *
1320 : * @return 0 in case of success or negative value in case of error.
1321 : */
1322 1 : int (*stop)(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp);
1323 :
1324 : /**
1325 : * @brief Stream release callback
1326 : *
1327 : * Release callback is called whenever a new Audio Stream needs to be released and thus
1328 : * deallocated.
1329 : *
1330 : * @param[in] stream Stream object.
1331 : * @param[out] rsp Object for the ASE operation response. Only used if the return
1332 : * value is non-zero.
1333 : *
1334 : * @return 0 in case of success or negative value in case of error.
1335 : */
1336 1 : int (*release)(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp);
1337 : };
1338 :
1339 : /**
1340 : * @brief Register the Unicast Server.
1341 : *
1342 : * Register the Unicast Server. Only a single Unicast Server can be registered at any one time.
1343 : * This will register ASCS in the GATT database.
1344 : *
1345 : * @param param Registration parameters for ascs.
1346 : *
1347 : * @return 0 in case of success, negative error code otherwise.
1348 : */
1349 1 : int bt_bap_unicast_server_register(const struct bt_bap_unicast_server_register_param *param);
1350 :
1351 : /**
1352 : * @brief Unregister the Unicast Server.
1353 : *
1354 : * Unregister the Unicast Server.
1355 : * This will unregister ASCS in the GATT database.
1356 : * Before calling this function, any callbacks registered through
1357 : * bt_bap_unicast_server_register_cb() needs to be unregistered with
1358 : * bt_bap_unicast_server_unregister_cb().
1359 : *
1360 : * Calling this function will issue an release operation on any ASE
1361 : * in a non-idle state.
1362 : *
1363 : * @return 0 in case of success, negative error code otherwise.
1364 : */
1365 1 : int bt_bap_unicast_server_unregister(void);
1366 :
1367 : /**
1368 : * @brief Register unicast server callbacks.
1369 : *
1370 : * Only one callback structure can be registered, and attempting to
1371 : * registering more than one will result in an error.
1372 : * Prior to calling this function the Unicast Server needs to be
1373 : * registered with bt_bap_unicast_server_register().
1374 : *
1375 : * @param cb Unicast server callback structure.
1376 : *
1377 : * @return 0 in case of success or negative value in case of error.
1378 : */
1379 1 : int bt_bap_unicast_server_register_cb(const struct bt_bap_unicast_server_cb *cb);
1380 :
1381 : /**
1382 : * @brief Unregister unicast server callbacks.
1383 : *
1384 : * May only unregister a callback structure that has previously been
1385 : * registered by bt_bap_unicast_server_register_cb().
1386 : *
1387 : * Calling this function will issue an release operation on any ASE
1388 : * in a non-idle state.
1389 : *
1390 : * @param cb Unicast server callback structure.
1391 : *
1392 : * @return 0 in case of success or negative value in case of error.
1393 : */
1394 1 : int bt_bap_unicast_server_unregister_cb(const struct bt_bap_unicast_server_cb *cb);
1395 :
1396 : /**
1397 : * @typedef bt_bap_ep_func_t
1398 : * @brief The callback function called for each endpoint.
1399 : *
1400 : * @param ep The structure object with endpoint info.
1401 : * @param user_data Data to pass to the function.
1402 : */
1403 1 : typedef void (*bt_bap_ep_func_t)(struct bt_bap_ep *ep, void *user_data);
1404 :
1405 : /**
1406 : * @brief Iterate through all endpoints of the given connection.
1407 : *
1408 : * @param conn Connection object
1409 : * @param func Function to call for each endpoint.
1410 : * @param user_data Data to pass to the callback function.
1411 : */
1412 1 : void bt_bap_unicast_server_foreach_ep(struct bt_conn *conn, bt_bap_ep_func_t func, void *user_data);
1413 :
1414 : /**
1415 : * @brief Initialize and configure a new ASE.
1416 : *
1417 : * @param conn Connection object
1418 : * @param stream Configured stream object to be attached to the ASE
1419 : * @param codec_cfg Codec configuration
1420 : * @param qos_pref Audio Stream Quality of Service Preference
1421 : *
1422 : * @return 0 in case of success or negative value in case of error.
1423 : */
1424 1 : int bt_bap_unicast_server_config_ase(struct bt_conn *conn, struct bt_bap_stream *stream,
1425 : struct bt_audio_codec_cfg *codec_cfg,
1426 : const struct bt_bap_qos_cfg_pref *qos_pref);
1427 :
1428 : /** @} */ /* End of group bt_bap_unicast_server */
1429 :
1430 : /**
1431 : * @defgroup bt_bap_unicast_client BAP Unicast Client APIs
1432 : * @ingroup bt_bap
1433 : * @{
1434 : */
1435 :
1436 : /** Parameter struct for each stream in the unicast group */
1437 1 : struct bt_bap_unicast_group_stream_param {
1438 : /** Pointer to a stream object. */
1439 1 : struct bt_bap_stream *stream;
1440 :
1441 : /** The QoS settings for the stream object. */
1442 1 : struct bt_bap_qos_cfg *qos;
1443 : };
1444 :
1445 : /**
1446 : * @brief Parameter struct for the unicast group functions
1447 : *
1448 : * Parameter struct for the bt_bap_unicast_group_create() and
1449 : * bt_bap_unicast_group_add_streams() functions.
1450 : */
1451 1 : struct bt_bap_unicast_group_stream_pair_param {
1452 : /** Pointer to a receiving stream parameters. */
1453 1 : struct bt_bap_unicast_group_stream_param *rx_param;
1454 :
1455 : /** Pointer to a transmitting stream parameters. */
1456 1 : struct bt_bap_unicast_group_stream_param *tx_param;
1457 : };
1458 :
1459 : /** Parameters for the creating unicast groups with bt_bap_unicast_group_create() */
1460 1 : struct bt_bap_unicast_group_param {
1461 : /** The number of parameters in @p params */
1462 1 : size_t params_count;
1463 :
1464 : /** Array of stream parameters */
1465 1 : struct bt_bap_unicast_group_stream_pair_param *params;
1466 :
1467 : /**
1468 : * @brief Unicast Group packing mode.
1469 : *
1470 : * @ref BT_ISO_PACKING_SEQUENTIAL or @ref BT_ISO_PACKING_INTERLEAVED.
1471 : *
1472 : * @note This is a recommendation to the controller, which the controller may ignore.
1473 : */
1474 1 : uint8_t packing;
1475 :
1476 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
1477 : /**
1478 : * @brief Central to Peripheral flush timeout
1479 : *
1480 : * The flush timeout in multiples of ISO_Interval for each payload sent
1481 : * from the Central to Peripheral.
1482 : *
1483 : * Value range from @ref BT_ISO_FT_MIN to @ref BT_ISO_FT_MAX
1484 : */
1485 1 : uint8_t c_to_p_ft;
1486 :
1487 : /**
1488 : * @brief Peripheral to Central flush timeout
1489 : *
1490 : * The flush timeout in multiples of ISO_Interval for each payload sent
1491 : * from the Peripheral to Central.
1492 : *
1493 : * Value range from @ref BT_ISO_FT_MIN to @ref BT_ISO_FT_MAX.
1494 : */
1495 1 : uint8_t p_to_c_ft;
1496 :
1497 : /**
1498 : * @brief ISO interval
1499 : *
1500 : * Time between consecutive CIS anchor points.
1501 : *
1502 : * Value range from @ref BT_ISO_ISO_INTERVAL_MIN to @ref BT_ISO_ISO_INTERVAL_MAX.
1503 : */
1504 1 : uint16_t iso_interval;
1505 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
1506 : };
1507 :
1508 : /**
1509 : * @brief Create unicast group.
1510 : *
1511 : * Create a new audio unicast group with one or more audio streams as a unicast client.
1512 : * All streams shall share the same framing.
1513 : * All streams in the same direction shall share the same interval and latency (see
1514 : * @ref bt_bap_qos_cfg).
1515 : *
1516 : * @param[in] param The unicast group create parameters.
1517 : * @param[out] unicast_group Pointer to the unicast group created.
1518 : *
1519 : * @return Zero on success or (negative) error code otherwise.
1520 : */
1521 1 : int bt_bap_unicast_group_create(struct bt_bap_unicast_group_param *param,
1522 : struct bt_bap_unicast_group **unicast_group);
1523 :
1524 : /**
1525 : * @brief Reconfigure unicast group.
1526 : *
1527 : * Reconfigure a unicast group with one or more audio streams as a unicast client.
1528 : * All streams shall share the same framing.
1529 : * All streams in the same direction shall share the same interval and latency (see
1530 : * @ref bt_bap_qos_cfg).
1531 : * All streams in @p param shall already belong to @p unicast_group.
1532 : * Use bt_bap_unicast_group_add_streams() to add additional streams.
1533 : *
1534 : * @param unicast_group Pointer to the unicast group created.
1535 : * @param param The unicast group reconfigure parameters.
1536 : *
1537 : * @return Zero on success or (negative) error code otherwise.
1538 : */
1539 1 : int bt_bap_unicast_group_reconfig(struct bt_bap_unicast_group *unicast_group,
1540 : const struct bt_bap_unicast_group_param *param);
1541 :
1542 : /**
1543 : * @brief Add streams to a unicast group as a unicast client
1544 : *
1545 : * This function can be used to add additional streams to a bt_bap_unicast_group.
1546 : *
1547 : * This can be called at any time before any of the streams in the group has been started
1548 : * (see bt_bap_stream_ops.started()).
1549 : * This can also be called after the streams have been stopped (see bt_bap_stream_ops.stopped()).
1550 : *
1551 : * Once a stream has been added to a unicast group, it cannot be removed. To remove a stream from a
1552 : * group, the group must be deleted with bt_bap_unicast_group_delete(), but this will require all
1553 : * streams in the group to be released first.
1554 : *
1555 : * @param unicast_group Pointer to the unicast group
1556 : * @param params Array of stream parameters with streams being added to the group.
1557 : * @param num_param Number of parameters in @p params.
1558 : *
1559 : * @return 0 in case of success or negative value in case of error.
1560 : */
1561 1 : int bt_bap_unicast_group_add_streams(struct bt_bap_unicast_group *unicast_group,
1562 : struct bt_bap_unicast_group_stream_pair_param params[],
1563 : size_t num_param);
1564 :
1565 : /**
1566 : * @brief Delete audio unicast group.
1567 : *
1568 : * Delete a audio unicast group as a client. All streams in the group shall
1569 : * be in the idle or configured state.
1570 : *
1571 : * @param unicast_group Pointer to the unicast group to delete
1572 : *
1573 : * @return Zero on success or (negative) error code otherwise.
1574 : */
1575 1 : int bt_bap_unicast_group_delete(struct bt_bap_unicast_group *unicast_group);
1576 :
1577 : /** Unicast Client callback structure */
1578 1 : struct bt_bap_unicast_client_cb {
1579 : /**
1580 : * @brief Remote Unicast Server Audio Locations
1581 : *
1582 : * This callback is called whenever the audio locations is read from
1583 : * the server or otherwise notified to the client.
1584 : *
1585 : * @param conn Connection to the remote unicast server.
1586 : * @param dir Direction of the location.
1587 : * @param loc The location bitfield value.
1588 : *
1589 : * @return 0 in case of success or negative value in case of error.
1590 : */
1591 1 : void (*location)(struct bt_conn *conn, enum bt_audio_dir dir, enum bt_audio_location loc);
1592 :
1593 : /**
1594 : * @brief Remote Unicast Server Available Contexts
1595 : *
1596 : * This callback is called whenever the available contexts are read
1597 : * from the server or otherwise notified to the client.
1598 : *
1599 : * @param conn Connection to the remote unicast server.
1600 : * @param snk_ctx The sink context bitfield value.
1601 : * @param src_ctx The source context bitfield value.
1602 : *
1603 : * @return 0 in case of success or negative value in case of error.
1604 : */
1605 1 : void (*available_contexts)(struct bt_conn *conn, enum bt_audio_context snk_ctx,
1606 : enum bt_audio_context src_ctx);
1607 :
1608 : /**
1609 : * @brief Callback function for bt_bap_stream_config() and bt_bap_stream_reconfig().
1610 : *
1611 : * Called when the codec configure operation is completed on the server.
1612 : *
1613 : * @param stream Stream the operation was performed on.
1614 : * @param rsp_code Response code.
1615 : * @param reason Reason code.
1616 : */
1617 1 : void (*config)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1618 : enum bt_bap_ascs_reason reason);
1619 :
1620 : /**
1621 : * @brief Callback function for bt_bap_stream_qos().
1622 : *
1623 : * Called when the QoS configure operation is completed on the server.
1624 : * This will be called for each stream in the group that was being QoS
1625 : * configured.
1626 : *
1627 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1628 : * associated with the ASE ID sent by the server.
1629 : * @param rsp_code Response code.
1630 : * @param reason Reason code.
1631 : */
1632 1 : void (*qos)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1633 : enum bt_bap_ascs_reason reason);
1634 :
1635 : /**
1636 : * @brief Callback function for bt_bap_stream_enable().
1637 : *
1638 : * Called when the enable operation is completed on the server.
1639 : *
1640 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1641 : * associated with the ASE ID sent by the server.
1642 : * @param rsp_code Response code.
1643 : * @param reason Reason code.
1644 : */
1645 1 : void (*enable)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1646 : enum bt_bap_ascs_reason reason);
1647 :
1648 : /**
1649 : * @brief Callback function for bt_bap_stream_start().
1650 : *
1651 : * Called when the start operation is completed on the server. This will
1652 : * only be called if the stream supplied to bt_bap_stream_start() is
1653 : * for a @ref BT_AUDIO_DIR_SOURCE endpoint.
1654 : *
1655 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1656 : * associated with the ASE ID sent by the server.
1657 : * @param rsp_code Response code.
1658 : * @param reason Reason code.
1659 : */
1660 1 : void (*start)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1661 : enum bt_bap_ascs_reason reason);
1662 :
1663 : /**
1664 : * @brief Callback function for bt_bap_stream_stop().
1665 : *
1666 : * Called when the stop operation is completed on the server. This will
1667 : * only be called if the stream supplied to bt_bap_stream_stop() is
1668 : * for a @ref BT_AUDIO_DIR_SOURCE endpoint.
1669 : *
1670 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1671 : * associated with the ASE ID sent by the server.
1672 : * @param rsp_code Response code.
1673 : * @param reason Reason code.
1674 : */
1675 1 : void (*stop)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1676 : enum bt_bap_ascs_reason reason);
1677 :
1678 : /**
1679 : * @brief Callback function for bt_bap_stream_disable().
1680 : *
1681 : * Called when the disable operation is completed on the server.
1682 : *
1683 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1684 : * associated with the ASE ID sent by the server.
1685 : * @param rsp_code Response code.
1686 : * @param reason Reason code.
1687 : */
1688 1 : void (*disable)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1689 : enum bt_bap_ascs_reason reason);
1690 :
1691 : /**
1692 : * @brief Callback function for bt_bap_stream_metadata().
1693 : *
1694 : * Called when the metadata operation is completed on the server.
1695 : *
1696 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1697 : * associated with the ASE ID sent by the server.
1698 : * @param rsp_code Response code.
1699 : * @param reason Reason code.
1700 : */
1701 1 : void (*metadata)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1702 : enum bt_bap_ascs_reason reason);
1703 :
1704 : /**
1705 : * @brief Callback function for bt_bap_stream_release().
1706 : *
1707 : * Called when the release operation is completed on the server.
1708 : *
1709 : * @param stream Stream the operation was performed on. May be NULL if there is no stream
1710 : * associated with the ASE ID sent by the server.
1711 : * @param rsp_code Response code.
1712 : * @param reason Reason code.
1713 : */
1714 1 : void (*release)(struct bt_bap_stream *stream, enum bt_bap_ascs_rsp_code rsp_code,
1715 : enum bt_bap_ascs_reason reason);
1716 :
1717 : /**
1718 : * @brief Remote Published Audio Capability (PAC) record discovered
1719 : *
1720 : * Called when a PAC record has been discovered as part of the discovery procedure.
1721 : *
1722 : * The @p codec is only valid while in the callback, so the values must be stored by the
1723 : * receiver if future use is wanted.
1724 : *
1725 : * @param conn Connection to the remote unicast server.
1726 : * @param dir The type of remote endpoints and capabilities discovered.
1727 : * @param codec_cap Remote capabilities.
1728 : *
1729 : * If discovery procedure has complete both @p codec and @p ep are set to NULL.
1730 : */
1731 1 : void (*pac_record)(struct bt_conn *conn, enum bt_audio_dir dir,
1732 : const struct bt_audio_codec_cap *codec_cap);
1733 :
1734 : /**
1735 : * @brief Remote Audio Stream Endpoint (ASE) discovered
1736 : *
1737 : * Called when an ASE has been discovered as part of the discovery procedure.
1738 : *
1739 : * @param conn Connection to the remote unicast server.
1740 : * @param dir The type of remote endpoints and capabilities discovered.
1741 : * @param ep Remote endpoint.
1742 : *
1743 : * If discovery procedure has complete both @p codec and @p ep are set to NULL.
1744 : */
1745 1 : void (*endpoint)(struct bt_conn *conn, enum bt_audio_dir dir, struct bt_bap_ep *ep);
1746 :
1747 : /**
1748 : * @brief BAP discovery callback function.
1749 : *
1750 : * If discovery procedure has completed @p ep is set to NULL and @p err is 0.
1751 : *
1752 : * @param conn Connection to the remote unicast server.
1753 : * @param err Error value. 0 on success, GATT error on positive value or errno on
1754 : * negative value.
1755 : * @param dir The type of remote endpoints and capabilities discovered.
1756 : *
1757 : * If discovery procedure has complete both @p codec and @p ep are set to NULL.
1758 : */
1759 1 : void (*discover)(struct bt_conn *conn, int err, enum bt_audio_dir dir);
1760 :
1761 : /** @cond INTERNAL_HIDDEN */
1762 : /** Internally used field for list handling */
1763 : sys_snode_t _node;
1764 : /** @endcond */
1765 : };
1766 :
1767 : /**
1768 : * @brief Register unicast client callbacks.
1769 : *
1770 : * Only one callback structure can be registered, and attempting to
1771 : * registering more than one will result in an error.
1772 : *
1773 : * @param cb Unicast client callback structure.
1774 : *
1775 : * @retval 0 Success
1776 : * @retval -EINVAL @p cb is NULL.
1777 : * @retval -EEXIST @p cb is already registered.
1778 : */
1779 1 : int bt_bap_unicast_client_register_cb(struct bt_bap_unicast_client_cb *cb);
1780 :
1781 : /**
1782 : * @brief Discover remote capabilities and endpoints
1783 : *
1784 : * This procedure is used by a client to discover remote capabilities and
1785 : * endpoints and notifies via params callback.
1786 : *
1787 : * @param conn Connection object
1788 : * @param dir The type of remote endpoints and capabilities to discover.
1789 : */
1790 1 : int bt_bap_unicast_client_discover(struct bt_conn *conn, enum bt_audio_dir dir);
1791 :
1792 : /** @} */ /* End of group bt_bap_unicast_client */
1793 : /**
1794 : * @brief BAP Broadcast APIs
1795 : * @defgroup bt_bap_broadcast BAP Broadcast APIs
1796 : * @ingroup bt_bap
1797 : * @{
1798 : */
1799 :
1800 : /** @brief Abstract Broadcast Audio Source Endpoint (BASE) subgroup structure. */
1801 : struct bt_bap_base_subgroup;
1802 : /** @brief Abstract Broadcast Audio Source Endpoint (BASE) structure. */
1803 : struct bt_bap_base;
1804 :
1805 : /** Codec ID structure for a Broadcast Audio Source Endpoint (BASE) */
1806 1 : struct bt_bap_base_codec_id {
1807 : /** Codec ID */
1808 1 : uint8_t id;
1809 : /** Codec Company ID */
1810 1 : uint16_t cid;
1811 : /** Codec Company Vendor ID */
1812 1 : uint16_t vid;
1813 : };
1814 :
1815 : /** BIS structure for each BIS in a Broadcast Audio Source Endpoint (BASE) subgroup */
1816 1 : struct bt_bap_base_subgroup_bis {
1817 : /** Unique index of the BIS */
1818 1 : uint8_t index;
1819 : /** Codec Specific Data length. */
1820 1 : uint8_t data_len;
1821 : /** Codec Specific Data */
1822 1 : uint8_t *data;
1823 : };
1824 :
1825 : /**
1826 : * @brief Generate a pointer to a BASE from periodic advertising data
1827 : *
1828 : * @param ad The periodic advertising data
1829 : *
1830 : * @retval NULL if the data does not contain a BASE
1831 : * @retval Pointer to a bt_bap_base structure
1832 : */
1833 1 : const struct bt_bap_base *bt_bap_base_get_base_from_ad(const struct bt_data *ad);
1834 :
1835 : /**
1836 : * @brief Get the size of a BASE
1837 : *
1838 : * @param base The BASE pointer
1839 : *
1840 : * @retval -EINVAL if arguments are invalid
1841 : * @retval The size of the BASE
1842 : */
1843 1 : int bt_bap_base_get_size(const struct bt_bap_base *base);
1844 :
1845 : /**
1846 : * @brief Get the presentation delay value of a BASE
1847 : *
1848 : * @param base The BASE pointer
1849 : *
1850 : * @retval -EINVAL if arguments are invalid
1851 : * @retval The 24-bit presentation delay value
1852 : */
1853 1 : int bt_bap_base_get_pres_delay(const struct bt_bap_base *base);
1854 :
1855 : /**
1856 : * @brief Get the subgroup count of a BASE
1857 : *
1858 : * @param base The BASE pointer
1859 : *
1860 : * @retval -EINVAL if arguments are invalid
1861 : * @retval The 8-bit subgroup count value
1862 : */
1863 1 : int bt_bap_base_get_subgroup_count(const struct bt_bap_base *base);
1864 :
1865 : /**
1866 : * @brief Get all BIS indexes of a BASE
1867 : *
1868 : * @param[in] base The BASE pointer
1869 : * @param[out] bis_indexes 32-bit BIS index bitfield that will be populated
1870 : *
1871 : * @retval -EINVAL if arguments are invalid
1872 : * @retval 0 on success
1873 : */
1874 1 : int bt_bap_base_get_bis_indexes(const struct bt_bap_base *base, uint32_t *bis_indexes);
1875 :
1876 : /**
1877 : * @brief Iterate on all subgroups in the BASE
1878 : *
1879 : * @param base The BASE pointer
1880 : * @param func Callback function. Return true to continue iterating, or false to stop.
1881 : * @param user_data Userdata supplied to @p func
1882 : *
1883 : * @retval -EINVAL if arguments are invalid
1884 : * @retval -ECANCELED if iterating over the subgroups stopped prematurely by @p func
1885 : * @retval 0 if all subgroups were iterated
1886 : */
1887 1 : int bt_bap_base_foreach_subgroup(const struct bt_bap_base *base,
1888 : bool (*func)(const struct bt_bap_base_subgroup *subgroup,
1889 : void *user_data),
1890 : void *user_data);
1891 :
1892 : /**
1893 : * @brief Get the codec ID of a subgroup
1894 : *
1895 : * @param[in] subgroup The subgroup pointer
1896 : * @param[out] codec_id Pointer to the struct where the results are placed
1897 : *
1898 : * @retval -EINVAL if arguments are invalid
1899 : * @retval 0 on success
1900 : */
1901 1 : int bt_bap_base_get_subgroup_codec_id(const struct bt_bap_base_subgroup *subgroup,
1902 : struct bt_bap_base_codec_id *codec_id);
1903 :
1904 : /**
1905 : * @brief Get the codec configuration data of a subgroup
1906 : *
1907 : * @param[in] subgroup The subgroup pointer
1908 : * @param[out] data Pointer that will point to the resulting codec configuration data
1909 : *
1910 : * @retval -EINVAL if arguments are invalid
1911 : * @retval 0 on success
1912 : */
1913 1 : int bt_bap_base_get_subgroup_codec_data(const struct bt_bap_base_subgroup *subgroup,
1914 : uint8_t **data);
1915 :
1916 : /**
1917 : * @brief Get the codec metadata of a subgroup
1918 : *
1919 : * @param[in] subgroup The subgroup pointer
1920 : * @param[out] meta Pointer that will point to the resulting codec metadata
1921 : *
1922 : * @retval -EINVAL if arguments are invalid
1923 : * @retval 0 on success
1924 : */
1925 1 : int bt_bap_base_get_subgroup_codec_meta(const struct bt_bap_base_subgroup *subgroup,
1926 : uint8_t **meta);
1927 :
1928 : /**
1929 : * @brief Store subgroup codec data in a @ref bt_audio_codec_cfg
1930 : *
1931 : * @param[in] subgroup The subgroup pointer
1932 : * @param[out] codec_cfg Pointer to the struct where the results are placed
1933 : *
1934 : * @retval -EINVAL if arguments are invalid
1935 : * @retval -ENOMEM if the @p codec_cfg cannot store the @p subgroup codec data
1936 : * @retval 0 on success
1937 : */
1938 1 : int bt_bap_base_subgroup_codec_to_codec_cfg(const struct bt_bap_base_subgroup *subgroup,
1939 : struct bt_audio_codec_cfg *codec_cfg);
1940 :
1941 : /**
1942 : * @brief Get the BIS count of a subgroup
1943 : *
1944 : * @param subgroup The subgroup pointer
1945 : *
1946 : * @retval -EINVAL if arguments are invalid
1947 : * @retval The 8-bit BIS count value
1948 : */
1949 1 : int bt_bap_base_get_subgroup_bis_count(const struct bt_bap_base_subgroup *subgroup);
1950 :
1951 : /**
1952 : * @brief Get all BIS indexes of a subgroup
1953 : *
1954 : * @param[in] subgroup The subgroup pointer
1955 : * @param[out] bis_indexes 32-bit BIS index bitfield that will be populated
1956 : *
1957 : * @retval -EINVAL if arguments are invalid
1958 : * @retval 0 on success
1959 : */
1960 1 : int bt_bap_base_subgroup_get_bis_indexes(const struct bt_bap_base_subgroup *subgroup,
1961 : uint32_t *bis_indexes);
1962 :
1963 : /**
1964 : * @brief Iterate on all BIS in the subgroup
1965 : *
1966 : * @param subgroup The subgroup pointer
1967 : * @param func Callback function. Return true to continue iterating, or false to stop.
1968 : * @param user_data Userdata supplied to @p func
1969 : *
1970 : * @retval -EINVAL if arguments are invalid
1971 : * @retval -ECANCELED if iterating over the subgroups stopped prematurely by @p func
1972 : * @retval 0 if all BIS were iterated
1973 : */
1974 1 : int bt_bap_base_subgroup_foreach_bis(const struct bt_bap_base_subgroup *subgroup,
1975 : bool (*func)(const struct bt_bap_base_subgroup_bis *bis,
1976 : void *user_data),
1977 : void *user_data);
1978 :
1979 : /**
1980 : * @brief Store BIS codec configuration data in a @ref bt_audio_codec_cfg
1981 : *
1982 : * This only sets the @ref bt_audio_codec_cfg data and @ref bt_audio_codec_cfg data_len, but is
1983 : * useful to use the BIS codec configuration data with the bt_audio_codec_cfg_* functions.
1984 : *
1985 : * @param[in] bis The BIS pointer
1986 : * @param[out] codec_cfg Pointer to the struct where the results are placed
1987 : *
1988 : * @retval -EINVAL if arguments are invalid
1989 : * @retval -ENOMEM if the @p codec_cfg cannot store the @p subgroup codec data
1990 : * @retval 0 on success
1991 : */
1992 1 : int bt_bap_base_subgroup_bis_codec_to_codec_cfg(const struct bt_bap_base_subgroup_bis *bis,
1993 : struct bt_audio_codec_cfg *codec_cfg);
1994 :
1995 : /** @} */ /* End of group bt_bap_broadcast */
1996 :
1997 : /**
1998 : * @brief BAP Broadcast Source APIs
1999 : * @defgroup bt_bap_broadcast_source BAP Broadcast Source APIs
2000 : * @ingroup bt_bap_broadcast
2001 : * @{
2002 : */
2003 :
2004 : /**
2005 : * @brief Struct to hold the Broadcast Source callbacks
2006 : *
2007 : * These can be registered for usage with bt_bap_broadcast_source_register_cb().
2008 : */
2009 1 : struct bt_bap_broadcast_source_cb {
2010 : /**
2011 : * @brief The Broadcast Source has started and all of the streams are ready for audio data
2012 : *
2013 : * @param source The started Broadcast Source
2014 : */
2015 1 : void (*started)(struct bt_bap_broadcast_source *source);
2016 :
2017 : /**
2018 : * @brief The Broadcast Source has stopped and none of the streams are ready for audio data
2019 : *
2020 : * @param source The stopped Broadcast Source
2021 : * @param reason The reason why the Broadcast Source stopped (see the BT_HCI_ERR_* values)
2022 : */
2023 1 : void (*stopped)(struct bt_bap_broadcast_source *source, uint8_t reason);
2024 :
2025 : /** @internal Internally used field for list handling */
2026 : sys_snode_t _node;
2027 : };
2028 :
2029 : /**
2030 : * @brief Registers callbacks for Broadcast Sources
2031 : *
2032 : * @param cb Pointer to the callback structure.
2033 : *
2034 : * @retval 0 on success
2035 : * @retval -EINVAL if @p cb is NULL
2036 : * @retval -EEXIST if @p cb is already registered
2037 : */
2038 1 : int bt_bap_broadcast_source_register_cb(struct bt_bap_broadcast_source_cb *cb);
2039 :
2040 : /**
2041 : * @brief Unregisters callbacks for Broadcast Sources
2042 : *
2043 : * @param cb Pointer to the callback structure.
2044 : *
2045 : * @retval 0 on success
2046 : * @retval -EINVAL if @p cb is NULL
2047 : * @retval -ENOENT if @p cb is not registered
2048 : */
2049 1 : int bt_bap_broadcast_source_unregister_cb(struct bt_bap_broadcast_source_cb *cb);
2050 :
2051 : /** Broadcast Source stream parameters */
2052 1 : struct bt_bap_broadcast_source_stream_param {
2053 : /** Audio stream */
2054 1 : struct bt_bap_stream *stream;
2055 :
2056 : #if CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 || defined(__DOXYGEN__)
2057 : /**
2058 : * @brief The number of elements in the @p data array.
2059 : *
2060 : * The BIS specific data may be omitted and this set to 0.
2061 : */
2062 1 : size_t data_len;
2063 :
2064 : /** BIS Codec Specific Configuration */
2065 1 : uint8_t *data;
2066 : #endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 */
2067 : };
2068 :
2069 : /** Broadcast Source subgroup parameters*/
2070 1 : struct bt_bap_broadcast_source_subgroup_param {
2071 : /** The number of parameters in @p stream_params */
2072 1 : size_t params_count;
2073 :
2074 : /** Array of stream parameters */
2075 1 : struct bt_bap_broadcast_source_stream_param *params;
2076 :
2077 : /** Subgroup Codec configuration. */
2078 1 : struct bt_audio_codec_cfg *codec_cfg;
2079 : };
2080 :
2081 : /** Broadcast Source create parameters */
2082 1 : struct bt_bap_broadcast_source_param {
2083 : /** The number of parameters in @p subgroup_params */
2084 1 : size_t params_count;
2085 :
2086 : /** Array of stream parameters */
2087 1 : struct bt_bap_broadcast_source_subgroup_param *params;
2088 :
2089 : /** Quality of Service configuration. */
2090 1 : struct bt_bap_qos_cfg *qos;
2091 :
2092 : /**
2093 : * @brief Broadcast Source packing mode.
2094 : *
2095 : * @ref BT_ISO_PACKING_SEQUENTIAL or @ref BT_ISO_PACKING_INTERLEAVED.
2096 : *
2097 : * @note This is a recommendation to the controller, which the controller may ignore.
2098 : */
2099 1 : uint8_t packing;
2100 :
2101 : /** Whether or not to encrypt the streams. */
2102 1 : bool encryption;
2103 :
2104 : /**
2105 : * @brief Broadcast code
2106 : *
2107 : * If the value is a string or a the value is less than 16 octets,
2108 : * the remaining octets shall be 0.
2109 : *
2110 : * Example:
2111 : * The string "Broadcast Code" shall be
2112 : * [42 72 6F 61 64 63 61 73 74 20 43 6F 64 65 00 00]
2113 : */
2114 1 : uint8_t broadcast_code[BT_ISO_BROADCAST_CODE_SIZE];
2115 :
2116 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
2117 : /**
2118 : * @brief Immediate Repetition Count
2119 : *
2120 : * The number of times the scheduled payloads are transmitted in a given event.
2121 : *
2122 : * Value range from @ref BT_ISO_IRC_MIN to @ref BT_ISO_IRC_MAX.
2123 : */
2124 1 : uint8_t irc;
2125 :
2126 : /**
2127 : * @brief Pre-transmission offset
2128 : *
2129 : * Offset used for pre-transmissions.
2130 : *
2131 : * Value range from @ref BT_ISO_PTO_MIN to @ref BT_ISO_PTO_MAX.
2132 : */
2133 1 : uint8_t pto;
2134 :
2135 : /**
2136 : * @brief ISO interval
2137 : *
2138 : * Time between consecutive BIS anchor points.
2139 : *
2140 : * Value range from @ref BT_ISO_ISO_INTERVAL_MIN to @ref BT_ISO_ISO_INTERVAL_MAX.
2141 : */
2142 1 : uint16_t iso_interval;
2143 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
2144 : };
2145 :
2146 : /**
2147 : * @brief Create audio broadcast source.
2148 : *
2149 : * Create a new audio broadcast source with one or more audio streams.
2150 : *
2151 : * The broadcast source will be visible for scanners once this has been called,
2152 : * and the device will advertise audio announcements.
2153 : *
2154 : * No audio data can be sent until bt_bap_broadcast_source_start() has been called and no audio
2155 : * information (BIGInfo) will be visible to scanners (see @ref bt_le_per_adv_sync_cb).
2156 : *
2157 : * @param[in] param Pointer to parameters used to create the broadcast source.
2158 : * @param[out] source Pointer to the broadcast source created
2159 : *
2160 : * @return Zero on success or (negative) error code otherwise.
2161 : */
2162 1 : int bt_bap_broadcast_source_create(struct bt_bap_broadcast_source_param *param,
2163 : struct bt_bap_broadcast_source **source);
2164 :
2165 : /**
2166 : * @brief Reconfigure audio broadcast source.
2167 : *
2168 : * Reconfigure an audio broadcast source with a new codec and codec quality of
2169 : * service parameters. This can only be done when the source is stopped.
2170 : *
2171 : * Since this may modify the Broadcast Audio Source Endpoint (BASE),
2172 : * bt_bap_broadcast_source_get_base() should be called after this to get the new BASE information.
2173 : *
2174 : * If the @p param.params_count is smaller than the number of subgroups that have been created in
2175 : * the Broadcast Source, only the first @p param.params_count subgroups are updated. If a stream
2176 : * exist in a subgroup not part of @p param, then that stream is left as is (i.e. it is not removed;
2177 : * the only way to remove a stream from a Broadcast Source is to recreate the Broadcast Source).
2178 : *
2179 : * @param source Pointer to the broadcast source
2180 : * @param param Pointer to parameters used to reconfigure the broadcast source.
2181 : *
2182 : * @return Zero on success or (negative) error code otherwise.
2183 : */
2184 1 : int bt_bap_broadcast_source_reconfig(struct bt_bap_broadcast_source *source,
2185 : struct bt_bap_broadcast_source_param *param);
2186 :
2187 : /**
2188 : * @brief Modify the metadata of an audio broadcast source.
2189 : *
2190 : * Modify the metadata an audio broadcast source. This can only be done when the source is started.
2191 : * To update the metadata in the stopped state, use bt_bap_broadcast_source_reconfig().
2192 : *
2193 : * @param source Pointer to the broadcast source.
2194 : * @param meta Metadata.
2195 : * @param meta_len Length of metadata.
2196 : *
2197 : * @return Zero on success or (negative) error code otherwise.
2198 : */
2199 1 : int bt_bap_broadcast_source_update_metadata(struct bt_bap_broadcast_source *source,
2200 : const uint8_t meta[], size_t meta_len);
2201 :
2202 : /**
2203 : * @brief Start audio broadcast source.
2204 : *
2205 : * Start an audio broadcast source with one or more audio streams.
2206 : * The broadcast source will start advertising BIGInfo, and audio data can be streamed.
2207 : *
2208 : * @param source Pointer to the broadcast source
2209 : * @param adv Pointer to an extended advertising set with periodic advertising configured.
2210 : *
2211 : * @return Zero on success or (negative) error code otherwise.
2212 : */
2213 1 : int bt_bap_broadcast_source_start(struct bt_bap_broadcast_source *source,
2214 : struct bt_le_ext_adv *adv);
2215 :
2216 : /**
2217 : * @brief Stop audio broadcast source.
2218 : *
2219 : * Stop an audio broadcast source.
2220 : * The broadcast source will stop advertising BIGInfo, and audio data can no longer be streamed.
2221 : *
2222 : * @param source Pointer to the broadcast source
2223 : *
2224 : * @return Zero on success or (negative) error code otherwise.
2225 : */
2226 1 : int bt_bap_broadcast_source_stop(struct bt_bap_broadcast_source *source);
2227 :
2228 : /**
2229 : * @brief Delete audio broadcast source.
2230 : *
2231 : * Delete an audio broadcast source.
2232 : * The broadcast source will stop advertising entirely, and the source can no longer be used.
2233 : *
2234 : * @param source Pointer to the broadcast source
2235 : *
2236 : * @return Zero on success or (negative) error code otherwise.
2237 : */
2238 1 : int bt_bap_broadcast_source_delete(struct bt_bap_broadcast_source *source);
2239 :
2240 : /**
2241 : * @brief Get the Broadcast Audio Stream Endpoint of a broadcast source
2242 : *
2243 : * This will encode the BASE of a broadcast source into a buffer, that can be used for
2244 : * advertisement. The encoded BASE will thus be encoded as little-endian. The BASE shall be put into
2245 : * the periodic advertising data (see bt_le_per_adv_set_data()).
2246 : *
2247 : * See table 3.15 in the Basic Audio Profile v1.0.1 for the structure.
2248 : *
2249 : * @param source Pointer to the broadcast source.
2250 : * @param base_buf Pointer to a buffer where the BASE will be inserted.
2251 : *
2252 : * @return Zero on success or (negative) error code otherwise.
2253 : */
2254 1 : int bt_bap_broadcast_source_get_base(struct bt_bap_broadcast_source *source,
2255 : struct net_buf_simple *base_buf);
2256 :
2257 : /** @} */ /* End of bt_bap_broadcast_source */
2258 :
2259 : /**
2260 : * @brief BAP Broadcast Sink APIs
2261 : * @defgroup bt_bap_broadcast_sink BAP Broadcast Sink APIs
2262 : * @ingroup bt_bap_broadcast
2263 : * @{
2264 : */
2265 :
2266 : /** Broadcast Audio Sink callback structure */
2267 1 : struct bt_bap_broadcast_sink_cb {
2268 : /**
2269 : * @brief Broadcast Audio Source Endpoint (BASE) received
2270 : *
2271 : * Callback for when we receive a BASE from a broadcaster after
2272 : * syncing to the broadcaster's periodic advertising.
2273 : *
2274 : * @param sink Pointer to the sink structure.
2275 : * @param base Broadcast Audio Source Endpoint (BASE).
2276 : * @param base_size Size of the @p base
2277 : */
2278 1 : void (*base_recv)(struct bt_bap_broadcast_sink *sink, const struct bt_bap_base *base,
2279 : size_t base_size);
2280 :
2281 : /**
2282 : * @brief Broadcast sink is syncable
2283 : *
2284 : * Called whenever a broadcast sink is not synchronized to audio, but the audio is
2285 : * synchronizable. This is inferred when a BIGInfo report is received.
2286 : *
2287 : * Once this callback has been called, it is possible to call
2288 : * bt_bap_broadcast_sink_sync() to synchronize to the audio stream(s).
2289 : *
2290 : * @param sink Pointer to the sink structure.
2291 : * @param biginfo The BIGInfo report.
2292 : */
2293 1 : void (*syncable)(struct bt_bap_broadcast_sink *sink, const struct bt_iso_biginfo *biginfo);
2294 :
2295 : /**
2296 : * @brief The Broadcast Sink has started and audio data may be received from all of the
2297 : * streams
2298 : *
2299 : * @param sink The started Broadcast Sink
2300 : */
2301 1 : void (*started)(struct bt_bap_broadcast_sink *sink);
2302 :
2303 : /**
2304 : * @brief The Broadcast Sink has stopped and none of the streams will receive audio data
2305 : *
2306 : * @param sink The stopped Broadcast Sink
2307 : * @param reason The reason why the Broadcast Sink stopped (see the BT_HCI_ERR_* values)
2308 : */
2309 1 : void (*stopped)(struct bt_bap_broadcast_sink *sink, uint8_t reason);
2310 :
2311 : /** @internal Internally used list node */
2312 : sys_snode_t _node;
2313 : };
2314 :
2315 : /**
2316 : * @brief Register Broadcast sink callbacks
2317 : *
2318 : * It is possible to register multiple struct of callbacks, but a single struct can only be
2319 : * registered once.
2320 : * Registering the same callback multiple times is undefined behavior and may break the stack.
2321 :
2322 : * @param cb Broadcast sink callback structure.
2323 : *
2324 : * @retval 0 on success
2325 : * @retval -EINVAL if @p cb is NULL
2326 : * @retval -EALREADY if @p cb was already registered
2327 : */
2328 1 : int bt_bap_broadcast_sink_register_cb(struct bt_bap_broadcast_sink_cb *cb);
2329 :
2330 : /**
2331 : * @brief Create a Broadcast Sink from a periodic advertising sync
2332 : *
2333 : * This should only be done after verifying that the periodic advertising sync
2334 : * is from a Broadcast Source.
2335 : *
2336 : * The created Broadcast Sink will need to be supplied to
2337 : * bt_bap_broadcast_sink_sync() in order to synchronize to the broadcast audio.
2338 : *
2339 : * bt_bap_broadcast_sink_cb.pa_synced() will be called with the Broadcast
2340 : * Sink object created if this is successful.
2341 : *
2342 : * @param pa_sync Pointer to the periodic advertising sync object.
2343 : * @param broadcast_id 24-bit broadcast ID.
2344 : * @param[out] sink Pointer to the Broadcast Sink created.
2345 : *
2346 : * @return 0 in case of success or errno value in case of error.
2347 : */
2348 1 : int bt_bap_broadcast_sink_create(struct bt_le_per_adv_sync *pa_sync, uint32_t broadcast_id,
2349 : struct bt_bap_broadcast_sink **sink);
2350 :
2351 : /**
2352 : * @brief Sync to a broadcaster's audio
2353 : *
2354 : * @param sink Pointer to the sink object from the base_recv callback.
2355 : * @param indexes_bitfield Bitfield of the BIS index to sync to. To sync to e.g. BIS index 1 and
2356 : * 2, this should have the value of BIT(1) | BIT(2).
2357 : * @param streams Stream object pointers to be used for the receiver. If multiple BIS
2358 : * indexes shall be synchronized, multiple streams shall be provided.
2359 : * @param broadcast_code The 16-octet broadcast code. Shall be supplied if the broadcast is
2360 : * encrypted (see @ref bt_bap_broadcast_sink_cb.syncable).
2361 : * If the value is a string or a the value is less
2362 : * than 16 octets, the remaining octets shall be 0.
2363 : *
2364 : * Example:
2365 : * The string "Broadcast Code" shall be
2366 : * [42 72 6F 61 64 63 61 73 74 20 43 6F 64 65 00 00]
2367 : *
2368 : * @return 0 in case of success or negative value in case of error.
2369 : */
2370 1 : int bt_bap_broadcast_sink_sync(struct bt_bap_broadcast_sink *sink, uint32_t indexes_bitfield,
2371 : struct bt_bap_stream *streams[],
2372 : const uint8_t broadcast_code[BT_ISO_BROADCAST_CODE_SIZE]);
2373 :
2374 : /**
2375 : * @brief Stop audio broadcast sink.
2376 : *
2377 : * Stop an audio broadcast sink.
2378 : * The broadcast sink will stop receiving BIGInfo, and audio data can no longer be streamed.
2379 : *
2380 : * @param sink Pointer to the broadcast sink
2381 : *
2382 : * @return Zero on success or (negative) error code otherwise.
2383 : */
2384 1 : int bt_bap_broadcast_sink_stop(struct bt_bap_broadcast_sink *sink);
2385 :
2386 : /**
2387 : * @brief Release a broadcast sink
2388 : *
2389 : * Once a broadcast sink has been allocated after the pa_synced callback, it can be deleted using
2390 : * this function. If the sink has synchronized to any broadcast audio streams, these must first be
2391 : * stopped using bt_bap_stream_stop.
2392 : *
2393 : * @param sink Pointer to the sink object to delete.
2394 : *
2395 : * @return 0 in case of success or negative value in case of error.
2396 : */
2397 1 : int bt_bap_broadcast_sink_delete(struct bt_bap_broadcast_sink *sink);
2398 :
2399 : /** @} */ /* End of group bt_bap_broadcast_sink */
2400 :
2401 : /**
2402 : * @brief Register the Basic Audio Profile Scan Delegator and BASS.
2403 : *
2404 : * Register the scan deligator and Broadcast Audio Scan Service (BASS)
2405 : * dynamically at runtime.
2406 : *
2407 : * Only one set of callbacks can be registered at any one time, and calling this function multiple
2408 : * times will override any previously registered callbacks.
2409 : *
2410 : * @param cb Pointer to the callback struct
2411 : *
2412 : * @return 0 in case of success or negative value in case of error.
2413 : */
2414 1 : int bt_bap_scan_delegator_register(struct bt_bap_scan_delegator_cb *cb);
2415 :
2416 : /**
2417 : * @brief unregister the Basic Audio Profile Scan Delegator and BASS.
2418 : *
2419 : * Unregister the scan deligator and Broadcast Audio Scan Service (BASS)
2420 : * dynamically at runtime.
2421 : *
2422 : * @return 0 in case of success or negative value in case of error.
2423 : */
2424 1 : int bt_bap_scan_delegator_unregister(void);
2425 :
2426 : /**
2427 : * @brief Set the periodic advertising sync state to syncing
2428 : *
2429 : * Set the periodic advertising sync state for a receive state to syncing,
2430 : * notifying Broadcast Assistants.
2431 : *
2432 : * @param src_id The source id used to identify the receive state.
2433 : * @param pa_state The Periodic Advertising sync state to set.
2434 : * BT_BAP_PA_STATE_NOT_SYNCED and BT_BAP_PA_STATE_SYNCED is
2435 : * not necessary to provide, as they are handled internally.
2436 : *
2437 : * @return int Error value. 0 on success, errno on fail.
2438 : */
2439 1 : int bt_bap_scan_delegator_set_pa_state(uint8_t src_id,
2440 : enum bt_bap_pa_state pa_state);
2441 :
2442 : /**
2443 : * @brief Set the sync state of a receive state in the server
2444 : *
2445 : * @param src_id The source id used to identify the receive state.
2446 : * @param bis_synced Array of bitfields to set the BIS sync state for each
2447 : * subgroup.
2448 : * @return int Error value. 0 on success, ERRNO on fail.
2449 : */
2450 1 : int bt_bap_scan_delegator_set_bis_sync_state(uint8_t src_id,
2451 : uint32_t bis_synced[BT_BAP_BASS_MAX_SUBGROUPS]);
2452 :
2453 : /** Parameters for bt_bap_scan_delegator_add_src() */
2454 1 : struct bt_bap_scan_delegator_add_src_param {
2455 : /** Periodic Advertiser Address */
2456 1 : bt_addr_le_t addr;
2457 :
2458 : /** Advertiser SID */
2459 1 : uint8_t sid;
2460 :
2461 : /** The broadcast isochronous group encryption state */
2462 1 : enum bt_bap_big_enc_state encrypt_state;
2463 :
2464 : /** The 24-bit broadcast ID */
2465 1 : uint32_t broadcast_id;
2466 :
2467 : /** Number of subgroups */
2468 1 : uint8_t num_subgroups;
2469 :
2470 : /** Subgroup specific information */
2471 1 : struct bt_bap_bass_subgroup subgroups[BT_BAP_BASS_MAX_SUBGROUPS];
2472 : };
2473 :
2474 : /**
2475 : * @brief Add a receive state source locally
2476 : *
2477 : * This will notify any connected clients about the new source. This allows them
2478 : * to modify and even remove it.
2479 : *
2480 : * If @kconfig{CONFIG_BT_BAP_BROADCAST_SINK} is enabled, any Broadcast Sink
2481 : * sources are autonomously added.
2482 : *
2483 : * @param param The parameters for adding the new source
2484 : *
2485 : * @return int errno on failure, or source ID on success.
2486 : */
2487 1 : int bt_bap_scan_delegator_add_src(const struct bt_bap_scan_delegator_add_src_param *param);
2488 :
2489 : /** Parameters for bt_bap_scan_delegator_mod_src() */
2490 1 : struct bt_bap_scan_delegator_mod_src_param {
2491 : /** The periodic adverting sync */
2492 1 : uint8_t src_id;
2493 :
2494 : /** The broadcast isochronous group encryption state */
2495 1 : enum bt_bap_big_enc_state encrypt_state;
2496 :
2497 : /** The 24-bit broadcast ID */
2498 1 : uint32_t broadcast_id;
2499 :
2500 : /** Number of subgroups */
2501 1 : uint8_t num_subgroups;
2502 :
2503 : /**
2504 : * @brief Subgroup specific information
2505 : *
2506 : * If a subgroup's metadata_len is set to 0, the existing metadata
2507 : * for the subgroup will remain unchanged
2508 : */
2509 1 : struct bt_bap_bass_subgroup subgroups[BT_BAP_BASS_MAX_SUBGROUPS];
2510 : };
2511 :
2512 : /**
2513 : * @brief Add a receive state source locally
2514 : *
2515 : * This will notify any connected clients about the new source. This allows them
2516 : * to modify and even remove it.
2517 : *
2518 : * If @kconfig{CONFIG_BT_BAP_BROADCAST_SINK} is enabled, any Broadcast Sink
2519 : * sources are autonomously modified.
2520 : *
2521 : * @param param The parameters for adding the new source
2522 : *
2523 : * @return int errno on failure, or source ID on success.
2524 : */
2525 1 : int bt_bap_scan_delegator_mod_src(const struct bt_bap_scan_delegator_mod_src_param *param);
2526 :
2527 : /**
2528 : * @brief Remove a receive state source
2529 : *
2530 : * This will remove the receive state. If the receive state periodic advertising
2531 : * is synced, bt_bap_scan_delegator_cb.pa_sync_term_req() will be called.
2532 : *
2533 : * If @kconfig{CONFIG_BT_BAP_BROADCAST_SINK} is enabled, any Broadcast Sink
2534 : * sources are autonomously removed.
2535 : *
2536 : * @param src_id The source ID to remove
2537 : *
2538 : * @return int Error value. 0 on success, errno on fail.
2539 : */
2540 1 : int bt_bap_scan_delegator_rem_src(uint8_t src_id);
2541 :
2542 : /** Callback function for Scan Delegator receive state search functions
2543 : *
2544 : * @param recv_state The receive state.
2545 : * @param user_data User data.
2546 : *
2547 : * @retval true to stop iterating. If this is used in the context of
2548 : * bt_bap_scan_delegator_find_state(), the recv_state will be returned by
2549 : * bt_bap_scan_delegator_find_state()
2550 : * @retval false to continue iterating
2551 : */
2552 1 : typedef bool (*bt_bap_scan_delegator_state_func_t)(
2553 : const struct bt_bap_scan_delegator_recv_state *recv_state, void *user_data);
2554 :
2555 : /**
2556 : * @brief Iterate through all existing receive states
2557 : *
2558 : * @param func The callback function
2559 : * @param user_data User specified data that sent to the callback function
2560 : */
2561 1 : void bt_bap_scan_delegator_foreach_state(bt_bap_scan_delegator_state_func_t func,
2562 : void *user_data);
2563 :
2564 : /**
2565 : * @brief Find and return a receive state based on a compare function
2566 : *
2567 : * @param func The compare callback function
2568 : * @param user_data User specified data that sent to the callback function
2569 : *
2570 : * @return The first receive state where the @p func returned true, or NULL
2571 : */
2572 1 : const struct bt_bap_scan_delegator_recv_state *bt_bap_scan_delegator_find_state(
2573 : bt_bap_scan_delegator_state_func_t func, void *user_data);
2574 :
2575 : /******************************** CLIENT API ********************************/
2576 :
2577 : /**
2578 : * @brief Callback function for writes.
2579 : *
2580 : * @param conn The connection to the peer device.
2581 : * @param err Error value. 0 on success, GATT error on fail.
2582 : */
2583 1 : typedef void (*bt_bap_broadcast_assistant_write_cb)(struct bt_conn *conn,
2584 : int err);
2585 :
2586 : /**
2587 : * @brief Struct to hold the Basic Audio Profile Broadcast Assistant callbacks
2588 : *
2589 : * These can be registered for usage with bt_bap_broadcast_assistant_register_cb().
2590 : */
2591 1 : struct bt_bap_broadcast_assistant_cb {
2592 : /**
2593 : * @brief Callback function for bt_bap_broadcast_assistant_discover.
2594 : *
2595 : * @param conn The connection that was used to discover
2596 : * Broadcast Audio Scan Service.
2597 : * @param err Error value. 0 on success,
2598 : * GATT error or ERRNO on fail.
2599 : * @param recv_state_count Number of receive states on the server.
2600 : */
2601 1 : void (*discover)(struct bt_conn *conn, int err,
2602 : uint8_t recv_state_count);
2603 :
2604 : /**
2605 : * @brief Callback function for Broadcast Audio Scan Service client scan results
2606 : *
2607 : * Called when the scanner finds an advertiser that advertises the
2608 : * BT_UUID_BROADCAST_AUDIO UUID.
2609 : *
2610 : * @param info Advertiser information.
2611 : * @param broadcast_id 24-bit broadcast ID.
2612 : */
2613 1 : void (*scan)(const struct bt_le_scan_recv_info *info,
2614 : uint32_t broadcast_id);
2615 :
2616 : /**
2617 : * @brief Callback function for when a receive state is read or updated
2618 : *
2619 : * Called whenever a receive state is read or updated.
2620 : *
2621 : * @param conn The connection to the Broadcast Audio Scan Service server.
2622 : * @param err Error value. 0 on success, GATT error on fail.
2623 : * @param state The receive state or NULL if the receive state is empty.
2624 : */
2625 1 : void (*recv_state)(struct bt_conn *conn, int err,
2626 : const struct bt_bap_scan_delegator_recv_state *state);
2627 :
2628 : /**
2629 : * @brief Callback function for when a receive state is removed.
2630 : *
2631 : * @param conn The connection to the Broadcast Audio Scan Service server.
2632 : * @param src_id The receive state.
2633 : */
2634 1 : void (*recv_state_removed)(struct bt_conn *conn, uint8_t src_id);
2635 :
2636 : /**
2637 : * @brief Callback function for bt_bap_broadcast_assistant_scan_start().
2638 : *
2639 : * @param conn The connection to the peer device.
2640 : * @param err Error value. 0 on success, GATT error on fail.
2641 : */
2642 1 : void (*scan_start)(struct bt_conn *conn, int err);
2643 :
2644 : /**
2645 : * @brief Callback function for bt_bap_broadcast_assistant_scan_stop().
2646 : *
2647 : * @param conn The connection to the peer device.
2648 : * @param err Error value. 0 on success, GATT error on fail.
2649 : */
2650 1 : void (*scan_stop)(struct bt_conn *conn, int err);
2651 :
2652 : /**
2653 : * @brief Callback function for bt_bap_broadcast_assistant_add_src().
2654 : *
2655 : * @param conn The connection to the peer device.
2656 : * @param err Error value. 0 on success, GATT error on fail.
2657 : */
2658 1 : void (*add_src)(struct bt_conn *conn, int err);
2659 :
2660 : /**
2661 : * @brief Callback function for bt_bap_broadcast_assistant_mod_src().
2662 : *
2663 : * @param conn The connection to the peer device.
2664 : * @param err Error value. 0 on success, GATT error on fail.
2665 : */
2666 1 : void (*mod_src)(struct bt_conn *conn, int err);
2667 :
2668 : /**
2669 : * @brief Callback function for bt_bap_broadcast_assistant_set_broadcast_code().
2670 : *
2671 : * @param conn The connection to the peer device.
2672 : * @param err Error value. 0 on success, GATT error on fail.
2673 : */
2674 1 : void (*broadcast_code)(struct bt_conn *conn, int err);
2675 :
2676 : /**
2677 : * @brief Callback function for bt_bap_broadcast_assistant_rem_src().
2678 : *
2679 : * @param conn The connection to the peer device.
2680 : * @param err Error value. 0 on success, GATT error on fail.
2681 : */
2682 1 : void (*rem_src)(struct bt_conn *conn, int err);
2683 :
2684 : /** @internal Internally used list node */
2685 : sys_snode_t _node;
2686 : };
2687 :
2688 : /**
2689 : * @brief Discover Broadcast Audio Scan Service on the server.
2690 : *
2691 : * Warning: Only one connection can be active at any time; discovering for a
2692 : * new connection, will delete all previous data.
2693 : *
2694 : * @param conn The connection
2695 : *
2696 : * @retval 0 Success
2697 : * @retval -EINVAL @p conn is NULL
2698 : * @retval -EBUSY Another operation is already in progress for this @p conn
2699 : * @retval -ENOTCONN @p conn is not connected
2700 : * @retval -ENOMEM Could not allocated memory for the request
2701 : * @retval -ENOEXEC Unexpected GATT error
2702 : */
2703 1 : int bt_bap_broadcast_assistant_discover(struct bt_conn *conn);
2704 :
2705 : /**
2706 : * @brief Scan start for BISes for a remote server.
2707 : *
2708 : * This will let the Broadcast Audio Scan Service server know that this device
2709 : * is actively scanning for broadcast sources.
2710 : * The function can optionally also start scanning, if the caller does not want
2711 : * to start scanning itself.
2712 : *
2713 : * Scan results, if @p start_scan is true, is sent to the
2714 : * bt_bap_broadcast_assistant_scan_cb callback.
2715 : *
2716 : * @param conn Connection to the Broadcast Audio Scan Service server.
2717 : * Used to let the server know that we are scanning.
2718 : * @param start_scan Start scanning if true. If false, the application should
2719 : * enable scan itself.
2720 :
2721 : * @retval 0 Success
2722 : * @retval -EINVAL @p conn is NULL of if @p conn has not done discovery
2723 : * @retval -EBUSY Another operation is already in progress for this @p conn
2724 : * @retval -EAGAIN Bluetooth has not been enabled.
2725 : * @retval -ENOTCONN @p conn is not connected
2726 : * @retval -ENOMEM Could not allocated memory for the request
2727 : * @retval -ENOEXEC Unexpected scan or GATT error
2728 : */
2729 1 : int bt_bap_broadcast_assistant_scan_start(struct bt_conn *conn,
2730 : bool start_scan);
2731 :
2732 : /**
2733 : * @brief Stop remote scanning for BISes for a server.
2734 : *
2735 : * @param conn Connection to the server.
2736 :
2737 : * @retval 0 Success
2738 : * @retval -EINVAL @p conn is NULL of if @p conn has not done discovery
2739 : * @retval -EBUSY Another operation is already in progress for this @p conn
2740 : * @retval -EAGAIN Bluetooth has not been enabled.
2741 : * @retval -ENOTCONN @p conn is not connected
2742 : * @retval -ENOMEM Could not allocated memory for the request
2743 : * @retval -ENOEXEC Unexpected scan or GATT error
2744 : */
2745 1 : int bt_bap_broadcast_assistant_scan_stop(struct bt_conn *conn);
2746 :
2747 : /**
2748 : * @brief Registers the callbacks used by Broadcast Audio Scan Service client.
2749 : *
2750 : * @param cb The callback structure.
2751 : *
2752 : * @retval 0 on success
2753 : * @retval -EINVAL if @p cb is NULL
2754 : * @retval -EALREADY if @p cb was already registered
2755 : */
2756 1 : int bt_bap_broadcast_assistant_register_cb(struct bt_bap_broadcast_assistant_cb *cb);
2757 :
2758 : /**
2759 : * @brief Unregisters the callbacks used by the Broadcast Audio Scan Service client.
2760 : *
2761 : * @param cb The callback structure.
2762 : *
2763 : * @retval 0 on success
2764 : * @retval -EINVAL if @p cb is NULL
2765 : * @retval -EALREADY if @p cb was not registered
2766 : */
2767 1 : int bt_bap_broadcast_assistant_unregister_cb(struct bt_bap_broadcast_assistant_cb *cb);
2768 :
2769 :
2770 : /** Parameters for adding a source to a Broadcast Audio Scan Service server */
2771 1 : struct bt_bap_broadcast_assistant_add_src_param {
2772 : /** Address of the advertiser. */
2773 1 : bt_addr_le_t addr;
2774 :
2775 : /** SID of the advertising set. */
2776 1 : uint8_t adv_sid;
2777 :
2778 : /** Whether to sync to periodic advertisements. */
2779 1 : bool pa_sync;
2780 :
2781 : /** 24-bit broadcast ID */
2782 1 : uint32_t broadcast_id;
2783 :
2784 : /**
2785 : * @brief Periodic advertising interval in milliseconds.
2786 : *
2787 : * BT_BAP_PA_INTERVAL_UNKNOWN if unknown.
2788 : */
2789 1 : uint16_t pa_interval;
2790 :
2791 : /** Number of subgroups */
2792 1 : uint8_t num_subgroups;
2793 :
2794 : /** Pointer to array of subgroups
2795 : *
2796 : * The @ref bt_bap_bass_subgroup.bis_sync value can be set to BT_BAP_BIS_SYNC_NO_PREF to
2797 : * let the broadcast sink decide which BIS to synchronize to.
2798 : */
2799 1 : struct bt_bap_bass_subgroup *subgroups;
2800 : };
2801 :
2802 : /**
2803 : * @brief Add a source on the server.
2804 : *
2805 : * @param conn Connection to the server.
2806 : * @param param Parameter struct.
2807 : *
2808 : * @retval 0 Success
2809 : * @retval -EINVAL @p conn is NULL or %p conn has not done discovery or if @p param is invalid
2810 : * @retval -EBUSY Another operation is already in progress for this @p conn
2811 : * @retval -ENOTCONN @p conn is not connected
2812 : * @retval -ENOMEM Could not allocated memory for the request
2813 : * @retval -ENOEXEC Unexpected scan or GATT error
2814 : */
2815 1 : int bt_bap_broadcast_assistant_add_src(
2816 : struct bt_conn *conn, const struct bt_bap_broadcast_assistant_add_src_param *param);
2817 :
2818 : /** Parameters for modifying a source */
2819 1 : struct bt_bap_broadcast_assistant_mod_src_param {
2820 : /** Source ID of the receive state. */
2821 1 : uint8_t src_id;
2822 :
2823 : /** Whether to sync to periodic advertisements. */
2824 1 : bool pa_sync;
2825 :
2826 : /**
2827 : * @brief Periodic advertising interval.
2828 : *
2829 : * BT_BAP_PA_INTERVAL_UNKNOWN if unknown.
2830 : */
2831 1 : uint16_t pa_interval;
2832 :
2833 : /** Number of subgroups */
2834 1 : uint8_t num_subgroups;
2835 :
2836 : /** Pointer to array of subgroups */
2837 1 : struct bt_bap_bass_subgroup *subgroups;
2838 : };
2839 :
2840 : /**
2841 : * @brief Modify a source on the server.
2842 : *
2843 : * @param conn Connection to the server.
2844 : * @param param Parameter struct.
2845 : *
2846 : * @retval 0 Success
2847 : * @retval -EINVAL @p conn is NULL or %p conn has not done discovery or if @p param is invalid
2848 : * @retval -EBUSY Another operation is already in progress for this @p conn
2849 : * @retval -ENOTCONN @p conn is not connected
2850 : * @retval -ENOMEM Could not allocated memory for the request
2851 : * @retval -ENOEXEC Unexpected scan or GATT error
2852 : */
2853 1 : int bt_bap_broadcast_assistant_mod_src(
2854 : struct bt_conn *conn, const struct bt_bap_broadcast_assistant_mod_src_param *param);
2855 :
2856 : /**
2857 : * @brief Set a broadcast code to the specified receive state.
2858 : *
2859 : * @param conn Connection to the server.
2860 : * @param src_id Source ID of the receive state.
2861 : * @param broadcast_code The broadcast code.
2862 : *
2863 : * @retval 0 Success
2864 : * @retval -EINVAL @p conn is NULL or %p conn has not done discovery or @p src_id is invalid
2865 : * @retval -EBUSY Another operation is already in progress for this @p conn
2866 : * @retval -ENOTCONN @p conn is not connected
2867 : * @retval -ENOMEM Could not allocated memory for the request
2868 : * @retval -ENOEXEC Unexpected scan or GATT error
2869 : */
2870 1 : int bt_bap_broadcast_assistant_set_broadcast_code(
2871 : struct bt_conn *conn, uint8_t src_id,
2872 : const uint8_t broadcast_code[BT_ISO_BROADCAST_CODE_SIZE]);
2873 :
2874 : /**
2875 : * @brief Remove a source from the server.
2876 : *
2877 : * @param conn Connection to the server.
2878 : * @param src_id Source ID of the receive state.
2879 : *
2880 : * @retval 0 Success
2881 : * @retval -EINVAL @p conn is NULL or %p conn has not done discovery or @p src_id is invalid
2882 : * @retval -EBUSY Another operation is already in progress for this @p conn
2883 : * @retval -ENOTCONN @p conn is not connected
2884 : * @retval -ENOMEM Could not allocated memory for the request
2885 : * @retval -ENOEXEC Unexpected scan or GATT error
2886 : */
2887 1 : int bt_bap_broadcast_assistant_rem_src(struct bt_conn *conn, uint8_t src_id);
2888 :
2889 : /**
2890 : * @brief Read the specified receive state from the server.
2891 : *
2892 : * @param conn Connection to the server.
2893 : * @param idx The index of the receive start (0 up to the value from
2894 : * bt_bap_broadcast_assistant_discover_cb)
2895 : *
2896 : * @retval 0 Success
2897 : * @retval -EINVAL @p conn is NULL or %p conn has not done discovery or @p src_id is invalid
2898 : * @retval -EBUSY Another operation is already in progress for this @p conn
2899 : * @retval -ENOTCONN @p conn is not connected
2900 : * @retval -ENOMEM Could not allocated memory for the request
2901 : * @retval -ENOEXEC Unexpected scan or GATT error
2902 : */
2903 1 : int bt_bap_broadcast_assistant_read_recv_state(struct bt_conn *conn, uint8_t idx);
2904 :
2905 : /** @} */ /* end of bt_bap */
2906 :
2907 : #ifdef __cplusplus
2908 : }
2909 : #endif
2910 :
2911 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_BAP_ */
|