LCOV - code coverage report
Current view: top level - zephyr/bluetooth/audio - bap.h Hit Total Coverage
Test: new.info Lines: 284 287 99.0 %
Date: 2024-12-21 18:13:37

          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_ */

Generated by: LCOV version 1.14