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 #define LOG_TAG "bt_bta_av" 26 27 #include <assert.h> 28 #include <string.h> 29 30 #include "bt_target.h" 31 #include "osi/include/log.h" 32 33 #if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE) 34 #include "bta_av_co.h" 35 #include "bta_av_int.h" 36 #include "l2c_api.h" 37 #include "l2cdefs.h" 38 #include "utl.h" 39 40 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 41 #include "bta_ar_api.h" 42 #endif 43 44 /***************************************************************************** 45 ** Constants and types 46 *****************************************************************************/ 47 48 /* AVDTP protocol timeout values */ 49 #define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink" 50 51 #ifndef BTA_AV_RET_TOUT 52 #define BTA_AV_RET_TOUT 4 53 #endif 54 55 #ifndef BTA_AV_SIG_TOUT 56 #define BTA_AV_SIG_TOUT 4 57 #endif 58 59 #ifndef BTA_AV_IDLE_TOUT 60 #define BTA_AV_IDLE_TOUT 10 61 #endif 62 63 /* the delay time in milliseconds to retry role switch */ 64 #ifndef BTA_AV_RS_TIME_VAL 65 #define BTA_AV_RS_TIME_VAL 1000 66 #endif 67 68 /* state machine states */ 69 enum 70 { 71 BTA_AV_INIT_ST, 72 BTA_AV_OPEN_ST 73 }; 74 75 /* state machine action enumeration list */ 76 enum 77 { 78 BTA_AV_DISABLE, 79 BTA_AV_RC_OPENED, 80 BTA_AV_RC_REMOTE_CMD, 81 BTA_AV_RC_VENDOR_CMD, 82 BTA_AV_RC_VENDOR_RSP, 83 BTA_AV_RC_FREE_RSP, 84 BTA_AV_RC_FREE_MSG, 85 BTA_AV_RC_META_RSP, 86 BTA_AV_RC_MSG, 87 BTA_AV_RC_CLOSE, 88 BTA_AV_NUM_ACTIONS 89 }; 90 91 #define BTA_AV_IGNORE BTA_AV_NUM_ACTIONS 92 93 /* type for action functions */ 94 typedef void (*tBTA_AV_ACTION)(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data); 95 96 /* action functions */ 97 const tBTA_AV_ACTION bta_av_action[] = 98 { 99 bta_av_disable, 100 bta_av_rc_opened, 101 bta_av_rc_remote_cmd, 102 bta_av_rc_vendor_cmd, 103 bta_av_rc_vendor_rsp, 104 bta_av_rc_free_rsp, 105 bta_av_rc_free_msg, 106 bta_av_rc_meta_rsp, 107 bta_av_rc_msg, 108 bta_av_rc_close, 109 NULL 110 }; 111 112 /* state table information */ 113 #define BTA_AV_ACTION_COL 0 /* position of actions */ 114 #define BTA_AV_NEXT_STATE 1 /* position of next state */ 115 #define BTA_AV_NUM_COLS 2 /* number of columns in state tables */ 116 117 /* state table for init state */ 118 static const UINT8 bta_av_st_init[][BTA_AV_NUM_COLS] = 119 { 120 /* Event Action 1 Next state */ 121 /* API_DISABLE_EVT */ {BTA_AV_DISABLE, BTA_AV_INIT_ST }, 122 /* API_REMOTE_CMD_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST }, 123 /* API_VENDOR_CMD_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST }, 124 /* API_VENDOR_RSP_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST }, 125 /* API_META_RSP_EVT */ {BTA_AV_RC_FREE_RSP, BTA_AV_INIT_ST }, 126 /* API_RC_CLOSE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST }, 127 /* AVRC_OPEN_EVT */ {BTA_AV_RC_OPENED, BTA_AV_OPEN_ST }, 128 /* AVRC_MSG_EVT */ {BTA_AV_RC_FREE_MSG, BTA_AV_INIT_ST }, 129 /* AVRC_NONE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST }, 130 }; 131 132 /* state table for open state */ 133 static const UINT8 bta_av_st_open[][BTA_AV_NUM_COLS] = 134 { 135 /* Event Action 1 Next state */ 136 /* API_DISABLE_EVT */ {BTA_AV_DISABLE, BTA_AV_INIT_ST }, 137 /* API_REMOTE_CMD_EVT */ {BTA_AV_RC_REMOTE_CMD, BTA_AV_OPEN_ST }, 138 /* API_VENDOR_CMD_EVT */ {BTA_AV_RC_VENDOR_CMD, BTA_AV_OPEN_ST }, 139 /* API_VENDOR_RSP_EVT */ {BTA_AV_RC_VENDOR_RSP, BTA_AV_OPEN_ST }, 140 /* API_META_RSP_EVT */ {BTA_AV_RC_META_RSP, BTA_AV_OPEN_ST }, 141 /* API_RC_CLOSE_EVT */ {BTA_AV_RC_CLOSE, BTA_AV_OPEN_ST }, 142 /* AVRC_OPEN_EVT */ {BTA_AV_RC_OPENED, BTA_AV_OPEN_ST }, 143 /* AVRC_MSG_EVT */ {BTA_AV_RC_MSG, BTA_AV_OPEN_ST }, 144 /* AVRC_NONE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST }, 145 }; 146 147 /* type for state table */ 148 typedef const UINT8 (*tBTA_AV_ST_TBL)[BTA_AV_NUM_COLS]; 149 150 /* state table */ 151 static const tBTA_AV_ST_TBL bta_av_st_tbl[] = 152 { 153 bta_av_st_init, 154 bta_av_st_open 155 }; 156 157 typedef void (*tBTA_AV_NSM_ACT)(tBTA_AV_DATA *p_data); 158 static void bta_av_api_enable(tBTA_AV_DATA *p_data); 159 static void bta_av_api_register(tBTA_AV_DATA *p_data); 160 #if (BTA_AV_SINK_INCLUDED == TRUE) 161 static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data); 162 #endif 163 static void bta_av_ci_data(tBTA_AV_DATA *p_data); 164 #if (AVDT_REPORTING == TRUE) 165 static void bta_av_rpc_conn(tBTA_AV_DATA *p_data); 166 #endif 167 static void bta_av_api_to_ssm(tBTA_AV_DATA *p_data); 168 169 static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 170 app_id, BD_ADDR peer_addr); 171 static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app_id, BD_ADDR peer_addr); 172 173 /* action functions */ 174 const tBTA_AV_NSM_ACT bta_av_nsm_act[] = 175 { 176 bta_av_api_enable, /* BTA_AV_API_ENABLE_EVT */ 177 bta_av_api_register, /* BTA_AV_API_REGISTER_EVT */ 178 bta_av_api_deregister, /* BTA_AV_API_DEREGISTER_EVT */ 179 bta_av_api_disconnect, /* BTA_AV_API_DISCONNECT_EVT */ 180 bta_av_ci_data, /* BTA_AV_CI_SRC_DATA_READY_EVT */ 181 bta_av_sig_chg, /* BTA_AV_SIG_CHG_EVT */ 182 bta_av_signalling_timer, /* BTA_AV_SIGNALLING_TIMER_EVT */ 183 bta_av_rc_disc_done, /* BTA_AV_SDP_AVRC_DISC_EVT */ 184 bta_av_rc_closed, /* BTA_AV_AVRC_CLOSE_EVT */ 185 bta_av_conn_chg, /* BTA_AV_CONN_CHG_EVT */ 186 bta_av_dereg_comp, /* BTA_AV_DEREG_COMP_EVT */ 187 #if (BTA_AV_SINK_INCLUDED == TRUE) 188 bta_av_api_sink_enable, /* BTA_AV_API_SINK_ENABLE_EVT */ 189 #endif 190 #if (AVDT_REPORTING == TRUE) 191 bta_av_rpc_conn, /* BTA_AV_AVDT_RPT_CONN_EVT */ 192 #endif 193 bta_av_api_to_ssm, /* BTA_AV_API_START_EVT */ 194 bta_av_api_to_ssm, /* BTA_AV_API_STOP_EVT */ 195 }; 196 197 /***************************************************************************** 198 ** Global data 199 *****************************************************************************/ 200 201 /* AV control block */ 202 #if BTA_DYNAMIC_MEMORY == FALSE 203 tBTA_AV_CB bta_av_cb; 204 #endif 205 206 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 207 static char *bta_av_st_code(UINT8 state); 208 #endif 209 210 /******************************************************************************* 211 ** 212 ** Function bta_av_api_enable 213 ** 214 ** Description Handle an API enable event. 215 ** 216 ** 217 ** Returns void 218 ** 219 *******************************************************************************/ 220 static void bta_av_api_enable(tBTA_AV_DATA *p_data) 221 { 222 /* initialize control block */ 223 memset(&bta_av_cb, 0, sizeof(tBTA_AV_CB)); 224 225 for (int i = 0; i < BTA_AV_NUM_RCB; i++) 226 bta_av_cb.rcb[i].handle = BTA_AV_RC_HANDLE_NONE; 227 228 bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE; 229 230 /* 231 * TODO: The "disable" event handling is missing - there we need 232 * to alarm_free() the alarms below. 233 */ 234 bta_av_cb.link_signalling_timer = alarm_new("bta_av.link_signalling_timer"); 235 bta_av_cb.accept_signalling_timer = 236 alarm_new("bta_av.accept_signalling_timer"); 237 238 /* store parameters */ 239 bta_av_cb.p_cback = p_data->api_enable.p_cback; 240 bta_av_cb.features = p_data->api_enable.features; 241 bta_av_cb.sec_mask = p_data->api_enable.sec_mask; 242 243 tBTA_AV_ENABLE enable; 244 enable.features = bta_av_cb.features; 245 246 /* Register for SCO change event */ 247 if (!(bta_av_cb.features & BTA_AV_FEAT_NO_SCO_SSPD)) 248 { 249 bta_sys_sco_register(bta_av_sco_chg_cback); 250 } 251 252 /* call callback with enable event */ 253 (*bta_av_cb.p_cback)(BTA_AV_ENABLE_EVT, (tBTA_AV *)&enable); 254 } 255 256 /******************************************************************************* 257 ** 258 ** Function bta_av_addr_to_scb 259 ** 260 ** Description find the stream control block by the peer addr 261 ** 262 ** Returns void 263 ** 264 *******************************************************************************/ 265 static tBTA_AV_SCB * bta_av_addr_to_scb(BD_ADDR bd_addr) 266 { 267 tBTA_AV_SCB * p_scb = NULL; 268 int xx; 269 270 for(xx=0; xx<BTA_AV_NUM_STRS; xx++) 271 { 272 if(bta_av_cb.p_scb[xx]) 273 { 274 if(!bdcmp(bd_addr, bta_av_cb.p_scb[xx]->peer_addr)) 275 { 276 p_scb = bta_av_cb.p_scb[xx]; 277 break; 278 } 279 } 280 } 281 return p_scb; 282 } 283 284 /******************************************************************************* 285 ** 286 ** Function bta_av_hndl_to_scb 287 ** 288 ** Description find the stream control block by the handle 289 ** 290 ** Returns void 291 ** 292 *******************************************************************************/ 293 tBTA_AV_SCB * bta_av_hndl_to_scb(UINT16 handle) 294 { 295 tBTA_AV_HNDL hndl = (tBTA_AV_HNDL)handle; 296 tBTA_AV_SCB * p_scb = NULL; 297 UINT8 idx = (hndl & BTA_AV_HNDL_MSK); 298 299 if(idx && (idx <= BTA_AV_NUM_STRS) ) 300 { 301 p_scb = bta_av_cb.p_scb[idx-1]; 302 } 303 return p_scb; 304 } 305 306 /******************************************************************************* 307 ** 308 ** Function bta_av_alloc_scb 309 ** 310 ** Description allocate stream control block, 311 ** register the service to stack 312 ** create SDP record 313 ** 314 ** Returns void 315 ** 316 *******************************************************************************/ 317 static tBTA_AV_SCB * bta_av_alloc_scb(tBTA_AV_CHNL chnl) 318 { 319 tBTA_AV_SCB *p_ret = NULL; 320 int xx; 321 tBTA_AV_STATUS sts = BTA_AV_SUCCESS; 322 323 if(chnl == BTA_AV_CHNL_VIDEO) 324 { 325 if(p_bta_av_cfg->p_act_tbl == NULL || p_bta_av_cfg->p_reg == NULL) 326 { 327 APPL_TRACE_ERROR("Video streaming not supported"); 328 sts = BTA_AV_FAIL; 329 } 330 else 331 { 332 /* allow only one Video channel */ 333 if(bta_av_cb.reg_video) 334 { 335 APPL_TRACE_ERROR("Already registered"); 336 sts = BTA_AV_FAIL; 337 } 338 } 339 } 340 else if(chnl != BTA_AV_CHNL_AUDIO) 341 { 342 APPL_TRACE_ERROR("bad channel: %d", chnl); 343 sts = BTA_AV_FAIL; 344 } 345 346 if(sts == BTA_AV_SUCCESS) 347 { 348 for(xx=0; xx<BTA_AV_NUM_STRS; xx++) 349 { 350 if(bta_av_cb.p_scb[xx] == NULL) 351 { 352 /* found an empty spot */ 353 p_ret = (tBTA_AV_SCB *)osi_calloc(sizeof(tBTA_AV_SCB)); 354 p_ret->rc_handle = BTA_AV_RC_HANDLE_NONE; 355 p_ret->chnl = chnl; 356 p_ret->hndl = (tBTA_AV_HNDL)((xx + 1) | chnl); 357 p_ret->hdi = xx; 358 p_ret->a2d_list = list_new(NULL); 359 p_ret->avrc_ct_timer = alarm_new("bta_av.avrc_ct_timer"); 360 bta_av_cb.p_scb[xx] = p_ret; 361 break; 362 } 363 } 364 } 365 return p_ret; 366 } 367 368 /******************************************************************************* 369 *******************************************************************************/ 370 void bta_av_conn_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 371 { 372 UINT16 evt = 0; 373 tBTA_AV_SCB *p_scb = NULL; 374 UNUSED(handle); 375 376 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 377 if (event == BTA_AR_AVDT_CONN_EVT || 378 event == AVDT_CONNECT_IND_EVT || event == AVDT_DISCONNECT_IND_EVT) 379 #else 380 if (event == AVDT_CONNECT_IND_EVT || event == AVDT_DISCONNECT_IND_EVT) 381 #endif 382 { 383 evt = BTA_AV_SIG_CHG_EVT; 384 if(AVDT_DISCONNECT_IND_EVT == event) 385 p_scb = bta_av_addr_to_scb(bd_addr); 386 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 387 else if (AVDT_CONNECT_IND_EVT == event) 388 { 389 APPL_TRACE_DEBUG("CONN_IND is ACP:%d", p_data->hdr.err_param); 390 } 391 #endif 392 393 tBTA_AV_STR_MSG *p_msg = 394 (tBTA_AV_STR_MSG *)osi_malloc(sizeof(tBTA_AV_STR_MSG)); 395 p_msg->hdr.event = evt; 396 p_msg->hdr.layer_specific = event; 397 p_msg->hdr.offset = p_data->hdr.err_param; 398 bdcpy(p_msg->bd_addr, bd_addr); 399 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 400 if(p_scb) { 401 APPL_TRACE_DEBUG("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role); 402 } 403 #endif 404 APPL_TRACE_DEBUG("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 405 bd_addr[0], bd_addr[1], 406 bd_addr[2], bd_addr[3], 407 bd_addr[4], bd_addr[5]); 408 bta_sys_sendmsg(p_msg); 409 } 410 } 411 412 #if AVDT_REPORTING == TRUE 413 /******************************************************************************* 414 ** 415 ** Function bta_av_a2dp_report_cback 416 ** 417 ** Description A2DP report callback. 418 ** 419 ** Returns void 420 ** 421 *******************************************************************************/ 422 static void bta_av_a2dp_report_cback(UINT8 handle, AVDT_REPORT_TYPE type, 423 tAVDT_REPORT_DATA *p_data) 424 { 425 UNUSED(handle); 426 UNUSED(type); 427 UNUSED(p_data); 428 /* Do not need to handle report data for now. 429 * This empty function is here for conformance reasons. */ 430 } 431 #endif 432 433 #if (BTA_AV_SINK_INCLUDED == TRUE) 434 /******************************************************************************* 435 ** 436 ** Function bta_av_api_sink_enable 437 ** 438 ** Description activate, deactive A2DP Sink, 439 ** 440 ** Returns void 441 ** 442 *******************************************************************************/ 443 444 static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data) 445 { 446 UINT16 activate_sink = 0; 447 activate_sink = p_data->hdr.layer_specific; 448 APPL_TRACE_DEBUG("bta_av_api_sink_enable %d ", activate_sink) 449 char p_service_name[BTA_SERVICE_NAME_LEN+1]; 450 strlcpy(p_service_name, BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN); 451 452 if (activate_sink) 453 { 454 AVDT_SINK_Activate(); 455 if (bta_av_cb.sdp_a2d_snk_handle == 0) 456 { 457 bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord(); 458 A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_service_name, NULL, 459 A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle); 460 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK); 461 } 462 } 463 else 464 { 465 AVDT_SINK_Deactivate(); 466 if (bta_av_cb.sdp_a2d_snk_handle != 0) 467 { 468 SDP_DeleteRecord(bta_av_cb.sdp_a2d_snk_handle); 469 bta_av_cb.sdp_a2d_snk_handle = 0; 470 bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK); 471 } 472 } 473 } 474 #endif 475 /******************************************************************************* 476 ** 477 ** Function bta_av_api_register 478 ** 479 ** Description allocate stream control block, 480 ** register the service to stack 481 ** create SDP record 482 ** 483 ** Returns void 484 ** 485 *******************************************************************************/ 486 static void bta_av_api_register(tBTA_AV_DATA *p_data) 487 { 488 tBTA_AV_REGISTER registr; 489 tBTA_AV_SCB *p_scb; /* stream control block */ 490 tAVDT_REG reg; 491 tAVDT_CS cs; 492 char *p_service_name; 493 tBTA_AV_CODEC codec_type; 494 tBTA_UTL_COD cod; 495 UINT8 index = 0; 496 497 memset(&cs,0,sizeof(tAVDT_CS)); 498 499 registr.status = BTA_AV_FAIL_RESOURCES; 500 registr.app_id = p_data->api_reg.app_id; 501 registr.chnl = (tBTA_AV_CHNL)p_data->hdr.layer_specific; 502 503 UINT16 profile_initialized = p_data->api_reg.service_uuid; 504 if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) 505 { 506 p_bta_av_cfg = (tBTA_AV_CFG *) &bta_avk_cfg; 507 } 508 else if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) 509 { 510 p_bta_av_cfg = (tBTA_AV_CFG *) &bta_av_cfg; 511 } 512 513 do 514 { 515 p_scb = bta_av_alloc_scb(registr.chnl); 516 if(p_scb == NULL) 517 { 518 APPL_TRACE_ERROR("failed to alloc SCB"); 519 break; 520 } 521 522 registr.hndl = p_scb->hndl; 523 p_scb->app_id = registr.app_id; 524 525 /* initialize the stream control block */ 526 registr.status = BTA_AV_SUCCESS; 527 528 if((bta_av_cb.reg_audio + bta_av_cb.reg_video) == 0) 529 { 530 /* the first channel registered. register to AVDTP */ 531 reg.ctrl_mtu = p_bta_av_cfg->sig_mtu; 532 reg.ret_tout = BTA_AV_RET_TOUT; 533 reg.sig_tout = BTA_AV_SIG_TOUT; 534 reg.idle_tout = BTA_AV_IDLE_TOUT; 535 reg.sec_mask = bta_av_cb.sec_mask; 536 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 537 bta_ar_reg_avdt(®, bta_av_conn_cback, BTA_ID_AV); 538 #endif 539 bta_sys_role_chg_register(&bta_av_sys_rs_cback); 540 541 /* create remote control TG service if required */ 542 if (bta_av_cb.features & (BTA_AV_FEAT_RCTG)) 543 { 544 /* register with no authorization; let AVDTP use authorization instead */ 545 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 546 #if (BTA_AV_WITH_AVCTP_AUTHORIZATION == TRUE) 547 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu, 548 bta_av_cb.sec_mask, BTA_ID_AV); 549 #else 550 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu, 551 (UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV); 552 #endif 553 if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) 554 { 555 bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target", 556 NULL, p_bta_av_cfg->avrc_tg_cat, BTA_ID_AV, 557 (bta_av_cb.features & BTA_AV_FEAT_BROWSE), AVRC_REV_1_3); 558 } 559 else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) 560 { 561 // Initialize AVRCP1.4 to provide Absolute Volume control. 562 bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target", 563 NULL, p_bta_av_cfg->avrc_tg_cat, BTA_ID_AV, 564 (bta_av_cb.features & BTA_AV_FEAT_BROWSE), AVRC_REV_1_4); 565 } 566 #endif 567 } 568 569 /* Set the Capturing service class bit */ 570 if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) 571 cod.service = BTM_COD_SERVICE_CAPTURING; 572 else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) 573 cod.service = BTM_COD_SERVICE_RENDERING; 574 utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS); 575 } /* if 1st channel */ 576 577 /* get stream configuration and create stream */ 578 /* memset(&cs.cfg,0,sizeof(tAVDT_CFG)); */ 579 cs.cfg.num_codec = 1; 580 581 582 /* 583 * memset of cs takes care setting call back pointers to null. 584 cs.p_data_cback = NULL; 585 cs.p_report_cback = NULL; 586 */ 587 cs.nsc_mask = AVDT_NSC_RECONFIG | 588 ((bta_av_cb.features & BTA_AV_FEAT_PROTECT) ? 0 : AVDT_NSC_SECURITY); 589 APPL_TRACE_DEBUG("nsc_mask: 0x%x", cs.nsc_mask); 590 591 if (p_data->api_reg.p_service_name[0] == 0) 592 { 593 p_service_name = NULL; 594 } 595 else 596 { 597 p_service_name = p_data->api_reg.p_service_name; 598 } 599 600 p_scb->suspend_sup = TRUE; 601 p_scb->recfg_sup = TRUE; 602 p_scb->skip_sdp = FALSE; 603 604 cs.p_ctrl_cback = bta_av_dt_cback[p_scb->hdi]; 605 if(registr.chnl == BTA_AV_CHNL_AUDIO) 606 { 607 /* set up the audio stream control block */ 608 p_scb->p_act_tbl = (const tBTA_AV_ACT *)bta_av_a2d_action; 609 p_scb->p_cos = &bta_av_a2d_cos; 610 p_scb->media_type= AVDT_MEDIA_AUDIO; 611 cs.cfg.psc_mask = AVDT_PSC_TRANS; 612 cs.media_type = AVDT_MEDIA_AUDIO; 613 cs.mtu = p_bta_av_cfg->audio_mtu; 614 cs.flush_to = L2CAP_DEFAULT_FLUSH_TO; 615 #if AVDT_REPORTING == TRUE 616 if(bta_av_cb.features & BTA_AV_FEAT_REPORT) 617 { 618 cs.cfg.psc_mask |= AVDT_PSC_REPORT; 619 cs.p_report_cback = bta_av_a2dp_report_cback; 620 #if AVDT_MULTIPLEXING == TRUE 621 cs.cfg.mux_tsid_report = 2; 622 #endif 623 } 624 #endif 625 if(bta_av_cb.features & BTA_AV_FEAT_DELAY_RPT) 626 cs.cfg.psc_mask |= AVDT_PSC_DELAY_RPT; 627 628 if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) 629 { 630 cs.tsep = AVDT_TSEP_SRC; 631 index = 0; 632 } 633 else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) 634 { 635 cs.tsep = AVDT_TSEP_SNK; 636 cs.p_data_cback = bta_av_stream_data_cback; 637 index = 1; 638 } 639 640 /* Initialize Handles to zero */ 641 for (int xx=0; xx < BTA_AV_MAX_SEPS; xx++) 642 { 643 p_scb->seps[xx].av_handle = 0; 644 } 645 646 /* keep the configuration in the stream control block */ 647 memcpy(&p_scb->cfg, &cs.cfg, sizeof(tAVDT_CFG)); 648 if ((*bta_av_a2d_cos.init)(&codec_type, cs.cfg.codec_info, 649 &cs.cfg.num_protect, cs.cfg.protect_info, index) == TRUE) 650 { 651 if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS) 652 { 653 p_scb->seps[index].codec_type = codec_type; 654 p_scb->seps[index].tsep = cs.tsep; 655 if(cs.tsep == AVDT_TSEP_SNK) 656 p_scb->seps[index].p_app_data_cback = p_data->api_reg.p_app_data_cback; 657 else 658 p_scb->seps[index].p_app_data_cback = NULL; /* In case of A2DP SOURCE we don't need a callback to handle media packets */ 659 660 } 661 } 662 663 if(!bta_av_cb.reg_audio) 664 { 665 bta_av_cb.sdp_a2d_handle = 0; 666 #if (BTA_AV_SINK_INCLUDED == TRUE) 667 bta_av_cb.sdp_a2d_snk_handle = 0; 668 #endif 669 if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) 670 { 671 /* create the SDP records on the 1st audio channel */ 672 bta_av_cb.sdp_a2d_handle = SDP_CreateRecord(); 673 A2D_AddRecord(UUID_SERVCLASS_AUDIO_SOURCE, p_service_name, NULL, 674 A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_handle); 675 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SOURCE); 676 } 677 else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) 678 { 679 #if (BTA_AV_SINK_INCLUDED == TRUE) 680 bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord(); 681 A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_service_name, NULL, 682 A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle); 683 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK); 684 #endif 685 } 686 /* start listening when A2DP is registered */ 687 if (bta_av_cb.features & BTA_AV_FEAT_RCTG) 688 bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1); 689 690 /* if the AV and AVK are both supported, it cannot support the CT role */ 691 if (bta_av_cb.features & (BTA_AV_FEAT_RCCT)) 692 { 693 /* if TG is not supported, we need to register to AVCT now */ 694 if ((bta_av_cb.features & (BTA_AV_FEAT_RCTG)) == 0) 695 { 696 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 697 #if (BTA_AV_WITH_AVCTP_AUTHORIZATION == TRUE) 698 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu, 699 bta_av_cb.sec_mask, BTA_ID_AV); 700 #else 701 bta_ar_reg_avct(p_bta_av_cfg->avrc_mtu, p_bta_av_cfg->avrc_br_mtu, 702 (UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV); 703 #endif 704 #endif 705 bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1); 706 } 707 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 708 /* create an SDP record as AVRC CT. We create 1.3 for SOURCE 709 * because we rely on feature bits being scanned by external 710 * devices more than the profile version itself. 711 */ 712 if ((profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) || 713 (profile_initialized == UUID_SERVCLASS_AUDIO_SINK)) 714 { 715 bta_ar_reg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, NULL, NULL, 716 p_bta_av_cfg->avrc_ct_cat, BTA_ID_AV, 717 (bta_av_cb.features & BTA_AV_FEAT_BROWSE), AVRC_REV_1_3); 718 } 719 #endif 720 } 721 } 722 bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi); 723 APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio); 724 } 725 else 726 { 727 bta_av_cb.reg_video = BTA_AV_HNDL_TO_MSK(p_scb->hdi); 728 bta_av_cb.sdp_vdp_handle = SDP_CreateRecord(); 729 /* register the video channel */ 730 /* no need to verify the function pointer here. it's verified prior */ 731 (*p_bta_av_cfg->p_reg)(&cs, p_service_name, p_scb); 732 } 733 } while (0); 734 735 /* call callback with register event */ 736 (*bta_av_cb.p_cback)(BTA_AV_REGISTER_EVT, (tBTA_AV *)®istr); 737 } 738 739 /******************************************************************************* 740 ** 741 ** Function bta_av_api_deregister 742 ** 743 ** Description de-register a channel 744 ** 745 ** 746 ** Returns void 747 ** 748 *******************************************************************************/ 749 void bta_av_api_deregister(tBTA_AV_DATA *p_data) 750 { 751 tBTA_AV_SCB *p_scb = bta_av_hndl_to_scb(p_data->hdr.layer_specific); 752 753 if(p_scb) 754 { 755 p_scb->deregistring = TRUE; 756 bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, p_data); 757 } 758 else 759 { 760 bta_av_dereg_comp(p_data); 761 } 762 } 763 764 /******************************************************************************* 765 ** 766 ** Function bta_av_ci_data 767 ** 768 ** Description forward the BTA_AV_CI_SRC_DATA_READY_EVT to stream state machine 769 ** 770 ** 771 ** Returns void 772 ** 773 *******************************************************************************/ 774 static void bta_av_ci_data(tBTA_AV_DATA *p_data) 775 { 776 tBTA_AV_SCB *p_scb; 777 int i; 778 UINT8 chnl = (UINT8)p_data->hdr.layer_specific; 779 780 for( i=0; i < BTA_AV_NUM_STRS; i++ ) 781 { 782 p_scb = bta_av_cb.p_scb[i]; 783 784 if(p_scb && p_scb->chnl == chnl) 785 { 786 bta_av_ssm_execute(p_scb, BTA_AV_SRC_DATA_READY_EVT, p_data); 787 } 788 } 789 } 790 791 /******************************************************************************* 792 ** 793 ** Function bta_av_rpc_conn 794 ** 795 ** Description report report channel open 796 ** 797 ** Returns void 798 ** 799 *******************************************************************************/ 800 #if (AVDT_REPORTING == TRUE) 801 static void bta_av_rpc_conn(tBTA_AV_DATA *p_data) 802 { 803 UNUSED(p_data); 804 } 805 #endif 806 807 /******************************************************************************* 808 ** 809 ** Function bta_av_api_to_ssm 810 ** 811 ** Description forward the API request to stream state machine 812 ** 813 ** 814 ** Returns void 815 ** 816 *******************************************************************************/ 817 static void bta_av_api_to_ssm(tBTA_AV_DATA *p_data) 818 { 819 int xx; 820 UINT16 event = p_data->hdr.event - BTA_AV_FIRST_A2S_API_EVT + BTA_AV_FIRST_A2S_SSM_EVT; 821 822 for(xx=0; xx<BTA_AV_NUM_STRS; xx++) 823 { 824 bta_av_ssm_execute(bta_av_cb.p_scb[xx], event, p_data); 825 } 826 } 827 828 /******************************************************************************* 829 ** 830 ** Function bta_av_chk_start 831 ** 832 ** Description if this is audio channel, check if more than one audio 833 ** channel is connected & already started. 834 ** 835 ** Returns TRUE, if need api_start 836 ** 837 *******************************************************************************/ 838 BOOLEAN bta_av_chk_start(tBTA_AV_SCB *p_scb) 839 { 840 BOOLEAN start = FALSE; 841 tBTA_AV_SCB *p_scbi; 842 int i; 843 844 if(p_scb->chnl == BTA_AV_CHNL_AUDIO) 845 { 846 if ((bta_av_cb.audio_open_cnt >= 2) && 847 ((0 == (p_scb->role & BTA_AV_ROLE_AD_ACP)) || /* Outgoing connection or */ 848 (bta_av_cb.features & BTA_AV_FEAT_ACP_START))) /* auto-starting option */ 849 { 850 /* more than one audio channel is connected */ 851 /* if this is the 2nd stream as ACP, give INT a chance to issue the START command */ 852 for(i=0; i<BTA_AV_NUM_STRS; i++) 853 { 854 p_scbi = bta_av_cb.p_scb[i]; 855 if(p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started) 856 { 857 start = TRUE; 858 /* may need to update the flush timeout of this already started stream */ 859 if(p_scbi->co_started != bta_av_cb.audio_open_cnt) 860 { 861 p_scbi->co_started = bta_av_cb.audio_open_cnt; 862 L2CA_SetFlushTimeout(p_scbi->peer_addr, p_bta_av_cfg->p_audio_flush_to[p_scbi->co_started - 1] ); 863 } 864 } 865 } 866 } 867 } 868 return start; 869 } 870 871 /******************************************************************************* 872 ** 873 ** Function bta_av_restore_switch 874 ** 875 ** Description assume that the caller of this function already makes 876 ** sure that there's only one ACL connection left 877 ** 878 ** Returns void 879 ** 880 *******************************************************************************/ 881 void bta_av_restore_switch (void) 882 { 883 tBTA_AV_CB *p_cb = &bta_av_cb; 884 int i; 885 UINT8 mask; 886 887 APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio); 888 for(i=0; i<BTA_AV_NUM_STRS; i++) 889 { 890 mask = BTA_AV_HNDL_TO_MSK(i); 891 if (p_cb->conn_audio == mask) 892 { 893 if (p_cb->p_scb[i]) 894 { 895 bta_sys_set_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_cb->p_scb[i]->peer_addr); 896 } 897 break; 898 } 899 } 900 } 901 902 /******************************************************************************* 903 ** 904 ** Function bta_av_sys_rs_cback 905 ** 906 ** Description Receives the role change event from dm 907 ** 908 ** Returns (BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda) 909 ** 910 *******************************************************************************/ 911 static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 912 { 913 int i; 914 tBTA_AV_SCB *p_scb = NULL; 915 UINT8 cur_role; 916 UINT8 peer_idx = 0; 917 UNUSED(status); 918 919 APPL_TRACE_DEBUG("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx); 920 for(i=0; i<BTA_AV_NUM_STRS; i++) 921 { 922 /* loop through all the SCBs to find matching peer addresses and report the role change event */ 923 /* note that more than one SCB (a2dp & vdp) maybe waiting for this event */ 924 p_scb = bta_av_cb.p_scb[i]; 925 if (p_scb && (bdcmp (peer_addr, p_scb->peer_addr) == 0)) { 926 tBTA_AV_ROLE_RES *p_buf = 927 (tBTA_AV_ROLE_RES *)osi_malloc(sizeof(tBTA_AV_ROLE_RES)); 928 APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl); 929 /* 930 if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS)) 931 { 932 bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_MASTER_SLAVE_SWITCH|HCI_ENABLE_SNIFF_MODE), p_scb->peer_addr); 933 } 934 */ 935 p_buf->hdr.event = BTA_AV_ROLE_CHANGE_EVT; 936 p_buf->hdr.layer_specific = p_scb->hndl; 937 p_buf->new_role = id; 938 p_buf->hci_status = app_id; 939 bta_sys_sendmsg(p_buf); 940 941 peer_idx = p_scb->hdi + 1; /* Handle index for the peer_addr */ 942 } 943 } 944 945 /* restore role switch policy, if role switch failed */ 946 if ((HCI_SUCCESS != app_id) && 947 (BTM_GetRole (peer_addr, &cur_role) == BTM_SUCCESS) && 948 (cur_role == BTM_ROLE_SLAVE) ) 949 { 950 bta_sys_set_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, peer_addr); 951 } 952 953 /* if BTA_AvOpen() was called for other device, which caused the role switch of the peer_addr, */ 954 /* we need to continue opening process for the BTA_AvOpen(). */ 955 if ((bta_av_cb.rs_idx != 0) && (bta_av_cb.rs_idx != peer_idx)) 956 { 957 if ((bta_av_cb.rs_idx -1) < BTA_AV_NUM_STRS) 958 { 959 p_scb = bta_av_cb.p_scb[bta_av_cb.rs_idx - 1]; 960 } 961 if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 962 { 963 APPL_TRACE_DEBUG ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d", 964 bta_av_cb.rs_idx, p_scb->hndl, p_scb->q_tag); 965 966 if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id) 967 p_scb->q_info.open.switch_res = BTA_AV_RS_OK; 968 else 969 p_scb->q_info.open.switch_res = BTA_AV_RS_FAIL; 970 971 /* Continue av open process */ 972 bta_av_do_disc_a2d (p_scb, (tBTA_AV_DATA *)&(p_scb->q_info.open)); 973 } 974 975 bta_av_cb.rs_idx = 0; 976 } 977 } 978 979 /******************************************************************************* 980 ** 981 ** Function bta_av_sco_chg_cback 982 ** 983 ** Description receive & process the SCO connection up/down event from sys. 984 ** call setup also triggers this callback, to suspend av before sco 985 ** activity happens, or to resume av once call ends. 986 ** 987 ** Returns void 988 ** 989 *******************************************************************************/ 990 static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 991 app_id, BD_ADDR peer_addr) 992 { 993 tBTA_AV_SCB *p_scb; 994 int i; 995 tBTA_AV_API_STOP stop; 996 UNUSED(app_id); 997 UNUSED(peer_addr); 998 999 APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d", id, status); 1000 if(id) 1001 { 1002 bta_av_cb.sco_occupied = TRUE; 1003 1004 /* either BTA_SYS_SCO_OPEN or BTA_SYS_SCO_CLOSE with remaining active SCO */ 1005 for(i=0; i<BTA_AV_NUM_STRS; i++) 1006 { 1007 p_scb = bta_av_cb.p_scb[i]; 1008 1009 if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE)) 1010 { 1011 APPL_TRACE_DEBUG("suspending scb:%d", i); 1012 /* scb is used and started, not suspended automatically */ 1013 p_scb->sco_suspend = TRUE; 1014 stop.flush = FALSE; 1015 stop.suspend = TRUE; 1016 bta_av_ssm_execute(p_scb, BTA_AV_AP_STOP_EVT, (tBTA_AV_DATA *)&stop); 1017 } 1018 } 1019 } 1020 else 1021 { 1022 bta_av_cb.sco_occupied = FALSE; 1023 1024 for(i=0; i<BTA_AV_NUM_STRS; i++) 1025 { 1026 p_scb = bta_av_cb.p_scb[i]; 1027 1028 if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */ 1029 { 1030 APPL_TRACE_DEBUG("starting scb:%d", i); 1031 bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 1032 } 1033 } 1034 } 1035 } 1036 1037 /******************************************************************************* 1038 ** 1039 ** Function bta_av_switch_if_needed 1040 ** 1041 ** Description This function checks if there is another existing AV 1042 ** channel that is local as slave role. 1043 ** If so, role switch and remove it from link policy. 1044 ** 1045 ** Returns TRUE, if role switch is done 1046 ** 1047 *******************************************************************************/ 1048 BOOLEAN bta_av_switch_if_needed(tBTA_AV_SCB *p_scb) 1049 { 1050 UINT8 role; 1051 BOOLEAN needed = FALSE; 1052 tBTA_AV_SCB *p_scbi; 1053 int i; 1054 UINT8 mask; 1055 1056 for(i=0; i<BTA_AV_NUM_STRS; i++) 1057 { 1058 mask = BTA_AV_HNDL_TO_MSK(i); 1059 p_scbi = bta_av_cb.p_scb[i]; 1060 if( p_scbi && (p_scb->hdi != i) && /* not the original channel */ 1061 ((bta_av_cb.conn_audio & mask) ||/* connected audio */ 1062 (bta_av_cb.conn_video & mask)) ) /* connected video */ 1063 { 1064 BTM_GetRole(p_scbi->peer_addr, &role); 1065 /* this channel is open - clear the role switch link policy for this link */ 1066 if(BTM_ROLE_MASTER != role) 1067 { 1068 if (bta_av_cb.features & BTA_AV_FEAT_MASTER) 1069 bta_sys_clear_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_scbi->peer_addr); 1070 if (BTM_CMD_STARTED != BTM_SwitchRole(p_scbi->peer_addr, BTM_ROLE_MASTER, NULL)) 1071 { 1072 /* can not switch role on SCBI 1073 * start the timer on SCB - because this function is ONLY called when SCB gets API_OPEN */ 1074 bta_sys_start_timer(p_scb->avrc_ct_timer, 1075 BTA_AV_RS_TIME_VAL, 1076 BTA_AV_AVRC_TIMER_EVT, p_scb->hndl); 1077 } 1078 needed = TRUE; 1079 /* mark the original channel as waiting for RS result */ 1080 bta_av_cb.rs_idx = p_scb->hdi + 1; 1081 break; 1082 } 1083 } 1084 } 1085 return needed; 1086 } 1087 1088 /******************************************************************************* 1089 ** 1090 ** Function bta_av_link_role_ok 1091 ** 1092 ** Description This function checks if the SCB has existing ACL connection 1093 ** If so, check if the link role fits the requirements. 1094 ** 1095 ** Returns TRUE, if role is ok 1096 ** 1097 *******************************************************************************/ 1098 BOOLEAN bta_av_link_role_ok(tBTA_AV_SCB *p_scb, UINT8 bits) 1099 { 1100 UINT8 role; 1101 BOOLEAN is_ok = TRUE; 1102 1103 if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS) 1104 { 1105 LOG_INFO(LOG_TAG, "%s hndl:x%x role:%d conn_audio:x%x bits:%d features:x%x", 1106 __func__, p_scb->hndl, role, bta_av_cb.conn_audio, bits, 1107 bta_av_cb.features); 1108 if (BTM_ROLE_MASTER != role && (A2D_BitsSet(bta_av_cb.conn_audio) > bits || (bta_av_cb.features & BTA_AV_FEAT_MASTER))) 1109 { 1110 if (bta_av_cb.features & BTA_AV_FEAT_MASTER) 1111 bta_sys_clear_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_scb->peer_addr); 1112 1113 if (BTM_CMD_STARTED != BTM_SwitchRole(p_scb->peer_addr, BTM_ROLE_MASTER, NULL)) 1114 { 1115 /* can not switch role on SCB - start the timer on SCB */ 1116 } 1117 is_ok = FALSE; 1118 p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_START; 1119 1120 } 1121 } 1122 1123 return is_ok; 1124 } 1125 1126 /******************************************************************************* 1127 ** 1128 ** Function bta_av_chk_mtu 1129 ** 1130 ** Description if this is audio channel, check if more than one audio 1131 ** channel is connected. 1132 ** 1133 ** Returns The smallest mtu of the connected audio channels 1134 ** 1135 *******************************************************************************/ 1136 UINT16 bta_av_chk_mtu(tBTA_AV_SCB *p_scb, UINT16 mtu) 1137 { 1138 UINT16 ret_mtu = BTA_AV_MAX_A2DP_MTU; 1139 tBTA_AV_SCB *p_scbi; 1140 int i; 1141 UINT8 mask; 1142 UNUSED(mtu); 1143 1144 /* TODO_MV mess with the mtu according to the number of EDR/non-EDR headsets */ 1145 if(p_scb->chnl == BTA_AV_CHNL_AUDIO) 1146 { 1147 if(bta_av_cb.audio_open_cnt >= 2) 1148 { 1149 /* more than one audio channel is connected */ 1150 for(i=0; i<BTA_AV_NUM_STRS; i++) 1151 { 1152 p_scbi = bta_av_cb.p_scb[i]; 1153 if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) ) 1154 { 1155 mask = BTA_AV_HNDL_TO_MSK(i); 1156 APPL_TRACE_DEBUG("[%d] mtu: %d, mask:0x%x", 1157 i, p_scbi->stream_mtu, mask); 1158 if(bta_av_cb.conn_audio & mask) 1159 { 1160 if(ret_mtu > p_scbi->stream_mtu) 1161 ret_mtu = p_scbi->stream_mtu; 1162 } 1163 } 1164 } 1165 } 1166 APPL_TRACE_DEBUG("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d", 1167 bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu); 1168 } 1169 return ret_mtu; 1170 } 1171 1172 /******************************************************************************* 1173 ** 1174 ** Function bta_av_dup_audio_buf 1175 ** 1176 ** Description dup the audio data to the q_info.a2d of other audio channels 1177 ** 1178 ** Returns void 1179 ** 1180 *******************************************************************************/ 1181 void bta_av_dup_audio_buf(tBTA_AV_SCB *p_scb, BT_HDR *p_buf) 1182 { 1183 /* Test whether there is more than one audio channel connected */ 1184 if ((p_buf == NULL) || (bta_av_cb.audio_open_cnt < 2)) 1185 return; 1186 1187 UINT16 copy_size = BT_HDR_SIZE + p_buf->len + p_buf->offset; 1188 for (int i = 0; i < BTA_AV_NUM_STRS; i++) { 1189 tBTA_AV_SCB *p_scbi = bta_av_cb.p_scb[i]; 1190 1191 if (i == p_scb->hdi) 1192 continue; /* Ignore the original channel */ 1193 if ((p_scbi == NULL) || !p_scbi->co_started) 1194 continue; /* Ignore if SCB is not used or started */ 1195 if (!(bta_av_cb.conn_audio & BTA_AV_HNDL_TO_MSK(i))) 1196 continue; /* Audio is not connected */ 1197 1198 /* Enqueue the data */ 1199 BT_HDR *p_new = (BT_HDR *)osi_malloc(copy_size); 1200 memcpy(p_new, p_buf, copy_size); 1201 list_append(p_scbi->a2d_list, p_new); 1202 1203 if (list_length(p_scbi->a2d_list) > p_bta_av_cfg->audio_mqs) { 1204 // Drop the oldest packet 1205 bta_av_co_audio_drop(p_scbi->hndl); 1206 BT_HDR *p_buf_drop = list_front(p_scbi->a2d_list); 1207 list_remove(p_scbi->a2d_list, p_buf_drop); 1208 osi_free(p_buf_drop); 1209 } 1210 } 1211 } 1212 1213 /******************************************************************************* 1214 ** 1215 ** Function bta_av_sm_execute 1216 ** 1217 ** Description State machine event handling function for AV 1218 ** 1219 ** 1220 ** Returns void 1221 ** 1222 *******************************************************************************/ 1223 void bta_av_sm_execute(tBTA_AV_CB *p_cb, UINT16 event, tBTA_AV_DATA *p_data) 1224 { 1225 tBTA_AV_ST_TBL state_table; 1226 UINT8 action; 1227 1228 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 1229 APPL_TRACE_EVENT("AV event=0x%x(%s) state=%d(%s)", 1230 event, bta_av_evt_code(event), p_cb->state, bta_av_st_code(p_cb->state)); 1231 #else 1232 APPL_TRACE_EVENT("AV event=0x%x state=%d", event, p_cb->state); 1233 #endif 1234 1235 /* look up the state table for the current state */ 1236 state_table = bta_av_st_tbl[p_cb->state]; 1237 1238 event &= 0x00FF; 1239 1240 /* set next state */ 1241 p_cb->state = state_table[event][BTA_AV_NEXT_STATE]; 1242 APPL_TRACE_EVENT("next state=%d", p_cb->state); 1243 1244 /* execute action functions */ 1245 if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE) 1246 { 1247 (*bta_av_action[action])(p_cb, p_data); 1248 } 1249 } 1250 1251 /******************************************************************************* 1252 ** 1253 ** Function bta_av_hdl_event 1254 ** 1255 ** Description Advanced audio/video main event handling function. 1256 ** 1257 ** 1258 ** Returns BOOLEAN 1259 ** 1260 *******************************************************************************/ 1261 BOOLEAN bta_av_hdl_event(BT_HDR *p_msg) 1262 { 1263 UINT16 event = p_msg->event; 1264 UINT16 first_event = BTA_AV_FIRST_NSM_EVT; 1265 1266 if (event > BTA_AV_LAST_EVT) 1267 { 1268 return TRUE; /* to free p_msg */ 1269 } 1270 1271 if(event >= first_event) 1272 { 1273 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 1274 APPL_TRACE_VERBOSE("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event)); 1275 #else 1276 APPL_TRACE_VERBOSE("AV nsm event=0x%x", event); 1277 #endif 1278 /* non state machine events */ 1279 (*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg); 1280 } 1281 else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT) 1282 { 1283 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 1284 APPL_TRACE_VERBOSE("AV sm event=0x%x(%s)", event, bta_av_evt_code(event)); 1285 #else 1286 APPL_TRACE_VERBOSE("AV sm event=0x%x", event); 1287 #endif 1288 /* state machine events */ 1289 bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg); 1290 } 1291 else 1292 { 1293 APPL_TRACE_VERBOSE("handle=0x%x", p_msg->layer_specific); 1294 /* stream state machine events */ 1295 bta_av_ssm_execute( bta_av_hndl_to_scb(p_msg->layer_specific), 1296 p_msg->event, (tBTA_AV_DATA *) p_msg); 1297 } 1298 return TRUE; 1299 } 1300 1301 /***************************************************************************** 1302 ** Debug Functions 1303 *****************************************************************************/ 1304 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) 1305 /******************************************************************************* 1306 ** 1307 ** Function bta_av_st_code 1308 ** 1309 ** Description 1310 ** 1311 ** Returns char * 1312 ** 1313 *******************************************************************************/ 1314 static char *bta_av_st_code(UINT8 state) 1315 { 1316 switch(state) 1317 { 1318 case BTA_AV_INIT_ST: return "INIT"; 1319 case BTA_AV_OPEN_ST: return "OPEN"; 1320 default: return "unknown"; 1321 } 1322 } 1323 /******************************************************************************* 1324 ** 1325 ** Function bta_av_evt_code 1326 ** 1327 ** Description 1328 ** 1329 ** Returns char * 1330 ** 1331 *******************************************************************************/ 1332 char *bta_av_evt_code(UINT16 evt_code) 1333 { 1334 switch(evt_code) 1335 { 1336 case BTA_AV_API_DISABLE_EVT: return "API_DISABLE"; 1337 case BTA_AV_API_REMOTE_CMD_EVT: return "API_REMOTE_CMD"; 1338 case BTA_AV_API_VENDOR_CMD_EVT: return "API_VENDOR_CMD"; 1339 case BTA_AV_API_VENDOR_RSP_EVT: return "API_VENDOR_RSP"; 1340 case BTA_AV_API_META_RSP_EVT: return "API_META_RSP_EVT"; 1341 case BTA_AV_API_RC_CLOSE_EVT: return "API_RC_CLOSE"; 1342 case BTA_AV_AVRC_OPEN_EVT: return "AVRC_OPEN"; 1343 case BTA_AV_AVRC_MSG_EVT: return "AVRC_MSG"; 1344 case BTA_AV_AVRC_NONE_EVT: return "AVRC_NONE"; 1345 1346 case BTA_AV_API_OPEN_EVT: return "API_OPEN"; 1347 case BTA_AV_API_CLOSE_EVT: return "API_CLOSE"; 1348 case BTA_AV_AP_START_EVT: return "AP_START"; 1349 case BTA_AV_AP_STOP_EVT: return "AP_STOP"; 1350 case BTA_AV_API_RECONFIG_EVT: return "API_RECONFIG"; 1351 case BTA_AV_API_PROTECT_REQ_EVT: return "API_PROTECT_REQ"; 1352 case BTA_AV_API_PROTECT_RSP_EVT: return "API_PROTECT_RSP"; 1353 case BTA_AV_API_RC_OPEN_EVT: return "API_RC_OPEN"; 1354 case BTA_AV_SRC_DATA_READY_EVT: return "SRC_DATA_READY"; 1355 case BTA_AV_CI_SETCONFIG_OK_EVT: return "CI_SETCONFIG_OK"; 1356 case BTA_AV_CI_SETCONFIG_FAIL_EVT: return "CI_SETCONFIG_FAIL"; 1357 case BTA_AV_SDP_DISC_OK_EVT: return "SDP_DISC_OK"; 1358 case BTA_AV_SDP_DISC_FAIL_EVT: return "SDP_DISC_FAIL"; 1359 case BTA_AV_STR_DISC_OK_EVT: return "STR_DISC_OK"; 1360 case BTA_AV_STR_DISC_FAIL_EVT: return "STR_DISC_FAIL"; 1361 case BTA_AV_STR_GETCAP_OK_EVT: return "STR_GETCAP_OK"; 1362 case BTA_AV_STR_GETCAP_FAIL_EVT: return "STR_GETCAP_FAIL"; 1363 case BTA_AV_STR_OPEN_OK_EVT: return "STR_OPEN_OK"; 1364 case BTA_AV_STR_OPEN_FAIL_EVT: return "STR_OPEN_FAIL"; 1365 case BTA_AV_STR_START_OK_EVT: return "STR_START_OK"; 1366 case BTA_AV_STR_START_FAIL_EVT: return "STR_START_FAIL"; 1367 case BTA_AV_STR_CLOSE_EVT: return "STR_CLOSE"; 1368 case BTA_AV_STR_CONFIG_IND_EVT: return "STR_CONFIG_IND"; 1369 case BTA_AV_STR_SECURITY_IND_EVT: return "STR_SECURITY_IND"; 1370 case BTA_AV_STR_SECURITY_CFM_EVT: return "STR_SECURITY_CFM"; 1371 case BTA_AV_STR_WRITE_CFM_EVT: return "STR_WRITE_CFM"; 1372 case BTA_AV_STR_SUSPEND_CFM_EVT: return "STR_SUSPEND_CFM"; 1373 case BTA_AV_STR_RECONFIG_CFM_EVT: return "STR_RECONFIG_CFM"; 1374 case BTA_AV_AVRC_TIMER_EVT: return "AVRC_TIMER"; 1375 case BTA_AV_AVDT_CONNECT_EVT: return "AVDT_CONNECT"; 1376 case BTA_AV_AVDT_DISCONNECT_EVT: return "AVDT_DISCONNECT"; 1377 case BTA_AV_ROLE_CHANGE_EVT: return "ROLE_CHANGE"; 1378 case BTA_AV_AVDT_DELAY_RPT_EVT: return "AVDT_DELAY_RPT"; 1379 case BTA_AV_ACP_CONNECT_EVT: return "ACP_CONNECT"; 1380 1381 case BTA_AV_API_ENABLE_EVT: return "API_ENABLE"; 1382 case BTA_AV_API_REGISTER_EVT: return "API_REG"; 1383 case BTA_AV_API_DEREGISTER_EVT: return "API_DEREG"; 1384 case BTA_AV_API_DISCONNECT_EVT: return "API_DISCNT"; 1385 case BTA_AV_CI_SRC_DATA_READY_EVT: return "CI_DATA_READY"; 1386 case BTA_AV_SIG_CHG_EVT: return "SIG_CHG"; 1387 case BTA_AV_SIGNALLING_TIMER_EVT: return "SIGNALLING_TIMER"; 1388 case BTA_AV_SDP_AVRC_DISC_EVT: return "SDP_AVRC_DISC"; 1389 case BTA_AV_AVRC_CLOSE_EVT: return "AVRC_CLOSE"; 1390 case BTA_AV_CONN_CHG_EVT: return "CONN_CHG"; 1391 case BTA_AV_DEREG_COMP_EVT: return "DEREG_COMP"; 1392 #if (BTA_AV_SINK_INCLUDED == TRUE) 1393 case BTA_AV_API_SINK_ENABLE_EVT: return "SINK_ENABLE"; 1394 #endif 1395 #if (AVDT_REPORTING == TRUE) 1396 case BTA_AV_AVDT_RPT_CONN_EVT: return "RPT_CONN"; 1397 #endif 1398 case BTA_AV_API_START_EVT: return "API_START"; 1399 case BTA_AV_API_STOP_EVT: return "API_STOP"; 1400 default: return "unknown"; 1401 } 1402 } 1403 #endif 1404 1405 #endif /* BTA_AV_INCLUDED */ 1406