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