LCOV - code coverage report
Current view: top level - zephyr/bluetooth/classic - a2dp.h Hit Total Coverage
Test: new.info Lines: 75 80 93.8 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /** @file
       2             :  * @brief Advanced Audio Distribution Profile header.
       3             :  */
       4             : 
       5             : /*
       6             :  * Copyright (c) 2015-2016 Intel Corporation
       7             :  * Copyright 2024 NXP
       8             :  *
       9             :  * SPDX-License-Identifier: Apache-2.0
      10             :  */
      11             : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_A2DP_H_
      12             : #define ZEPHYR_INCLUDE_BLUETOOTH_A2DP_H_
      13             : 
      14             : #include <stdint.h>
      15             : 
      16             : #include <zephyr/bluetooth/bluetooth.h>
      17             : #include <zephyr/bluetooth/l2cap.h>
      18             : #include <zephyr/bluetooth/classic/avdtp.h>
      19             : 
      20             : #ifdef __cplusplus
      21             : extern "C" {
      22             : #endif
      23             : 
      24           0 : #define BT_A2DP_STREAM_BUF_RESERVE (12u + BT_L2CAP_BUF_SIZE(0))
      25             : 
      26             : /** SBC IE length */
      27           1 : #define BT_A2DP_SBC_IE_LENGTH      (4u)
      28             : /** MPEG1,2 IE length */
      29           1 : #define BT_A2DP_MPEG_1_2_IE_LENGTH (4u)
      30             : /** MPEG2,4 IE length */
      31           1 : #define BT_A2DP_MPEG_2_4_IE_LENGTH (6u)
      32             : /** The max IE (Codec Info Element) length */
      33           1 : #define A2DP_MAX_IE_LENGTH (8U)
      34             : 
      35             : /** @brief define the audio endpoint
      36             :  *  @param _role BT_AVDTP_SOURCE or BT_AVDTP_SINK.
      37             :  *  @param _codec value of enum bt_a2dp_codec_id.
      38             :  *  @param _capability the codec capability.
      39             :  */
      40           1 : #define BT_A2DP_EP_INIT(_role, _codec, _capability)\
      41             : {\
      42             :         .codec_type = _codec,\
      43             :         .sep = {.sep_info = {.media_type = BT_AVDTP_AUDIO, .tsep = _role}},\
      44             :         .codec_cap = _capability,\
      45             :         .stream = NULL,\
      46             : }
      47             : 
      48             : /** @brief define the audio sink endpoint
      49             :  *  @param _codec value of enum bt_a2dp_codec_id.
      50             :  *  @param _capability the codec capability.
      51             :  */
      52           1 : #define BT_A2DP_SINK_EP_INIT(_codec, _capability)\
      53             : BT_A2DP_EP_INIT(BT_AVDTP_SINK, _codec, _capability)
      54             : 
      55             : /** @brief define the audio source endpoint
      56             :  *  @param _codec value of enum bt_a2dp_codec_id.
      57             :  *  @param _capability the codec capability.
      58             :  */
      59           1 : #define BT_A2DP_SOURCE_EP_INIT(_codec, _capability)\
      60             : BT_A2DP_EP_INIT(BT_AVDTP_SOURCE, _codec, _capability)
      61             : 
      62             : /** @brief define the SBC sink endpoint that can be used as
      63             :  * bt_a2dp_register_endpoint's parameter.
      64             :  *
      65             :  * SBC is mandatory as a2dp specification, BT_A2DP_SBC_SINK_EP_DEFAULT
      66             :  * is more convenient for user to register SBC endpoint.
      67             :  *
      68             :  *  @param _name unique structure name postfix.
      69             :  *  @param _freq sbc codec frequency.
      70             :  *               for example: A2DP_SBC_SAMP_FREQ_44100 | A2DP_SBC_SAMP_FREQ_48000
      71             :  *  @param _ch_mode sbc codec channel mode.
      72             :  *               for example: A2DP_SBC_CH_MODE_MONO | A2DP_SBC_CH_MODE_STREO
      73             :  *  @param _blk_len sbc codec block length.
      74             :  *               for example: A2DP_SBC_BLK_LEN_16
      75             :  *  @param _subband sbc codec subband.
      76             :  *               for example: A2DP_SBC_SUBBAND_8
      77             :  *  @param _alloc_mthd sbc codec allocate method.
      78             :  *               for example: A2DP_SBC_ALLOC_MTHD_LOUDNESS
      79             :  *  @param _min_bitpool sbc codec min bit pool. for example: 18
      80             :  *  @param _max_bitpool sbc codec max bit pool. for example: 35
      81             :  *  @
      82             :  */
      83             : #define BT_A2DP_SBC_SINK_EP(_name, _freq, _ch_mode, _blk_len, _subband,\
      84           1 : _alloc_mthd, _min_bitpool, _max_bitpool)\
      85             : static struct bt_a2dp_codec_ie bt_a2dp_ep_cap_ie##_name =\
      86             : {.len = BT_A2DP_SBC_IE_LENGTH, .codec_ie = {_freq | _ch_mode,\
      87             : _blk_len | _subband | _alloc_mthd, _min_bitpool, _max_bitpool}};\
      88             : static struct bt_a2dp_ep _name = BT_A2DP_SINK_EP_INIT(BT_A2DP_SBC,\
      89             : (&bt_a2dp_ep_cap_ie##_name))
      90             : 
      91             : /** @brief define the SBC source endpoint that can be used as bt_a2dp_register_endpoint's
      92             :  * parameter.
      93             :  *
      94             :  * SBC is mandatory as a2dp specification, BT_A2DP_SBC_SOURCE_EP_DEFAULT
      95             :  * is more convenient for user to register SBC endpoint.
      96             :  *
      97             :  *  @param _name the endpoint variable name.
      98             :  *  @param _freq sbc codec frequency.
      99             :  *               for example: A2DP_SBC_SAMP_FREQ_44100 | A2DP_SBC_SAMP_FREQ_48000
     100             :  *  @param _ch_mode sbc codec channel mode.
     101             :  *               for example: A2DP_SBC_CH_MODE_MONO | A2DP_SBC_CH_MODE_STREO
     102             :  *  @param _blk_len sbc codec block length.
     103             :  *               for example: A2DP_SBC_BLK_LEN_16
     104             :  *  @param _subband sbc codec subband.
     105             :  *               for example: A2DP_SBC_SUBBAND_8
     106             :  *  @param _alloc_mthd sbc codec allocate method.
     107             :  *               for example: A2DP_SBC_ALLOC_MTHD_LOUDNESS
     108             :  *  @param _min_bitpool sbc codec min bit pool. for example: 18
     109             :  *  @param _max_bitpool sbc codec max bit pool. for example: 35
     110             :  */
     111             : #define BT_A2DP_SBC_SOURCE_EP(_name, _freq, _ch_mode, _blk_len, _subband,\
     112           1 : _alloc_mthd, _min_bitpool, _max_bitpool)\
     113             : static struct bt_a2dp_codec_ie bt_a2dp_ep_cap_ie##_name =\
     114             : {.len = BT_A2DP_SBC_IE_LENGTH, .codec_ie = {_freq | _ch_mode,\
     115             : _blk_len | _subband | _alloc_mthd, _min_bitpool, _max_bitpool}};\
     116             : static struct bt_a2dp_ep _name = BT_A2DP_SOURCE_EP_INIT(BT_A2DP_SBC,\
     117             : &bt_a2dp_ep_cap_ie##_name)
     118             : 
     119             : /** @brief define the default SBC sink endpoint that can be used as
     120             :  * bt_a2dp_register_endpoint's parameter.
     121             :  *
     122             :  * SBC is mandatory as a2dp specification, BT_A2DP_SBC_SINK_EP_DEFAULT
     123             :  * is more convenient for user to register SBC endpoint.
     124             :  *
     125             :  *  @param _name the endpoint variable name.
     126             :  */
     127           1 : #define BT_A2DP_SBC_SINK_EP_DEFAULT(_name)\
     128             : static struct bt_a2dp_codec_ie bt_a2dp_ep_cap_ie##_name =\
     129             : {.len = BT_A2DP_SBC_IE_LENGTH, .codec_ie = {A2DP_SBC_SAMP_FREQ_44100 |\
     130             : A2DP_SBC_SAMP_FREQ_48000 | A2DP_SBC_CH_MODE_MONO | A2DP_SBC_CH_MODE_STREO |\
     131             : A2DP_SBC_CH_MODE_JOINT, A2DP_SBC_BLK_LEN_16 |\
     132             : A2DP_SBC_SUBBAND_8 | A2DP_SBC_ALLOC_MTHD_LOUDNESS, 18U, 35U}};\
     133             : static struct bt_a2dp_ep _name = BT_A2DP_SINK_EP_INIT(BT_A2DP_SBC,\
     134             : &bt_a2dp_ep_cap_ie##_name)
     135             : 
     136             : /** @brief define the default SBC source endpoint that can be used as bt_a2dp_register_endpoint's
     137             :  * parameter.
     138             :  *
     139             :  * SBC is mandatory as a2dp specification, BT_A2DP_SBC_SOURCE_EP_DEFAULT
     140             :  * is more convenient for user to register SBC endpoint.
     141             :  *
     142             :  *  @param _name the endpoint variable name.
     143             :  */
     144           1 : #define BT_A2DP_SBC_SOURCE_EP_DEFAULT(_name)\
     145             : static struct bt_a2dp_codec_ie bt_a2dp_ep_cap_ie##_name =\
     146             : {.len = BT_A2DP_SBC_IE_LENGTH, .codec_ie = {A2DP_SBC_SAMP_FREQ_44100 | \
     147             : A2DP_SBC_SAMP_FREQ_48000 | A2DP_SBC_CH_MODE_MONO | A2DP_SBC_CH_MODE_STREO | \
     148             : A2DP_SBC_CH_MODE_JOINT, A2DP_SBC_BLK_LEN_16 | A2DP_SBC_SUBBAND_8 | A2DP_SBC_ALLOC_MTHD_LOUDNESS,\
     149             : 18U, 35U},};\
     150             : static struct bt_a2dp_ep _name = BT_A2DP_SOURCE_EP_INIT(BT_A2DP_SBC,\
     151             : &bt_a2dp_ep_cap_ie##_name)
     152             : 
     153             : /** @brief define the SBC default configuration.
     154             :  *
     155             :  *  @param _name unique structure name postfix.
     156             :  *  @param _freq_cfg sbc codec frequency.
     157             :  *               for example: A2DP_SBC_SAMP_FREQ_44100
     158             :  *  @param _ch_mode_cfg sbc codec channel mode.
     159             :  *               for example: A2DP_SBC_CH_MODE_JOINT
     160             :  *  @param _blk_len_cfg sbc codec block length.
     161             :  *               for example: A2DP_SBC_BLK_LEN_16
     162             :  *  @param _subband_cfg sbc codec subband.
     163             :  *               for example: A2DP_SBC_SUBBAND_8
     164             :  *  @param _alloc_mthd_cfg sbc codec allocate method.
     165             :  *               for example: A2DP_SBC_ALLOC_MTHD_LOUDNESS
     166             :  *  @param _min_bitpool_cfg sbc codec min bit pool. for example: 18
     167             :  *  @param _max_bitpool_cfg sbc codec max bit pool. for example: 35
     168             :  */
     169             : #define BT_A2DP_SBC_EP_CFG(_name, _freq_cfg, _ch_mode_cfg, _blk_len_cfg, _subband_cfg,\
     170           1 : _alloc_mthd_cfg, _min_bitpool_cfg, _max_bitpool_cfg)\
     171             : static struct bt_a2dp_codec_ie bt_a2dp_codec_ie##_name = {\
     172             : .len = BT_A2DP_SBC_IE_LENGTH, .codec_ie = {_freq_cfg | _ch_mode_cfg,\
     173             : _blk_len_cfg | _subband_cfg | _alloc_mthd_cfg, _min_bitpool_cfg, _max_bitpool_cfg},};\
     174             : struct bt_a2dp_codec_cfg _name = {.codec_config = &bt_a2dp_codec_ie##_name,}
     175             : 
     176             : /** @brief define the SBC default configuration.
     177             :  *
     178             :  *  @param _name unique structure name postfix.
     179             :  *  @param _freq_cfg the frequency to configure the remote same codec type endpoint.
     180             :  */
     181           1 : #define BT_A2DP_SBC_EP_CFG_DEFAULT(_name, _freq_cfg)\
     182             : static struct bt_a2dp_codec_ie bt_a2dp_codec_ie##_name = {\
     183             : .len = BT_A2DP_SBC_IE_LENGTH, .codec_ie = {_freq_cfg | A2DP_SBC_CH_MODE_JOINT,\
     184             : A2DP_SBC_BLK_LEN_16 | A2DP_SBC_SUBBAND_8 | A2DP_SBC_ALLOC_MTHD_LOUDNESS, 18U, 35U},};\
     185             : struct bt_a2dp_codec_cfg _name = {.codec_config = &bt_a2dp_codec_ie##_name,}
     186             : 
     187             : /**
     188             :  * @brief A2DP error code
     189             :  */
     190           1 : enum bt_a2dp_err_code {
     191             :         /** Media Codec Type is not valid */
     192             :         BT_A2DP_INVALID_CODEC_TYPE = 0xC1,
     193             :         /** Media Codec Type is not supported */
     194             :         BT_A2DP_NOT_SUPPORTED_CODEC_TYPE = 0xC2,
     195             :         /** Sampling Frequency is not valid or multiple values have been selected */
     196             :         BT_A2DP_INVALID_SAMPLING_FREQUENCY = 0xC3,
     197             :         /** Sampling Frequency is not supported */
     198             :         BT_A2DP_NOT_SUPPORTED_SAMPLING_FREQUENCY = 0xC4,
     199             :         /** Channel Mode is not valid or multiple values have been selected */
     200             :         BT_A2DP_INVALID_CHANNEL_MODE = 0xC5,
     201             :         /** Channel Mode is not supported */
     202             :         BT_A2DP_NOT_SUPPORTED_CHANNEL_MODE = 0xC6,
     203             :         /** None or multiple values have been selected for Number of Subbands */
     204             :         BT_A2DP_INVALID_SUBBANDS = 0xC7,
     205             :         /** Number of Subbands is not supported */
     206             :         BT_A2DP_NOT_SUPPORTED_SUBBANDS = 0xC8,
     207             :         /** None or multiple values have been selected for Allocation Method */
     208             :         BT_A2DP_INVALID_ALLOCATION_METHOD = 0xC9,
     209             :         /** Allocation Method is not supported */
     210             :         BT_A2DP_NOT_SUPPORTED_ALLOCATION_METHOD = 0xCA,
     211             :         /** Minimum Bitpool Value is not valid */
     212             :         BT_A2DP_INVALID_MINIMUM_BITPOOL_VALUE = 0xCB,
     213             :         /** Minimum Bitpool Value is not supported */
     214             :         BT_A2DP_NOT_SUPPORTED_MINIMUM_BITPOOL_VALUE = 0xCC,
     215             :         /** Maximum Bitpool Value is not valid */
     216             :         BT_A2DP_INVALID_MAXIMUM_BITPOOL_VALUE = 0xCD,
     217             :         /** Maximum Bitpool Value is not supported */
     218             :         BT_A2DP_NOT_SUPPORTED_MAXIMUM_BITPOOL_VALUE = 0xCE,
     219             :         /** None or multiple values have been selected for Layer */
     220             :         BT_A2DP_INVALID_LAYER = 0xCF,
     221             :         /** Layer is not supported */
     222             :         BT_A2DP_NOT_SUPPORTED_LAYER = 0xD0,
     223             :         /** CRC is not supported */
     224             :         BT_A2DP_NOT_SUPPORTED_CRC = 0xD1,
     225             :         /** MPF-2 is not supported */
     226             :         BT_A2DP_NOT_SUPPORTED_MPF = 0xD2,
     227             :         /** VBR is not supported */
     228             :         BT_A2DP_NOT_SUPPORTED_VBR = 0xD3,
     229             :         /** None or multiple values have been selected for Bit Rate */
     230             :         BT_A2DP_INVALID_BIT_RATE = 0xD4,
     231             :         /** Bit Rate is not supported */
     232             :         BT_A2DP_NOT_SUPPORTED_BIT_RATE = 0xD5,
     233             :         /** Either 1) Object type is not valid or
     234             :          * 2) None or multiple values have been selected for Object Type
     235             :          */
     236             :         BT_A2DP_INVALID_OBJECT_TYPE = 0xD6,
     237             :         /** Object Type is not supported */
     238             :         BT_A2DP_NOT_SUPPORTED_OBJECT_TYPE = 0xD7,
     239             :         /** Either 1) Channels is not valid or
     240             :          * 2) None or multiple values have been selected for Channels
     241             :          */
     242             :         BT_A2DP_INVALID_CHANNELS = 0xD8,
     243             :         /** Channels is not supported */
     244             :         BT_A2DP_NOT_SUPPORTED_CHANNELS = 0xD9,
     245             :         /** Version is not valid */
     246             :         BT_A2DP_INVALID_VERSION = 0xDA,
     247             :         /** Version is not supported */
     248             :         BT_A2DP_NOT_SUPPORTED_VERSION = 0xDB,
     249             :         /** Maximum SUL is not acceptable for the Decoder in the SNK */
     250             :         BT_A2DP_NOT_SUPPORTED_MAXIMUM_SUL = 0xDC,
     251             :         /** None or multiple values have been selected for Block Length */
     252             :         BT_A2DP_INVALID_BLOCK_LENGTH = 0xDD,
     253             :         /** The requested CP Type is not supported */
     254             :         BT_A2DP_INVALID_CP_TYPE = 0xE0,
     255             :         /** The format of Content Protection Service Capability/Content
     256             :          * Protection Scheme Dependent Data is not correct
     257             :          */
     258             :         BT_A2DP_INVALID_CP_FORMAT = 0xE1,
     259             :         /** The codec parameter is invalid.
     260             :          * Used if a more specific error code does not exist for the codec in use
     261             :          */
     262             :         BT_A2DP_INVALID_CODEC_PARAMETER = 0xE2,
     263             :         /** The codec parameter is not supported.
     264             :          * Used if a more specific error code does not exist for the codec in use
     265             :          */
     266             :         BT_A2DP_NOT_SUPPORTED_CODEC_PARAMETER = 0xE3,
     267             :         /** Combination of Object Type and DRC is invalid */
     268             :         BT_A2DP_INVALID_DRC = 0xE4,
     269             :         /** DRC is not supported */
     270             :         BT_A2DP_NOT_SUPPORTED_DRC = 0xE5,
     271             : };
     272             : 
     273             : /** @brief Codec Type */
     274           1 : enum bt_a2dp_codec_type {
     275             :         /** Codec SBC */
     276             :         BT_A2DP_SBC = 0x00,
     277             :         /** Codec MPEG-1 */
     278             :         BT_A2DP_MPEG1 = 0x01,
     279             :         /** Codec MPEG-2 */
     280             :         BT_A2DP_MPEG2 = 0x02,
     281             :         /** Codec ATRAC */
     282             :         BT_A2DP_ATRAC = 0x04,
     283             :         /** Codec Non-A2DP */
     284             :         BT_A2DP_VENDOR = 0xff
     285             : };
     286             : 
     287             : /** @brief A2DP structure */
     288             : struct bt_a2dp;
     289             : 
     290             : /* Internal to pass build */
     291             : struct bt_a2dp_stream;
     292             : 
     293             : /** @brief codec information elements for the endpoint */
     294           1 : struct bt_a2dp_codec_ie {
     295             :         /** Length of codec_cap */
     296           1 :         uint8_t len;
     297             :         /** codec information element */
     298           1 :         uint8_t codec_ie[A2DP_MAX_IE_LENGTH];
     299             : };
     300             : 
     301             : /** @brief The endpoint configuration */
     302           1 : struct bt_a2dp_codec_cfg {
     303             :         /** The media codec configuration content */
     304           1 :         struct bt_a2dp_codec_ie *codec_config;
     305             : };
     306             : 
     307             : /** @brief Stream End Point */
     308           1 : struct bt_a2dp_ep {
     309             :         /** Code Type @ref bt_a2dp_codec_type */
     310           1 :         uint8_t codec_type;
     311             :         /** Capabilities */
     312           1 :         struct bt_a2dp_codec_ie *codec_cap;
     313             :         /** AVDTP Stream End Point Identifier */
     314           1 :         struct bt_avdtp_sep sep;
     315             :         /* Internally used stream object pointer */
     316           0 :         struct bt_a2dp_stream *stream;
     317             : };
     318             : 
     319           0 : struct bt_a2dp_ep_info {
     320             :         /** Code Type @ref bt_a2dp_codec_type */
     321           1 :         uint8_t codec_type;
     322             :         /** Codec capabilities, if SBC, use function of a2dp_codec_sbc.h to parse it */
     323           1 :         struct bt_a2dp_codec_ie codec_cap;
     324             :         /** Stream End Point Information */
     325           1 :         struct bt_avdtp_sep_info sep_info;
     326             : };
     327             : 
     328             : /** @brief Helper enum to be used as return value of bt_a2dp_discover_ep_cb.
     329             :  *  The value informs the caller to perform further pending actions or stop them.
     330             :  */
     331           0 : enum {
     332             :         BT_A2DP_DISCOVER_EP_STOP = 0,
     333             :         BT_A2DP_DISCOVER_EP_CONTINUE,
     334             : };
     335             : 
     336             : /** @typedef bt_a2dp_discover_ep_cb
     337             :  *
     338             :  *  @brief Called when a stream endpoint is discovered.
     339             :  *
     340             :  *  A function of this type is given by the user to the bt_a2dp_discover_param
     341             :  *  object. It'll be called on each valid stream endpoint discovery completion.
     342             :  *  When no more endpoint then NULL is passed to the user. Otherwise user can get
     343             :  *  valid endpoint information from parameter info, user can set parameter ep to
     344             :  *  get the endpoint after the callback is return.
     345             :  *  The returned function value allows the user to control retrieving follow-up
     346             :  *  endpoints if any. If the user doesn't want to read more endpoints since
     347             :  *  current found endpoints fulfill its requirements then should return
     348             :  *  BT_A2DP_DISCOVER_EP_STOP. Otherwise returned value means
     349             :  *  more subcall iterations are allowable.
     350             :  *
     351             :  *  @param a2dp a2dp connection object identifying a2dp connection to queried remote.
     352             :  *  @param info Object pointing to the information of the callbacked endpoint.
     353             :  *  @param ep If the user want to use this found endpoint, user can set value to it
     354             :  *  to get the endpoint that can be used further in other A2DP APIs. It is NULL if info
     355             :  *  is NULL (no more endpoint is found).
     356             :  *
     357             :  *  @return BT_A2DP_DISCOVER_EP_STOP in case of no more need to continue discovery
     358             :  *  for next endpoint. By returning BT_A2DP_DISCOVER_EP_STOP user allows this
     359             :  *  discovery continuation.
     360             :  */
     361           1 : typedef uint8_t (*bt_a2dp_discover_ep_cb)(struct bt_a2dp *a2dp,
     362             :                 struct bt_a2dp_ep_info *info, struct bt_a2dp_ep **ep);
     363             : 
     364           0 : struct bt_a2dp_discover_param {
     365             :         /** discover callback */
     366           1 :         bt_a2dp_discover_ep_cb cb;
     367             :         /** The discovered endpoint info that is callbacked by cb */
     368           1 :         struct bt_a2dp_ep_info info;
     369             :         /** The max count of remote endpoints that can be got,
     370             :          *  it save endpoint info internally.
     371             :          */
     372           1 :         struct bt_avdtp_sep_info *seps_info;
     373             :         /** The max count of seps (stream endpoint) that can be got in this call route */
     374           1 :         uint8_t sep_count;
     375             : };
     376             : 
     377             : /** @brief The connecting callback */
     378           1 : struct bt_a2dp_cb {
     379             :         /** @brief A a2dp connection has been established.
     380             :          *
     381             :          *  This callback notifies the application of a a2dp connection.
     382             :          *  It means the AVDTP L2CAP connection.
     383             :          *  In case the err parameter is non-zero it means that the
     384             :          *  connection establishment failed.
     385             :          *
     386             :          *  @param a2dp a2dp connection object.
     387             :          *  @param err error code.
     388             :          */
     389           1 :         void (*connected)(struct bt_a2dp *a2dp, int err);
     390             :         /** @brief A a2dp connection has been disconnected.
     391             :          *
     392             :          *  This callback notifies the application that a a2dp connection
     393             :          *  has been disconnected.
     394             :          *
     395             :          *  @param a2dp a2dp connection object.
     396             :          */
     397           1 :         void (*disconnected)(struct bt_a2dp *a2dp);
     398             :         /**
     399             :          * @brief Endpoint config request callback
     400             :          *
     401             :          * The callback is called whenever an endpoint is requested to be
     402             :          * configured.
     403             :          *
     404             :          *  @param a2dp a2dp connection object.
     405             :          *  @param[in]  ep        Local Audio Endpoint being configured.
     406             :          *  @param[in]  codec_cfg Codec configuration.
     407             :          *  @param[out] stream    Pointer to stream that will be configured for the endpoint.
     408             :          *  @param[out] rsp_err_code  give the error code if response error.
     409             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     410             :          *
     411             :          * @return 0 in case of success or negative value in case of error.
     412             :          */
     413           1 :         int (*config_req)(struct bt_a2dp *a2dp, struct bt_a2dp_ep *ep,
     414             :                         struct bt_a2dp_codec_cfg *codec_cfg, struct bt_a2dp_stream **stream,
     415             :                         uint8_t *rsp_err_code);
     416             :         /** @brief Callback function for bt_a2dp_stream_config()
     417             :          *
     418             :          *  Called when the codec configure operation is completed.
     419             :          *
     420             :          *  @param[in] stream    Pointer to stream object.
     421             :          *  @param[in] rsp_err_code the remote responded error code
     422             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     423             :          */
     424           1 :         void (*config_rsp)(struct bt_a2dp_stream *stream, uint8_t rsp_err_code);
     425             :         /**
     426             :          * @brief stream establishment request callback
     427             :          *
     428             :          * The callback is called whenever an stream is requested to be
     429             :          * established (open cmd and create the stream l2cap channel).
     430             :          *
     431             :          *  @param[in] stream    Pointer to stream object.
     432             :          *  @param[out] rsp_err_code  give the error code if response error.
     433             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     434             :          *
     435             :          * @return 0 in case of success or negative value in case of error.
     436             :          */
     437           1 :         int (*establish_req)(struct bt_a2dp_stream *stream, uint8_t *rsp_err_code);
     438             :         /** @brief Callback function for bt_a2dp_stream_establish()
     439             :          *
     440             :          *  Called when the establishment operation is completed.
     441             :          *  (open cmd and create the stream l2cap channel).
     442             :          *
     443             :          *  @param[in] stream    Pointer to stream object.
     444             :          *  @param[in] rsp_err_code the remote responded error code
     445             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     446             :          */
     447           1 :         void (*establish_rsp)(struct bt_a2dp_stream *stream, uint8_t rsp_err_code);
     448             :         /**
     449             :          * @brief stream release request callback
     450             :          *
     451             :          * The callback is called whenever an stream is requested to be
     452             :          * released (release cmd and release the l2cap channel)
     453             :          *
     454             :          *  @param[in] stream    Pointer to stream object.
     455             :          *  @param[out] rsp_err_code  give the error code if response error.
     456             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     457             :          *
     458             :          * @return 0 in case of success or negative value in case of error.
     459             :          */
     460           1 :         int (*release_req)(struct bt_a2dp_stream *stream, uint8_t *rsp_err_code);
     461             :         /** @brief Callback function for bt_a2dp_stream_release()
     462             :          *
     463             :          *  Called when the release operation is completed.
     464             :          *  (release cmd and release the l2cap channel)
     465             :          *
     466             :          *  @param[in] stream    Pointer to stream object.
     467             :          *  @param[in] rsp_err_code the remote responded error code
     468             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     469             :          */
     470           1 :         void (*release_rsp)(struct bt_a2dp_stream *stream, uint8_t rsp_err_code);
     471             :         /**
     472             :          * @brief stream start request callback
     473             :          *
     474             :          * The callback is called whenever an stream is requested to be
     475             :          * started.
     476             :          *
     477             :          *  @param[in] stream    Pointer to stream object.
     478             :          *  @param[out] rsp_err_code  give the error code if response error.
     479             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     480             :          *
     481             :          * @return 0 in case of success or negative value in case of error.
     482             :          */
     483           1 :         int (*start_req)(struct bt_a2dp_stream *stream, uint8_t *rsp_err_code);
     484             :         /** @brief Callback function for bt_a2dp_stream_start()
     485             :          *
     486             :          *  Called when the start operation is completed.
     487             :          *
     488             :          *  @param[in] stream    Pointer to stream object.
     489             :          *  @param[in] rsp_err_code the remote responded error code
     490             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     491             :          */
     492           1 :         void (*start_rsp)(struct bt_a2dp_stream *stream, uint8_t rsp_err_code);
     493             :         /**
     494             :          * @brief Endpoint suspend request callback
     495             :          *
     496             :          * The callback is called whenever an stream is requested to be
     497             :          * suspended.
     498             :          *
     499             :          *  @param[in] stream    Pointer to stream object.
     500             :          *  @param[out] rsp_err_code  give the error code if response error.
     501             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     502             :          *
     503             :          * @return 0 in case of success or negative value in case of error.
     504             :          */
     505           1 :         int (*suspend_req)(struct bt_a2dp_stream *stream, uint8_t *rsp_err_code);
     506             :         /** @brief Callback function for bt_a2dp_stream_suspend()
     507             :          *
     508             :          *  Called when the suspend operation is completed.
     509             :          *
     510             :          *  @param[in] stream    Pointer to stream object.
     511             :          *  @param[in] rsp_err_code the remote responded error code
     512             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     513             :          */
     514           1 :         void (*suspend_rsp)(struct bt_a2dp_stream *stream, uint8_t rsp_err_code);
     515             :         /**
     516             :          * @brief Endpoint config request callback
     517             :          *
     518             :          * The callback is called whenever an endpoint is requested to be
     519             :          * reconfigured.
     520             :          *
     521             :          *  @param[in] stream    Pointer to stream object.
     522             :          *  @param[out] rsp_err_code  give the error code if response error.
     523             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     524             :          *
     525             :          * @return 0 in case of success or negative value in case of error.
     526             :          */
     527           1 :         int (*reconfig_req)(struct bt_a2dp_stream *stream, uint8_t *rsp_err_code);
     528             :         /** @brief Callback function for bt_a2dp_stream_reconfig()
     529             :          *
     530             :          *  Called when the reconfig operation is completed.
     531             :          *
     532             :          *  @param[in] stream    Pointer to stream object.
     533             :          *  @param[in] rsp_err_code the remote responded error code
     534             :          *                          bt_a2dp_err_code or bt_avdtp_err_code
     535             :          */
     536           1 :         void (*reconfig_rsp)(struct bt_a2dp_stream *stream, uint8_t rsp_err_code);
     537             : };
     538             : 
     539             : /** @brief A2DP Connect.
     540             :  *
     541             :  *  This function is to be called after the conn parameter is obtained by
     542             :  *  performing a GAP procedure. The API is to be used to establish A2DP
     543             :  *  connection between devices.
     544             :  *  This function only establish AVDTP L2CAP Signaling connection.
     545             :  *  After connection success, the callback that is registered by
     546             :  *  bt_a2dp_register_connect_callback is called.
     547             :  *
     548             :  *  @param conn Pointer to bt_conn structure.
     549             :  *
     550             :  *  @return pointer to struct bt_a2dp in case of success or NULL in case
     551             :  *  of error.
     552             :  */
     553           1 : struct bt_a2dp *bt_a2dp_connect(struct bt_conn *conn);
     554             : 
     555             : /** @brief disconnect l2cap a2dp
     556             :  *
     557             :  * This function close AVDTP L2CAP Signaling connection.
     558             :  * It closes the AVDTP L2CAP Media connection too if it is established.
     559             :  *
     560             :  *  @param a2dp The a2dp instance.
     561             :  *
     562             :  *  @return 0 in case of success and error code in case of error.
     563             :  */
     564           1 : int bt_a2dp_disconnect(struct bt_a2dp *a2dp);
     565             : 
     566             : /** @brief Endpoint Registration.
     567             :  *
     568             :  *  @param ep Pointer to bt_a2dp_ep structure.
     569             :  *  @param media_type Media type that the Endpoint is.
     570             :  *  @param role Role of Endpoint.
     571             :  *
     572             :  *  @return 0 in case of success and error code in case of error.
     573             :  */
     574           1 : int bt_a2dp_register_ep(struct bt_a2dp_ep *ep, uint8_t media_type, uint8_t role);
     575             : 
     576             : /** @brief register callback.
     577             :  *
     578             :  *  The cb is called when bt_a2dp_connect is called or it is operated by remote device.
     579             :  *
     580             :  *  @param cb The callback function.
     581             :  *
     582             :  *  @return 0 in case of success and error code in case of error.
     583             :  */
     584           1 : int bt_a2dp_register_cb(struct bt_a2dp_cb *cb);
     585             : 
     586             : /** @brief Discover remote endpoints.
     587             :  *
     588             :  *  @param a2dp The a2dp instance.
     589             :  *  @param param the discover used param.
     590             :  *
     591             :  *  @return 0 in case of success and error code in case of error.
     592             :  */
     593           1 : int bt_a2dp_discover(struct bt_a2dp *a2dp, struct bt_a2dp_discover_param *param);
     594             : 
     595             : /** @brief A2DP Stream */
     596           1 : struct bt_a2dp_stream {
     597             :         /** local endpoint */
     598           1 :         struct bt_a2dp_ep *local_ep;
     599             :         /** remote endpoint */
     600           1 :         struct bt_a2dp_ep *remote_ep;
     601             :         /** remote endpoint's Stream End Point ID */
     602           1 :         uint8_t remote_ep_id;
     603             :         /** Audio stream operations */
     604           1 :         struct bt_a2dp_stream_ops *ops;
     605             :         /** the a2dp connection */
     606           1 :         struct bt_a2dp *a2dp;
     607             :         /** the stream current configuration */
     608           1 :         struct bt_a2dp_codec_ie codec_config;
     609             : };
     610             : 
     611             : /** @brief The stream endpoint related operations */
     612           1 : struct bt_a2dp_stream_ops {
     613             :         /**
     614             :          * @brief Stream configured callback
     615             :          *
     616             :          * The callback is called whenever an Audio Stream has been configured.
     617             :          *
     618             :          * @param stream Stream object that has been configured.
     619             :          */
     620           1 :         void (*configured)(struct bt_a2dp_stream *stream);
     621             :         /**
     622             :          * @brief Stream establishment callback
     623             :          *
     624             :          * The callback is called whenever an Audio Stream has been established.
     625             :          *
     626             :          * @param stream Stream object that has been established.
     627             :          */
     628           1 :         void (*established)(struct bt_a2dp_stream *stream);
     629             :         /**
     630             :          * @brief Stream release callback
     631             :          *
     632             :          * The callback is called whenever an Audio Stream has been released.
     633             :          *
     634             :          * @param stream Stream object that has been released.
     635             :          */
     636           1 :         void (*released)(struct bt_a2dp_stream *stream);
     637             :         /**
     638             :          * @brief Stream start callback
     639             :          *
     640             :          * The callback is called whenever an Audio Stream has been started.
     641             :          *
     642             :          * @param stream Stream object that has been started.
     643             :          */
     644           1 :         void (*started)(struct bt_a2dp_stream *stream);
     645             :         /**
     646             :          * @brief Stream suspend callback
     647             :          *
     648             :          * The callback is called whenever an Audio Stream has been suspended.
     649             :          *
     650             :          * @param stream Stream object that has been suspended.
     651             :          */
     652           1 :         void (*suspended)(struct bt_a2dp_stream *stream);
     653             :         /**
     654             :          * @brief Stream reconfigured callback
     655             :          *
     656             :          * The callback is called whenever an Audio Stream has been reconfigured.
     657             :          *
     658             :          * @param stream Stream object that has been reconfigured.
     659             :          */
     660           1 :         void (*reconfigured)(struct bt_a2dp_stream *stream);
     661             : #if defined(CONFIG_BT_A2DP_SINK)
     662             :         /** @brief the media streaming data, only for sink
     663             :          *
     664             :          *  @param buf the data buf
     665             :          *  @param seq_num the sequence number
     666             :          *  @param ts the time stamp
     667             :          */
     668             :         void (*recv)(struct bt_a2dp_stream *stream,
     669             :                 struct net_buf *buf, uint16_t seq_num, uint32_t ts);
     670             : #endif
     671             : #if defined(CONFIG_BT_A2DP_SOURCE)
     672             :         /**
     673             :          * @brief Stream audio HCI sent callback
     674             :          *
     675             :          * This callback will be called once the controller marks the SDU
     676             :          * as completed. When the controller does so is implementation
     677             :          * dependent. It could be after the SDU is enqueued for transmission,
     678             :          * or after it is sent on air or flushed.
     679             :          *
     680             :          * This callback is only used if the ISO data path is HCI.
     681             :          *
     682             :          * @param stream Stream object.
     683             :          */
     684             :         void (*sent)(struct bt_a2dp_stream *stream);
     685             : #endif
     686             : };
     687             : 
     688             : /**
     689             :  * @brief Register Audio callbacks for a stream.
     690             :  *
     691             :  * Register Audio callbacks for a stream.
     692             :  *
     693             :  * @param stream Stream object.
     694             :  * @param ops    Stream operations structure.
     695             :  */
     696           1 : void bt_a2dp_stream_cb_register(struct bt_a2dp_stream *stream, struct bt_a2dp_stream_ops *ops);
     697             : 
     698             : /** @brief configure endpoint.
     699             :  *
     700             :  *  bt_a2dp_discover can be used to find remote's endpoints.
     701             :  *  This function to configure the selected endpoint that is found by
     702             :  *  bt_a2dp_discover.
     703             :  *  This function sends AVDTP_SET_CONFIGURATION.
     704             :  *
     705             :  *  @param a2dp The a2dp instance.
     706             :  *  @param stream Stream object.
     707             :  *  @param local_ep The configured endpoint that is registered.
     708             :  *  @param remote_ep The remote endpoint.
     709             :  *  @param config The config to configure the endpoint.
     710             :  *
     711             :  *  @return 0 in case of success and error code in case of error.
     712             :  */
     713           1 : int bt_a2dp_stream_config(struct bt_a2dp *a2dp, struct bt_a2dp_stream *stream,
     714             :                 struct bt_a2dp_ep *local_ep, struct bt_a2dp_ep *remote_ep,
     715             :                 struct bt_a2dp_codec_cfg *config);
     716             : 
     717             : /** @brief establish a2dp streamer.
     718             :  *
     719             :  * This function sends the AVDTP_OPEN command and create the l2cap channel.
     720             :  *
     721             :  *  @param stream The stream object.
     722             :  *
     723             :  *  @return 0 in case of success and error code in case of error.
     724             :  */
     725           1 : int bt_a2dp_stream_establish(struct bt_a2dp_stream *stream);
     726             : 
     727             : /** @brief release a2dp streamer.
     728             :  *
     729             :  * This function sends the AVDTP_CLOSE command and release the l2cap channel.
     730             :  *
     731             :  *  @param stream The stream object.
     732             :  *
     733             :  *  @return 0 in case of success and error code in case of error.
     734             :  */
     735           1 : int bt_a2dp_stream_release(struct bt_a2dp_stream *stream);
     736             : 
     737             : /** @brief start a2dp streamer.
     738             :  *
     739             :  * This function sends the AVDTP_START command.
     740             :  *
     741             :  *  @param stream The stream object.
     742             :  *
     743             :  *  @return 0 in case of success and error code in case of error.
     744             :  */
     745           1 : int bt_a2dp_stream_start(struct bt_a2dp_stream *stream);
     746             : 
     747             : /** @brief suspend a2dp streamer.
     748             :  *
     749             :  * This function sends the AVDTP_SUSPEND command.
     750             :  *
     751             :  *  @param stream The stream object.
     752             :  *
     753             :  *  @return 0 in case of success and error code in case of error.
     754             :  */
     755           1 : int bt_a2dp_stream_suspend(struct bt_a2dp_stream *stream);
     756             : 
     757             : /** @brief re-configure a2dp streamer
     758             :  *
     759             :  * This function sends the AVDTP_RECONFIGURE command.
     760             :  *
     761             :  *  @param stream The stream object.
     762             :  *  @param config The config to configure the stream.
     763             :  *
     764             :  *  @return 0 in case of success and error code in case of error.
     765             :  */
     766           1 : int bt_a2dp_stream_reconfig(struct bt_a2dp_stream *stream, struct bt_a2dp_codec_cfg *config);
     767             : 
     768             : /** @brief get the stream l2cap mtu
     769             :  *
     770             :  *  @param stream The stream object.
     771             :  *
     772             :  *  @return mtu value
     773             :  */
     774           1 : uint32_t bt_a2dp_get_mtu(struct bt_a2dp_stream *stream);
     775             : 
     776             : #if defined(CONFIG_BT_A2DP_SOURCE)
     777             : /** @brief send a2dp media data
     778             :  *
     779             :  * Only A2DP source side can call this function.
     780             :  *
     781             :  *  @param stream The stream object.
     782             :  *  @param buf  The data.
     783             :  *  @param seq_num The sequence number.
     784             :  *  @param ts The time stamp.
     785             :  *
     786             :  *  @return 0 in case of success and error code in case of error.
     787             :  */
     788             : int bt_a2dp_stream_send(struct bt_a2dp_stream *stream,  struct net_buf *buf,
     789             :                         uint16_t seq_num, uint32_t ts);
     790             : #endif
     791             : 
     792             : #ifdef __cplusplus
     793             : }
     794             : #endif
     795             : 
     796             : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_A2DP_H_ */

Generated by: LCOV version 1.14