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(&param->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(&param->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 }