1 /******************************************************************************
3 * Copyright (C) 2004-2012 Broadcom Corporation
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 ******************************************************************************/
19 /******************************************************************************
21 * This is the main implementation file for the BTA advanced audio/video.
23 ******************************************************************************/
28 #include "bt_target.h"
29 #include "osi/include/log.h"
31 #if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE)
32 #include "bta_av_int.h"
36 #include "bta_av_co.h"
37 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
38 #include "bta_ar_api.h"
41 /*****************************************************************************
42 ** Constants and types
43 *****************************************************************************/
45 /* AVDTP protocol timeout values */
46 #define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink"
48 #ifndef BTA_AV_RET_TOUT
49 #define BTA_AV_RET_TOUT 4
52 #ifndef BTA_AV_SIG_TOUT
53 #define BTA_AV_SIG_TOUT 4
56 #ifndef BTA_AV_IDLE_TOUT
57 #define BTA_AV_IDLE_TOUT 10
60 /* the delay time in milliseconds to retry role switch */
61 #ifndef BTA_AV_RS_TIME_VAL
62 #define BTA_AV_RS_TIME_VAL 1000
65 /* state machine states */
72 /* state machine action enumeration list */
88 #define BTA_AV_IGNORE BTA_AV_NUM_ACTIONS
90 /* type for action functions */
91 typedef void (*tBTA_AV_ACTION)(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data);
93 /* action functions */
94 const tBTA_AV_ACTION bta_av_action[] =
100 bta_av_rc_vendor_rsp,
109 /* state table information */
110 #define BTA_AV_ACTION_COL 0 /* position of actions */
111 #define BTA_AV_NEXT_STATE 1 /* position of next state */
112 #define BTA_AV_NUM_COLS 2 /* number of columns in state tables */
114 /* state table for init state */
115 static const UINT8 bta_av_st_init[][BTA_AV_NUM_COLS] =
117 /* Event Action 1 Next state */
118 /* API_DISABLE_EVT */ {BTA_AV_DISABLE, BTA_AV_INIT_ST },
119 /* API_REMOTE_CMD_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
120 /* API_VENDOR_CMD_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
121 /* API_VENDOR_RSP_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
122 /* API_META_RSP_EVT */ {BTA_AV_RC_FREE_RSP, BTA_AV_INIT_ST },
123 /* API_RC_CLOSE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
124 /* AVRC_OPEN_EVT */ {BTA_AV_RC_OPENED, BTA_AV_OPEN_ST },
125 /* AVRC_MSG_EVT */ {BTA_AV_RC_FREE_MSG, BTA_AV_INIT_ST },
126 /* AVRC_NONE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
129 /* state table for open state */
130 static const UINT8 bta_av_st_open[][BTA_AV_NUM_COLS] =
132 /* Event Action 1 Next state */
133 /* API_DISABLE_EVT */ {BTA_AV_DISABLE, BTA_AV_INIT_ST },
134 /* API_REMOTE_CMD_EVT */ {BTA_AV_RC_REMOTE_CMD, BTA_AV_OPEN_ST },
135 /* API_VENDOR_CMD_EVT */ {BTA_AV_RC_VENDOR_CMD, BTA_AV_OPEN_ST },
136 /* API_VENDOR_RSP_EVT */ {BTA_AV_RC_VENDOR_RSP, BTA_AV_OPEN_ST },
137 /* API_META_RSP_EVT */ {BTA_AV_RC_META_RSP, BTA_AV_OPEN_ST },
138 /* API_RC_CLOSE_EVT */ {BTA_AV_RC_CLOSE, BTA_AV_OPEN_ST },
139 /* AVRC_OPEN_EVT */ {BTA_AV_RC_OPENED, BTA_AV_OPEN_ST },
140 /* AVRC_MSG_EVT */ {BTA_AV_RC_MSG, BTA_AV_OPEN_ST },
141 /* AVRC_NONE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
144 /* type for state table */
145 typedef const UINT8 (*tBTA_AV_ST_TBL)[BTA_AV_NUM_COLS];
148 static const tBTA_AV_ST_TBL bta_av_st_tbl[] =
154 typedef void (*tBTA_AV_NSM_ACT)(tBTA_AV_DATA *p_data);
155 static void bta_av_api_enable(tBTA_AV_DATA *p_data);
156 static void bta_av_api_register(tBTA_AV_DATA *p_data);
157 #if (BTA_AV_SINK_INCLUDED == TRUE)
158 static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data);
160 static void bta_av_ci_data(tBTA_AV_DATA *p_data);
161 #if (AVDT_REPORTING == TRUE)
162 static void bta_av_rpc_conn(tBTA_AV_DATA *p_data);
164 static void bta_av_api_to_ssm(tBTA_AV_DATA *p_data);
166 static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8
167 app_id, BD_ADDR peer_addr);
168 static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
171 /* action functions */
172 const tBTA_AV_NSM_ACT bta_av_nsm_act[] =
174 bta_av_api_enable, /* BTA_AV_API_ENABLE_EVT */
175 bta_av_api_register, /* BTA_AV_API_REGISTER_EVT */
176 bta_av_api_deregister, /* BTA_AV_API_DEREGISTER_EVT */
177 bta_av_api_disconnect, /* BTA_AV_API_DISCONNECT_EVT */
178 bta_av_ci_data, /* BTA_AV_CI_SRC_DATA_READY_EVT */
179 bta_av_sig_chg, /* BTA_AV_SIG_CHG_EVT */
180 bta_av_sig_timer, /* BTA_AV_SIG_TIMER_EVT */
181 bta_av_rc_disc_done, /* BTA_AV_SDP_AVRC_DISC_EVT */
182 bta_av_rc_closed, /* BTA_AV_AVRC_CLOSE_EVT */
183 bta_av_conn_chg, /* BTA_AV_CONN_CHG_EVT */
184 bta_av_dereg_comp, /* BTA_AV_DEREG_COMP_EVT */
185 #if (BTA_AV_SINK_INCLUDED == TRUE)
186 bta_av_api_sink_enable, /* BTA_AV_API_SINK_ENABLE_EVT */
188 #if (AVDT_REPORTING == TRUE)
189 bta_av_rpc_conn, /* BTA_AV_AVDT_RPT_CONN_EVT */
191 bta_av_api_to_ssm, /* BTA_AV_API_START_EVT */
192 bta_av_api_to_ssm, /* BTA_AV_API_STOP_EVT */
195 /*****************************************************************************
197 *****************************************************************************/
199 /* AV control block */
200 #if BTA_DYNAMIC_MEMORY == FALSE
201 tBTA_AV_CB bta_av_cb;
204 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
205 static char *bta_av_st_code(UINT8 state);
208 /*******************************************************************************
210 ** Function bta_av_timer_cback
212 ** Description forward the event to stream state machine
216 *******************************************************************************/
217 static void bta_av_timer_cback(void *p_tle)
220 TIMER_LIST_ENT *p = (TIMER_LIST_ENT *)p_tle;
222 tBTA_AV_SCB *p_scb = NULL;
224 /* find the SCB that has the timer */
225 for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
227 if(bta_av_cb.p_scb[xx] && &(bta_av_cb.p_scb[xx]->timer)== p)
229 p_scb = bta_av_cb.p_scb[xx];
234 if (p_scb && (p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
236 /* send the event through the audio state machine.
237 * only when the audio SM is open, the main SM opens the RC connection as INT */
238 p_buf->event = p->event;
239 p_buf->layer_specific = p_scb->hndl;
240 bta_sys_sendmsg(p_buf);
244 /*******************************************************************************
246 ** Function bta_av_api_enable
248 ** Description Handle an API enable event.
253 *******************************************************************************/
254 static void bta_av_api_enable(tBTA_AV_DATA *p_data)
257 tBTA_AV_ENABLE enable;
259 /* initialize control block */
260 memset(&bta_av_cb, 0, sizeof(tBTA_AV_CB));
262 for(i=0; i<BTA_AV_NUM_RCB; i++)
263 bta_av_cb.rcb[i].handle = BTA_AV_RC_HANDLE_NONE;
265 bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE;
267 /* store parameters */
268 bta_av_cb.p_cback = p_data->api_enable.p_cback;
269 bta_av_cb.features = p_data->api_enable.features;
270 bta_av_cb.sec_mask = p_data->api_enable.sec_mask;
272 enable.features = bta_av_cb.features;
274 /* Register for SCO change event */
275 if (!(bta_av_cb.features & BTA_AV_FEAT_NO_SCO_SSPD))
277 bta_sys_sco_register(bta_av_sco_chg_cback);
280 /* call callback with enable event */
281 (*bta_av_cb.p_cback)(BTA_AV_ENABLE_EVT, (tBTA_AV *)&enable);
284 /*******************************************************************************
286 ** Function bta_av_addr_to_scb
288 ** Description find the stream control block by the peer addr
292 *******************************************************************************/
293 static tBTA_AV_SCB * bta_av_addr_to_scb(BD_ADDR bd_addr)
295 tBTA_AV_SCB * p_scb = NULL;
298 for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
300 if(bta_av_cb.p_scb[xx])
302 if(!bdcmp(bd_addr, bta_av_cb.p_scb[xx]->peer_addr))
304 p_scb = bta_av_cb.p_scb[xx];
312 /*******************************************************************************
314 ** Function bta_av_hndl_to_scb
316 ** Description find the stream control block by the handle
320 *******************************************************************************/
321 tBTA_AV_SCB * bta_av_hndl_to_scb(UINT16 handle)
323 tBTA_AV_HNDL hndl = (tBTA_AV_HNDL)handle;
324 tBTA_AV_SCB * p_scb = NULL;
325 UINT8 idx = (hndl & BTA_AV_HNDL_MSK);
327 if(idx && (idx <= BTA_AV_NUM_STRS) )
329 p_scb = bta_av_cb.p_scb[idx-1];
334 /*******************************************************************************
336 ** Function bta_av_alloc_scb
338 ** Description allocate stream control block,
339 ** register the service to stack
344 *******************************************************************************/
345 static tBTA_AV_SCB * bta_av_alloc_scb(tBTA_AV_CHNL chnl)
347 tBTA_AV_SCB *p_ret = NULL;
349 tBTA_AV_STATUS sts = BTA_AV_SUCCESS;
351 if(chnl == BTA_AV_CHNL_VIDEO)
353 if(p_bta_av_cfg->p_act_tbl == NULL || p_bta_av_cfg->p_reg == NULL)
355 APPL_TRACE_ERROR("Video streaming not supported");
360 /* allow only one Video channel */
361 if(bta_av_cb.reg_video)
363 APPL_TRACE_ERROR("Already registered");
368 else if(chnl != BTA_AV_CHNL_AUDIO)
370 APPL_TRACE_ERROR("bad channel: %d", chnl);
374 if(sts == BTA_AV_SUCCESS)
376 for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
378 if(bta_av_cb.p_scb[xx] == NULL)
380 /* found an empty spot */
381 p_ret = (tBTA_AV_SCB *)GKI_getbuf(sizeof(tBTA_AV_SCB));
384 memset(p_ret, 0, sizeof(tBTA_AV_SCB));
385 p_ret->rc_handle = BTA_AV_RC_HANDLE_NONE;
387 p_ret->hndl = (tBTA_AV_HNDL)((xx + 1) | chnl);
389 p_ret->a2d_list = list_new(NULL);
390 bta_av_cb.p_scb[xx] = p_ret;
399 /*******************************************************************************
401 ** Function bta_av_free_scb
403 ** Description free stream control block,
408 *******************************************************************************/
409 static void bta_av_free_scb(tBTA_AV_SCB *p_scb)
411 // NOTE(google) This free currently is not called
412 assert(p_scb != NULL);
414 list_free(p_scb->a2d_list);
418 /*******************************************************************************
419 *******************************************************************************/
420 void bta_av_conn_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
422 tBTA_AV_STR_MSG *p_msg;
424 tBTA_AV_SCB *p_scb = NULL;
427 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
428 if (event == BTA_AR_AVDT_CONN_EVT ||
429 event == AVDT_CONNECT_IND_EVT || event == AVDT_DISCONNECT_IND_EVT)
431 if (event == AVDT_CONNECT_IND_EVT || event == AVDT_DISCONNECT_IND_EVT)
434 evt = BTA_AV_SIG_CHG_EVT;
435 if(AVDT_DISCONNECT_IND_EVT == event)
436 p_scb = bta_av_addr_to_scb(bd_addr);
437 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
438 else if (AVDT_CONNECT_IND_EVT == event)
440 APPL_TRACE_DEBUG("CONN_IND is ACP:%d", p_data->hdr.err_param);
444 if (/*((p_scb && (p_scb->role & BTA_AV_ROLE_AD_ACP)) ||
446 //(AVDT_CONNECT_IND_EVT == event && AVDT_ACP == p_data->hdr.err_param))
448 (AVDT_CONNECT_IND_EVT == event))&& */
449 (p_msg = (tBTA_AV_STR_MSG *) GKI_getbuf((UINT16) (sizeof(tBTA_AV_STR_MSG)))) != NULL)
451 p_msg->hdr.event = evt;
452 p_msg->hdr.layer_specific = event;
453 p_msg->hdr.offset = p_data->hdr.err_param;
454 bdcpy(p_msg->bd_addr, bd_addr);
455 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
458 APPL_TRACE_DEBUG("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role);
461 APPL_TRACE_DEBUG("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
462 bd_addr[0], bd_addr[1],
463 bd_addr[2], bd_addr[3],
464 bd_addr[4], bd_addr[5]);
465 bta_sys_sendmsg(p_msg);
471 #if AVDT_REPORTING == TRUE
472 /*******************************************************************************
474 ** Function bta_av_a2dp_report_cback
476 ** Description A2DP report callback.
480 *******************************************************************************/
481 static void bta_av_a2dp_report_cback(UINT8 handle, AVDT_REPORT_TYPE type,
482 tAVDT_REPORT_DATA *p_data)
487 /* Do not need to handle report data for now.
488 * This empty function is here for conformance reasons. */
492 #if (BTA_AV_SINK_INCLUDED == TRUE)
493 /*******************************************************************************
495 ** Function bta_av_api_sink_enable
497 ** Description activate, deactive A2DP Sink,
501 *******************************************************************************/
503 static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data)
505 UINT16 activate_sink = 0;
506 activate_sink = p_data->hdr.layer_specific;
507 APPL_TRACE_DEBUG("bta_av_api_sink_enable %d ", activate_sink)
508 char p_service_name[BTA_SERVICE_NAME_LEN+1];
509 BCM_STRNCPY_S(p_service_name, sizeof(p_service_name),
510 BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
514 AVDT_SINK_Activate();
515 if (bta_av_cb.sdp_a2d_snk_handle == 0)
517 bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord();
518 A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_service_name, NULL,
519 A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle);
520 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
525 AVDT_SINK_Deactivate();
526 if (bta_av_cb.sdp_a2d_snk_handle != 0)
528 SDP_DeleteRecord(bta_av_cb.sdp_a2d_snk_handle);
529 bta_av_cb.sdp_a2d_snk_handle = 0;
530 bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
535 /*******************************************************************************
537 ** Function bta_av_api_register
539 ** Description allocate stream control block,
540 ** register the service to stack
545 *******************************************************************************/
546 static void bta_av_api_register(tBTA_AV_DATA *p_data)
548 tBTA_AV_REGISTER registr;
549 tBTA_AV_SCB *p_scb; /* stream control block */
552 char *p_service_name;
553 tBTA_AV_CODEC codec_type;
556 char p_avk_service_name[BTA_SERVICE_NAME_LEN+1];
557 BCM_STRNCPY_S(p_avk_service_name, sizeof(p_avk_service_name), BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
559 memset(&cs,0,sizeof(tAVDT_CS));
561 registr.status = BTA_AV_FAIL_RESOURCES;
562 registr.app_id = p_data->api_reg.app_id;
563 registr.chnl = (tBTA_AV_CHNL)p_data->hdr.layer_specific;
566 p_scb = bta_av_alloc_scb(registr.chnl);
569 APPL_TRACE_ERROR("failed to alloc SCB");
573 registr.hndl = p_scb->hndl;
574 p_scb->app_id = registr.app_id;
576 /* initialize the stream control block */
577 p_scb->timer.p_cback = (TIMER_CBACK*)&bta_av_timer_cback;
578 registr.status = BTA_AV_SUCCESS;
580 if((bta_av_cb.reg_audio + bta_av_cb.reg_video) == 0)
582 /* the first channel registered. register to AVDTP */
583 reg.ctrl_mtu = p_bta_av_cfg->sig_mtu;
584 reg.ret_tout = BTA_AV_RET_TOUT;
585 reg.sig_tout = BTA_AV_SIG_TOUT;
586 reg.idle_tout = BTA_AV_IDLE_TOUT;
587 reg.sec_mask = bta_av_cb.sec_mask;
588 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
589 bta_ar_reg_avdt(®, bta_av_conn_cback, BTA_ID_AV);
591 bta_sys_role_chg_register(&bta_av_sys_rs_cback);
593 /* create remote control TG service if required */
594 if (bta_av_cb.features & (BTA_AV_FEAT_RCTG))
596 /* register with no authorization; let AVDTP use authorization instead */
597 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
598 #if (BTA_AV_WITH_AVCTP_AUTHORIZATION == TRUE)
599 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu,
600 bta_av_cb.sec_mask, BTA_ID_AV);
602 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu,
603 (UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV);
606 bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target", NULL,
607 p_bta_av_cfg->avrc_tg_cat, BTA_ID_AV);
611 /* Set the Capturing service class bit */
612 #if (BTA_AV_SINK_INCLUDED == TRUE)
613 cod.service = BTM_COD_SERVICE_CAPTURING | BTM_COD_SERVICE_RENDERING;
615 cod.service = BTM_COD_SERVICE_CAPTURING;
617 utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
618 } /* if 1st channel */
620 /* get stream configuration and create stream */
621 /* memset(&cs.cfg,0,sizeof(tAVDT_CFG)); */
622 cs.cfg.num_codec = 1;
623 cs.tsep = AVDT_TSEP_SRC;
626 * memset of cs takes care setting call back pointers to null.
627 cs.p_data_cback = NULL;
628 cs.p_report_cback = NULL;
630 cs.nsc_mask = AVDT_NSC_RECONFIG |
631 ((bta_av_cb.features & BTA_AV_FEAT_PROTECT) ? 0 : AVDT_NSC_SECURITY);
632 APPL_TRACE_DEBUG("nsc_mask: 0x%x", cs.nsc_mask);
634 if (p_data->api_reg.p_service_name[0] == 0)
636 p_service_name = NULL;
640 p_service_name = p_data->api_reg.p_service_name;
643 p_scb->suspend_sup = TRUE;
644 p_scb->recfg_sup = TRUE;
646 cs.p_ctrl_cback = bta_av_dt_cback[p_scb->hdi];
647 if(registr.chnl == BTA_AV_CHNL_AUDIO)
649 /* set up the audio stream control block */
650 p_scb->p_act_tbl = (const tBTA_AV_ACT *)bta_av_a2d_action;
651 p_scb->p_cos = &bta_av_a2d_cos;
652 p_scb->media_type= AVDT_MEDIA_AUDIO;
653 cs.cfg.psc_mask = AVDT_PSC_TRANS;
654 cs.media_type = AVDT_MEDIA_AUDIO;
655 cs.mtu = p_bta_av_cfg->audio_mtu;
656 cs.flush_to = L2CAP_DEFAULT_FLUSH_TO;
657 #if AVDT_REPORTING == TRUE
658 if(bta_av_cb.features & BTA_AV_FEAT_REPORT)
660 cs.cfg.psc_mask |= AVDT_PSC_REPORT;
661 cs.p_report_cback = bta_av_a2dp_report_cback;
662 #if AVDT_MULTIPLEXING == TRUE
663 cs.cfg.mux_tsid_report = 2;
667 if(bta_av_cb.features & BTA_AV_FEAT_DELAY_RPT)
668 cs.cfg.psc_mask |= AVDT_PSC_DELAY_RPT;
670 /* keep the configuration in the stream control block */
671 memcpy(&p_scb->cfg, &cs.cfg, sizeof(tAVDT_CFG));
672 while(index < BTA_AV_MAX_SEPS &&
673 (*bta_av_a2d_cos.init)(&codec_type, cs.cfg.codec_info,
674 &cs.cfg.num_protect, cs.cfg.protect_info, index) == TRUE)
677 #if (BTA_AV_SINK_INCLUDED == TRUE)
680 cs.tsep = AVDT_TSEP_SNK;
681 cs.p_data_cback = bta_av_stream_data_cback;
683 APPL_TRACE_DEBUG(" SEP Type = %d",cs.tsep);
685 if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS)
687 p_scb->seps[index].codec_type = codec_type;
689 #if (BTA_AV_SINK_INCLUDED == TRUE)
690 p_scb->seps[index].tsep = cs.tsep;
691 if(cs.tsep == AVDT_TSEP_SNK)
692 p_scb->seps[index].p_app_data_cback = p_data->api_reg.p_app_data_cback;
694 p_scb->seps[index].p_app_data_cback = NULL; /* In case of A2DP SOURCE we don't need a callback to handle media packets */
697 APPL_TRACE_DEBUG("audio[%d] av_handle: %d codec_type: %d",
698 index, p_scb->seps[index].av_handle, p_scb->seps[index].codec_type);
705 if(!bta_av_cb.reg_audio)
707 /* create the SDP records on the 1st audio channel */
708 bta_av_cb.sdp_a2d_handle = SDP_CreateRecord();
709 A2D_AddRecord(UUID_SERVCLASS_AUDIO_SOURCE, p_service_name, NULL,
710 A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_handle);
711 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
713 #if (BTA_AV_SINK_INCLUDED == TRUE)
714 bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord();
715 A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_avk_service_name, NULL,
716 A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle);
717 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
719 /* start listening when A2DP is registered */
720 if (bta_av_cb.features & BTA_AV_FEAT_RCTG)
721 bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1);
723 /* if the AV and AVK are both supported, it cannot support the CT role */
724 if (bta_av_cb.features & (BTA_AV_FEAT_RCCT))
726 /* if TG is not supported, we need to register to AVCT now */
727 if ((bta_av_cb.features & (BTA_AV_FEAT_RCTG)) == 0)
729 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
730 #if (BTA_AV_WITH_AVCTP_AUTHORIZATION == TRUE)
731 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu,
732 bta_av_cb.sec_mask, BTA_ID_AV);
734 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu,
735 (UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV);
739 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
740 /* create an SDP record as AVRC CT. */
741 bta_ar_reg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, NULL, NULL,
742 p_bta_av_cfg->avrc_ct_cat, BTA_ID_AV);
746 bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi);
747 APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
751 bta_av_cb.reg_video = BTA_AV_HNDL_TO_MSK(p_scb->hdi);
752 bta_av_cb.sdp_vdp_handle = SDP_CreateRecord();
753 /* register the video channel */
754 /* no need to verify the function pointer here. it's verified prior */
755 (*p_bta_av_cfg->p_reg)(&cs, p_service_name, p_scb);
759 /* call callback with register event */
760 (*bta_av_cb.p_cback)(BTA_AV_REGISTER_EVT, (tBTA_AV *)®istr);
763 /*******************************************************************************
765 ** Function bta_av_api_deregister
767 ** Description de-register a channel
772 *******************************************************************************/
773 void bta_av_api_deregister(tBTA_AV_DATA *p_data)
775 tBTA_AV_SCB *p_scb = bta_av_hndl_to_scb(p_data->hdr.layer_specific);
779 p_scb->deregistring = TRUE;
780 bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, p_data);
784 bta_av_dereg_comp(p_data);
788 /*******************************************************************************
790 ** Function bta_av_ci_data
792 ** Description forward the BTA_AV_CI_SRC_DATA_READY_EVT to stream state machine
797 *******************************************************************************/
798 static void bta_av_ci_data(tBTA_AV_DATA *p_data)
802 UINT8 chnl = (UINT8)p_data->hdr.layer_specific;
804 for( i=0; i < BTA_AV_NUM_STRS; i++ )
806 p_scb = bta_av_cb.p_scb[i];
808 if(p_scb && p_scb->chnl == chnl)
810 bta_av_ssm_execute(p_scb, BTA_AV_SRC_DATA_READY_EVT, p_data);
815 /*******************************************************************************
817 ** Function bta_av_rpc_conn
819 ** Description report report channel open
823 *******************************************************************************/
824 #if (AVDT_REPORTING == TRUE)
825 static void bta_av_rpc_conn(tBTA_AV_DATA *p_data)
831 /*******************************************************************************
833 ** Function bta_av_api_to_ssm
835 ** Description forward the API request to stream state machine
840 *******************************************************************************/
841 static void bta_av_api_to_ssm(tBTA_AV_DATA *p_data)
844 UINT16 event = p_data->hdr.event - BTA_AV_FIRST_A2S_API_EVT + BTA_AV_FIRST_A2S_SSM_EVT;
846 for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
848 bta_av_ssm_execute(bta_av_cb.p_scb[xx], event, p_data);
852 /*******************************************************************************
854 ** Function bta_av_chk_start
856 ** Description if this is audio channel, check if more than one audio
857 ** channel is connected & already started.
859 ** Returns TRUE, if need api_start
861 *******************************************************************************/
862 BOOLEAN bta_av_chk_start(tBTA_AV_SCB *p_scb)
864 BOOLEAN start = FALSE;
868 if(p_scb->chnl == BTA_AV_CHNL_AUDIO)
870 if ((bta_av_cb.audio_open_cnt >= 2) &&
871 ((0 == (p_scb->role & BTA_AV_ROLE_AD_ACP)) || /* Outgoing connection or */
872 (bta_av_cb.features & BTA_AV_FEAT_ACP_START))) /* auto-starting option */
874 /* more than one audio channel is connected */
875 /* if this is the 2nd stream as ACP, give INT a chance to issue the START command */
876 for(i=0; i<BTA_AV_NUM_STRS; i++)
878 p_scbi = bta_av_cb.p_scb[i];
879 if(p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started)
882 /* may need to update the flush timeout of this already started stream */
883 if(p_scbi->co_started != bta_av_cb.audio_open_cnt)
885 p_scbi->co_started = bta_av_cb.audio_open_cnt;
886 L2CA_SetFlushTimeout(p_scbi->peer_addr, p_bta_av_cfg->p_audio_flush_to[p_scbi->co_started - 1] );
895 /*******************************************************************************
897 ** Function bta_av_restore_switch
899 ** Description assume that the caller of this function already makes
900 ** sure that there's only one ACL connection left
904 *******************************************************************************/
905 void bta_av_restore_switch (void)
907 tBTA_AV_CB *p_cb = &bta_av_cb;
911 APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
912 for(i=0; i<BTA_AV_NUM_STRS; i++)
914 mask = BTA_AV_HNDL_TO_MSK(i);
915 if (p_cb->conn_audio == mask)
919 bta_sys_set_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_cb->p_scb[i]->peer_addr);
926 /*******************************************************************************
928 ** Function bta_av_sys_rs_cback
930 ** Description Receives the role change event from dm
932 ** Returns (BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda)
934 *******************************************************************************/
935 static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
938 tBTA_AV_SCB *p_scb = NULL;
939 tBTA_AV_ROLE_RES *p_buf;
944 APPL_TRACE_DEBUG("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx);
945 for(i=0; i<BTA_AV_NUM_STRS; i++)
947 /* loop through all the SCBs to find matching peer addresses and report the role change event */
948 /* note that more than one SCB (a2dp & vdp) maybe waiting for this event */
949 p_scb = bta_av_cb.p_scb[i];
950 if (p_scb && (bdcmp (peer_addr, p_scb->peer_addr) == 0) &&
951 (p_buf = (tBTA_AV_ROLE_RES *) GKI_getbuf(sizeof(tBTA_AV_ROLE_RES))) != NULL)
953 APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl);
955 if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS))
957 bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_MASTER_SLAVE_SWITCH|HCI_ENABLE_SNIFF_MODE), p_scb->peer_addr);
960 p_buf->hdr.event = BTA_AV_ROLE_CHANGE_EVT;
961 p_buf->hdr.layer_specific = p_scb->hndl;
962 p_buf->new_role = id;
963 p_buf->hci_status = app_id;
964 bta_sys_sendmsg(p_buf);
966 peer_idx = p_scb->hdi + 1; /* Handle index for the peer_addr */
970 /* restore role switch policy, if role switch failed */
971 if ((HCI_SUCCESS != app_id) &&
972 (BTM_GetRole (peer_addr, &cur_role) == BTM_SUCCESS) &&
973 (cur_role == BTM_ROLE_SLAVE) )
975 bta_sys_set_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, peer_addr);
978 /* if BTA_AvOpen() was called for other device, which caused the role switch of the peer_addr, */
979 /* we need to continue opening process for the BTA_AvOpen(). */
980 if ((bta_av_cb.rs_idx != 0) && (bta_av_cb.rs_idx != peer_idx))
982 if ((bta_av_cb.rs_idx -1) < BTA_AV_NUM_STRS)
984 p_scb = bta_av_cb.p_scb[bta_av_cb.rs_idx - 1];
986 if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN)
988 APPL_TRACE_DEBUG ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d",
989 bta_av_cb.rs_idx, p_scb->hndl, p_scb->q_tag);
991 if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id)
992 p_scb->q_info.open.switch_res = BTA_AV_RS_OK;
994 p_scb->q_info.open.switch_res = BTA_AV_RS_FAIL;
996 /* Continue av open process */
997 bta_av_do_disc_a2d (p_scb, (tBTA_AV_DATA *)&(p_scb->q_info.open));
1000 bta_av_cb.rs_idx = 0;
1004 /*******************************************************************************
1006 ** Function bta_av_sco_chg_cback
1008 ** Description receive & process the SCO connection up/down event from sys.
1009 ** call setup also triggers this callback, to suspend av before sco
1010 ** activity happens, or to resume av once call ends.
1014 *******************************************************************************/
1015 static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8
1016 app_id, BD_ADDR peer_addr)
1020 tBTA_AV_API_STOP stop;
1024 APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d", id, status);
1027 bta_av_cb.sco_occupied = TRUE;
1029 /* either BTA_SYS_SCO_OPEN or BTA_SYS_SCO_CLOSE with remaining active SCO */
1030 for(i=0; i<BTA_AV_NUM_STRS; i++)
1032 p_scb = bta_av_cb.p_scb[i];
1034 if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE))
1036 APPL_TRACE_DEBUG("suspending scb:%d", i);
1037 /* scb is used and started, not suspended automatically */
1038 p_scb->sco_suspend = TRUE;
1040 stop.suspend = TRUE;
1041 bta_av_ssm_execute(p_scb, BTA_AV_AP_STOP_EVT, (tBTA_AV_DATA *)&stop);
1047 bta_av_cb.sco_occupied = FALSE;
1049 for(i=0; i<BTA_AV_NUM_STRS; i++)
1051 p_scb = bta_av_cb.p_scb[i];
1053 if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */
1055 APPL_TRACE_DEBUG("starting scb:%d", i);
1056 bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL);
1062 /*******************************************************************************
1064 ** Function bta_av_switch_if_needed
1066 ** Description This function checks if there is another existing AV
1067 ** channel that is local as slave role.
1068 ** If so, role switch and remove it from link policy.
1070 ** Returns TRUE, if role switch is done
1072 *******************************************************************************/
1073 BOOLEAN bta_av_switch_if_needed(tBTA_AV_SCB *p_scb)
1076 BOOLEAN needed = FALSE;
1077 tBTA_AV_SCB *p_scbi;
1081 for(i=0; i<BTA_AV_NUM_STRS; i++)
1083 mask = BTA_AV_HNDL_TO_MSK(i);
1084 p_scbi = bta_av_cb.p_scb[i];
1085 if( p_scbi && (p_scb->hdi != i) && /* not the original channel */
1086 ((bta_av_cb.conn_audio & mask) ||/* connected audio */
1087 (bta_av_cb.conn_video & mask)) ) /* connected video */
1089 BTM_GetRole(p_scbi->peer_addr, &role);
1090 /* this channel is open - clear the role switch link policy for this link */
1091 if(BTM_ROLE_MASTER != role)
1093 if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
1094 bta_sys_clear_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_scbi->peer_addr);
1095 if (BTM_CMD_STARTED != BTM_SwitchRole(p_scbi->peer_addr, BTM_ROLE_MASTER, NULL))
1097 /* can not switch role on SCBI
1098 * start the timer on SCB - because this function is ONLY called when SCB gets API_OPEN */
1099 bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RS_TIME_VAL);
1102 /* mark the original channel as waiting for RS result */
1103 bta_av_cb.rs_idx = p_scb->hdi + 1;
1111 /*******************************************************************************
1113 ** Function bta_av_link_role_ok
1115 ** Description This function checks if the SCB has existing ACL connection
1116 ** If so, check if the link role fits the requirements.
1118 ** Returns TRUE, if role is ok
1120 *******************************************************************************/
1121 BOOLEAN bta_av_link_role_ok(tBTA_AV_SCB *p_scb, UINT8 bits)
1124 BOOLEAN is_ok = TRUE;
1126 if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS)
1128 LOG_INFO("%s hndl:x%x role:%d conn_audio:x%x bits:%d features:x%x",
1129 __func__, p_scb->hndl, role, bta_av_cb.conn_audio, bits,
1130 bta_av_cb.features);
1131 if (BTM_ROLE_MASTER != role && (A2D_BitsSet(bta_av_cb.conn_audio) > bits || (bta_av_cb.features & BTA_AV_FEAT_MASTER)))
1133 if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
1134 bta_sys_clear_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_scb->peer_addr);
1136 if (BTM_CMD_STARTED != BTM_SwitchRole(p_scb->peer_addr, BTM_ROLE_MASTER, NULL))
1138 /* can not switch role on SCB - start the timer on SCB */
1141 p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_START;
1149 /*******************************************************************************
1151 ** Function bta_av_chk_mtu
1153 ** Description if this is audio channel, check if more than one audio
1154 ** channel is connected.
1156 ** Returns The smallest mtu of the connected audio channels
1158 *******************************************************************************/
1159 UINT16 bta_av_chk_mtu(tBTA_AV_SCB *p_scb, UINT16 mtu)
1161 UINT16 ret_mtu = BTA_AV_MAX_A2DP_MTU;
1162 tBTA_AV_SCB *p_scbi;
1167 /* TODO_MV mess with the mtu according to the number of EDR/non-EDR headsets */
1168 if(p_scb->chnl == BTA_AV_CHNL_AUDIO)
1170 if(bta_av_cb.audio_open_cnt >= 2)
1172 /* more than one audio channel is connected */
1173 for(i=0; i<BTA_AV_NUM_STRS; i++)
1175 p_scbi = bta_av_cb.p_scb[i];
1176 if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) )
1178 mask = BTA_AV_HNDL_TO_MSK(i);
1179 APPL_TRACE_DEBUG("[%d] mtu: %d, mask:0x%x",
1180 i, p_scbi->stream_mtu, mask);
1181 if(bta_av_cb.conn_audio & mask)
1183 if(ret_mtu > p_scbi->stream_mtu)
1184 ret_mtu = p_scbi->stream_mtu;
1189 APPL_TRACE_DEBUG("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d",
1190 bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu);
1195 /*******************************************************************************
1197 ** Function bta_av_dup_audio_buf
1199 ** Description dup the audio data to the q_info.a2d of other audio channels
1203 *******************************************************************************/
1204 void bta_av_dup_audio_buf(tBTA_AV_SCB *p_scb, BT_HDR *p_buf)
1206 tBTA_AV_SCB *p_scbi;
1208 UINT16 size, copy_size;
1214 if(bta_av_cb.audio_open_cnt >= 2)
1216 size = GKI_get_buf_size(p_buf);
1217 copy_size = BT_HDR_SIZE + p_buf->len + p_buf->offset;
1218 /* more than one audio channel is connected */
1219 for(i=0; i<BTA_AV_NUM_STRS; i++)
1221 p_scbi = bta_av_cb.p_scb[i];
1222 if( (p_scb->hdi != i) && /* not the original channel */
1223 (bta_av_cb.conn_audio & BTA_AV_HNDL_TO_MSK(i)) && /* connected audio */
1224 p_scbi && p_scbi->co_started ) /* scb is used and started */
1226 /* enqueue the data only when the stream is started */
1227 p_new = (BT_HDR *)GKI_getbuf(size);
1230 memcpy(p_new, p_buf, copy_size);
1231 list_append(p_scbi->a2d_list, p_new);
1232 if (list_length(p_scbi->a2d_list) > p_bta_av_cfg->audio_mqs) {
1233 // Drop the oldest packet
1234 bta_av_co_audio_drop(p_scbi->hndl);
1235 BT_HDR *p_buf = list_front(p_scbi->a2d_list);
1236 list_remove(p_scbi->a2d_list, p_buf);
1246 /*******************************************************************************
1248 ** Function bta_av_sm_execute
1250 ** Description State machine event handling function for AV
1255 *******************************************************************************/
1256 void bta_av_sm_execute(tBTA_AV_CB *p_cb, UINT16 event, tBTA_AV_DATA *p_data)
1258 tBTA_AV_ST_TBL state_table;
1261 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
1262 APPL_TRACE_EVENT("AV event=0x%x(%s) state=%d(%s)",
1263 event, bta_av_evt_code(event), p_cb->state, bta_av_st_code(p_cb->state));
1265 APPL_TRACE_EVENT("AV event=0x%x state=%d", event, p_cb->state);
1268 /* look up the state table for the current state */
1269 state_table = bta_av_st_tbl[p_cb->state];
1273 /* set next state */
1274 p_cb->state = state_table[event][BTA_AV_NEXT_STATE];
1275 APPL_TRACE_EVENT("next state=%d", p_cb->state);
1277 /* execute action functions */
1278 if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE)
1280 (*bta_av_action[action])(p_cb, p_data);
1285 /*******************************************************************************
1287 ** Function bta_av_hdl_event
1289 ** Description Advanced audio/video main event handling function.
1294 *******************************************************************************/
1295 BOOLEAN bta_av_hdl_event(BT_HDR *p_msg)
1297 UINT16 event = p_msg->event;
1298 UINT16 first_event = BTA_AV_FIRST_NSM_EVT;
1300 if (event > BTA_AV_LAST_EVT)
1302 return TRUE; /* to free p_msg */
1305 if(event >= first_event)
1307 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
1308 APPL_TRACE_VERBOSE("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event));
1310 APPL_TRACE_VERBOSE("AV nsm event=0x%x", event);
1312 /* non state machine events */
1313 (*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg);
1315 else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT)
1317 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
1318 APPL_TRACE_VERBOSE("AV sm event=0x%x(%s)", event, bta_av_evt_code(event));
1320 APPL_TRACE_VERBOSE("AV sm event=0x%x", event);
1322 /* state machine events */
1323 bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg);
1327 APPL_TRACE_VERBOSE("handle=0x%x", p_msg->layer_specific);
1328 /* stream state machine events */
1329 bta_av_ssm_execute( bta_av_hndl_to_scb(p_msg->layer_specific),
1330 p_msg->event, (tBTA_AV_DATA *) p_msg);
1336 /*****************************************************************************
1338 *****************************************************************************/
1339 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
1340 /*******************************************************************************
1342 ** Function bta_av_st_code
1348 *******************************************************************************/
1349 static char *bta_av_st_code(UINT8 state)
1353 case BTA_AV_INIT_ST: return "INIT";
1354 case BTA_AV_OPEN_ST: return "OPEN";
1355 default: return "unknown";
1358 /*******************************************************************************
1360 ** Function bta_av_evt_code
1366 *******************************************************************************/
1367 char *bta_av_evt_code(UINT16 evt_code)
1371 case BTA_AV_API_DISABLE_EVT: return "API_DISABLE";
1372 case BTA_AV_API_REMOTE_CMD_EVT: return "API_REMOTE_CMD";
1373 case BTA_AV_API_VENDOR_CMD_EVT: return "API_VENDOR_CMD";
1374 case BTA_AV_API_VENDOR_RSP_EVT: return "API_VENDOR_RSP";
1375 case BTA_AV_API_META_RSP_EVT: return "API_META_RSP_EVT";
1376 case BTA_AV_API_RC_CLOSE_EVT: return "API_RC_CLOSE";
1377 case BTA_AV_AVRC_OPEN_EVT: return "AVRC_OPEN";
1378 case BTA_AV_AVRC_MSG_EVT: return "AVRC_MSG";
1379 case BTA_AV_AVRC_NONE_EVT: return "AVRC_NONE";
1381 case BTA_AV_API_OPEN_EVT: return "API_OPEN";
1382 case BTA_AV_API_CLOSE_EVT: return "API_CLOSE";
1383 case BTA_AV_AP_START_EVT: return "AP_START";
1384 case BTA_AV_AP_STOP_EVT: return "AP_STOP";
1385 case BTA_AV_API_RECONFIG_EVT: return "API_RECONFIG";
1386 case BTA_AV_API_PROTECT_REQ_EVT: return "API_PROTECT_REQ";
1387 case BTA_AV_API_PROTECT_RSP_EVT: return "API_PROTECT_RSP";
1388 case BTA_AV_API_RC_OPEN_EVT: return "API_RC_OPEN";
1389 case BTA_AV_SRC_DATA_READY_EVT: return "SRC_DATA_READY";
1390 case BTA_AV_CI_SETCONFIG_OK_EVT: return "CI_SETCONFIG_OK";
1391 case BTA_AV_CI_SETCONFIG_FAIL_EVT: return "CI_SETCONFIG_FAIL";
1392 case BTA_AV_SDP_DISC_OK_EVT: return "SDP_DISC_OK";
1393 case BTA_AV_SDP_DISC_FAIL_EVT: return "SDP_DISC_FAIL";
1394 case BTA_AV_STR_DISC_OK_EVT: return "STR_DISC_OK";
1395 case BTA_AV_STR_DISC_FAIL_EVT: return "STR_DISC_FAIL";
1396 case BTA_AV_STR_GETCAP_OK_EVT: return "STR_GETCAP_OK";
1397 case BTA_AV_STR_GETCAP_FAIL_EVT: return "STR_GETCAP_FAIL";
1398 case BTA_AV_STR_OPEN_OK_EVT: return "STR_OPEN_OK";
1399 case BTA_AV_STR_OPEN_FAIL_EVT: return "STR_OPEN_FAIL";
1400 case BTA_AV_STR_START_OK_EVT: return "STR_START_OK";
1401 case BTA_AV_STR_START_FAIL_EVT: return "STR_START_FAIL";
1402 case BTA_AV_STR_CLOSE_EVT: return "STR_CLOSE";
1403 case BTA_AV_STR_CONFIG_IND_EVT: return "STR_CONFIG_IND";
1404 case BTA_AV_STR_SECURITY_IND_EVT: return "STR_SECURITY_IND";
1405 case BTA_AV_STR_SECURITY_CFM_EVT: return "STR_SECURITY_CFM";
1406 case BTA_AV_STR_WRITE_CFM_EVT: return "STR_WRITE_CFM";
1407 case BTA_AV_STR_SUSPEND_CFM_EVT: return "STR_SUSPEND_CFM";
1408 case BTA_AV_STR_RECONFIG_CFM_EVT: return "STR_RECONFIG_CFM";
1409 case BTA_AV_AVRC_TIMER_EVT: return "AVRC_TIMER";
1410 case BTA_AV_AVDT_CONNECT_EVT: return "AVDT_CONNECT";
1411 case BTA_AV_AVDT_DISCONNECT_EVT: return "AVDT_DISCONNECT";
1412 case BTA_AV_ROLE_CHANGE_EVT: return "ROLE_CHANGE";
1413 case BTA_AV_AVDT_DELAY_RPT_EVT: return "AVDT_DELAY_RPT";
1414 case BTA_AV_ACP_CONNECT_EVT: return "ACP_CONNECT";
1416 case BTA_AV_API_ENABLE_EVT: return "API_ENABLE";
1417 case BTA_AV_API_REGISTER_EVT: return "API_REG";
1418 case BTA_AV_API_DEREGISTER_EVT: return "API_DEREG";
1419 case BTA_AV_API_DISCONNECT_EVT: return "API_DISCNT";
1420 case BTA_AV_CI_SRC_DATA_READY_EVT: return "CI_DATA_READY";
1421 case BTA_AV_SIG_CHG_EVT: return "SIG_CHG";
1422 case BTA_AV_SIG_TIMER_EVT: return "SIG_TMR";
1423 case BTA_AV_SDP_AVRC_DISC_EVT: return "SDP_AVRC_DISC";
1424 case BTA_AV_AVRC_CLOSE_EVT: return "AVRC_CLOSE";
1425 case BTA_AV_CONN_CHG_EVT: return "CONN_CHG";
1426 case BTA_AV_DEREG_COMP_EVT: return "DEREG_COMP";
1427 #if (BTA_AV_SINK_INCLUDED == TRUE)
1428 case BTA_AV_API_SINK_ENABLE_EVT: return "SINK_ENABLE";
1430 #if (AVDT_REPORTING == TRUE)
1431 case BTA_AV_AVDT_RPT_CONN_EVT: return "RPT_CONN";
1433 case BTA_AV_API_START_EVT: return "API_START";
1434 case BTA_AV_API_STOP_EVT: return "API_STOP";
1435 default: return "unknown";
1440 #endif /* BTA_AV_INCLUDED */