1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "avdtp_api.h"
17 #include "avdtp_ctrl.h"
18 #include "log.h"
19 #include "securec.h"
20
21 /**
22 *
23 * @brief AVDT_Register
24 *
25 * @details This function initializes AVDTP and prepares the protocol
26 * stack for its use. It must be called once by the system
27 * or platform using AVDT before the other functions of the
28 * API an be used.
29 *
30 * @return void
31 *
32 */
AVDT_Register(const AvdtRegisterParam * reg)33 void AVDT_Register(const AvdtRegisterParam *reg)
34 {
35 LOG_INFO("[AVDT]%{public}s:", __func__);
36 Event *event = EventCreate(true);
37 AvdtRegisterTskParam *param = malloc(sizeof(AvdtRegisterTskParam));
38 if (param == NULL) {
39 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
40 EventDelete(event);
41 return;
42 }
43 (void)memset_s(param, sizeof(AvdtRegisterTskParam), 0, sizeof(AvdtRegisterTskParam));
44 param->reg = reg;
45 param->event = event;
46 if (!AvdtAsyncProcess(AvdtRegisterTsk, param)) {
47 EventWait(event, WAIT_TIME);
48 }
49 free(param);
50 EventDelete(event);
51 return;
52 }
53
AvdtRegisterTsk(void * context)54 void AvdtRegisterTsk(void *context)
55 {
56 AvdtRegisterTskParam *param = (AvdtRegisterTskParam *)context;
57 AvdtRegister(param->reg);
58 EventSet(param->event);
59 return;
60 }
61
62 /**
63 *
64 * @brief AVDT_Deregister
65 *
66 * @details This function is called to deregister AVDTP protocol.
67 * This function can be called after all streams must be
68 * removed.
69 *
70 * @return void
71 *
72 */
AVDT_Deregister(void)73 void AVDT_Deregister(void)
74 {
75 LOG_DEBUG("[AVDT]%{public}s:", __func__);
76 return;
77 }
78
79 /**
80 *
81 * @brief AVDT_CreateStream
82 *
83 * @details Create a stream endpoint. An application can initiate a
84 * connection between this endpoint and an endpoint on a peer
85 * device after a stream endpoint is created.
86 * Pram[in] bdAddr Peer device address.
87 * Pram[out] handle Stream channel handle.Start from 1.
88 * Pram[in] codecIndex Sep index. Start form 1.
89 * @return AVDT_SUCCESS if successful, otherwise error.
90 *
91 */
AVDT_CreateStream(const BtAddr * bdAddr,uint16_t * handle,uint16_t codecIndex)92 uint16_t AVDT_CreateStream(const BtAddr *bdAddr, uint16_t *handle, uint16_t codecIndex)
93 {
94 LOG_INFO("[AVDT]%{public}s:bdAddr((%02x:%02x:%02x:%02x:%02x:%02x) codecIndex(%hu)",
95 __func__,
96 BT_ADDR_FMT_DSC(bdAddr->addr),
97 codecIndex);
98 uint16_t Ret = AVDT_FAILED;
99 Event *event = EventCreate(true);
100 AvdtCreateStreamTskParam *param = malloc(sizeof(AvdtCreateStreamTskParam));
101 if (param == NULL) {
102 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
103 EventDelete(event);
104 return Ret;
105 }
106 (void)memset_s(param, sizeof(AvdtCreateStreamTskParam), 0, sizeof(AvdtCreateStreamTskParam));
107 param->bdAddr = bdAddr;
108 param->handle = handle;
109 param->codecIndex = codecIndex;
110 param->event = event;
111 if (!AvdtAsyncProcess(AvdtCreateStreamTsk, param)) {
112 EventWait(event, WAIT_TIME);
113 Ret = param->ret;
114 }
115 free(param);
116 EventDelete(event);
117 return Ret;
118 }
119
AvdtCreateStreamTsk(void * context)120 void AvdtCreateStreamTsk(void *context)
121 {
122 AvdtCreateStreamTskParam *param = (AvdtCreateStreamTskParam *)context;
123 param->ret = AvdtCreateStream(param->bdAddr, param->handle, param->codecIndex);
124 EventSet(param->event);
125 return;
126 }
127
AvdtCreateStream(const BtAddr * bdAddr,uint16_t * handle,uint16_t codecIndex)128 uint16_t AvdtCreateStream(const BtAddr *bdAddr, uint16_t *handle, uint16_t codecIndex)
129 {
130 LOG_DEBUG("[AVDT]%{public}s:bdAddr((%02x:%02x:%02x:%02x:%02x:%02x) codecIndex(%hu)",
131 __func__,
132 BT_ADDR_FMT_DSC(bdAddr->addr),
133 codecIndex);
134 uint16_t Ret = AVDT_SUCCESS;
135 if (codecIndex < 1) {
136 Ret = AVDT_BAD_PARAMS;
137 return Ret;
138 }
139 /* judge avdt Ind,Cfm callback and service capabilities
140 Allocate channel ctrl and stream ctrl */
141 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
142 if (sigCtrl == NULL) {
143 sigCtrl = AvdtSigCtrlAllocate(bdAddr, AVDT_ROLE_UNKOWN);
144 if (sigCtrl == NULL) {
145 Ret = AVDT_NO_RESOURCES;
146 return Ret;
147 }
148 }
149 /* check the sep had been registered */
150 *handle = AvdtCheckSepIsUsed(sigCtrl, codecIndex);
151 if (*handle != 0) {
152 LOG_INFO("[AVDT]%{public}s: Index(%hu) registered, registered handle(%hu)", __func__, codecIndex, *handle);
153 return Ret;
154 }
155 /* Create stream control block */
156 AvdtStreamCtrl *streamCtrl = AvdtStreamCtrlAllocate(sigCtrl, codecIndex);
157 if (streamCtrl == NULL) {
158 Ret = AVDT_NO_RESOURCES;
159 } else {
160 *handle = streamCtrl->handle;
161 LOG_INFO("[AVDT]%{public}s: Index(%hu) registered, registered handle(%hu)", __func__, codecIndex, *handle);
162 }
163 return Ret;
164 }
165
166 /**
167 *
168 * @brief AVDT_RegisterLocalSEP
169 *
170 * @details Register local host stream endpoint information
171 *
172 * @return AVDT_SUCCESS if successful, otherwise error.
173 *
174 */
AVDT_RegisterLocalSEP(AvdtStreamConfig * avdtStreamConfig,uint8_t number)175 uint16_t AVDT_RegisterLocalSEP(AvdtStreamConfig *avdtStreamConfig, uint8_t number)
176 {
177 LOG_INFO("[AVDT]%{public}s:", __func__);
178 uint16_t Ret = AVDT_FAILED;
179 Event *event = EventCreate(true);
180 AvdtRegisterLocalSEPTskParam *param = malloc(sizeof(AvdtRegisterLocalSEPTskParam));
181 if (param == NULL) {
182 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
183 EventDelete(event);
184 return Ret;
185 }
186 (void)memset_s(param, sizeof(AvdtRegisterLocalSEPTskParam), 0, sizeof(AvdtRegisterLocalSEPTskParam));
187 param->avdtStreamConfig = avdtStreamConfig;
188 param->number = number;
189 param->event = event;
190 if (!AvdtAsyncProcess(AvdtRegisterLocalSEPTsk, param)) {
191 EventWait(event, WAIT_TIME);
192 Ret = param->ret;
193 }
194 free(param);
195 EventDelete(event);
196 return Ret;
197 }
198
AvdtRegisterLocalSEPTsk(void * context)199 void AvdtRegisterLocalSEPTsk(void *context)
200 {
201 AvdtRegisterLocalSEPTskParam *param = (AvdtRegisterLocalSEPTskParam *)context;
202 param->ret = AvdtRegisterLocalSEP(param->avdtStreamConfig, param->number);
203 EventSet(param->event);
204 return;
205 }
206
207 /**
208 *
209 * @brief AVDT_RemoveStream
210 *
211 * @details Remove a stream endpoint. If this function is called when
212 * the endpoint is connected the connection is closed and then
213 * the stream endpoint is removed.
214 *
215 *
216 * @return AVDT_SUCCESS if successful, otherwise error.
217 *
218 */
AVDT_RemoveStream(uint16_t handle)219 uint16_t AVDT_RemoveStream(uint16_t handle)
220 {
221 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
222 uint16_t Ret = AVDT_SUCCESS;
223 return Ret;
224 }
225
226 /**
227 *
228 * @brief AVDT_DiscoverReq
229 *
230 * @details This function send AVDT_DISCOVER_CMD from INT to ACP and it
231 * request to get the overview of all SEP information of the ACP.
232 *
233 * When discovery is complete, an AVDT_DISCOVER_CFM_EVT
234 * is sent to the application via its callback function.
235 * The application must not call AVDT_GetCapReq() or
236 * AVDT_DiscoverReq() again to the same device until
237 * discovery is complete.
238 * AVDTP.ICS #Table 4-1, 4b-1 Stream discover command
239 *
240 * @return AVDT_SUCCESS if successful, otherwise error.
241 *
242 */
AVDT_DiscoverReq(const BtAddr * bdAddr,uint8_t maxSeps,uint8_t * transLabel)243 uint16_t AVDT_DiscoverReq(const BtAddr *bdAddr, uint8_t maxSeps, uint8_t *transLabel)
244 {
245 LOG_INFO("[AVDT]%{public}s: type (%hhu)Addr(%x:%x:%x:%x:%x:%x), maxSeps(%hhu)",
246 __func__,
247 bdAddr->type,
248 BT_ADDR_FMT_DSC(bdAddr->addr),
249 maxSeps);
250 uint16_t Ret = AVDT_FAILED;
251 Event *event = EventCreate(true);
252 AvdtDiscoverReqTskParam *param = malloc(sizeof(AvdtDiscoverReqTskParam));
253 if (param == NULL) {
254 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
255 EventDelete(event);
256 return Ret;
257 }
258 (void)memset_s(param, sizeof(AvdtDiscoverReqTskParam), 0, sizeof(AvdtDiscoverReqTskParam));
259 param->bdAddr = bdAddr;
260 param->maxSeps = maxSeps;
261 param->transLabel = transLabel;
262 param->event = event;
263 if (!AvdtAsyncProcess(AvdtDiscoverReqTsk, param)) {
264 EventWait(event, WAIT_TIME);
265 Ret = param->ret;
266 }
267 free(param);
268 EventDelete(event);
269 return Ret;
270 }
271
AvdtDiscoverReqTsk(void * context)272 void AvdtDiscoverReqTsk(void *context)
273 {
274 AvdtDiscoverReqTskParam *param = (AvdtDiscoverReqTskParam *)context;
275 param->ret = AvdtDiscoverReq(param->bdAddr, param->maxSeps, param->transLabel);
276 EventSet(param->event);
277 return;
278 }
279
AvdtDiscoverReq(const BtAddr * bdAddr,uint8_t maxSeps,uint8_t * transLabel)280 uint16_t AvdtDiscoverReq(const BtAddr *bdAddr, uint8_t maxSeps, uint8_t *transLabel)
281 {
282 LOG_DEBUG("[AVDT]%{public}s: type (%hhu)Addr(%x:%x:%x:%x:%x:%x), maxSeps(%hhu)",
283 __func__,
284 bdAddr->type,
285 BT_ADDR_FMT_DSC(bdAddr->addr),
286 maxSeps);
287 uint16_t Ret = AVDT_SUCCESS;
288 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
289 if (sigCtrl == NULL) {
290 sigCtrl = AvdtSigCtrlAllocate(bdAddr, AVDT_ROLE_UNKOWN);
291 if (sigCtrl == NULL) {
292 /* Trace:No resources */
293 Ret = AVDT_NO_RESOURCES;
294 LOG_ERROR("[AVDT]%{public}s: No SigCtrl resource!", __func__);
295 }
296 }
297 if (Ret == AVDT_SUCCESS) {
298 if (sigCtrl->isProcBusy) {
299 /* Disable call this api again before the respond is feedback */
300 Ret = AVDT_BUSY;
301 /* Trace: disable call the api */
302 LOG_WARN("[AVDT]%{public}s: Proce Busy!", __func__);
303 } else {
304 AvdtEventData evt = {0};
305 evt.discover.numSeps = maxSeps;
306 *transLabel = AvdtCreateTransLabel(sigCtrl);
307 AvdtSigProcEvent(sigCtrl, AVDT_DISCOVER_CMD_REQ_EVENT, &evt);
308 }
309 }
310 return Ret;
311 }
312
313 /**
314 *
315 * @brief AVDT_DiscoverRsp
316 *
317 * @details Respond to a discover request from ACP.
318 * Test suit only.
319 * AVDTP.ICS #Table 10-1, 10b-1 Stream discover response
320 *
321 * @return AVDT_SUCCESS if successful, otherwise error.
322 *
323 */
AVDT_DiscoverRsp(const BtAddr * bdAddr,uint8_t transLabel,uint8_t errCode,AvdtSepInfo * sepInfo,uint8_t numSeps)324 uint16_t AVDT_DiscoverRsp(
325 const BtAddr *bdAddr, uint8_t transLabel, uint8_t errCode, AvdtSepInfo *sepInfo, uint8_t numSeps)
326 {
327 LOG_DEBUG("[AVDT]%{public}s:", __func__);
328 uint16_t Ret = AVDT_SUCCESS;
329 return Ret;
330 }
331
332 /**
333 *
334 * @brief AVDT_GetCapReq
335 *
336 * @details This function send AVDT_GETCAP_REQ from INT to ACP and it
337 * used to get the information of a SEP of ACP.
338 *
339 * When the procedure is complete, an AVDT_GETCAP_CFM_EVT is
340 * sent to the application via its callback function. The
341 * application must not call AVDT_GetCapReq() or
342 * AVDT_DiscoverReq() again until the procedure is complete.
343 * AVDTP.ICS #Table 4-2, 4b-2 Stream get capabilities command
344 * AVDTP.ICS #Table 4-6, 4b-6 Stream get all capabilities
345 * command.
346 *
347 * @return AVDT_SUCCESS if successful, otherwise error.
348 *
349 */
AVDT_GetCapReq(const BtAddr * bdAddr,uint8_t acpSeid,uint8_t * transLabel)350 uint16_t AVDT_GetCapReq(const BtAddr *bdAddr, uint8_t acpSeid, uint8_t *transLabel)
351 {
352 LOG_INFO("[AVDT]%{public}s: acpSeid(%hhu)", __func__, acpSeid);
353 uint16_t Ret = AVDT_FAILED;
354 Event *event = EventCreate(true);
355 AvdtGetCapReqTskParam *param = malloc(sizeof(AvdtGetCapReqTskParam));
356 if (param == NULL) {
357 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
358 EventDelete(event);
359 return Ret;
360 }
361 (void)memset_s(param, sizeof(AvdtGetCapReqTskParam), 0, sizeof(AvdtGetCapReqTskParam));
362 param->bdAddr = bdAddr;
363 param->acpSeid = acpSeid;
364 param->transLabel = transLabel;
365 param->event = event;
366 if (!AvdtAsyncProcess(AvdtGetCapReqTsk, param)) {
367 EventWait(event, WAIT_TIME);
368 Ret = param->ret;
369 }
370 free(param);
371 EventDelete(event);
372 return Ret;
373 }
374
AvdtGetCapReqTsk(void * context)375 void AvdtGetCapReqTsk(void *context)
376 {
377 AvdtGetCapReqTskParam *param = (AvdtGetCapReqTskParam *)context;
378 param->ret = AvdtGetCapReq(param->bdAddr, param->acpSeid, param->transLabel);
379 EventSet(param->event);
380 return;
381 }
382
AvdtGetCapReq(const BtAddr * bdAddr,uint8_t acpSeid,uint8_t * transLabel)383 uint16_t AvdtGetCapReq(const BtAddr *bdAddr, uint8_t acpSeid, uint8_t *transLabel)
384 {
385 LOG_DEBUG("[AVDT]%{public}s: acpSeid(%hhu)", __func__, acpSeid);
386 uint16_t Ret = AVDT_SUCCESS;
387 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
388 if (sigCtrl == NULL) {
389 sigCtrl = AvdtSigCtrlAllocate(bdAddr, AVDT_ROLE_UNKOWN);
390 if (sigCtrl == NULL) {
391 /* Trace:No resources */
392 Ret = AVDT_NO_RESOURCES;
393 LOG_ERROR("[AVDT]%{public}s: AvdtSigCtrlAllocate failed!", __func__);
394 }
395 }
396 if (Ret == AVDT_SUCCESS) {
397 if (sigCtrl->isProcBusy) {
398 /* Disable call this api again before the respond is feedback */
399 Ret = AVDT_BUSY;
400 /* Trace: disable call the api */
401 LOG_WARN("[AVDT]%{public}s: Proce Busy!", __func__);
402 } else {
403 AvdtEventData evt = {0};
404 evt.getcap.single.seid = acpSeid;
405 *transLabel = AvdtCreateTransLabel(sigCtrl);
406 AvdtSigProcEvent(sigCtrl, AVDT_GETCAP_CMD_REQ_EVENT, &evt);
407 }
408 }
409 return Ret;
410 }
411
412 /**
413 *
414 * @brief AVDT_GetCapRsp
415 *
416 * @details Respond to a getcap request from INT. Test suit only.
417 * AVDTP.ICS #Table 10-2, 10b-2 Stream get capabilities
418 * response.
419 *
420 * @return AVDT_SUCCESS if successful, otherwise error.
421 *
422 */
AVDT_GetCapRsp(const BtAddr * bdAddr,uint8_t transLabel,uint8_t errCode,AvdtSepConfig * sepCap)423 uint16_t AVDT_GetCapRsp(const BtAddr *bdAddr, uint8_t transLabel, uint8_t errCode, AvdtSepConfig *sepCap)
424 {
425 LOG_INFO("[AVDT]%{public}s:", __func__);
426 uint16_t Ret = AVDT_FAILED;
427 Event *event = EventCreate(true);
428 AvdtGetCapRspTskParam *param = malloc(sizeof(AvdtGetCapRspTskParam));
429 if (param == NULL) {
430 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
431 EventDelete(event);
432 return Ret;
433 }
434 (void)memset_s(param, sizeof(AvdtGetCapRspTskParam), 0, sizeof(AvdtGetCapRspTskParam));
435 param->bdAddr = bdAddr;
436 param->transLabel = transLabel;
437 param->errCode = errCode;
438 param->sepCap = sepCap;
439 param->event = event;
440 if (!AvdtAsyncProcess(AvdtGetCapRspTsk, param)) {
441 EventWait(event, WAIT_TIME);
442 Ret = param->ret;
443 }
444 free(param);
445 EventDelete(event);
446 return Ret;
447 }
448
AvdtGetCapRspTsk(void * context)449 void AvdtGetCapRspTsk(void *context)
450 {
451 AvdtGetCapRspTskParam *param = (AvdtGetCapRspTskParam *)context;
452 param->ret = AvdtGetCapRsp(param->bdAddr, param->transLabel, param->errCode, param->sepCap);
453 EventSet(param->event);
454 return;
455 }
456
AvdtGetCapRsp(const BtAddr * bdAddr,uint8_t transLabel,uint8_t errCode,AvdtSepConfig * sepCap)457 uint16_t AvdtGetCapRsp(const BtAddr *bdAddr, uint8_t transLabel, uint8_t errCode, AvdtSepConfig *sepCap)
458 {
459 LOG_DEBUG("[AVDT]%{public}s:", __func__);
460 uint16_t Ret = AVDT_SUCCESS;
461 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
462 if (sigCtrl == NULL) {
463 Ret = AVDT_BAD_PARAMS;
464 } else {
465 AvdtEventData event = {0};
466 event.getcap.cfg = sepCap;
467 event.getcap.single.errCode = errCode;
468 AvdtSigProcEvent(sigCtrl, AVDT_GETCAP_CMD_RSP_EVENT, &event);
469 }
470 return Ret;
471 }
472
473 /**
474 *
475 * @brief AVDT_GetAllCapReq
476 *
477 * @details This function send AVDT_GETALLCAP_REQ from INT to ACP and it
478 * used to get the information of a SEP of ACP.
479 *
480 * When the procedure is complete, an AVDT_GETALLCAP_CFM_EVT is
481 * sent to the application via its callback function. The
482 * application must not call AVDT_GetAllCapReq() or
483 * AVDT_DiscoverReq() again until the procedure is complete.
484 * AVDTP.ICS #Table 4-2, 4b-2 Stream get capabilities command
485 * AVDTP.ICS #Table 4-6, 4b-6 Stream get all capabilities
486 * command.
487 *
488 * @return AVDT_SUCCESS if successful, otherwise error.
489 *
490 */
AVDT_GetAllCapReq(const BtAddr * bdAddr,uint8_t acpSeid,uint8_t * transLabel)491 uint16_t AVDT_GetAllCapReq(const BtAddr *bdAddr, uint8_t acpSeid, uint8_t *transLabel)
492 {
493 LOG_INFO("[AVDT]%{public}s: acpSeid(%hhu)", __func__, acpSeid);
494 uint16_t Ret = AVDT_FAILED;
495 Event *event = EventCreate(true);
496 AvdtGetAllCapReqTskParam *param = malloc(sizeof(AvdtGetAllCapReqTskParam));
497 if (param == NULL) {
498 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
499 EventDelete(event);
500 return Ret;
501 }
502 (void)memset_s(param, sizeof(AvdtGetAllCapReqTskParam), 0, sizeof(AvdtGetAllCapReqTskParam));
503 param->bdAddr = bdAddr;
504 param->acpSeid = acpSeid;
505 param->transLabel = transLabel;
506 param->event = event;
507 if (!AvdtAsyncProcess(AvdtGetAllCapReqTsk, param)) {
508 EventWait(event, WAIT_TIME);
509 Ret = param->ret;
510 }
511 free(param);
512 EventDelete(event);
513 return Ret;
514 }
515
AvdtGetAllCapReqTsk(void * context)516 void AvdtGetAllCapReqTsk(void *context)
517 {
518 AvdtGetAllCapReqTskParam *param = (AvdtGetAllCapReqTskParam *)context;
519 param->ret = AvdtGetAllCapReq(param->bdAddr, param->acpSeid, param->transLabel);
520 EventSet(param->event);
521 return;
522 }
523
AvdtGetAllCapReq(const BtAddr * bdAddr,uint8_t acpSeid,uint8_t * transLabel)524 uint16_t AvdtGetAllCapReq(const BtAddr *bdAddr, uint8_t acpSeid, uint8_t *transLabel)
525 {
526 LOG_DEBUG("[AVDT]%{public}s: acpSeid(%hhu)", __func__, acpSeid);
527 uint16_t Ret = AVDT_SUCCESS;
528 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
529 if (sigCtrl == NULL) {
530 sigCtrl = AvdtSigCtrlAllocate(bdAddr, AVDT_ROLE_UNKOWN);
531 if (sigCtrl == NULL) {
532 /* Trace:No resources */
533 Ret = AVDT_NO_RESOURCES;
534 LOG_ERROR("[AVDT]%{public}s: AvdtSigCtrlAllocate failed!", __func__);
535 }
536 }
537 if (Ret == AVDT_SUCCESS) {
538 if (sigCtrl->isProcBusy) {
539 /* Disable call this api again before the respond is feedback */
540 Ret = AVDT_BUSY;
541 /* Trace: disable call the api */
542 LOG_WARN("[AVDT]%{public}s: Proce Busy!", __func__);
543 } else {
544 AvdtEventData evt = {0};
545 evt.getcap.single.seid = acpSeid;
546 *transLabel = AvdtCreateTransLabel(sigCtrl);
547 AvdtSigProcEvent(sigCtrl, AVDT_GETALLCAP_CMD_REQ_EVENT, &evt);
548 }
549 }
550 return Ret;
551 }
552
553 /**
554 *
555 * @brief AVDT_GetAllCapRsp
556 *
557 * @details Respond to a getcap request from INT. Test suit only.
558 * AVDTP.ICS #Table 10-2, 10b-2 Stream get capabilities
559 * response.
560 *
561 * @return AVDT_SUCCESS if successful, otherwise error.
562 *
563 */
AVDT_GetAllCapRsp(const BtAddr * bdAddr,uint8_t transLabel,uint8_t errCode,AvdtSepConfig * sepCap)564 uint16_t AVDT_GetAllCapRsp(const BtAddr *bdAddr, uint8_t transLabel, uint8_t errCode, AvdtSepConfig *sepCap)
565 {
566 LOG_INFO("[AVDT]%{public}s:", __func__);
567 uint16_t Ret = AVDT_FAILED;
568 Event *event = EventCreate(true);
569 AvdtGetAllCapRspTskParam *param = malloc(sizeof(AvdtGetAllCapRspTskParam));
570 if (param == NULL) {
571 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
572 EventDelete(event);
573 return Ret;
574 }
575 (void)memset_s(param, sizeof(AvdtGetAllCapRspTskParam), 0, sizeof(AvdtGetAllCapRspTskParam));
576 param->bdAddr = bdAddr;
577 param->transLabel = transLabel;
578 param->errCode = errCode;
579 param->sepCap = sepCap;
580 param->event = event;
581 if (!AvdtAsyncProcess(AvdtGetAllCapRspTsk, param)) {
582 EventWait(event, WAIT_TIME);
583 Ret = param->ret;
584 }
585 free(param);
586 EventDelete(event);
587 return Ret;
588 }
589
AvdtGetAllCapRspTsk(void * context)590 void AvdtGetAllCapRspTsk(void *context)
591 {
592 AvdtGetAllCapRspTskParam *param = (AvdtGetAllCapRspTskParam *)context;
593 param->ret = AvdtGetAllCapRsp(param->bdAddr, param->transLabel, param->errCode, param->sepCap);
594 EventSet(param->event);
595 return;
596 }
597
AvdtGetAllCapRsp(const BtAddr * bdAddr,uint8_t transLabel,uint8_t errCode,AvdtSepConfig * sepCap)598 uint16_t AvdtGetAllCapRsp(const BtAddr *bdAddr, uint8_t transLabel, uint8_t errCode, AvdtSepConfig *sepCap)
599 {
600 LOG_DEBUG("[AVDT]%{public}s:", __func__);
601 uint16_t Ret = AVDT_SUCCESS;
602 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
603 if (sigCtrl == NULL) {
604 Ret = AVDT_BAD_PARAMS;
605 } else {
606 AvdtEventData event = {0};
607 event.getcap.cfg = sepCap;
608 event.getcap.single.errCode = errCode;
609 AvdtSigProcEvent(sigCtrl, AVDT_GETALLCAP_CMD_RSP_EVENT, &event);
610 }
611 return Ret;
612 }
613
614 /**
615 *
616 * @brief AVDT_DelayReq
617 *
618 * @details This functions sends a Delay Report to ACP
619 * that is associated with a particular SEID.
620 * This function is called by SNK device.
621 * AVDTP.ICS #Table 15-6 Delay Reporting
622 *
623 * @return AVDT_SUCCESS if successful, otherwise error.
624 *
625 */
AVDT_DelayReq(uint16_t handle,uint8_t * transLabel,uint16_t delayValue)626 uint16_t AVDT_DelayReq(uint16_t handle, uint8_t *transLabel, uint16_t delayValue)
627 {
628 LOG_INFO("[AVDT]%{public}s:handle(%hu),delayValue(%hu)", __func__, handle, delayValue);
629 uint16_t Ret = AVDT_FAILED;
630 Event *event = EventCreate(true);
631 AvdtDelayReqTskParam *param = malloc(sizeof(AvdtDelayReqTskParam));
632 if (param == NULL) {
633 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
634 EventDelete(event);
635 return Ret;
636 }
637 (void)memset_s(param, sizeof(AvdtDelayReqTskParam), 0, sizeof(AvdtDelayReqTskParam));
638 param->handle = handle;
639 param->transLabel = transLabel;
640 param->delayValue = delayValue;
641 param->event = event;
642 if (!AvdtAsyncProcess(AvdtDelayReqTsk, param)) {
643 EventWait(event, WAIT_TIME);
644 Ret = param->ret;
645 }
646 free(param);
647 EventDelete(event);
648 return Ret;
649 }
650
AvdtDelayReqTsk(void * context)651 void AvdtDelayReqTsk(void *context)
652 {
653 AvdtDelayReqTskParam *param = (AvdtDelayReqTskParam *)context;
654 param->ret = AvdtDelayReq(param->handle, param->transLabel, param->delayValue);
655 EventSet(param->event);
656 return;
657 }
658
AvdtDelayReq(uint16_t handle,uint8_t * transLabel,uint16_t delayValue)659 uint16_t AvdtDelayReq(uint16_t handle, uint8_t *transLabel, uint16_t delayValue)
660 {
661 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),delayValue(%hu)", __func__, handle, delayValue);
662 uint16_t Ret = AVDT_SUCCESS;
663 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
664 if (streamCtrl == NULL) {
665 /* Trace input parameter invalid */
666 Ret = AVDT_BAD_PARAMS;
667 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
668 }
669 if (Ret == AVDT_SUCCESS) {
670 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
671 if (sigCtrl != NULL) {
672 AvdtEventData evt = {0};
673 evt.apiDelay.delay = delayValue;
674 evt.apiDelay.hdr.seid = streamCtrl->peerSeid;
675 *transLabel = AvdtCreateTransLabel(sigCtrl);
676 AvdtStreamProcEvent(streamCtrl, AVDT_DELAY_CMD_REQ_EVENT, &evt);
677 }
678 }
679 return Ret;
680 }
681
682 /**
683 *
684 * @brief AVDT_DelayRsp
685 *
686 * @details Respond to a delay request from the peer device. This
687 * function must be called if the application receives an
688 * AVDT_DELAY_IND_EVT through its control callback.
689 * AVDTP.ICS #Table 14-6 Delay Reporting.
690 * The feature is not supported ,only for test suite
691 *
692 * @return AVDT_SUCCESS if successful, otherwise error.
693 *
694 */
AVDT_DelayRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)695 uint16_t AVDT_DelayRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
696 {
697 LOG_INFO("[AVDT]%{public}s:handle(%hu),transLabel(%hhu),errCode(%hhu)", __func__, handle, transLabel, errCode);
698 uint16_t Ret = AVDT_FAILED;
699 Event *event = EventCreate(true);
700 AvdtDelayRspTskParam *param = malloc(sizeof(AvdtDelayRspTskParam));
701 if (param == NULL) {
702 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
703 EventDelete(event);
704 return Ret;
705 }
706 (void)memset_s(param, sizeof(AvdtDelayRspTskParam), 0, sizeof(AvdtDelayRspTskParam));
707 param->handle = handle;
708 param->transLabel = transLabel;
709 param->errCode = errCode;
710 param->event = event;
711 if (!AvdtAsyncProcess(AvdtDelayRspTsk, param)) {
712 EventWait(event, WAIT_TIME);
713 Ret = param->ret;
714 }
715 free(param);
716 EventDelete(event);
717 return Ret;
718 }
719
AvdtDelayRspTsk(void * context)720 void AvdtDelayRspTsk(void *context)
721 {
722 AvdtDelayRspTskParam *param = (AvdtDelayRspTskParam *)context;
723 param->ret = AvdtDelayRsp(param->handle, param->transLabel, param->errCode);
724 EventSet(param->event);
725 return;
726 }
727
AvdtDelayRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)728 uint16_t AvdtDelayRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
729 {
730 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),transLabel(%hhu),errCode(%hhu)", __func__, handle, transLabel, errCode);
731 uint16_t Ret = AVDT_SUCCESS;
732 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
733 if (streamCtrl != NULL) {
734 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
735 if (sigCtrl != NULL) {
736 AvdtEventData evt = {0};
737 evt.msg.single.errCode = errCode;
738 evt.msg.single.label = transLabel;
739 AvdtStreamProcEvent(streamCtrl, AVDT_DELAY_CMD_RSP_EVENT, &evt);
740 } else {
741 Ret = AVDT_BAD_PARAMS;
742 LOG_ERROR("[AVDT]%{public}s:AvdtGetSigCtrlByHandle(%hhu) Failed!", __func__, streamCtrl->sigHandle);
743 }
744 } else {
745 Ret = AVDT_BAD_PARAMS;
746 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
747 }
748 return Ret;
749 }
750
751 /**
752 *
753 * @brief AVDT_OpenReq
754 *
755 * @details This function send the AVDT_OPEN_REQ from INT to ACP and
756 * create the stream between INT and ACP.When the connection
757 * is completed, an AVDT_OPEN_CFM_EVT is sent to the
758 * application via the control callback function for this
759 * handle.
760 * AVDTP.ICS #Table 5-1,5b-1 Open stream command
761 *
762 * @return AVDT_SUCCESS if successful, otherwise error.
763 *
764 */
AVDT_OpenReq(uint16_t handle,uint8_t * transLabel)765 uint16_t AVDT_OpenReq(uint16_t handle, uint8_t *transLabel)
766 {
767 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
768 uint16_t Ret = AVDT_FAILED;
769 Event *event = EventCreate(true);
770 AvdtOpenReqTskParam *param = malloc(sizeof(AvdtOpenReqTskParam));
771 if (param == NULL) {
772 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
773 EventDelete(event);
774 return Ret;
775 }
776 (void)memset_s(param, sizeof(AvdtOpenReqTskParam), 0, sizeof(AvdtOpenReqTskParam));
777 param->handle = handle;
778 param->transLabel = transLabel;
779 param->event = event;
780 if (!AvdtAsyncProcess(AvdtOpenReqTsk, param)) {
781 EventWait(event, WAIT_TIME);
782 Ret = param->ret;
783 }
784 free(param);
785 EventDelete(event);
786 return Ret;
787 }
788
AvdtOpenReqTsk(void * context)789 void AvdtOpenReqTsk(void *context)
790 {
791 AvdtOpenReqTskParam *param = (AvdtOpenReqTskParam *)context;
792 param->ret = AvdtOpenReq(param->handle, param->transLabel);
793 EventSet(param->event);
794 return;
795 }
796
AvdtOpenReq(uint16_t handle,uint8_t * transLabel)797 uint16_t AvdtOpenReq(uint16_t handle, uint8_t *transLabel)
798 {
799 LOG_DEBUG("[AVDT]%{public}s:handle(%hu)", __func__, handle);
800 uint16_t Ret = AVDT_SUCCESS;
801 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
802 if (streamCtrl == NULL) {
803 /* Trace input parameter invalid */
804 Ret = AVDT_BAD_PARAMS;
805 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
806 }
807 if (Ret == AVDT_SUCCESS) {
808 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
809 if (sigCtrl != NULL) {
810 AvdtEventData evt = {0};
811 evt.msg.single.seid = streamCtrl->peerSeid;
812 *transLabel = AvdtCreateTransLabel(sigCtrl);
813 AvdtStreamProcEvent(streamCtrl, AVDT_OPEN_CMD_REQ_EVENT, &evt);
814 } else {
815 Ret = AVDT_BAD_PARAMS;
816 LOG_ERROR("[AVDT]%{public}s:AvdtGetSigCtrlByHandle(%hhu) Failed!", __func__, streamCtrl->sigHandle);
817 }
818 }
819 return Ret;
820 }
821
822 /**
823 *
824 * @brief AVDT_OpenRsp
825 *
826 * @details Respond to an open request from ACP. This function must be
827 * called if the application receives an AVDT_OPEN_IND_EVT
828 * through its control callback.
829 * AVDTP.ICS #Table 11-1, 11b-1 Open stream response
830 *
831 * @return AVDT_SUCCESS if successful, otherwise error.
832 *
833 */
AVDT_OpenRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)834 uint16_t AVDT_OpenRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
835 {
836 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
837 uint16_t Ret = AVDT_SUCCESS;
838 return Ret;
839 }
840
841 /**
842 *
843 * @brief AVDT_SetConfigReq
844 *
845 * @details This function send AVDT_CONFIG_CMD from INT to ACP. When
846 * the config is completed, an AVDT_CONFIG_CFM_EVT is sent to
847 * the application via the control callback function for this
848 * handle.
849 * AVDTP.ICS #Table 4-3, 4b-3 Set configuration command
850 *
851 * @return AVDT_SUCCESS if successful, otherwise error.
852 *
853 */
AVDT_SetConfigReq(uint16_t handle,uint8_t seid,AvdtSepConfig * sepConfig,uint8_t * transLabel)854 uint16_t AVDT_SetConfigReq(uint16_t handle, uint8_t seid, AvdtSepConfig *sepConfig, uint8_t *transLabel)
855 {
856 LOG_INFO("[AVDT]%{public}s:handle(%hu),seid(%hhu)", __func__, handle, seid);
857 uint16_t Ret = AVDT_FAILED;
858 Event *event = EventCreate(true);
859 AvdtSetConfigReqTskParam *param = malloc(sizeof(AvdtSetConfigReqTskParam));
860 if (param == NULL) {
861 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
862 EventDelete(event);
863 return Ret;
864 }
865 (void)memset_s(param, sizeof(AvdtSetConfigReqTskParam), 0, sizeof(AvdtSetConfigReqTskParam));
866 param->handle = handle;
867 param->seid = seid;
868 param->sepConfig = sepConfig;
869 param->transLabel = transLabel;
870 param->event = event;
871 if (!AvdtAsyncProcess(AvdtSetConfigReqTsk, param)) {
872 EventWait(event, WAIT_TIME);
873 Ret = param->ret;
874 }
875 free(param);
876 EventDelete(event);
877 return Ret;
878 }
879
AvdtSetConfigReqTsk(void * context)880 void AvdtSetConfigReqTsk(void *context)
881 {
882 AvdtSetConfigReqTskParam *param = (AvdtSetConfigReqTskParam *)context;
883 param->ret = AvdtSetConfigReq(param->handle, param->seid, param->sepConfig, param->transLabel);
884 EventSet(param->event);
885 return;
886 }
887
AvdtSetConfigReq(uint16_t handle,uint8_t seid,AvdtSepConfig * sepConfig,uint8_t * transLabel)888 uint16_t AvdtSetConfigReq(uint16_t handle, uint8_t seid, AvdtSepConfig *sepConfig, uint8_t *transLabel)
889 {
890 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),seid(%hhu)", __func__, handle, seid);
891 uint16_t Ret = AVDT_SUCCESS;
892 AvdtSigCtrl *sigCtrl = NULL;
893 if (seid == 0) {
894 /* Trace input parameter invalid */
895 Ret = AVDT_BAD_PARAMS;
896 }
897 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
898 if (streamCtrl == NULL) {
899 Ret = AVDT_BAD_PARAMS;
900 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
901 } else {
902 sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
903 if (sigCtrl == NULL) {
904 Ret = AVDT_BAD_PARAMS;
905 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed!", __func__, streamCtrl->sigHandle);
906 }
907 }
908 if (AVDT_SUCCESS == Ret) {
909 AvdtIsEdr2MbMode(&sigCtrl->peerAddress);
910 AvdtIsEdr3MbMode(&sigCtrl->peerAddress);
911 AvdtStreamConfig *streamConfig = AvdtGetSepConfigByCodecIndex(streamCtrl->codecIndex);
912 if ((streamConfig != NULL) && (sigCtrl->role != streamConfig->sepType)) {
913 sigCtrl->role = streamConfig->sepType;
914 }
915 AvdtEventData evt = {0};
916 evt.msg.configureCmd.acpSeid = seid;
917 streamCtrl->peerSeid = seid;
918 evt.msg.configureCmd.intSeid = (uint8_t)handle;
919 (void)memcpy_s(&streamCtrl->reqCfg, sizeof(AvdtSepConfig), sepConfig, sizeof(AvdtSepConfig));
920 *transLabel = AvdtCreateTransLabel(sigCtrl);
921 AvdtStreamProcEvent(streamCtrl, AVDT_SETCONFIGURE_CMD_REQ_EVENT, &evt);
922 }
923 return Ret;
924 }
925
926 /**
927 *
928 * @brief AVDT_SetConfigRsp
929 *
930 * @details Respond to a configure request from ACP. This
931 * function must be called if the application receives an
932 * AVDT_CONFIG_IND_EVT through its control callback.
933 * AVDTP.ICS #Table 10-3, 10b-3 Set configuration response
934 *
935 * @return AVDT_SUCCESS if successful, otherwise error.
936 *
937 */
AVDT_SetConfigRsp(uint16_t handle,uint8_t transLabel,AvdtCatetory category)938 uint16_t AVDT_SetConfigRsp(uint16_t handle, uint8_t transLabel, AvdtCatetory category)
939 {
940 LOG_INFO("[AVDT]%{public}s:handle(%hu),transLabel(%hhu)", __func__, handle, transLabel);
941 uint16_t Ret = AVDT_FAILED;
942 Event *event = EventCreate(true);
943 AvdtSetConfigRspTskParam *param = malloc(sizeof(AvdtSetConfigRspTskParam));
944 if (param == NULL) {
945 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
946 EventDelete(event);
947 return Ret;
948 }
949 (void)memset_s(param, sizeof(AvdtSetConfigRspTskParam), 0, sizeof(AvdtSetConfigRspTskParam));
950 param->handle = handle;
951 param->transLabel = transLabel;
952 (void)memcpy_s(¶m->category, sizeof(AvdtCatetory), &category, sizeof(AvdtCatetory));
953 param->event = event;
954 if (!AvdtAsyncProcess(AvdtSetConfigRspTsk, param)) {
955 EventWait(event, WAIT_TIME);
956 Ret = param->ret;
957 }
958 free(param);
959 EventDelete(event);
960 return Ret;
961 }
962
AvdtSetConfigRspTsk(void * context)963 void AvdtSetConfigRspTsk(void *context)
964 {
965 AvdtSetConfigRspTskParam *param = (AvdtSetConfigRspTskParam *)context;
966 param->ret = AvdtSetConfigRsp(param->handle, param->transLabel, param->category);
967 EventSet(param->event);
968 return;
969 }
970
AvdtSetConfigRsp(uint16_t handle,uint8_t transLabel,AvdtCatetory category)971 uint16_t AvdtSetConfigRsp(uint16_t handle, uint8_t transLabel, AvdtCatetory category)
972 {
973 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),transLabel(%hhu)", __func__, handle, transLabel);
974 uint16_t Ret = AVDT_SUCCESS;
975 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
976 if (streamCtrl != NULL) {
977 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
978 if (sigCtrl != NULL) {
979 AvdtEventData evt = {0};
980 evt.msg.configureCmd.hdr.errCode = category.errCode;
981 evt.msg.configureCmd.hdr.label = transLabel;
982 evt.msg.configureCmd.hdr.errParam = category.category;
983 AvdtStreamProcEvent(streamCtrl, AVDT_SETCONFIGURE_CMD_RSP_EVENT, &evt);
984 }
985 } else {
986 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle Failed,input parameter invalid handl(%hu)",
987 __func__, handle);
988 }
989 return Ret;
990 }
991
992 /**
993 *
994 * @brief AVDT_GetConfigReq
995 *
996 * @details This function send AVDT_GETCONFIG_CMD from INT to ACP
997 * to get the current configuration of a SEP in ACP. When
998 * the config is completed, an AVDT_GETCONFIG_CFM_EVT is
999 * sent to the application via the control callback function.
1000 * AVDTP.ICS #Table 4-4, 4b-4 Get configuration command
1001 *
1002 * @return AVDT_SUCCESS if successful, otherwise error.
1003 *
1004 */
AVDT_GetConfigReq(uint16_t handle,uint8_t * transLabel)1005 uint16_t AVDT_GetConfigReq(uint16_t handle, uint8_t *transLabel)
1006 {
1007 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1008 uint16_t Ret = AVDT_FAILED;
1009 Event *event = EventCreate(true);
1010 AvdtGetConfigReqTskParam *param = malloc(sizeof(AvdtGetConfigReqTskParam));
1011 if (param == NULL) {
1012 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1013 EventDelete(event);
1014 return Ret;
1015 }
1016 (void)memset_s(param, sizeof(AvdtGetConfigReqTskParam), 0, sizeof(AvdtGetConfigReqTskParam));
1017 param->handle = handle;
1018 param->transLabel = transLabel;
1019 param->event = event;
1020 if (!AvdtAsyncProcess(AvdtGetConfigReqTsk, param)) {
1021 EventWait(event, WAIT_TIME);
1022 Ret = param->ret;
1023 }
1024 free(param);
1025 EventDelete(event);
1026 return Ret;
1027 }
1028
AvdtGetConfigReqTsk(void * context)1029 void AvdtGetConfigReqTsk(void *context)
1030 {
1031 AvdtGetConfigReqTskParam *param = (AvdtGetConfigReqTskParam *)context;
1032 param->ret = AvdtGetConfigReq(param->handle, param->transLabel);
1033 EventSet(param->event);
1034 return;
1035 }
1036
AvdtGetConfigReq(uint16_t handle,uint8_t * transLabel)1037 uint16_t AvdtGetConfigReq(uint16_t handle, uint8_t *transLabel)
1038 {
1039 LOG_DEBUG("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1040 uint16_t Ret = AVDT_SUCCESS;
1041 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1042 if (streamCtrl == NULL) {
1043 /* Trace input parameter invalid */
1044 Ret = AVDT_BAD_PARAMS;
1045 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1046 }
1047 if (Ret == AVDT_SUCCESS) {
1048 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1049 if (sigCtrl != NULL) {
1050 AvdtEventData evt = {0};
1051 evt.msg.single.seid = streamCtrl->peerSeid;
1052 *transLabel = AvdtCreateTransLabel(sigCtrl);
1053 AvdtStreamProcEvent(streamCtrl, AVDT_GETCONFIGURE_CMD_REQ_EVENT, &evt);
1054 } else {
1055 Ret = AVDT_FAILED;
1056 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1057 }
1058 }
1059 return Ret;
1060 }
1061
1062 /**
1063 *
1064 * @brief AVDT_StartReq
1065 *
1066 * @details Start one or more stream endpoints(audio/video). All stream
1067 * endpoints must previously be opened. When the streams are
1068 * started, an AVDT_START_CFM_EVT is sent to the application
1069 * via the control callback function for each stream.
1070 * AVDTP.ICS #Table 5-2, 5b-2 Start stream command
1071 *
1072 * @return AVDT_SUCCESS if successful, otherwise error.
1073 *
1074 */
AVDT_StartReq(const uint16_t * handles,uint8_t numHandles,uint8_t * transLabel)1075 uint16_t AVDT_StartReq(const uint16_t *handles, uint8_t numHandles, uint8_t *transLabel)
1076 {
1077 LOG_INFO("[AVDT]%{public}s:handles[0] is %hu", __func__, handles[0]);
1078 uint16_t Ret = AVDT_FAILED;
1079 Event *event = EventCreate(true);
1080 AvdtStartReqTskParam *param = malloc(sizeof(AvdtStartReqTskParam));
1081 if (param == NULL) {
1082 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1083 EventDelete(event);
1084 return Ret;
1085 }
1086 (void)memset_s(param, sizeof(AvdtStartReqTskParam), 0, sizeof(AvdtStartReqTskParam));
1087 param->handles = handles;
1088 param->numHandles = numHandles;
1089 param->transLabel = transLabel;
1090 param->event = event;
1091 if (!AvdtAsyncProcess(AvdtStartReqTsk, param)) {
1092 EventWait(event, WAIT_TIME);
1093 Ret = param->ret;
1094 }
1095 free(param);
1096 EventDelete(event);
1097 return Ret;
1098 }
1099
AvdtStartReqTsk(void * context)1100 void AvdtStartReqTsk(void *context)
1101 {
1102 AvdtStartReqTskParam *param = (AvdtStartReqTskParam *)context;
1103 param->ret = AvdtStartReq(param->handles, param->numHandles, param->transLabel);
1104 EventSet(param->event);
1105 return;
1106 }
1107
AvdtStartReq(const uint16_t * handles,uint8_t numHandles,uint8_t * transLabel)1108 uint16_t AvdtStartReq(const uint16_t *handles, uint8_t numHandles, uint8_t *transLabel)
1109 {
1110 LOG_DEBUG("[AVDT]%{public}s:handles[0] is %hu", __func__, handles[0]);
1111 uint16_t Ret = AVDT_SUCCESS;
1112 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handles[0]);
1113 if (streamCtrl == NULL) {
1114 /* Trace input parameter invalid */
1115 Ret = AVDT_BAD_PARAMS;
1116 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handles[0]);
1117 }
1118 if (Ret == AVDT_SUCCESS) {
1119 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1120 if (sigCtrl != NULL) {
1121 AvdtEventData evt = {0};
1122 evt.msg.single.seid = streamCtrl->peerSeid;
1123 *transLabel = AvdtCreateTransLabel(sigCtrl);
1124 AvdtStreamProcEvent(streamCtrl, AVDT_START_CMD_REQ_EVENT, &evt);
1125 } else {
1126 Ret = AVDT_FAILED;
1127 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1128 }
1129 }
1130 return Ret;
1131 }
1132
1133 /**
1134 *
1135 * @brief AVDT_StartRsp
1136 *
1137 * @details Respond to a start request from ACP. This function must
1138 * be called if the application receives an AVDT_START_IND_EVT
1139 * through its control callback.
1140 * AVDTP.ICS #Table 11-2, 11b-2 Start stream command
1141 *
1142 * @return AVDT_SUCCESS if successful, otherwise error.
1143 *
1144 */
AVDT_StartRsp(uint16_t firstHandle,uint8_t transLabel,uint16_t firstFailHandle,uint8_t errCode)1145 uint16_t AVDT_StartRsp(uint16_t firstHandle, uint8_t transLabel, uint16_t firstFailHandle, uint8_t errCode)
1146 {
1147 LOG_INFO("[AVDT]%{public}s:transLabel(%hhu),firstHandle(%hu),firstFailHandle(%hu)",
1148 __func__,
1149 transLabel,
1150 firstHandle,
1151 firstFailHandle);
1152 uint16_t Ret = AVDT_FAILED;
1153 Event *event = EventCreate(true);
1154 AvdtStartRspTskParam *param = malloc(sizeof(AvdtStartRspTskParam));
1155 if (param == NULL) {
1156 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1157 EventDelete(event);
1158 return Ret;
1159 }
1160 (void)memset_s(param, sizeof(AvdtStartRspTskParam), 0, sizeof(AvdtStartRspTskParam));
1161 param->firstHandle = firstHandle;
1162 param->transLabel = transLabel;
1163 param->firstFailHandle = firstFailHandle;
1164 param->errCode = errCode;
1165 param->event = event;
1166 if (!AvdtAsyncProcess(AvdtStartRspTsk, param)) {
1167 EventWait(event, WAIT_TIME);
1168 Ret = param->ret;
1169 }
1170 free(param);
1171 EventDelete(event);
1172 return Ret;
1173 }
1174
AvdtStartRspTsk(void * context)1175 void AvdtStartRspTsk(void *context)
1176 {
1177 AvdtStartRspTskParam *param = (AvdtStartRspTskParam *)context;
1178 param->ret = AvdtStartRsp(param->firstHandle, param->transLabel, param->firstFailHandle, param->errCode);
1179 EventSet(param->event);
1180 return;
1181 }
1182
AvdtStartRsp(uint16_t firstHandle,uint8_t transLabel,uint16_t firstFailHandle,uint8_t errCode)1183 uint16_t AvdtStartRsp(uint16_t firstHandle, uint8_t transLabel, uint16_t firstFailHandle, uint8_t errCode)
1184 {
1185 LOG_DEBUG("[AVDT]%{public}s:transLabel(%hhu),firstHandle(%hu),firstFailHandle(%hu)",
1186 __func__,
1187 transLabel,
1188 firstHandle,
1189 firstFailHandle);
1190 uint16_t Ret = AVDT_SUCCESS;
1191 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(firstHandle);
1192 if (streamCtrl == NULL || firstHandle == 0) {
1193 /* Trace input parameter invalid */
1194 Ret = AVDT_BAD_PARAMS;
1195 LOG_WARN("[AVDT]%{public}s: input parameter invalid handle(%hu)", __func__, firstHandle);
1196 }
1197 if (Ret == AVDT_SUCCESS) {
1198 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1199 if (sigCtrl != NULL) {
1200 AvdtEventData evt = {0};
1201 evt.msg.single.errCode = errCode;
1202 evt.msg.single.label = transLabel;
1203 AvdtStreamProcEvent(streamCtrl, AVDT_START_CMD_RSP_EVENT, &evt);
1204 } else {
1205 Ret = AVDT_FAILED;
1206 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1207 }
1208 }
1209 return Ret;
1210 }
1211
1212 /**
1213 *
1214 * @brief AVDT_SuspendReq
1215 *
1216 * @details Suspend one or more stream endpoints. This suspends the
1217 * transfer of media packets for the streams. All stream
1218 * endpoints must previously be open and started. When the
1219 * streams are suspended, an AVDT_SUSPEND_CFM_EVT is sent to
1220 * the application via the control callback function for
1221 * each stream.
1222 * AVDTP.ICS #Table 5-4, 5b-4 Suspend command
1223 *
1224 * @return AVDT_SUCCESS if successful, otherwise error.
1225 *
1226 */
AVDT_SuspendReq(const uint16_t * handles,uint8_t numHandles,uint8_t * transLabel)1227 uint16_t AVDT_SuspendReq(const uint16_t *handles, uint8_t numHandles, uint8_t *transLabel)
1228 {
1229 LOG_INFO("[AVDT]%{public}s:", __func__);
1230 uint16_t Ret = AVDT_FAILED;
1231 Event *event = EventCreate(true);
1232 AvdtSuspendReqTskParam *param = malloc(sizeof(AvdtSuspendReqTskParam));
1233 if (param == NULL) {
1234 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1235 EventDelete(event);
1236 return Ret;
1237 }
1238 (void)memset_s(param, sizeof(AvdtSuspendReqTskParam), 0, sizeof(AvdtSuspendReqTskParam));
1239 param->handles = handles;
1240 param->numHandles = numHandles;
1241 param->transLabel = transLabel;
1242 param->event = event;
1243 if (!AvdtAsyncProcess(AvdtSuspendReqTsk, param)) {
1244 EventWait(event, WAIT_TIME);
1245 Ret = param->ret;
1246 }
1247 free(param);
1248 EventDelete(event);
1249 return Ret;
1250 }
1251
AvdtSuspendReqTsk(void * context)1252 void AvdtSuspendReqTsk(void *context)
1253 {
1254 AvdtSuspendReqTskParam *param = (AvdtSuspendReqTskParam *)context;
1255 param->ret = AvdtSuspendReq(param->handles, param->numHandles, param->transLabel);
1256 EventSet(param->event);
1257 return;
1258 }
1259
AvdtSuspendReq(const uint16_t * handles,uint8_t numHandles,uint8_t * transLabel)1260 uint16_t AvdtSuspendReq(const uint16_t *handles, uint8_t numHandles, uint8_t *transLabel)
1261 {
1262 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1263 uint16_t Ret = AVDT_SUCCESS;
1264 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handles[0]);
1265 if (streamCtrl == NULL) {
1266 /* Trace input parameter invalid */
1267 Ret = AVDT_BAD_PARAMS;
1268 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handles[0]);
1269 }
1270 if (Ret == AVDT_SUCCESS) {
1271 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1272 if (sigCtrl != NULL) {
1273 AvdtEventData evt = {0};
1274 evt.msg.single.seid = streamCtrl->peerSeid;
1275 *transLabel = AvdtCreateTransLabel(sigCtrl);
1276 AvdtStreamProcEvent(streamCtrl, AVDT_SUSPEND_CMD_REQ_EVENT, &evt);
1277 } else {
1278 Ret = AVDT_FAILED;
1279 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1280 }
1281 }
1282 return Ret;
1283 }
1284
1285 /**
1286 *
1287 * @brief AVDT_SuspendRsp
1288 *
1289 * @details Respond to a suspend request from ACP. This function must
1290 * be called if the application receives an
1291 * AVDT_SUSPEND_IND_EVT through its control callback.
1292 * AVDTP.ICS #Table 11-4, 11b-4 Suspend response
1293 *
1294 * @return AVDT_SUCCESS if successful, otherwise error.
1295 *
1296 */
AVDT_SuspendRsp(uint16_t firstHandle,uint8_t transLabel,uint16_t firstFailHandle,uint8_t errCode)1297 uint16_t AVDT_SuspendRsp(uint16_t firstHandle, uint8_t transLabel, uint16_t firstFailHandle, uint8_t errCode)
1298 {
1299 LOG_INFO("[AVDT]%{public}s:firstHandle(%hu),firstFailHandle(%hu)", __func__, firstHandle, firstFailHandle);
1300 uint16_t Ret = AVDT_FAILED;
1301 Event *event = EventCreate(true);
1302 AvdtSuspendRspTskParam *param = malloc(sizeof(AvdtSuspendRspTskParam));
1303 if (param == NULL) {
1304 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1305 EventDelete(event);
1306 return Ret;
1307 }
1308 (void)memset_s(param, sizeof(AvdtSuspendRspTskParam), 0, sizeof(AvdtSuspendRspTskParam));
1309 param->firstHandle = firstHandle;
1310 param->transLabel = transLabel;
1311 param->firstFailHandle = firstFailHandle;
1312 param->errCode = errCode;
1313 param->event = event;
1314 if (!AvdtAsyncProcess(AvdtSuspendRspTsk, param)) {
1315 EventWait(event, WAIT_TIME);
1316 Ret = param->ret;
1317 }
1318 free(param);
1319 EventDelete(event);
1320 return Ret;
1321 }
1322
AvdtSuspendRspTsk(void * context)1323 void AvdtSuspendRspTsk(void *context)
1324 {
1325 AvdtSuspendRspTskParam *param = (AvdtSuspendRspTskParam *)context;
1326 param->ret = AvdtSuspendRsp(param->firstHandle, param->transLabel, param->firstFailHandle, param->errCode);
1327 EventSet(param->event);
1328 return;
1329 }
1330
AvdtSuspendRsp(uint16_t firstHandle,uint8_t transLabel,uint16_t firstFailHandle,uint8_t errCode)1331 uint16_t AvdtSuspendRsp(uint16_t firstHandle, uint8_t transLabel, uint16_t firstFailHandle, uint8_t errCode)
1332 {
1333 LOG_DEBUG("[AVDT]%{public}s:firstHandle(%hu),firstFailHandle(%hu)", __func__, firstHandle, firstFailHandle);
1334 uint16_t Ret = AVDT_SUCCESS;
1335 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(firstHandle);
1336 if (streamCtrl == NULL || firstHandle == 0) {
1337 /* Trace input parameter invalid */
1338 Ret = AVDT_BAD_PARAMS;
1339 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, firstHandle);
1340 }
1341 if (Ret == AVDT_SUCCESS) {
1342 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1343 if (sigCtrl != NULL) {
1344 AvdtEventData evt = {0};
1345 evt.msg.single.errCode = errCode;
1346 evt.msg.single.label = transLabel;
1347 AvdtStreamProcEvent(streamCtrl, AVDT_SUSPEND_CMD_RSP_EVENT, &evt);
1348 } else {
1349 Ret = AVDT_FAILED;
1350 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1351 }
1352 }
1353 return Ret;
1354 }
1355
1356 /**
1357 *
1358 * @brief AVDT_CloseReq
1359 *
1360 * @details Close a stream endpoint. It stops the transfer of media
1361 * packets and closes the transport channel associated with
1362 * this stream endpoint. When the stream is closed, an
1363 * AVDT_CLOSE_CFM_EVT is sent to the application via the
1364 * control callback function for this handle.
1365 * AVDTP.ICS #Table 5-3, 5b-3 Close stream command
1366 *
1367 * @return AVDT_SUCCESS if successful, otherwise error.
1368 *
1369 */
AVDT_CloseReq(uint16_t handle)1370 uint16_t AVDT_CloseReq(uint16_t handle)
1371 {
1372 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1373 uint16_t Ret = AVDT_FAILED;
1374 Event *event = EventCreate(true);
1375 AvdtCloseReqTskParam *param = malloc(sizeof(AvdtCloseReqTskParam));
1376 if (param == NULL) {
1377 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1378 EventDelete(event);
1379 return Ret;
1380 }
1381 (void)memset_s(param, sizeof(AvdtCloseReqTskParam), 0, sizeof(AvdtCloseReqTskParam));
1382 param->handle = handle;
1383 param->event = event;
1384 if (!AvdtAsyncProcess(AvdtCloseReqTsk, param)) {
1385 EventWait(event, WAIT_TIME);
1386 Ret = param->ret;
1387 }
1388 free(param);
1389 EventDelete(event);
1390 return Ret;
1391 }
1392
AvdtCloseReqTsk(void * context)1393 void AvdtCloseReqTsk(void *context)
1394 {
1395 AvdtCloseReqTskParam *param = (AvdtCloseReqTskParam *)context;
1396 param->ret = AvdtCloseReq(param->handle);
1397 EventSet(param->event);
1398 return;
1399 }
1400
AvdtCloseReq(uint16_t handle)1401 uint16_t AvdtCloseReq(uint16_t handle)
1402 {
1403 LOG_DEBUG("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1404 uint16_t Ret = AVDT_SUCCESS;
1405 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1406 if (streamCtrl == NULL) {
1407 /* Trace input parameter invalid */
1408 Ret = AVDT_BAD_PARAMS;
1409 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1410 }
1411 if (Ret == AVDT_SUCCESS) {
1412 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1413 if (sigCtrl != NULL) {
1414 AvdtEventData evt = {0};
1415 evt.msg.single.seid = streamCtrl->peerSeid;
1416 AvdtStreamProcEvent(streamCtrl, AVDT_CLOSE_CMD_REQ_EVENT, &evt);
1417 } else {
1418 Ret = AVDT_FAILED;
1419 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1420 }
1421 }
1422 return Ret;
1423 }
1424
1425 /**
1426 *
1427 * @brief AVDT_CloseRsp
1428 *
1429 * @details Respond to a close request from ACP. This function must
1430 * be called if the application receives an AVDT_CLOSE_IND_EVT
1431 * through its control callback.
1432 * AVDTP.ICS #Table 11-3, 11b-c Close stream response
1433 *
1434 * @return AVDT_SUCCESS if successful, otherwise error.
1435 *
1436 */
AVDT_CloseRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)1437 uint16_t AVDT_CloseRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
1438 {
1439 LOG_INFO("[AVDT]%{public}s:handle(%hu),transLabel(%hhu),errCode(%hhu)", __func__, handle, transLabel, errCode);
1440 uint16_t Ret = AVDT_FAILED;
1441 Event *event = EventCreate(true);
1442 AvdtCloseRspTskParam *param = malloc(sizeof(AvdtCloseRspTskParam));
1443 if (param == NULL) {
1444 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1445 EventDelete(event);
1446 return Ret;
1447 }
1448 (void)memset_s(param, sizeof(AvdtCloseRspTskParam), 0, sizeof(AvdtCloseRspTskParam));
1449 param->handle = handle;
1450 param->transLabel = transLabel;
1451 param->errCode = errCode;
1452 param->event = event;
1453 if (!AvdtAsyncProcess(AvdtCloseRspTsk, param)) {
1454 EventWait(event, WAIT_TIME);
1455 Ret = param->ret;
1456 }
1457 free(param);
1458 EventDelete(event);
1459 return Ret;
1460 }
1461
AvdtCloseRspTsk(void * context)1462 void AvdtCloseRspTsk(void *context)
1463 {
1464 AvdtCloseRspTskParam *param = (AvdtCloseRspTskParam *)context;
1465 param->ret = AvdtCloseRsp(param->handle, param->transLabel, param->errCode);
1466 EventSet(param->event);
1467 return;
1468 }
1469
AvdtCloseRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)1470 uint16_t AvdtCloseRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
1471 {
1472 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),transLabel(%hhu),errCode(%hhu)", __func__, handle, transLabel, errCode);
1473 uint16_t Ret = AVDT_SUCCESS;
1474 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1475 if (streamCtrl == NULL || handle == 0) {
1476 /* Trace input parameter invalid */
1477 Ret = AVDT_BAD_PARAMS;
1478 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1479 }
1480 if (Ret == AVDT_SUCCESS) {
1481 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1482 if (sigCtrl != NULL) {
1483 AvdtEventData evt = {0};
1484 evt.msg.single.errCode = errCode;
1485 evt.msg.single.label = transLabel;
1486 AvdtStreamProcEvent(streamCtrl, AVDT_CLOSE_CMD_RSP_EVENT, &evt);
1487 } else {
1488 Ret = AVDT_FAILED;
1489 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1490 }
1491 }
1492 return Ret;
1493 }
1494
1495 /**
1496 *
1497 * @brief AVDT_AbortReq
1498 *
1499 * @details This function is called to request to pass AVDT Abort.
1500 * AVDTP.ICS #Table 5-5, 5b-5 Abort stream command
1501 *
1502 * @return AVDT_SUCCESS if successful, otherwise error.
1503 *
1504 */
AVDT_AbortReq(uint16_t handle,uint8_t * transLabel)1505 uint16_t AVDT_AbortReq(uint16_t handle, uint8_t *transLabel)
1506 {
1507 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1508 uint16_t Ret = AVDT_FAILED;
1509 Event *event = EventCreate(true);
1510 AvdtAbortReqTskParam *param = malloc(sizeof(AvdtAbortReqTskParam));
1511 if (param == NULL) {
1512 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1513 EventDelete(event);
1514 return Ret;
1515 }
1516 (void)memset_s(param, sizeof(AvdtAbortReqTskParam), 0, sizeof(AvdtAbortReqTskParam));
1517 param->handle = handle;
1518 param->transLabel = transLabel;
1519 param->event = event;
1520 if (!AvdtAsyncProcess(AvdtAbortReqTsk, param)) {
1521 EventWait(event, WAIT_TIME);
1522 Ret = param->ret;
1523 }
1524 free(param);
1525 EventDelete(event);
1526 return Ret;
1527 }
1528
AvdtAbortReqTsk(void * context)1529 void AvdtAbortReqTsk(void *context)
1530 {
1531 AvdtAbortReqTskParam *param = (AvdtAbortReqTskParam *)context;
1532 param->ret = AvdtAbortReq(param->handle, param->transLabel);
1533 EventSet(param->event);
1534 return;
1535 }
1536
AvdtAbortReq(uint16_t handle,uint8_t * transLabel)1537 uint16_t AvdtAbortReq(uint16_t handle, uint8_t *transLabel)
1538 {
1539 LOG_DEBUG("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1540 uint16_t Ret = AVDT_SUCCESS;
1541 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1542 if (streamCtrl == NULL) {
1543 /* Trace input parameter invalid */
1544 Ret = AVDT_BAD_PARAMS;
1545 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1546 }
1547 if (Ret == AVDT_SUCCESS) {
1548 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1549 if (sigCtrl != NULL) {
1550 AvdtEventData evt = {0};
1551 evt.msg.single.seid = streamCtrl->peerSeid;
1552 AvdtStreamProcEvent(streamCtrl, AVDT_ABORT_CMD_REQ_EVENT, &evt);
1553 *transLabel = AvdtCreateTransLabel(sigCtrl);
1554 } else {
1555 Ret = AVDT_FAILED;
1556 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1557 }
1558 }
1559 return Ret;
1560 }
1561
1562 /**
1563 *
1564 * @brief AVDT_AbortRsp
1565 *
1566 * @details The response of Abort request from peer device.
1567 * AVDTP.ICS #Table 11-5, 11b-5 Abort stream response
1568 *
1569 * @return AVDT_SUCCESS if successful, otherwise error.
1570 *
1571 */
AVDT_AbortRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)1572 uint16_t AVDT_AbortRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
1573 {
1574 LOG_INFO("[AVDT]%{public}s:handle(%hu),transLabel(%hhu),errCode(%hhu) ", __func__, handle, transLabel, errCode);
1575 uint16_t Ret = AVDT_FAILED;
1576 Event *event = EventCreate(true);
1577 AvdtAbortRspTskParam *param = malloc(sizeof(AvdtAbortRspTskParam));
1578 if (param == NULL) {
1579 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1580 EventDelete(event);
1581 return Ret;
1582 }
1583 (void)memset_s(param, sizeof(AvdtAbortRspTskParam), 0, sizeof(AvdtAbortRspTskParam));
1584 param->handle = handle;
1585 param->transLabel = transLabel;
1586 param->errCode = errCode;
1587 param->event = event;
1588 if (!AvdtAsyncProcess(AvdtAbortRspTsk, param)) {
1589 EventWait(event, WAIT_TIME);
1590 Ret = param->ret;
1591 }
1592 free(param);
1593 EventDelete(event);
1594 return Ret;
1595 }
1596
AvdtAbortRspTsk(void * context)1597 void AvdtAbortRspTsk(void *context)
1598 {
1599 AvdtAbortRspTskParam *param = (AvdtAbortRspTskParam *)context;
1600 param->ret = AvdtAbortRsp(param->handle, param->transLabel, param->errCode);
1601 EventSet(param->event);
1602 return;
1603 }
1604
AvdtAbortRsp(uint16_t handle,uint8_t transLabel,uint8_t errCode)1605 uint16_t AvdtAbortRsp(uint16_t handle, uint8_t transLabel, uint8_t errCode)
1606 {
1607 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),transLabel(%hhu),errCode(%hhu) ", __func__, handle, transLabel, errCode);
1608 uint16_t Ret = AVDT_SUCCESS;
1609 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1610 if (handle == 0 || streamCtrl == NULL) {
1611 /* Trace input parameter invalid */
1612 Ret = AVDT_BAD_PARAMS;
1613 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1614 }
1615 if (Ret == AVDT_SUCCESS) {
1616 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1617 if (sigCtrl != NULL) {
1618 AvdtEventData evt = {0};
1619 evt.msg.single.errCode = errCode;
1620 evt.msg.single.label = transLabel;
1621 AvdtStreamProcEvent(streamCtrl, AVDT_ABORT_CMD_RSP_EVENT, &evt);
1622 } else {
1623 Ret = AVDT_FAILED;
1624 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1625 }
1626 }
1627 return Ret;
1628 }
1629
1630 /**
1631 *
1632 * @brief AVDT_ReconfigReq
1633 *
1634 * @details Reconfigure a stream endpoint. It allows the application
1635 * can only be called if the stream is opened but not started
1636 * to change the codec capabilities of a stream endpoint after
1637 * it has been opened. When the procedure is completed, an
1638 * AVDT_RECONFIG_CFM_EVT is sent to the application via the
1639 * control callback function for this handle.
1640 * AVDTP.ICS #Table 4-5, 4b-5 Reconfigure command
1641 *
1642 * @return AVDT_SUCCESS if successful, otherwise error.
1643 *
1644 */
AVDT_ReconfigReq(uint16_t handle,AvdtSepConfig * cfg,uint8_t * transLabel)1645 uint16_t AVDT_ReconfigReq(uint16_t handle, AvdtSepConfig *cfg, uint8_t *transLabel)
1646 {
1647 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1648 uint16_t Ret = AVDT_FAILED;
1649 Event *event = EventCreate(true);
1650 AvdtReconfigReqTskParam *param = malloc(sizeof(AvdtReconfigReqTskParam));
1651 if (param == NULL) {
1652 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1653 EventDelete(event);
1654 return Ret;
1655 }
1656 (void)memset_s(param, sizeof(AvdtReconfigReqTskParam), 0, sizeof(AvdtReconfigReqTskParam));
1657 param->handle = handle;
1658 param->cfg = cfg;
1659 param->transLabel = transLabel;
1660 param->event = event;
1661 if (!AvdtAsyncProcess(AvdtReconfigReqTsk, param)) {
1662 EventWait(event, WAIT_TIME);
1663 Ret = param->ret;
1664 }
1665 free(param);
1666 EventDelete(event);
1667 return Ret;
1668 }
1669
AvdtReconfigReqTsk(void * context)1670 void AvdtReconfigReqTsk(void *context)
1671 {
1672 AvdtReconfigReqTskParam *param = (AvdtReconfigReqTskParam *)context;
1673 param->ret = AvdtReconfigReq(param->handle, param->cfg, param->transLabel);
1674 EventSet(param->event);
1675 return;
1676 }
1677
AvdtReconfigReq(uint16_t handle,AvdtSepConfig * cfg,uint8_t * transLabel)1678 uint16_t AvdtReconfigReq(uint16_t handle, AvdtSepConfig *cfg, uint8_t *transLabel)
1679 {
1680 LOG_DEBUG("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1681 uint16_t Ret = AVDT_SUCCESS;
1682 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1683 if (streamCtrl == NULL) {
1684 /* Trace input parameter invalid */
1685 Ret = AVDT_BAD_PARAMS;
1686 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1687 }
1688 if (AVDT_SUCCESS == Ret) {
1689 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1690 if (sigCtrl != NULL) {
1691 AvdtEventData evt = {0};
1692 evt.msg.reconfigureCmd.hdr.seid = streamCtrl->peerSeid;
1693 (void)memcpy_s(&evt.msg.reconfigureCmd.cfg, sizeof(AvdtSepConfig), cfg, sizeof(AvdtSepConfig));
1694 *transLabel = AvdtCreateTransLabel(sigCtrl);
1695 AvdtStreamProcEvent(streamCtrl, AVDT_RECONFIGURE_CMD_REQ_EVENT, &evt);
1696 } else {
1697 Ret = AVDT_FAILED;
1698 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1699 }
1700 }
1701 return Ret;
1702 }
1703
1704 /**
1705 *
1706 * @brief AVDT_ReconfigRsp
1707 *
1708 * @details Respond to a reconfigure request from ACP.This functionr
1709 * must be called if the application receives an
1710 * AVDT_RECONFIG_IND_EVT through its control callback.
1711 * AVDTP.ICS #Table 10-5, 10b-5 Reconfigure response
1712 *
1713 * @return AVDT_SUCCESS if successful, otherwise error.
1714 *
1715 */
AVDT_ReconfigRsp(uint16_t handle,uint8_t transLabel,AvdtCatetory category)1716 uint16_t AVDT_ReconfigRsp(uint16_t handle, uint8_t transLabel, AvdtCatetory category)
1717 {
1718 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1719 uint16_t Ret = AVDT_FAILED;
1720 Event *event = EventCreate(true);
1721 AvdtReconfigRspTskParam *param = malloc(sizeof(AvdtReconfigRspTskParam));
1722 if (param == NULL) {
1723 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1724 EventDelete(event);
1725 return Ret;
1726 }
1727 (void)memset_s(param, sizeof(AvdtReconfigRspTskParam), 0, sizeof(AvdtReconfigRspTskParam));
1728 param->handle = handle;
1729 param->transLabel = transLabel;
1730 (void)memcpy_s(¶m->category, sizeof(AvdtCatetory), &category, sizeof(AvdtCatetory));
1731 param->event = event;
1732 if (!AvdtAsyncProcess(AvdtReconfigRspTsk, param)) {
1733 EventWait(event, WAIT_TIME);
1734 Ret = param->ret;
1735 }
1736 free(param);
1737 EventDelete(event);
1738 return Ret;
1739 }
1740
AvdtReconfigRspTsk(void * context)1741 void AvdtReconfigRspTsk(void *context)
1742 {
1743 AvdtReconfigRspTskParam *param = (AvdtReconfigRspTskParam *)context;
1744 param->ret = AvdtReconfigRsp(param->handle, param->transLabel, param->category);
1745 EventSet(param->event);
1746 return;
1747 }
1748
AvdtReconfigRsp(uint16_t handle,uint8_t transLabel,AvdtCatetory category)1749 uint16_t AvdtReconfigRsp(uint16_t handle, uint8_t transLabel, AvdtCatetory category)
1750 {
1751 LOG_DEBUG("[AVDT]%{public}s:handle(%hu)", __func__, handle);
1752 uint16_t Ret = AVDT_SUCCESS;
1753 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1754 if (streamCtrl == NULL || handle == 0) {
1755 /* Trace input parameter invalid */
1756 Ret = AVDT_BAD_PARAMS;
1757 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1758 }
1759 if (Ret == AVDT_SUCCESS) {
1760 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1761 if (sigCtrl != NULL) {
1762 AvdtEventData evt = {0};
1763 evt.msg.configureCmd.hdr.errCode = category.errCode;
1764 evt.msg.configureCmd.hdr.label = transLabel;
1765 evt.msg.configureCmd.hdr.errParam = category.category;
1766 AvdtStreamProcEvent(streamCtrl, AVDT_RECONFIGURE_CMD_RSP_EVENT, &evt);
1767 } else {
1768 Ret = AVDT_FAILED;
1769 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1770 }
1771 }
1772 return Ret;
1773 }
1774
1775 /**
1776 *
1777 * @brief AVDT_WriteReq
1778 *
1779 * @details Send a media packet from SOURCE to the SINK and the status
1780 * of the stream must be streaming.
1781 * AVDTP 13.2.1
1782 *
1783 * @return AVDT_SUCCESS if successful, otherwise error.
1784 *
1785 */
AVDT_WriteReq(uint16_t handle,const Packet * pkt,uint32_t timeStamp,uint8_t payloadType,uint16_t marker)1786 uint16_t AVDT_WriteReq(uint16_t handle, const Packet *pkt, uint32_t timeStamp, uint8_t payloadType, uint16_t marker)
1787 {
1788 LOG_INFO("[AVDT]%{public}s:handle(%hu),timeStamp(%u),payloadType(%hhu),marker(%hu),pktlen(%u)",
1789 __func__,
1790 handle,
1791 timeStamp,
1792 payloadType,
1793 marker,
1794 PacketSize(pkt));
1795 uint16_t Ret = AVDT_FAILED;
1796 Event *event = EventCreate(true);
1797 AvdtWriteReqTskParam *param = malloc(sizeof(AvdtWriteReqTskParam));
1798 if (param == NULL) {
1799 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1800 EventDelete(event);
1801 return Ret;
1802 }
1803 (void)memset_s(param, sizeof(AvdtWriteReqTskParam), 0, sizeof(AvdtWriteReqTskParam));
1804 param->handle = handle;
1805 param->pkt = PacketRefMalloc(pkt);
1806 param->timeStamp = timeStamp;
1807 param->payloadType = payloadType;
1808 param->marker = marker;
1809 param->event = event;
1810 if (!AvdtAsyncProcess(AvdtWriteReqTsk, param)) {
1811 EventWait(event, WAIT_TIME);
1812 Ret = param->ret;
1813 }
1814 PacketFree(param->pkt);
1815 free(param);
1816 EventDelete(event);
1817 return Ret;
1818 }
1819
AvdtWriteReqTsk(void * context)1820 void AvdtWriteReqTsk(void *context)
1821 {
1822 AvdtWriteReqTskParam *param = (AvdtWriteReqTskParam *)context;
1823 param->ret = AvdtWriteReq(param->handle, param->pkt, param->timeStamp, param->payloadType, param->marker);
1824 EventSet(param->event);
1825 return;
1826 }
1827
AvdtWriteReq(uint16_t handle,Packet * pkt,uint32_t timeStamp,uint8_t payloadType,uint16_t marker)1828 uint16_t AvdtWriteReq(uint16_t handle, Packet *pkt, uint32_t timeStamp, uint8_t payloadType, uint16_t marker)
1829 {
1830 LOG_DEBUG("[AVDT]%{public}s:handle(%hu),timeStamp(%u),payloadType(%hhu),marker(%hu),pktlen(%u)",
1831 __func__,
1832 handle,
1833 timeStamp,
1834 payloadType,
1835 marker,
1836 PacketSize(pkt));
1837 uint16_t Ret = AVDT_SUCCESS;
1838 /* pkt data debug print */
1839 AvdtPktDataPrint(pkt);
1840 AvdtStreamCtrl *streamCtrl = AvdtGetStreamCtrlByHandle(handle);
1841 if (streamCtrl == NULL) {
1842 /* Trace input bad parameters */
1843 Ret = AVDT_BAD_HANDLE;
1844 LOG_ERROR("[AVDT]%{public}s: AvdtGetStreamCtrlByHandle(%hu) Failed!", __func__, handle);
1845 } else {
1846 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByHandle(streamCtrl->sigHandle);
1847 if (sigCtrl != NULL) {
1848 AvdtEventData evt = {0};
1849 evt.apiWrite.marker = marker;
1850 evt.apiWrite.pkt = pkt;
1851 evt.apiWrite.timeStamp = timeStamp;
1852 evt.apiWrite.payloadType = payloadType;
1853 AvdtStreamProcEvent(streamCtrl, AVDT_WRITE_CMD_REQ_EVENT, &evt);
1854 } else {
1855 Ret = AVDT_FAILED;
1856 LOG_ERROR("[AVDT]%{public}s: AvdtGetSigCtrlByHandle(%hhu) Failed", __func__, streamCtrl->sigHandle);
1857 }
1858 }
1859 return Ret;
1860 }
1861
1862 /**
1863 *
1864 * @brief AVDT_ConnectRsp
1865 *
1866 * @details Respond to a connect request from ACP. This function must
1867 * be called if the application receives an
1868 * AVDT_CONNECT_IND_EVT through its control callback.
1869 * AVDTP.ICS #Table 9-1, 9b-1 Establish signaling channel
1870 *
1871 * @return AVDT_SUCCESS if successful, otherwise error.
1872 *
1873 */
AVDT_ConnectRsp(const BtAddr * bdAddr,uint8_t errCode)1874 uint16_t AVDT_ConnectRsp(const BtAddr *bdAddr, uint8_t errCode)
1875 {
1876 LOG_DEBUG("[AVDT]%{public}s:", __func__);
1877 uint16_t Ret = AVDT_SUCCESS;
1878 return Ret;
1879 }
1880
1881 /**
1882 *
1883 * @brief AVDT_ConnectReq
1884 *
1885 * @details This function send an AVDT_CONNECT_REQ from INT to ACP.
1886 * When the connection is completed, an AVDT_CONNECT_CFM_EVT
1887 * is sent to the application via its control callback
1888 * function.
1889 * AVDTP.ICS #Table 3-1, 3b-1 Establish signaling channel
1890 *
1891 * @return AVDT_SUCCESS if successful, otherwise error.
1892 *
1893 */
AVDT_ConnectReq(const BtAddr * bdAddr,uint8_t role)1894 uint16_t AVDT_ConnectReq(const BtAddr *bdAddr, uint8_t role)
1895 {
1896 LOG_INFO("[AVDT]%{public}s: addr(%02x:%02x:%02x:%02x:%02x:%02x),pkrole(%hhu)",
1897 __func__, BT_ADDR_FMT_DSC(bdAddr->addr), role);
1898 uint16_t Ret = AVDT_FAILED;
1899 Event *event = EventCreate(true);
1900 AvdtConnectReqTskParam *param = malloc(sizeof(AvdtConnectReqTskParam));
1901 if (param == NULL) {
1902 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1903 EventDelete(event);
1904 return Ret;
1905 }
1906 (void)memset_s(param, sizeof(AvdtConnectReqTskParam), 0, sizeof(AvdtConnectReqTskParam));
1907 param->bdAddr = bdAddr;
1908 param->role = role;
1909 param->event = event;
1910 if (!AvdtAsyncProcess(AvdtConnectReqTsk, param)) {
1911 EventWait(event, WAIT_TIME);
1912 Ret = param->ret;
1913 }
1914 free(param);
1915 EventDelete(event);
1916 return Ret;
1917 }
1918
AvdtConnectReqTsk(void * context)1919 void AvdtConnectReqTsk(void *context)
1920 {
1921 AvdtConnectReqTskParam *param = (AvdtConnectReqTskParam *)context;
1922 param->ret = AvdtConnectReq(param->bdAddr, param->role);
1923 EventSet(param->event);
1924 return;
1925 }
1926
AvdtConnectReq(const BtAddr * bdAddr,uint8_t role)1927 uint16_t AvdtConnectReq(const BtAddr *bdAddr, uint8_t role)
1928 {
1929 LOG_DEBUG("[AVDT]%{public}s: addr(%02x:%02x:%02x:%02x:%02x:%02x),pkrole(%hhu)",
1930 __func__, BT_ADDR_FMT_DSC(bdAddr->addr), role);
1931 uint16_t Ret = AVDT_SUCCESS;
1932 AvdtTransChannel *transTbl = NULL;
1933 AvdtCtrlData confirmData = {0};
1934 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
1935 if (sigCtrl == NULL) {
1936 /* Trace:No resources */
1937 Ret = AVDT_NO_RESOURCES;
1938 LOG_WARN("[AVDT]%{public}s: Ret(%hu)", __func__, Ret);
1939 }
1940 if (Ret == AVDT_SUCCESS) {
1941 /* judge the signal channel is created or not */
1942 transTbl = AvdtGetTransChTabByAddr(bdAddr, 0);
1943 sigCtrl->role = role;
1944 if (transTbl != NULL) {
1945 AvdtCtrlEvtCallback(sigCtrl, sigCtrl->handle, bdAddr, AVDT_CONNECT_CFM_EVT, &confirmData, role);
1946 return Ret;
1947 }
1948 sigCtrl->peerAddress = *bdAddr;
1949 AvdtSigProcEvent(sigCtrl, AVDT_CONNECT_CMD_REQ_EVENT, NULL);
1950 }
1951 return Ret;
1952 }
1953
1954 /**
1955 *
1956 * @brief AVDT_DisconnectReq
1957 *
1958 * @details This function send an AVDT_DISCONNECT_REQ from INT to ACP.
1959 * When the connection is completed, an AVDT_DISCONNECT_CFM_EVT
1960 * is sent to the application via its control callback function.
1961 * AVDTP.ICS #Table 3-2, 3b-2 Establish signaling channel
1962 *
1963 * @return AVDT_SUCCESS if successful, otherwise error.
1964 *
1965 */
AVDT_DisconnectReq(const BtAddr * bdAddr)1966 uint16_t AVDT_DisconnectReq(const BtAddr *bdAddr)
1967 {
1968 LOG_INFO("[AVDT]%{public}s: addr(%02x:%02x:%02x:%02x:%02x:%02x)", __func__, BT_ADDR_FMT_DSC(bdAddr->addr));
1969 uint16_t Ret = AVDT_FAILED;
1970 Event *event = EventCreate(true);
1971 AvdtDisconnectReqTskParam *param = malloc(sizeof(AvdtDisconnectReqTskParam));
1972 if (param == NULL) {
1973 LOG_ERROR("[AVDT] %{public}s: memory malloc failed", __func__);
1974 EventDelete(event);
1975 return Ret;
1976 }
1977 (void)memset_s(param, sizeof(AvdtDisconnectReqTskParam), 0, sizeof(AvdtDisconnectReqTskParam));
1978 param->bdAddr = bdAddr;
1979 param->event = event;
1980 if (!AvdtAsyncProcess(AvdtDisconnectReqTsk, param)) {
1981 EventWait(event, WAIT_TIME);
1982 Ret = param->ret;
1983 }
1984 free(param);
1985 EventDelete(event);
1986 return Ret;
1987 }
1988
AvdtDisconnectReqTsk(void * context)1989 void AvdtDisconnectReqTsk(void *context)
1990 {
1991 AvdtDisconnectReqTskParam *param = (AvdtDisconnectReqTskParam *)context;
1992 param->ret = AvdtDisconnectReq(param->bdAddr);
1993 EventSet(param->event);
1994 return;
1995 }
AvdtDisconnectReq(const BtAddr * bdAddr)1996 uint16_t AvdtDisconnectReq(const BtAddr *bdAddr)
1997 {
1998 LOG_DEBUG("[AVDT]%{public}s: addr(%02x:%02x:%02x:%02x:%02x:%02x)", __func__, BT_ADDR_FMT_DSC(bdAddr->addr));
1999 uint16_t Ret = AVDT_SUCCESS;
2000 AvdtSigCtrl *sigCtrl = AvdtGetSigCtrlByAddr(bdAddr);
2001 if (sigCtrl == NULL) {
2002 /* Trace:No resources */
2003 Ret = AVDT_NO_RESOURCES;
2004 LOG_ERROR("[AVDT]%{public}s: The sigCtrl is no exist!", __func__);
2005 }
2006 if (Ret == AVDT_SUCCESS) {
2007 sigCtrl->peerAddress = *bdAddr;
2008 AvdtSigProcEvent(sigCtrl, AVDT_DISCONNECT_CMD_REQ_EVENT, NULL);
2009 }
2010 return Ret;
2011 }
2012
2013 /**
2014 *
2015 * @brief AVDT_DisconnectRsp
2016 *
2017 * @details Respond to a disconnect request from ACP. This function
2018 * must be called if the application receives an
2019 * AVDT_DISCONNECT_IND_EVT through its control callback.
2020 * AVDTP.ICS #Table 9-2, 9b-2 Establish signaling channel
2021 *
2022 * @return AVDT_SUCCESS if successful, otherwise error.
2023 *
2024 */
AVDT_DisconnectRsp(const BtAddr * bdAddr,uint8_t errCode)2025 uint16_t AVDT_DisconnectRsp(const BtAddr *bdAddr, uint8_t errCode)
2026 {
2027 LOG_INFO("[AVDT]%{public}s:errCode(%hhu)", __func__, errCode);
2028 uint16_t Ret = AVDT_SUCCESS;
2029 return Ret;
2030 }
2031
2032 /**
2033 *
2034 * @brief AVDT_GetL2capChannelByHandle
2035 *
2036 * @details Get the L2CAP CID used by the handle.
2037 *
2038 * @return LCID if successful, otherwise 0.
2039 *
2040 */
AVDT_GetL2capChannelByHandle(uint16_t handle)2041 uint16_t AVDT_GetL2capChannelByHandle(uint16_t handle)
2042 {
2043 LOG_INFO("[AVDT]%{public}s:handle(%hu)", __func__, handle);
2044 uint16_t Ret = AVDT_SUCCESS;
2045 return Ret;
2046 }
2047
2048 /**
2049 *
2050 * @brief AVDT_Rej
2051 *
2052 * @details Send a reject message from ACP to INT.
2053 * AVDTP.ICS #Table 11-6,11b-6,16-3 General Reject Response
2054 * Includes Signal ID,General reject message
2055 *
2056 @return void
2057 *
2058 */
AVDT_Rej(uint16_t handle,const BtAddr * bdAddr,uint8_t cmd,uint8_t transLabel,AvdtRejErrInfo errInfo)2059 void AVDT_Rej(uint16_t handle, const BtAddr *bdAddr, uint8_t cmd, uint8_t transLabel, AvdtRejErrInfo errInfo)
2060 {
2061 LOG_DEBUG("[AVDT]%{public}s:", __func__);
2062 return;
2063 }