Home | History | Annotate | Download | only in av
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2004-2012 Broadcom Corporation
      4  *
      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:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     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.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This is the main implementation file for the BTA advanced audio/video.
     22  *
     23  ******************************************************************************/
     24 
     25 #include <assert.h>
     26 #include <string.h>
     27 
     28 #include "bt_target.h"
     29 #include "osi/include/log.h"
     30 
     31 #if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE)
     32 #include "bta_av_int.h"
     33 #include "utl.h"
     34 #include "l2c_api.h"
     35 #include "l2cdefs.h"
     36 #include "bta_av_co.h"
     37 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
     38 #include "bta_ar_api.h"
     39 #endif
     40 
     41 /*****************************************************************************
     42 ** Constants and types
     43 *****************************************************************************/
     44 
     45 /* AVDTP protocol timeout values */
     46 #define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink"
     47 
     48 #ifndef BTA_AV_RET_TOUT
     49 #define BTA_AV_RET_TOUT     4
     50 #endif
     51 
     52 #ifndef BTA_AV_SIG_TOUT
     53 #define BTA_AV_SIG_TOUT     4
     54 #endif
     55 
     56 #ifndef BTA_AV_IDLE_TOUT
     57 #define BTA_AV_IDLE_TOUT    10
     58 #endif
     59 
     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
     63 #endif
     64 
     65 /* state machine states */
     66 enum
     67 {
     68     BTA_AV_INIT_ST,
     69     BTA_AV_OPEN_ST
     70 };
     71 
     72 /* state machine action enumeration list */
     73 enum
     74 {
     75     BTA_AV_DISABLE,
     76     BTA_AV_RC_OPENED,
     77     BTA_AV_RC_REMOTE_CMD,
     78     BTA_AV_RC_VENDOR_CMD,
     79     BTA_AV_RC_VENDOR_RSP,
     80     BTA_AV_RC_FREE_RSP,
     81     BTA_AV_RC_FREE_MSG,
     82     BTA_AV_RC_META_RSP,
     83     BTA_AV_RC_MSG,
     84     BTA_AV_RC_CLOSE,
     85     BTA_AV_NUM_ACTIONS
     86 };
     87 
     88 #define BTA_AV_IGNORE       BTA_AV_NUM_ACTIONS
     89 
     90 /* type for action functions */
     91 typedef void (*tBTA_AV_ACTION)(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data);
     92 
     93 /* action functions */
     94 const tBTA_AV_ACTION bta_av_action[] =
     95 {
     96     bta_av_disable,
     97     bta_av_rc_opened,
     98     bta_av_rc_remote_cmd,
     99     bta_av_rc_vendor_cmd,
    100     bta_av_rc_vendor_rsp,
    101     bta_av_rc_free_rsp,
    102     bta_av_rc_free_msg,
    103     bta_av_rc_meta_rsp,
    104     bta_av_rc_msg,
    105     bta_av_rc_close,
    106     NULL
    107 };
    108 
    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 */
    113 
    114 /* state table for init state */
    115 static const UINT8 bta_av_st_init[][BTA_AV_NUM_COLS] =
    116 {
    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 },
    127 };
    128 
    129 /* state table for open state */
    130 static const UINT8 bta_av_st_open[][BTA_AV_NUM_COLS] =
    131 {
    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 },
    142 };
    143 
    144 /* type for state table */
    145 typedef const UINT8 (*tBTA_AV_ST_TBL)[BTA_AV_NUM_COLS];
    146 
    147 /* state table */
    148 static const tBTA_AV_ST_TBL bta_av_st_tbl[] =
    149 {
    150     bta_av_st_init,
    151     bta_av_st_open
    152 };
    153 
    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);
    159 #endif
    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);
    163 #endif
    164 static void bta_av_api_to_ssm(tBTA_AV_DATA *p_data);
    165 
    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);
    169 
    170 
    171 /* action functions */
    172 const tBTA_AV_NSM_ACT bta_av_nsm_act[] =
    173 {
    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 */
    187 #endif
    188 #if (AVDT_REPORTING == TRUE)
    189     bta_av_rpc_conn,        /* BTA_AV_AVDT_RPT_CONN_EVT */
    190 #endif
    191     bta_av_api_to_ssm,      /* BTA_AV_API_START_EVT */
    192     bta_av_api_to_ssm,      /* BTA_AV_API_STOP_EVT */
    193 };
    194 
    195 /*****************************************************************************
    196 ** Global data
    197 *****************************************************************************/
    198 
    199 /* AV control block */
    200 #if BTA_DYNAMIC_MEMORY == FALSE
    201 tBTA_AV_CB  bta_av_cb;
    202 #endif
    203 
    204 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
    205 static char *bta_av_st_code(UINT8 state);
    206 #endif
    207 
    208 /*******************************************************************************
    209 **
    210 ** Function         bta_av_timer_cback
    211 **
    212 ** Description      forward the event to stream state machine
    213 **
    214 ** Returns          void
    215 **
    216 *******************************************************************************/
    217 static void bta_av_timer_cback(void *p_tle)
    218 {
    219     BT_HDR          *p_buf;
    220     TIMER_LIST_ENT  *p = (TIMER_LIST_ENT *)p_tle;
    221     int xx;
    222     tBTA_AV_SCB *p_scb = NULL;
    223 
    224     /* find the SCB that has the timer */
    225     for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
    226     {
    227         if(bta_av_cb.p_scb[xx] && &(bta_av_cb.p_scb[xx]->timer)== p)
    228         {
    229             p_scb = bta_av_cb.p_scb[xx];
    230             break;
    231         }
    232     }
    233 
    234     if (p_scb && (p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    235     {
    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);
    241     }
    242 }
    243 
    244 /*******************************************************************************
    245 **
    246 ** Function         bta_av_api_enable
    247 **
    248 ** Description      Handle an API enable event.
    249 **
    250 **
    251 ** Returns          void
    252 **
    253 *******************************************************************************/
    254 static void bta_av_api_enable(tBTA_AV_DATA *p_data)
    255 {
    256     int i;
    257     tBTA_AV_ENABLE      enable;
    258 
    259     /* initialize control block */
    260     memset(&bta_av_cb, 0, sizeof(tBTA_AV_CB));
    261 
    262     for(i=0; i<BTA_AV_NUM_RCB; i++)
    263         bta_av_cb.rcb[i].handle = BTA_AV_RC_HANDLE_NONE;
    264 
    265     bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE;
    266 
    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;
    271 
    272     enable.features = bta_av_cb.features;
    273 
    274     /* Register for SCO change event */
    275     if (!(bta_av_cb.features & BTA_AV_FEAT_NO_SCO_SSPD))
    276     {
    277         bta_sys_sco_register(bta_av_sco_chg_cback);
    278     }
    279 
    280     /* call callback with enable event */
    281     (*bta_av_cb.p_cback)(BTA_AV_ENABLE_EVT, (tBTA_AV *)&enable);
    282 }
    283 
    284 /*******************************************************************************
    285 **
    286 ** Function         bta_av_addr_to_scb
    287 **
    288 ** Description      find the stream control block by the peer addr
    289 **
    290 ** Returns          void
    291 **
    292 *******************************************************************************/
    293 static tBTA_AV_SCB * bta_av_addr_to_scb(BD_ADDR bd_addr)
    294 {
    295     tBTA_AV_SCB * p_scb = NULL;
    296     int         xx;
    297 
    298     for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
    299     {
    300         if(bta_av_cb.p_scb[xx])
    301         {
    302             if(!bdcmp(bd_addr, bta_av_cb.p_scb[xx]->peer_addr))
    303             {
    304                 p_scb = bta_av_cb.p_scb[xx];
    305                 break;
    306             }
    307         }
    308     }
    309     return p_scb;
    310 }
    311 
    312 /*******************************************************************************
    313 **
    314 ** Function         bta_av_hndl_to_scb
    315 **
    316 ** Description      find the stream control block by the handle
    317 **
    318 ** Returns          void
    319 **
    320 *******************************************************************************/
    321 tBTA_AV_SCB * bta_av_hndl_to_scb(UINT16 handle)
    322 {
    323     tBTA_AV_HNDL hndl = (tBTA_AV_HNDL)handle;
    324     tBTA_AV_SCB * p_scb = NULL;
    325     UINT8 idx = (hndl & BTA_AV_HNDL_MSK);
    326 
    327     if(idx && (idx <= BTA_AV_NUM_STRS) )
    328     {
    329         p_scb = bta_av_cb.p_scb[idx-1];
    330     }
    331     return p_scb;
    332 }
    333 
    334 /*******************************************************************************
    335 **
    336 ** Function         bta_av_alloc_scb
    337 **
    338 ** Description      allocate stream control block,
    339 **                  register the service to stack
    340 **                  create SDP record
    341 **
    342 ** Returns          void
    343 **
    344 *******************************************************************************/
    345 static tBTA_AV_SCB * bta_av_alloc_scb(tBTA_AV_CHNL chnl)
    346 {
    347     tBTA_AV_SCB *p_ret = NULL;
    348     int         xx;
    349     tBTA_AV_STATUS sts = BTA_AV_SUCCESS;
    350 
    351     if(chnl == BTA_AV_CHNL_VIDEO)
    352     {
    353         if(p_bta_av_cfg->p_act_tbl == NULL || p_bta_av_cfg->p_reg == NULL)
    354         {
    355             APPL_TRACE_ERROR("Video streaming not supported");
    356             sts = BTA_AV_FAIL;
    357         }
    358         else
    359         {
    360             /* allow only one Video channel */
    361             if(bta_av_cb.reg_video)
    362             {
    363                 APPL_TRACE_ERROR("Already registered");
    364                 sts = BTA_AV_FAIL;
    365             }
    366         }
    367     }
    368     else if(chnl != BTA_AV_CHNL_AUDIO)
    369     {
    370         APPL_TRACE_ERROR("bad channel: %d", chnl);
    371         sts = BTA_AV_FAIL;
    372     }
    373 
    374     if(sts == BTA_AV_SUCCESS)
    375     {
    376         for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
    377         {
    378             if(bta_av_cb.p_scb[xx] == NULL)
    379             {
    380                 /* found an empty spot */
    381                 p_ret = (tBTA_AV_SCB *)GKI_getbuf(sizeof(tBTA_AV_SCB));
    382                 if(p_ret)
    383                 {
    384                     memset(p_ret, 0, sizeof(tBTA_AV_SCB));
    385                     p_ret->rc_handle = BTA_AV_RC_HANDLE_NONE;
    386                     p_ret->chnl = chnl;
    387                     p_ret->hndl = (tBTA_AV_HNDL)((xx + 1) | chnl);
    388                     p_ret->hdi  = xx;
    389                     p_ret->a2d_list = list_new(NULL);
    390                     bta_av_cb.p_scb[xx] = p_ret;
    391                 }
    392                 break;
    393             }
    394         }
    395     }
    396     return p_ret;
    397 }
    398 
    399 /*******************************************************************************
    400 **
    401 ** Function         bta_av_free_scb
    402 **
    403 ** Description      free stream control block,
    404 **
    405 **
    406 ** Returns          void
    407 **
    408 *******************************************************************************/
    409 static void bta_av_free_scb(tBTA_AV_SCB *p_scb)
    410 {
    411     // NOTE(google) This free currently is not called
    412     assert(p_scb != NULL);
    413 
    414     list_free(p_scb->a2d_list);
    415     GKI_freebuf(p_scb);
    416 }
    417 
    418 /*******************************************************************************
    419 *******************************************************************************/
    420 void bta_av_conn_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
    421 {
    422     tBTA_AV_STR_MSG     *p_msg;
    423     UINT16  evt = 0;
    424     tBTA_AV_SCB *p_scb = NULL;
    425     UNUSED(handle);
    426 
    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)
    430 #else
    431     if (event == AVDT_CONNECT_IND_EVT || event == AVDT_DISCONNECT_IND_EVT)
    432 #endif
    433     {
    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)
    439         {
    440             APPL_TRACE_DEBUG("CONN_IND is ACP:%d", p_data->hdr.err_param);
    441         }
    442 #endif
    443 
    444         if (/*((p_scb && (p_scb->role & BTA_AV_ROLE_AD_ACP)) ||
    445 
    446             //(AVDT_CONNECT_IND_EVT == event && AVDT_ACP == p_data->hdr.err_param))
    447 
    448             (AVDT_CONNECT_IND_EVT == event))&& */
    449             (p_msg = (tBTA_AV_STR_MSG *) GKI_getbuf((UINT16) (sizeof(tBTA_AV_STR_MSG)))) != NULL)
    450         {
    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)
    456             if(p_scb)
    457             {
    458                 APPL_TRACE_DEBUG("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role);
    459             }
    460 #endif
    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);
    466         }
    467     }
    468 
    469 }
    470 
    471 #if AVDT_REPORTING == TRUE
    472 /*******************************************************************************
    473 **
    474 ** Function         bta_av_a2dp_report_cback
    475 **
    476 ** Description      A2DP report callback.
    477 **
    478 ** Returns          void
    479 **
    480 *******************************************************************************/
    481 static void bta_av_a2dp_report_cback(UINT8 handle, AVDT_REPORT_TYPE type,
    482                                     tAVDT_REPORT_DATA *p_data)
    483 {
    484     UNUSED(handle);
    485     UNUSED(type);
    486     UNUSED(p_data);
    487     /* Do not need to handle report data for now.
    488      * This empty function is here for conformance reasons. */
    489 }
    490 #endif
    491 
    492 #if (BTA_AV_SINK_INCLUDED == TRUE)
    493 /*******************************************************************************
    494 **
    495 ** Function         bta_av_api_sink_enable
    496 **
    497 ** Description      activate, deactive A2DP Sink,
    498 **
    499 ** Returns          void
    500 **
    501 *******************************************************************************/
    502 
    503 static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data)
    504 {
    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);
    511 
    512     if(activate_sink)
    513     {
    514         AVDT_SINK_Activate();
    515         if (bta_av_cb.sdp_a2d_snk_handle == 0)
    516         {
    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);
    521         }
    522     }
    523     else
    524     {
    525         AVDT_SINK_Deactivate();
    526         if (bta_av_cb.sdp_a2d_snk_handle != 0)
    527         {
    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);
    531         }
    532     }
    533 }
    534 #endif
    535 /*******************************************************************************
    536 **
    537 ** Function         bta_av_api_register
    538 **
    539 ** Description      allocate stream control block,
    540 **                  register the service to stack
    541 **                  create SDP record
    542 **
    543 ** Returns          void
    544 **
    545 *******************************************************************************/
    546 static void bta_av_api_register(tBTA_AV_DATA *p_data)
    547 {
    548     tBTA_AV_REGISTER    registr;
    549     tBTA_AV_SCB         *p_scb;    /* stream control block */
    550     tAVDT_REG       reg;
    551     tAVDT_CS        cs;
    552     char            *p_service_name;
    553     tBTA_AV_CODEC   codec_type;
    554     tBTA_UTL_COD    cod;
    555     UINT8           index = 0;
    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);
    558 
    559     memset(&cs,0,sizeof(tAVDT_CS));
    560 
    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;
    564     do
    565     {
    566         p_scb = bta_av_alloc_scb(registr.chnl);
    567         if(p_scb == NULL)
    568         {
    569             APPL_TRACE_ERROR("failed to alloc SCB");
    570             break;
    571         }
    572 
    573         registr.hndl    = p_scb->hndl;
    574         p_scb->app_id   = registr.app_id;
    575 
    576         /* initialize the stream control block */
    577         p_scb->timer.p_cback = (TIMER_CBACK*)&bta_av_timer_cback;
    578         registr.status = BTA_AV_SUCCESS;
    579 
    580         if((bta_av_cb.reg_audio + bta_av_cb.reg_video) == 0)
    581         {
    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(&reg, bta_av_conn_cback, BTA_ID_AV);
    590 #endif
    591             bta_sys_role_chg_register(&bta_av_sys_rs_cback);
    592 
    593             /* create remote control TG service if required */
    594             if (bta_av_cb.features & (BTA_AV_FEAT_RCTG))
    595             {
    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);
    601 #else
    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);
    604 #endif
    605 
    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);
    608 #endif
    609             }
    610 
    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;
    614 #else
    615             cod.service = BTM_COD_SERVICE_CAPTURING;
    616 #endif
    617             utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
    618         } /* if 1st channel */
    619 
    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;
    624 
    625         /*
    626          * memset of cs takes care setting call back pointers to null.
    627         cs.p_data_cback = NULL;
    628         cs.p_report_cback = NULL;
    629         */
    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);
    633 
    634         if (p_data->api_reg.p_service_name[0] == 0)
    635         {
    636             p_service_name = NULL;
    637         }
    638         else
    639         {
    640             p_service_name = p_data->api_reg.p_service_name;
    641         }
    642 
    643         p_scb->suspend_sup  = TRUE;
    644         p_scb->recfg_sup    = TRUE;
    645 
    646         cs.p_ctrl_cback  = bta_av_dt_cback[p_scb->hdi];
    647         if(registr.chnl == BTA_AV_CHNL_AUDIO)
    648         {
    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)
    659             {
    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;
    664 #endif
    665             }
    666 #endif
    667             if(bta_av_cb.features & BTA_AV_FEAT_DELAY_RPT)
    668                 cs.cfg.psc_mask |= AVDT_PSC_DELAY_RPT;
    669 
    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)
    675             {
    676 
    677 #if (BTA_AV_SINK_INCLUDED == TRUE)
    678             if(index == 1)
    679             {
    680                 cs.tsep = AVDT_TSEP_SNK;
    681                 cs.p_data_cback = bta_av_stream_data_cback;
    682             }
    683                 APPL_TRACE_DEBUG(" SEP Type = %d",cs.tsep);
    684 #endif
    685                 if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS)
    686                 {
    687                     p_scb->seps[index].codec_type = codec_type;
    688 
    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;
    693                     else
    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 */
    695 #endif
    696 
    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);
    699                     index++;
    700                 }
    701                 else
    702                     break;
    703             }
    704 
    705             if(!bta_av_cb.reg_audio)
    706             {
    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);
    712 
    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);
    718 #endif
    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);
    722 
    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))
    725                 {
    726                     /* if TG is not supported, we need to register to AVCT now */
    727                     if ((bta_av_cb.features & (BTA_AV_FEAT_RCTG)) == 0)
    728                     {
    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);
    733 #else
    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);
    736 #endif
    737 #endif
    738                     }
    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);
    743 #endif
    744                 }
    745             }
    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);
    748         }
    749         else
    750         {
    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);
    756         }
    757     } while (0);
    758 
    759     /* call callback with register event */
    760     (*bta_av_cb.p_cback)(BTA_AV_REGISTER_EVT, (tBTA_AV *)&registr);
    761 }
    762 
    763 /*******************************************************************************
    764 **
    765 ** Function         bta_av_api_deregister
    766 **
    767 ** Description      de-register a channel
    768 **
    769 **
    770 ** Returns          void
    771 **
    772 *******************************************************************************/
    773 void bta_av_api_deregister(tBTA_AV_DATA *p_data)
    774 {
    775     tBTA_AV_SCB *p_scb = bta_av_hndl_to_scb(p_data->hdr.layer_specific);
    776 
    777     if(p_scb)
    778     {
    779         p_scb->deregistring = TRUE;
    780         bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, p_data);
    781     }
    782     else
    783     {
    784         bta_av_dereg_comp(p_data);
    785     }
    786 }
    787 
    788 /*******************************************************************************
    789 **
    790 ** Function         bta_av_ci_data
    791 **
    792 ** Description      forward the BTA_AV_CI_SRC_DATA_READY_EVT to stream state machine
    793 **
    794 **
    795 ** Returns          void
    796 **
    797 *******************************************************************************/
    798 static void bta_av_ci_data(tBTA_AV_DATA *p_data)
    799 {
    800     tBTA_AV_SCB *p_scb;
    801     int     i;
    802     UINT8   chnl = (UINT8)p_data->hdr.layer_specific;
    803 
    804     for( i=0; i < BTA_AV_NUM_STRS; i++ )
    805     {
    806         p_scb = bta_av_cb.p_scb[i];
    807 
    808         if(p_scb && p_scb->chnl == chnl)
    809         {
    810             bta_av_ssm_execute(p_scb, BTA_AV_SRC_DATA_READY_EVT, p_data);
    811         }
    812     }
    813 }
    814 
    815 /*******************************************************************************
    816 **
    817 ** Function         bta_av_rpc_conn
    818 **
    819 ** Description      report report channel open
    820 **
    821 ** Returns          void
    822 **
    823 *******************************************************************************/
    824 #if (AVDT_REPORTING == TRUE)
    825 static void bta_av_rpc_conn(tBTA_AV_DATA *p_data)
    826 {
    827     UNUSED(p_data);
    828 }
    829 #endif
    830 
    831 /*******************************************************************************
    832 **
    833 ** Function         bta_av_api_to_ssm
    834 **
    835 ** Description      forward the API request to stream state machine
    836 **
    837 **
    838 ** Returns          void
    839 **
    840 *******************************************************************************/
    841 static void bta_av_api_to_ssm(tBTA_AV_DATA *p_data)
    842 {
    843     int xx;
    844     UINT16 event = p_data->hdr.event - BTA_AV_FIRST_A2S_API_EVT + BTA_AV_FIRST_A2S_SSM_EVT;
    845 
    846     for(xx=0; xx<BTA_AV_NUM_STRS; xx++)
    847     {
    848         bta_av_ssm_execute(bta_av_cb.p_scb[xx], event, p_data);
    849     }
    850 }
    851 
    852 /*******************************************************************************
    853 **
    854 ** Function         bta_av_chk_start
    855 **
    856 ** Description      if this is audio channel, check if more than one audio
    857 **                  channel is connected & already started.
    858 **
    859 ** Returns          TRUE, if need api_start
    860 **
    861 *******************************************************************************/
    862 BOOLEAN bta_av_chk_start(tBTA_AV_SCB *p_scb)
    863 {
    864     BOOLEAN start = FALSE;
    865     tBTA_AV_SCB *p_scbi;
    866     int i;
    867 
    868     if(p_scb->chnl == BTA_AV_CHNL_AUDIO)
    869     {
    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     */
    873         {
    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++)
    877             {
    878                 p_scbi = bta_av_cb.p_scb[i];
    879                 if(p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started)
    880                 {
    881                     start = TRUE;
    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)
    884                     {
    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] );
    887                     }
    888                 }
    889             }
    890         }
    891     }
    892     return start;
    893 }
    894 
    895 /*******************************************************************************
    896 **
    897 ** Function         bta_av_restore_switch
    898 **
    899 ** Description      assume that the caller of this function already makes
    900 **                  sure that there's only one ACL connection left
    901 **
    902 ** Returns          void
    903 **
    904 *******************************************************************************/
    905 void bta_av_restore_switch (void)
    906 {
    907     tBTA_AV_CB   *p_cb = &bta_av_cb;
    908     int     i;
    909     UINT8   mask;
    910 
    911     APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
    912     for(i=0; i<BTA_AV_NUM_STRS; i++)
    913     {
    914         mask = BTA_AV_HNDL_TO_MSK(i);
    915         if (p_cb->conn_audio == mask)
    916         {
    917             if (p_cb->p_scb[i])
    918             {
    919                 bta_sys_set_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_cb->p_scb[i]->peer_addr);
    920             }
    921             break;
    922         }
    923     }
    924 }
    925 
    926 /*******************************************************************************
    927 **
    928 ** Function         bta_av_sys_rs_cback
    929 **
    930 ** Description      Receives the role change event from dm
    931 **
    932 ** Returns          (BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda)
    933 **
    934 *******************************************************************************/
    935 static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
    936 {
    937     int         i;
    938     tBTA_AV_SCB *p_scb = NULL;
    939     tBTA_AV_ROLE_RES  *p_buf;
    940     UINT8       cur_role;
    941     UINT8       peer_idx = 0;
    942     UNUSED(status);
    943 
    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++)
    946     {
    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)
    952         {
    953             APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl);
    954             /*
    955             if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS))
    956             {
    957                 bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_MASTER_SLAVE_SWITCH|HCI_ENABLE_SNIFF_MODE), p_scb->peer_addr);
    958             }
    959             */
    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);
    965 
    966             peer_idx = p_scb->hdi + 1;  /* Handle index for the peer_addr */
    967         }
    968     }
    969 
    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) )
    974     {
    975         bta_sys_set_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, peer_addr);
    976     }
    977 
    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))
    981     {
    982         if ((bta_av_cb.rs_idx -1) < BTA_AV_NUM_STRS)
    983         {
    984             p_scb = bta_av_cb.p_scb[bta_av_cb.rs_idx - 1];
    985         }
    986         if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN)
    987         {
    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);
    990 
    991             if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id)
    992                 p_scb->q_info.open.switch_res = BTA_AV_RS_OK;
    993             else
    994                 p_scb->q_info.open.switch_res = BTA_AV_RS_FAIL;
    995 
    996             /* Continue av open process */
    997             bta_av_do_disc_a2d (p_scb, (tBTA_AV_DATA *)&(p_scb->q_info.open));
    998         }
    999 
   1000         bta_av_cb.rs_idx = 0;
   1001     }
   1002 }
   1003 
   1004 /*******************************************************************************
   1005 **
   1006 ** Function         bta_av_sco_chg_cback
   1007 **
   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.
   1011 **
   1012 ** Returns          void
   1013 **
   1014 *******************************************************************************/
   1015 static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8
   1016                                  app_id, BD_ADDR peer_addr)
   1017 {
   1018     tBTA_AV_SCB *p_scb;
   1019     int     i;
   1020     tBTA_AV_API_STOP stop;
   1021     UNUSED(app_id);
   1022     UNUSED(peer_addr);
   1023 
   1024     APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d", id, status);
   1025     if(id)
   1026     {
   1027         bta_av_cb.sco_occupied = TRUE;
   1028 
   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++)
   1031         {
   1032             p_scb = bta_av_cb.p_scb[i];
   1033 
   1034             if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE))
   1035             {
   1036                 APPL_TRACE_DEBUG("suspending scb:%d", i);
   1037                 /* scb is used and started, not suspended automatically */
   1038                 p_scb->sco_suspend = TRUE;
   1039                 stop.flush   = FALSE;
   1040                 stop.suspend = TRUE;
   1041                 bta_av_ssm_execute(p_scb, BTA_AV_AP_STOP_EVT, (tBTA_AV_DATA *)&stop);
   1042             }
   1043         }
   1044     }
   1045     else
   1046     {
   1047         bta_av_cb.sco_occupied = FALSE;
   1048 
   1049         for(i=0; i<BTA_AV_NUM_STRS; i++)
   1050         {
   1051             p_scb = bta_av_cb.p_scb[i];
   1052 
   1053             if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */
   1054             {
   1055                 APPL_TRACE_DEBUG("starting scb:%d", i);
   1056                 bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL);
   1057             }
   1058         }
   1059     }
   1060 }
   1061 
   1062 /*******************************************************************************
   1063 **
   1064 ** Function         bta_av_switch_if_needed
   1065 **
   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.
   1069 **
   1070 ** Returns          TRUE, if role switch is done
   1071 **
   1072 *******************************************************************************/
   1073 BOOLEAN bta_av_switch_if_needed(tBTA_AV_SCB *p_scb)
   1074 {
   1075     UINT8 role;
   1076     BOOLEAN needed = FALSE;
   1077     tBTA_AV_SCB *p_scbi;
   1078     int i;
   1079     UINT8       mask;
   1080 
   1081     for(i=0; i<BTA_AV_NUM_STRS; i++)
   1082     {
   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 */
   1088         {
   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)
   1092             {
   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))
   1096                 {
   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);
   1100                 }
   1101                 needed = TRUE;
   1102                 /* mark the original channel as waiting for RS result */
   1103                 bta_av_cb.rs_idx = p_scb->hdi + 1;
   1104                 break;
   1105             }
   1106         }
   1107     }
   1108     return needed;
   1109 }
   1110 
   1111 /*******************************************************************************
   1112 **
   1113 ** Function         bta_av_link_role_ok
   1114 **
   1115 ** Description      This function checks if the SCB has existing ACL connection
   1116 **                  If so, check if the link role fits the requirements.
   1117 **
   1118 ** Returns          TRUE, if role is ok
   1119 **
   1120 *******************************************************************************/
   1121 BOOLEAN bta_av_link_role_ok(tBTA_AV_SCB *p_scb, UINT8 bits)
   1122 {
   1123     UINT8 role;
   1124     BOOLEAN is_ok = TRUE;
   1125 
   1126     if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS)
   1127     {
   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)))
   1132         {
   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);
   1135 
   1136             if (BTM_CMD_STARTED != BTM_SwitchRole(p_scb->peer_addr, BTM_ROLE_MASTER, NULL))
   1137             {
   1138                 /* can not switch role on SCB - start the timer on SCB */
   1139             }
   1140             is_ok = FALSE;
   1141             p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_START;
   1142 
   1143         }
   1144     }
   1145 
   1146     return is_ok;
   1147 }
   1148 
   1149 /*******************************************************************************
   1150 **
   1151 ** Function         bta_av_chk_mtu
   1152 **
   1153 ** Description      if this is audio channel, check if more than one audio
   1154 **                  channel is connected.
   1155 **
   1156 ** Returns          The smallest mtu of the connected audio channels
   1157 **
   1158 *******************************************************************************/
   1159 UINT16 bta_av_chk_mtu(tBTA_AV_SCB *p_scb, UINT16 mtu)
   1160 {
   1161     UINT16 ret_mtu = BTA_AV_MAX_A2DP_MTU;
   1162     tBTA_AV_SCB *p_scbi;
   1163     int i;
   1164     UINT8   mask;
   1165     UNUSED(mtu);
   1166 
   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)
   1169     {
   1170         if(bta_av_cb.audio_open_cnt >= 2)
   1171         {
   1172             /* more than one audio channel is connected */
   1173             for(i=0; i<BTA_AV_NUM_STRS; i++)
   1174             {
   1175                 p_scbi = bta_av_cb.p_scb[i];
   1176                 if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) )
   1177                 {
   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)
   1182                     {
   1183                         if(ret_mtu > p_scbi->stream_mtu)
   1184                             ret_mtu = p_scbi->stream_mtu;
   1185                     }
   1186                 }
   1187             }
   1188         }
   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);
   1191     }
   1192     return ret_mtu;
   1193 }
   1194 
   1195 /*******************************************************************************
   1196 **
   1197 ** Function         bta_av_dup_audio_buf
   1198 **
   1199 ** Description      dup the audio data to the q_info.a2d of other audio channels
   1200 **
   1201 ** Returns          void
   1202 **
   1203 *******************************************************************************/
   1204 void bta_av_dup_audio_buf(tBTA_AV_SCB *p_scb, BT_HDR *p_buf)
   1205 {
   1206     tBTA_AV_SCB *p_scbi;
   1207     int     i;
   1208     UINT16  size, copy_size;
   1209     BT_HDR *p_new;
   1210 
   1211     if(!p_buf)
   1212         return;
   1213 
   1214     if(bta_av_cb.audio_open_cnt >= 2)
   1215     {
   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++)
   1220         {
   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 */
   1225             {
   1226                 /* enqueue the data only when the stream is started */
   1227                 p_new = (BT_HDR *)GKI_getbuf(size);
   1228                 if(p_new)
   1229                 {
   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);
   1237                         GKI_freebuf(p_buf);
   1238                     }
   1239                 }
   1240             }
   1241         }
   1242     }
   1243 
   1244 }
   1245 
   1246 /*******************************************************************************
   1247 **
   1248 ** Function         bta_av_sm_execute
   1249 **
   1250 ** Description      State machine event handling function for AV
   1251 **
   1252 **
   1253 ** Returns          void
   1254 **
   1255 *******************************************************************************/
   1256 void bta_av_sm_execute(tBTA_AV_CB *p_cb, UINT16 event, tBTA_AV_DATA *p_data)
   1257 {
   1258     tBTA_AV_ST_TBL      state_table;
   1259     UINT8               action;
   1260 
   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));
   1264 #else
   1265     APPL_TRACE_EVENT("AV event=0x%x state=%d", event, p_cb->state);
   1266 #endif
   1267 
   1268     /* look up the state table for the current state */
   1269     state_table = bta_av_st_tbl[p_cb->state];
   1270 
   1271     event &= 0x00FF;
   1272 
   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);
   1276 
   1277     /* execute action functions */
   1278     if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE)
   1279     {
   1280         (*bta_av_action[action])(p_cb, p_data);
   1281     }
   1282 }
   1283 
   1284 
   1285 /*******************************************************************************
   1286 **
   1287 ** Function         bta_av_hdl_event
   1288 **
   1289 ** Description      Advanced audio/video main event handling function.
   1290 **
   1291 **
   1292 ** Returns          BOOLEAN
   1293 **
   1294 *******************************************************************************/
   1295 BOOLEAN bta_av_hdl_event(BT_HDR *p_msg)
   1296 {
   1297     UINT16 event = p_msg->event;
   1298     UINT16 first_event = BTA_AV_FIRST_NSM_EVT;
   1299 
   1300     if (event > BTA_AV_LAST_EVT)
   1301     {
   1302         return TRUE; /* to free p_msg */
   1303     }
   1304 
   1305     if(event >= first_event)
   1306     {
   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));
   1309 #else
   1310         APPL_TRACE_VERBOSE("AV nsm event=0x%x", event);
   1311 #endif
   1312         /* non state machine events */
   1313         (*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg);
   1314     }
   1315     else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT)
   1316     {
   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));
   1319 #else
   1320         APPL_TRACE_VERBOSE("AV sm event=0x%x", event);
   1321 #endif
   1322         /* state machine events */
   1323         bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg);
   1324     }
   1325     else
   1326     {
   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);
   1331     }
   1332     return TRUE;
   1333 }
   1334 
   1335 
   1336 /*****************************************************************************
   1337 **  Debug Functions
   1338 *****************************************************************************/
   1339 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
   1340 /*******************************************************************************
   1341 **
   1342 ** Function         bta_av_st_code
   1343 **
   1344 ** Description
   1345 **
   1346 ** Returns          char *
   1347 **
   1348 *******************************************************************************/
   1349 static char *bta_av_st_code(UINT8 state)
   1350 {
   1351     switch(state)
   1352     {
   1353     case BTA_AV_INIT_ST: return "INIT";
   1354     case BTA_AV_OPEN_ST: return "OPEN";
   1355     default:             return "unknown";
   1356     }
   1357 }
   1358 /*******************************************************************************
   1359 **
   1360 ** Function         bta_av_evt_code
   1361 **
   1362 ** Description
   1363 **
   1364 ** Returns          char *
   1365 **
   1366 *******************************************************************************/
   1367 char *bta_av_evt_code(UINT16 evt_code)
   1368 {
   1369     switch(evt_code)
   1370     {
   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";
   1380 
   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";
   1415 
   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";
   1429 #endif
   1430 #if (AVDT_REPORTING == TRUE)
   1431     case BTA_AV_AVDT_RPT_CONN_EVT: return "RPT_CONN";
   1432 #endif
   1433     case BTA_AV_API_START_EVT: return "API_START";
   1434     case BTA_AV_API_STOP_EVT: return "API_STOP";
   1435     default:             return "unknown";
   1436     }
   1437 }
   1438 #endif
   1439 
   1440 #endif /* BTA_AV_INCLUDED */
   1441