1 /****************************************************************************** 2 * 3 * Copyright (C) 2002-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 module contains the action functions associated with the stream 22 * control block state machine. 23 * 24 ******************************************************************************/ 25 26 #include <string.h> 27 #include "a2dp_codec_api.h" 28 #include "avdt_api.h" 29 #include "avdt_int.h" 30 #include "avdtc_api.h" 31 #include "bt_common.h" 32 #include "bt_target.h" 33 #include "bt_types.h" 34 #include "bt_utils.h" 35 #include "btu.h" 36 #include "osi/include/osi.h" 37 38 extern fixed_queue_t* btu_general_alarm_queue; 39 40 /* This table is used to lookup the callback event that matches a particular 41 * state machine API request event. Note that state machine API request 42 * events are at the beginning of the event list starting at zero, thus 43 * allowing for this table. 44 */ 45 const uint8_t avdt_scb_cback_evt[] = { 46 0, /* API_REMOVE_EVT (no event) */ 47 AVDT_WRITE_CFM_EVT, /* API_WRITE_REQ_EVT */ 48 0, /* API_GETCONFIG_REQ_EVT (no event) */ 49 0, /* API_DELAY_RPT_REQ_EVT (no event) */ 50 AVDT_OPEN_CFM_EVT, /* API_SETCONFIG_REQ_EVT */ 51 AVDT_OPEN_CFM_EVT, /* API_OPEN_REQ_EVT */ 52 AVDT_CLOSE_CFM_EVT, /* API_CLOSE_REQ_EVT */ 53 AVDT_RECONFIG_CFM_EVT, /* API_RECONFIG_REQ_EVT */ 54 AVDT_SECURITY_CFM_EVT, /* API_SECURITY_REQ_EVT */ 55 0 /* API_ABORT_REQ_EVT (no event) */ 56 }; 57 58 /******************************************************************************* 59 * 60 * Function avdt_scb_gen_ssrc 61 * 62 * Description This function generates a SSRC number unique to the stream. 63 * 64 * Returns SSRC value. 65 * 66 ******************************************************************************/ 67 uint32_t avdt_scb_gen_ssrc(tAVDT_SCB* p_scb) { 68 /* combine the value of the media type and codec type of the SCB */ 69 return ( 70 (uint32_t)(p_scb->cs.cfg.codec_info[1] | p_scb->cs.cfg.codec_info[2])); 71 } 72 73 /******************************************************************************* 74 * 75 * Function avdt_scb_hdl_abort_cmd 76 * 77 * Description This function sends the SCB an AVDT_SCB_API_ABORT_RSP_EVT 78 * to initiate sending of an abort response message. 79 * 80 * Returns Nothing. 81 * 82 ******************************************************************************/ 83 void avdt_scb_hdl_abort_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 84 p_scb->role = AVDT_CLOSE_ACP; 85 avdt_scb_event(p_scb, AVDT_SCB_API_ABORT_RSP_EVT, p_data); 86 } 87 88 /******************************************************************************* 89 * 90 * Function avdt_scb_hdl_abort_rsp 91 * 92 * Description This function is an empty function; it serves as a 93 * placeholder for a conformance API action function. 94 * 95 * Returns Nothing. 96 * 97 ******************************************************************************/ 98 void avdt_scb_hdl_abort_rsp(UNUSED_ATTR tAVDT_SCB* p_scb, 99 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 100 return; 101 } 102 103 /******************************************************************************* 104 * 105 * Function avdt_scb_hdl_close_cmd 106 * 107 * Description This function sends the SCB an AVDT_SCB_API_CLOSE_RSP_EVT 108 * to initiate sending of a close response message. 109 * 110 * Returns Nothing. 111 * 112 ******************************************************************************/ 113 void avdt_scb_hdl_close_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 114 p_scb->role = AVDT_CLOSE_ACP; 115 avdt_scb_event(p_scb, AVDT_SCB_API_CLOSE_RSP_EVT, p_data); 116 } 117 118 /******************************************************************************* 119 * 120 * Function avdt_scb_hdl_close_rsp 121 * 122 * Description This function sets the close_code variable to the error 123 * code returned in the close response. 124 * 125 * Returns Nothing. 126 * 127 ******************************************************************************/ 128 void avdt_scb_hdl_close_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 129 p_scb->close_code = p_data->msg.hdr.err_code; 130 } 131 132 /******************************************************************************* 133 * 134 * Function avdt_scb_hdl_getconfig_cmd 135 * 136 * Description This function retrieves the configuration parameters of 137 * the SCB and sends the SCB an AVDT_SCB_API_GETCONFIG_RSP_EVT 138 * to initiate sending of a get configuration response message. 139 * 140 * Returns Nothing. 141 * 142 ******************************************************************************/ 143 void avdt_scb_hdl_getconfig_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 144 p_data->msg.svccap.p_cfg = &p_scb->curr_cfg; 145 146 avdt_scb_event(p_scb, AVDT_SCB_API_GETCONFIG_RSP_EVT, p_data); 147 } 148 149 /******************************************************************************* 150 * 151 * Function avdt_scb_hdl_getconfig_rsp 152 * 153 * Description This function is an empty function; it serves as a 154 * placeholder for a conformance API action function. 155 * 156 * Returns Nothing. 157 * 158 ******************************************************************************/ 159 void avdt_scb_hdl_getconfig_rsp(UNUSED_ATTR tAVDT_SCB* p_scb, 160 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 161 return; 162 } 163 164 /******************************************************************************* 165 * 166 * Function avdt_scb_hdl_open_cmd 167 * 168 * Description This function sends the SCB an AVDT_SCB_API_OPEN_RSP_EVT 169 * to initiate sending of an open response message. 170 * 171 * Returns Nothing. 172 * 173 ******************************************************************************/ 174 void avdt_scb_hdl_open_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 175 avdt_scb_event(p_scb, AVDT_SCB_API_OPEN_RSP_EVT, p_data); 176 } 177 178 /******************************************************************************* 179 * 180 * Function avdt_scb_hdl_open_rej 181 * 182 * Description This function calls the application callback function 183 * indicating the open request has failed. It initializes 184 * certain SCB variables and sends a AVDT_CCB_UL_CLOSE_EVT 185 * to the CCB. 186 * 187 * Returns Nothing. 188 * 189 ******************************************************************************/ 190 void avdt_scb_hdl_open_rej(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 191 /* do exactly same as setconfig reject */ 192 avdt_scb_hdl_setconfig_rej(p_scb, p_data); 193 } 194 195 /******************************************************************************* 196 * 197 * Function avdt_scb_hdl_open_rsp 198 * 199 * Description This function calls avdt_ad_open_req() to initiate 200 * connection of the transport channel for this stream. 201 * 202 * Returns Nothing. 203 * 204 ******************************************************************************/ 205 void avdt_scb_hdl_open_rsp(tAVDT_SCB* p_scb, 206 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 207 /* initiate opening of trans channels for this SEID */ 208 p_scb->role = AVDT_OPEN_INT; 209 avdt_ad_open_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, AVDT_INT); 210 211 /* start tc connect timer */ 212 alarm_set_on_queue( 213 p_scb->transport_channel_timer, AVDT_SCB_TC_CONN_TIMEOUT_MS, 214 avdt_scb_transport_channel_timer_timeout, p_scb, btu_general_alarm_queue); 215 } 216 217 /******************************************************************************* 218 * 219 * Function avdt_scb_hdl_pkt_no_frag 220 * 221 * Description 222 * 223 * Returns Nothing. 224 * 225 ******************************************************************************/ 226 void avdt_scb_hdl_pkt_no_frag(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 227 uint8_t *p, *p_start; 228 uint8_t o_v, o_p, o_x, o_cc; 229 uint8_t m_pt; 230 uint8_t marker; 231 uint16_t seq; 232 uint32_t time_stamp; 233 uint16_t offset; 234 uint16_t ex_len; 235 uint8_t pad_len = 0; 236 237 p = p_start = (uint8_t*)(p_data->p_pkt + 1) + p_data->p_pkt->offset; 238 239 /* parse media packet header */ 240 AVDT_MSG_PRS_OCTET1(p, o_v, o_p, o_x, o_cc); 241 AVDT_MSG_PRS_M_PT(p, m_pt, marker); 242 BE_STREAM_TO_UINT16(seq, p); 243 BE_STREAM_TO_UINT32(time_stamp, p); 244 p += 4; 245 246 /* skip over any csrc's in packet */ 247 p += o_cc * 4; 248 249 /* check for and skip over extension header */ 250 if (o_x) { 251 p += 2; 252 BE_STREAM_TO_UINT16(ex_len, p); 253 p += ex_len * 4; 254 } 255 256 /* save our new offset */ 257 offset = (uint16_t)(p - p_start); 258 259 /* adjust length for any padding at end of packet */ 260 if (o_p) { 261 /* padding length in last byte of packet */ 262 pad_len = *(p_start + p_data->p_pkt->len); 263 } 264 265 /* do sanity check */ 266 if ((offset > p_data->p_pkt->len) || 267 ((pad_len + offset) > p_data->p_pkt->len)) { 268 AVDT_TRACE_WARNING("Got bad media packet"); 269 osi_free_and_reset((void**)&p_data->p_pkt); 270 } 271 /* adjust offset and length and send it up */ 272 else { 273 p_data->p_pkt->len -= (offset + pad_len); 274 p_data->p_pkt->offset += offset; 275 276 if (p_scb->cs.p_sink_data_cback != NULL) { 277 /* report sequence number */ 278 p_data->p_pkt->layer_specific = seq; 279 (*p_scb->cs.p_sink_data_cback)(avdt_scb_to_hdl(p_scb), p_data->p_pkt, 280 time_stamp, 281 (uint8_t)(m_pt | (marker << 7))); 282 } else { 283 osi_free_and_reset((void**)&p_data->p_pkt); 284 } 285 } 286 } 287 288 #if (AVDT_REPORTING == TRUE) 289 /******************************************************************************* 290 * 291 * Function avdt_scb_hdl_report 292 * 293 * Description 294 * 295 * Returns Nothing. 296 * 297 ******************************************************************************/ 298 uint8_t* avdt_scb_hdl_report(tAVDT_SCB* p_scb, uint8_t* p, uint16_t len) { 299 uint16_t result = AVDT_SUCCESS; 300 uint8_t* p_start = p; 301 uint32_t ssrc; 302 uint8_t o_v, o_p, o_cc; 303 AVDT_REPORT_TYPE pt; 304 tAVDT_REPORT_DATA report, *p_rpt; 305 306 AVDT_TRACE_DEBUG("%s", __func__); 307 if (p_scb->cs.p_report_cback) { 308 p_rpt = &report; 309 /* parse report packet header */ 310 AVDT_MSG_PRS_RPT_OCTET1(p, o_v, o_p, o_cc); 311 pt = *p++; 312 p += 2; 313 BE_STREAM_TO_UINT32(ssrc, p); 314 315 switch (pt) { 316 case AVDT_RTCP_PT_SR: /* the packet type - SR (Sender Report) */ 317 BE_STREAM_TO_UINT32(report.sr.ntp_sec, p); 318 BE_STREAM_TO_UINT32(report.sr.ntp_frac, p); 319 BE_STREAM_TO_UINT32(report.sr.rtp_time, p); 320 BE_STREAM_TO_UINT32(report.sr.pkt_count, p); 321 BE_STREAM_TO_UINT32(report.sr.octet_count, p); 322 break; 323 324 case AVDT_RTCP_PT_RR: /* the packet type - RR (Receiver Report) */ 325 report.rr.frag_lost = *p; 326 BE_STREAM_TO_UINT32(report.rr.packet_lost, p); 327 report.rr.packet_lost &= 0xFFFFFF; 328 BE_STREAM_TO_UINT32(report.rr.seq_num_rcvd, p); 329 BE_STREAM_TO_UINT32(report.rr.jitter, p); 330 BE_STREAM_TO_UINT32(report.rr.lsr, p); 331 BE_STREAM_TO_UINT32(report.rr.dlsr, p); 332 break; 333 334 case AVDT_RTCP_PT_SDES: /* the packet type - SDES (Source Description) */ 335 if (*p == AVDT_RTCP_SDES_CNAME) { 336 p_rpt = (tAVDT_REPORT_DATA*)(p + 2); 337 } else { 338 AVDT_TRACE_WARNING(" - SDES SSRC=0x%08x sc=%d %d len=%d %s", ssrc, 339 o_cc, *p, *(p + 1), p + 2); 340 result = AVDT_BUSY; 341 } 342 break; 343 344 default: 345 AVDT_TRACE_ERROR("Bad Report pkt - packet type: %d", pt); 346 result = AVDT_BAD_PARAMS; 347 } 348 349 if (result == AVDT_SUCCESS) 350 (*p_scb->cs.p_report_cback)(avdt_scb_to_hdl(p_scb), pt, p_rpt); 351 } 352 p_start += len; 353 return p_start; 354 } 355 #endif 356 357 /******************************************************************************* 358 * 359 * Function avdt_scb_hdl_pkt 360 * 361 * Description 362 * 363 * Returns Nothing. 364 * 365 ******************************************************************************/ 366 void avdt_scb_hdl_pkt(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 367 #if (AVDT_REPORTING == TRUE) 368 if (p_data->p_pkt->layer_specific == AVDT_CHAN_REPORT) { 369 uint8_t* p = (uint8_t*)(p_data->p_pkt + 1) + p_data->p_pkt->offset; 370 avdt_scb_hdl_report(p_scb, p, p_data->p_pkt->len); 371 osi_free_and_reset((void**)&p_data->p_pkt); 372 } else 373 #endif 374 avdt_scb_hdl_pkt_no_frag(p_scb, p_data); 375 } 376 377 /******************************************************************************* 378 * 379 * Function avdt_scb_drop_pkt 380 * 381 * Description Drop an incoming media packet. This function is called if 382 * a media packet is received in any state besides streaming. 383 * 384 * Returns Nothing. 385 * 386 ******************************************************************************/ 387 void avdt_scb_drop_pkt(UNUSED_ATTR tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 388 AVDT_TRACE_ERROR("%s dropped incoming media packet", __func__); 389 osi_free_and_reset((void**)&p_data->p_pkt); 390 } 391 392 /******************************************************************************* 393 * 394 * Function avdt_scb_hdl_reconfig_cmd 395 * 396 * Description This function calls the application callback function 397 * with a reconfiguration indication. 398 * 399 * Returns Nothing. 400 * 401 ******************************************************************************/ 402 void avdt_scb_hdl_reconfig_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 403 /* if command not supported */ 404 if (p_scb->cs.nsc_mask & AVDT_NSC_RECONFIG) { 405 /* send reject */ 406 p_data->msg.hdr.err_code = AVDT_ERR_NSC; 407 p_data->msg.hdr.err_param = 0; 408 avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_RSP_EVT, p_data); 409 } else { 410 /* store requested configuration */ 411 memcpy(&p_scb->req_cfg, p_data->msg.reconfig_cmd.p_cfg, sizeof(tAVDT_CFG)); 412 413 /* call application callback */ 414 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, 415 AVDT_RECONFIG_IND_EVT, 416 (tAVDT_CTRL*)&p_data->msg.reconfig_cmd); 417 } 418 } 419 420 /******************************************************************************* 421 * 422 * Function avdt_scb_hdl_reconfig_rsp 423 * 424 * Description This function calls the application callback function 425 * with a reconfiguration confirm. 426 * 427 * Returns Nothing. 428 * 429 ******************************************************************************/ 430 void avdt_scb_hdl_reconfig_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 431 if (p_data->msg.hdr.err_code == 0) { 432 /* store new configuration */ 433 if (p_scb->req_cfg.num_codec > 0) { 434 p_scb->curr_cfg.num_codec = p_scb->req_cfg.num_codec; 435 memcpy(p_scb->curr_cfg.codec_info, p_scb->req_cfg.codec_info, 436 AVDT_CODEC_SIZE); 437 } 438 if (p_scb->req_cfg.num_protect > 0) { 439 p_scb->curr_cfg.num_protect = p_scb->req_cfg.num_protect; 440 memcpy(p_scb->curr_cfg.protect_info, p_scb->req_cfg.protect_info, 441 AVDT_PROTECT_SIZE); 442 } 443 } 444 445 p_data->msg.svccap.p_cfg = &p_scb->curr_cfg; 446 447 /* call application callback */ 448 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_RECONFIG_CFM_EVT, 449 (tAVDT_CTRL*)&p_data->msg.svccap); 450 } 451 452 /******************************************************************************* 453 * 454 * Function avdt_scb_hdl_security_cmd 455 * 456 * Description This function calls the application callback with a 457 * security indication. 458 * 459 * Returns Nothing. 460 * 461 ******************************************************************************/ 462 void avdt_scb_hdl_security_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 463 /* if command not supported */ 464 if (p_scb->cs.nsc_mask & AVDT_NSC_SECURITY) { 465 /* send reject */ 466 p_data->msg.hdr.err_code = AVDT_ERR_NSC; 467 avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_RSP_EVT, p_data); 468 } else { 469 /* call application callback */ 470 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, 471 AVDT_SECURITY_IND_EVT, 472 (tAVDT_CTRL*)&p_data->msg.security_cmd); 473 } 474 } 475 476 /******************************************************************************* 477 * 478 * Function avdt_scb_hdl_security_rsp 479 * 480 * Description This function calls the application callback with a 481 * security confirm. 482 * 483 * Returns Nothing. 484 * 485 ******************************************************************************/ 486 void avdt_scb_hdl_security_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 487 /* call application callback */ 488 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_SECURITY_CFM_EVT, 489 (tAVDT_CTRL*)&p_data->msg.security_cmd); 490 } 491 492 /******************************************************************************* 493 * 494 * Function avdt_scb_hdl_setconfig_cmd 495 * 496 * Description This function marks the SCB as in use and copies the 497 * configuration and peer SEID to the SCB. It then calls 498 * the application callback with a configuration indication. 499 * 500 * Returns Nothing. 501 * 502 ******************************************************************************/ 503 void avdt_scb_hdl_setconfig_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 504 tAVDT_CFG* p_cfg; 505 506 if (!p_scb->in_use) { 507 p_cfg = p_data->msg.config_cmd.p_cfg; 508 if (A2DP_GetCodecType(p_scb->cs.cfg.codec_info) == 509 A2DP_GetCodecType(p_cfg->codec_info)) { 510 /* set sep as in use */ 511 p_scb->in_use = true; 512 513 /* copy info to scb */ 514 p_scb->p_ccb = avdt_ccb_by_idx(p_data->msg.config_cmd.hdr.ccb_idx); 515 p_scb->peer_seid = p_data->msg.config_cmd.int_seid; 516 memcpy(&p_scb->req_cfg, p_cfg, sizeof(tAVDT_CFG)); 517 /* call app callback */ 518 /* handle of scb- which is same as sep handle of bta_av_cb.p_scb*/ 519 (*p_scb->cs.p_ctrl_cback)( 520 avdt_scb_to_hdl(p_scb), p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 521 AVDT_CONFIG_IND_EVT, (tAVDT_CTRL*)&p_data->msg.config_cmd); 522 } else { 523 p_data->msg.hdr.err_code = AVDT_ERR_UNSUP_CFG; 524 p_data->msg.hdr.err_param = 0; 525 avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), 526 p_data->msg.hdr.sig_id, &p_data->msg); 527 } 528 } else { 529 avdt_scb_rej_in_use(p_scb, p_data); 530 } 531 } 532 533 /******************************************************************************* 534 * 535 * Function avdt_scb_hdl_setconfig_rej 536 * 537 * Description This function marks the SCB as not in use and calls the 538 * application callback with an open confirm indicating 539 * failure. 540 * 541 * Returns Nothing. 542 * 543 ******************************************************************************/ 544 void avdt_scb_hdl_setconfig_rej(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 545 /* clear scb variables */ 546 avdt_scb_clr_vars(p_scb, p_data); 547 548 /* tell ccb we're done with signaling channel */ 549 avdt_ccb_event(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), 550 AVDT_CCB_UL_CLOSE_EVT, NULL); 551 552 /* call application callback */ 553 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_OPEN_CFM_EVT, 554 (tAVDT_CTRL*)&p_data->msg.hdr); 555 } 556 557 /******************************************************************************* 558 * 559 * Function avdt_scb_hdl_setconfig_rsp 560 * 561 * Description This function sends the SCB an AVDT_SCB_API_OPEN_REQ_EVT 562 * to initiate sending of an open command message. 563 * 564 * Returns Nothing. 565 * 566 ******************************************************************************/ 567 void avdt_scb_hdl_setconfig_rsp(tAVDT_SCB* p_scb, 568 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 569 tAVDT_EVT_HDR single; 570 571 if (p_scb->p_ccb != NULL) { 572 /* save configuration */ 573 memcpy(&p_scb->curr_cfg, &p_scb->req_cfg, sizeof(tAVDT_CFG)); 574 575 /* initiate open */ 576 single.seid = p_scb->peer_seid; 577 avdt_scb_event(p_scb, AVDT_SCB_API_OPEN_REQ_EVT, (tAVDT_SCB_EVT*)&single); 578 } 579 } 580 581 /******************************************************************************* 582 * 583 * Function avdt_scb_hdl_start_cmd 584 * 585 * Description This function calls the application callback with a 586 * start indication. 587 * 588 * Returns Nothing. 589 * 590 ******************************************************************************/ 591 void avdt_scb_hdl_start_cmd(tAVDT_SCB* p_scb, 592 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 593 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), 594 p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 595 AVDT_START_IND_EVT, NULL); 596 } 597 598 /******************************************************************************* 599 * 600 * Function avdt_scb_hdl_start_rsp 601 * 602 * Description This function calls the application callback with a 603 * start confirm. 604 * 605 * Returns Nothing. 606 * 607 ******************************************************************************/ 608 void avdt_scb_hdl_start_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 609 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), 610 p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 611 AVDT_START_CFM_EVT, (tAVDT_CTRL*)&p_data->msg.hdr); 612 } 613 614 /******************************************************************************* 615 * 616 * Function avdt_scb_hdl_suspend_cmd 617 * 618 * Description This function calls the application callback with a suspend 619 * indication. 620 * 621 * Returns Nothing. 622 * 623 ******************************************************************************/ 624 void avdt_scb_hdl_suspend_cmd(tAVDT_SCB* p_scb, 625 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 626 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), 627 p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 628 AVDT_SUSPEND_IND_EVT, NULL); 629 } 630 631 /******************************************************************************* 632 * 633 * Function avdt_scb_hdl_suspend_rsp 634 * 635 * Description This function calls the application callback with a suspend 636 * confirm. 637 * 638 * Returns Nothing. 639 * 640 ******************************************************************************/ 641 void avdt_scb_hdl_suspend_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 642 (*p_scb->cs.p_ctrl_cback)( 643 avdt_scb_to_hdl(p_scb), p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 644 AVDT_SUSPEND_CFM_EVT, (tAVDT_CTRL*)&p_data->msg.hdr); 645 } 646 647 /******************************************************************************* 648 * 649 * Function avdt_scb_hdl_tc_close 650 * 651 * Description This function is called when the transport channel is 652 * closed. It marks the SCB as not in use and 653 * initializes certain SCB parameters. It then sends 654 * an AVDT_CCB_UL_CLOSE_EVT to the CCB if the SCB 655 * initiated the close. It then checks to see if the SCB 656 * is to be removed. If it is it deallocates the SCB. 657 * Finally, it calls the application callback with a close 658 * indication. 659 * 660 * Returns Nothing. 661 * 662 ******************************************************************************/ 663 void avdt_scb_hdl_tc_close(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 664 uint8_t hdl = avdt_scb_to_hdl(p_scb); 665 tAVDT_CTRL_CBACK* p_ctrl_cback = p_scb->cs.p_ctrl_cback; 666 tAVDT_CTRL avdt_ctrl; 667 uint8_t event; 668 tAVDT_CCB* p_ccb = p_scb->p_ccb; 669 BD_ADDR remote_addr; 670 671 memcpy(remote_addr, p_ccb->peer_addr, BD_ADDR_LEN); 672 673 /* set up hdr */ 674 avdt_ctrl.hdr.err_code = p_scb->close_code; 675 676 /* clear sep variables */ 677 avdt_scb_clr_vars(p_scb, p_data); 678 p_scb->media_seq = 0; 679 p_scb->cong = false; 680 681 /* free pkt we're holding, if any */ 682 osi_free_and_reset((void**)&p_scb->p_pkt); 683 684 alarm_cancel(p_scb->transport_channel_timer); 685 686 if ((p_scb->role == AVDT_CLOSE_INT) || (p_scb->role == AVDT_OPEN_INT)) { 687 /* tell ccb we're done with signaling channel */ 688 avdt_ccb_event(p_ccb, AVDT_CCB_UL_CLOSE_EVT, NULL); 689 } 690 event = 691 (p_scb->role == AVDT_CLOSE_INT) ? AVDT_CLOSE_CFM_EVT : AVDT_CLOSE_IND_EVT; 692 p_scb->role = AVDT_CLOSE_ACP; 693 694 if (p_scb->remove) { 695 avdt_scb_dealloc(p_scb, NULL); 696 } 697 698 /* call app callback */ 699 (*p_ctrl_cback)(hdl, remote_addr, event, &avdt_ctrl); 700 } 701 702 /******************************************************************************* 703 * 704 * Function avdt_scb_snd_delay_rpt_req 705 * 706 * Description This function calls the application callback with a delay 707 * report. 708 * 709 * Returns Nothing. 710 * 711 ******************************************************************************/ 712 void avdt_scb_snd_delay_rpt_req(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 713 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_DELAY_RPT, 714 (tAVDT_MSG*)&p_data->apidelay); 715 } 716 717 /******************************************************************************* 718 * 719 * Function avdt_scb_hdl_delay_rpt_cmd 720 * 721 * Description This function calls the application callback with a delay 722 * report. 723 * 724 * Returns Nothing. 725 * 726 ******************************************************************************/ 727 void avdt_scb_hdl_delay_rpt_cmd(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 728 (*p_scb->cs.p_ctrl_cback)( 729 avdt_scb_to_hdl(p_scb), p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 730 AVDT_DELAY_REPORT_EVT, (tAVDT_CTRL*)&p_data->msg.hdr); 731 732 if (p_scb->p_ccb) 733 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_DELAY_RPT, &p_data->msg); 734 else 735 avdt_scb_rej_not_in_use(p_scb, p_data); 736 } 737 738 /******************************************************************************* 739 * 740 * Function avdt_scb_hdl_delay_rpt_rsp 741 * 742 * Description This function calls the application callback with a delay 743 * report. 744 * 745 * Returns Nothing. 746 * 747 ******************************************************************************/ 748 void avdt_scb_hdl_delay_rpt_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 749 (*p_scb->cs.p_ctrl_cback)( 750 avdt_scb_to_hdl(p_scb), p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 751 AVDT_DELAY_REPORT_CFM_EVT, (tAVDT_CTRL*)&p_data->msg.hdr); 752 } 753 754 #if (AVDT_REPORTING == TRUE) 755 /******************************************************************************* 756 * 757 * Function avdt_scb_hdl_tc_close_sto 758 * 759 * Description This function is called when a channel is closed in OPEN 760 * state. Check the channel type and process accordingly. 761 * 762 * Returns Nothing. 763 * 764 ******************************************************************************/ 765 void avdt_scb_hdl_tc_close_sto(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 766 tAVDT_CTRL avdt_ctrl; 767 /* AVDT_CHAN_SIG does not visit this action */ 768 if (p_data && p_data->close.type != AVDT_CHAN_MEDIA) { 769 /* it's reporting or recovery channel, 770 * the channel close in open state means the peer does not support it */ 771 if (p_data->close.old_tc_state == AVDT_AD_ST_OPEN) { 772 avdt_ctrl.hdr.err_code = 0; 773 avdt_ctrl.hdr.err_param = 0; 774 /* call app callback */ 775 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), 776 p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 777 AVDT_REPORT_DISCONN_EVT, &avdt_ctrl); 778 } 779 } else { 780 /* must be in OPEN state. need to go back to idle */ 781 avdt_scb_event(p_scb, AVDT_SCB_MSG_ABORT_RSP_EVT, NULL); 782 avdt_scb_hdl_tc_close(p_scb, p_data); 783 } 784 } 785 #endif 786 787 /******************************************************************************* 788 * 789 * Function avdt_scb_hdl_tc_open 790 * 791 * Description This function is called when the transport channel is 792 * opened while in the opening state. It calls the 793 * application callback with an open indication or open 794 * confirm depending on who initiated the open procedure. 795 * 796 * Returns Nothing. 797 * 798 ******************************************************************************/ 799 void avdt_scb_hdl_tc_open(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 800 uint8_t event; 801 #if (AVDT_REPORTING == TRUE) 802 uint8_t role; 803 #endif 804 805 alarm_cancel(p_scb->transport_channel_timer); 806 807 event = 808 (p_scb->role == AVDT_OPEN_INT) ? AVDT_OPEN_CFM_EVT : AVDT_OPEN_IND_EVT; 809 p_data->open.hdr.err_code = 0; 810 811 AVDT_TRACE_DEBUG("psc_mask: cfg: 0x%x, req:0x%x, cur: 0x%x", 812 p_scb->cs.cfg.psc_mask, p_scb->req_cfg.psc_mask, 813 p_scb->curr_cfg.psc_mask); 814 #if (AVDT_REPORTING == TRUE) 815 if (p_scb->curr_cfg.psc_mask & AVDT_PSC_REPORT) { 816 /* open the reporting channel, if both devices support it */ 817 role = (p_scb->role == AVDT_OPEN_INT) ? AVDT_INT : AVDT_ACP; 818 avdt_ad_open_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb, role); 819 } 820 #endif 821 822 /* call app callback */ 823 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), 824 p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 825 event, (tAVDT_CTRL*)&p_data->open); 826 } 827 828 #if (AVDT_REPORTING == TRUE) 829 /******************************************************************************* 830 * 831 * Function avdt_scb_hdl_tc_open_sto 832 * 833 * Description This function is called when the transport channel is 834 * opened while in the opening state. It calls the 835 * application callback with an open indication or open 836 * confirm depending on who initiated the open procedure. 837 * 838 * Returns Nothing. 839 * 840 ******************************************************************************/ 841 void avdt_scb_hdl_tc_open_sto(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 842 tAVDT_CTRL avdt_ctrl; 843 /* open reporting channel here, when it is implemented */ 844 845 /* call app callback */ 846 if (p_data->open.hdr.err_code == AVDT_CHAN_REPORT) { 847 avdt_ctrl.hdr.err_code = 0; 848 avdt_ctrl.hdr.err_param = 1; 849 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), 850 p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL, 851 AVDT_REPORT_CONN_EVT, &avdt_ctrl); 852 } 853 } 854 #endif 855 856 /******************************************************************************* 857 * 858 * Function avdt_scb_hdl_write_req 859 * 860 * Description This function frees the media packet currently stored in 861 * the SCB, if any. Then it builds a new media packet from 862 * with the passed in buffer and stores it in the SCB. 863 * 864 * Returns Nothing. 865 * 866 ******************************************************************************/ 867 void avdt_scb_hdl_write_req(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 868 uint8_t* p; 869 uint32_t ssrc; 870 bool add_rtp_header = !(p_data->apiwrite.opt & AVDT_DATA_OPT_NO_RTP); 871 872 /* free packet we're holding, if any; to be replaced with new */ 873 if (p_scb->p_pkt != NULL) { 874 /* this shouldn't be happening */ 875 AVDT_TRACE_WARNING("Dropped media packet; congested"); 876 } 877 osi_free_and_reset((void**)&p_scb->p_pkt); 878 879 /* Recompute only if the RTP header wasn't disabled by the API */ 880 if (add_rtp_header) { 881 bool is_content_protection = (p_scb->curr_cfg.num_protect > 0); 882 add_rtp_header = 883 A2DP_UsesRtpHeader(is_content_protection, p_scb->curr_cfg.codec_info); 884 } 885 886 /* Build a media packet, and add an RTP header if required. */ 887 if (add_rtp_header) { 888 ssrc = avdt_scb_gen_ssrc(p_scb); 889 890 p_data->apiwrite.p_buf->len += AVDT_MEDIA_HDR_SIZE; 891 p_data->apiwrite.p_buf->offset -= AVDT_MEDIA_HDR_SIZE; 892 p_scb->media_seq++; 893 p = (uint8_t*)(p_data->apiwrite.p_buf + 1) + p_data->apiwrite.p_buf->offset; 894 895 UINT8_TO_BE_STREAM(p, AVDT_MEDIA_OCTET1); 896 UINT8_TO_BE_STREAM(p, p_data->apiwrite.m_pt); 897 UINT16_TO_BE_STREAM(p, p_scb->media_seq); 898 UINT32_TO_BE_STREAM(p, p_data->apiwrite.time_stamp); 899 UINT32_TO_BE_STREAM(p, ssrc); 900 } 901 902 /* store it */ 903 p_scb->p_pkt = p_data->apiwrite.p_buf; 904 } 905 906 /******************************************************************************* 907 * 908 * Function avdt_scb_snd_abort_req 909 * 910 * Description This function sends an abort command message. 911 * 912 * Returns Nothing. 913 * 914 ******************************************************************************/ 915 void avdt_scb_snd_abort_req(tAVDT_SCB* p_scb, 916 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 917 tAVDT_EVT_HDR hdr; 918 919 if (p_scb->p_ccb != NULL) { 920 p_scb->role = AVDT_CLOSE_INT; 921 922 hdr.seid = p_scb->peer_seid; 923 924 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_ABORT, (tAVDT_MSG*)&hdr); 925 } 926 } 927 928 /******************************************************************************* 929 * 930 * Function avdt_scb_snd_abort_rsp 931 * 932 * Description This function sends an abort response message. 933 * 934 * Returns Nothing. 935 * 936 ******************************************************************************/ 937 void avdt_scb_snd_abort_rsp(UNUSED_ATTR tAVDT_SCB* p_scb, 938 tAVDT_SCB_EVT* p_data) { 939 avdt_msg_send_rsp(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), AVDT_SIG_ABORT, 940 &p_data->msg); 941 } 942 943 /******************************************************************************* 944 * 945 * Function avdt_scb_snd_close_req 946 * 947 * Description This function sends a close command message. 948 * 949 * Returns Nothing. 950 * 951 ******************************************************************************/ 952 void avdt_scb_snd_close_req(tAVDT_SCB* p_scb, 953 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 954 tAVDT_EVT_HDR hdr; 955 956 p_scb->role = AVDT_CLOSE_INT; 957 958 hdr.seid = p_scb->peer_seid; 959 960 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_CLOSE, (tAVDT_MSG*)&hdr); 961 } 962 963 /******************************************************************************* 964 * 965 * Function avdt_scb_snd_stream_close 966 * 967 * Description This function sends a close command message. 968 * 969 * Returns Nothing. 970 * 971 ******************************************************************************/ 972 void avdt_scb_snd_stream_close(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 973 osi_free_and_reset((void**)&p_scb->p_pkt); 974 avdt_scb_snd_close_req(p_scb, p_data); 975 } 976 977 /******************************************************************************* 978 * 979 * Function avdt_scb_snd_close_rsp 980 * 981 * Description This function sends a close response message. 982 * 983 * Returns Nothing. 984 * 985 ******************************************************************************/ 986 void avdt_scb_snd_close_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 987 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_CLOSE, &p_data->msg); 988 } 989 990 /******************************************************************************* 991 * 992 * Function avdt_scb_snd_getconfig_req 993 * 994 * Description This function sends a get configuration command message. 995 * 996 * Returns Nothing. 997 * 998 ******************************************************************************/ 999 void avdt_scb_snd_getconfig_req(tAVDT_SCB* p_scb, 1000 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1001 tAVDT_EVT_HDR hdr; 1002 1003 hdr.seid = p_scb->peer_seid; 1004 1005 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_GETCONFIG, (tAVDT_MSG*)&hdr); 1006 } 1007 1008 /******************************************************************************* 1009 * 1010 * Function avdt_scb_snd_getconfig_rsp 1011 * 1012 * Description This function sends a get configuration response message. 1013 * 1014 * Returns Nothing. 1015 * 1016 ******************************************************************************/ 1017 void avdt_scb_snd_getconfig_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1018 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_GETCONFIG, &p_data->msg); 1019 } 1020 1021 /******************************************************************************* 1022 * 1023 * Function avdt_scb_snd_open_req 1024 * 1025 * Description This function sends an open command message. 1026 * 1027 * Returns Nothing. 1028 * 1029 ******************************************************************************/ 1030 void avdt_scb_snd_open_req(tAVDT_SCB* p_scb, 1031 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1032 tAVDT_EVT_HDR hdr; 1033 1034 hdr.seid = p_scb->peer_seid; 1035 1036 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_OPEN, (tAVDT_MSG*)&hdr); 1037 } 1038 1039 /******************************************************************************* 1040 * 1041 * Function avdt_scb_snd_open_rsp 1042 * 1043 * Description This function sends an open response message. It also 1044 * calls avdt_ad_open_req() to accept a transport channel 1045 * connection. 1046 * 1047 * Returns Nothing. 1048 * 1049 ******************************************************************************/ 1050 void avdt_scb_snd_open_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1051 /* notify adaption that we're waiting for transport channel open */ 1052 p_scb->role = AVDT_OPEN_ACP; 1053 avdt_ad_open_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, AVDT_ACP); 1054 1055 /* send response */ 1056 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_OPEN, &p_data->msg); 1057 1058 alarm_set_on_queue( 1059 p_scb->transport_channel_timer, AVDT_SCB_TC_CONN_TIMEOUT_MS, 1060 avdt_scb_transport_channel_timer_timeout, p_scb, btu_general_alarm_queue); 1061 } 1062 1063 /******************************************************************************* 1064 * 1065 * Function avdt_scb_snd_reconfig_req 1066 * 1067 * Description This function stores the configuration parameters in the 1068 * SCB and sends a reconfiguration command message. 1069 * 1070 * Returns Nothing. 1071 * 1072 ******************************************************************************/ 1073 void avdt_scb_snd_reconfig_req(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1074 memcpy(&p_scb->req_cfg, p_data->msg.config_cmd.p_cfg, sizeof(tAVDT_CFG)); 1075 p_data->msg.hdr.seid = p_scb->peer_seid; 1076 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_RECONFIG, &p_data->msg); 1077 } 1078 1079 /******************************************************************************* 1080 * 1081 * Function avdt_scb_snd_reconfig_rsp 1082 * 1083 * Description This function stores the configuration parameters in the 1084 * SCB and sends a reconfiguration response message. 1085 * 1086 * Returns Nothing. 1087 * 1088 ******************************************************************************/ 1089 void avdt_scb_snd_reconfig_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1090 if (p_data->msg.hdr.err_code == 0) { 1091 /* store new configuration */ 1092 if (p_scb->req_cfg.num_codec > 0) { 1093 p_scb->curr_cfg.num_codec = p_scb->req_cfg.num_codec; 1094 memcpy(p_scb->curr_cfg.codec_info, p_scb->req_cfg.codec_info, 1095 AVDT_CODEC_SIZE); 1096 } 1097 if (p_scb->req_cfg.num_protect > 0) { 1098 p_scb->curr_cfg.num_protect = p_scb->req_cfg.num_protect; 1099 memcpy(p_scb->curr_cfg.protect_info, p_scb->req_cfg.protect_info, 1100 AVDT_PROTECT_SIZE); 1101 } 1102 1103 /* send response */ 1104 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_RECONFIG, &p_data->msg); 1105 } else { 1106 /* send reject */ 1107 avdt_msg_send_rej(p_scb->p_ccb, AVDT_SIG_RECONFIG, &p_data->msg); 1108 } 1109 } 1110 1111 /******************************************************************************* 1112 * 1113 * Function avdt_scb_snd_security_req 1114 * 1115 * Description This function sends a security command message. 1116 * 1117 * Returns Nothing. 1118 * 1119 ******************************************************************************/ 1120 void avdt_scb_snd_security_req(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1121 p_data->msg.hdr.seid = p_scb->peer_seid; 1122 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_SECURITY, &p_data->msg); 1123 } 1124 1125 /******************************************************************************* 1126 * 1127 * Function avdt_scb_snd_security_rsp 1128 * 1129 * Description This function sends a security response message. 1130 * 1131 * Returns Nothing. 1132 * 1133 ******************************************************************************/ 1134 void avdt_scb_snd_security_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1135 if (p_data->msg.hdr.err_code == 0) { 1136 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_SECURITY, &p_data->msg); 1137 } else { 1138 avdt_msg_send_rej(p_scb->p_ccb, AVDT_SIG_SECURITY, &p_data->msg); 1139 } 1140 } 1141 1142 /******************************************************************************* 1143 * 1144 * Function avdt_scb_snd_setconfig_rej 1145 * 1146 * Description This function marks the SCB as not in use and sends a 1147 * set configuration reject message. 1148 * 1149 * Returns Nothing. 1150 * 1151 ******************************************************************************/ 1152 void avdt_scb_snd_setconfig_rej(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1153 if (p_scb->p_ccb != NULL) { 1154 avdt_msg_send_rej(p_scb->p_ccb, AVDT_SIG_SETCONFIG, &p_data->msg); 1155 1156 /* clear scb variables */ 1157 avdt_scb_clr_vars(p_scb, p_data); 1158 } 1159 } 1160 1161 /******************************************************************************* 1162 * 1163 * Function avdt_scb_snd_setconfig_req 1164 * 1165 * Description This function marks the SCB as in use and copies the 1166 * configuration parameters to the SCB. Then the function 1167 * sends a set configuration command message and initiates 1168 * opening of the signaling channel. 1169 * 1170 * Returns Nothing. 1171 * 1172 ******************************************************************************/ 1173 void avdt_scb_snd_setconfig_req(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1174 tAVDT_CFG *p_req, *p_cfg; 1175 1176 /* copy API parameters to scb, set scb as in use */ 1177 p_scb->in_use = true; 1178 p_scb->p_ccb = avdt_ccb_by_idx(p_data->msg.config_cmd.hdr.ccb_idx); 1179 p_scb->peer_seid = p_data->msg.config_cmd.hdr.seid; 1180 p_req = p_data->msg.config_cmd.p_cfg; 1181 p_cfg = &p_scb->cs.cfg; 1182 memcpy(&p_scb->req_cfg, p_data->msg.config_cmd.p_cfg, sizeof(tAVDT_CFG)); 1183 1184 avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_SETCONFIG, &p_data->msg); 1185 1186 /* tell ccb to open channel */ 1187 avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_UL_OPEN_EVT, NULL); 1188 } 1189 1190 /******************************************************************************* 1191 * 1192 * Function avdt_scb_snd_setconfig_rsp 1193 * 1194 * Description This function copies the requested configuration into the 1195 * current configuration and sends a set configuration 1196 * response message. 1197 * 1198 * Returns Nothing. 1199 * 1200 ******************************************************************************/ 1201 void avdt_scb_snd_setconfig_rsp(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1202 if (p_scb->p_ccb != NULL) { 1203 memcpy(&p_scb->curr_cfg, &p_scb->req_cfg, sizeof(tAVDT_CFG)); 1204 1205 avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_SETCONFIG, &p_data->msg); 1206 } 1207 } 1208 1209 /******************************************************************************* 1210 * 1211 * Function avdt_scb_snd_tc_close 1212 * 1213 * Description This function calls avdt_ad_close_req() to close the 1214 * transport channel for this SCB. 1215 * 1216 * Returns Nothing. 1217 * 1218 ******************************************************************************/ 1219 void avdt_scb_snd_tc_close(tAVDT_SCB* p_scb, 1220 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1221 #if (AVDT_REPORTING == TRUE) 1222 if (p_scb->curr_cfg.psc_mask & AVDT_PSC_REPORT) 1223 avdt_ad_close_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb); 1224 #endif 1225 avdt_ad_close_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb); 1226 } 1227 1228 /******************************************************************************* 1229 * 1230 * Function avdt_scb_cb_err 1231 * 1232 * Description This function calls the application callback function 1233 * indicating an error. 1234 * 1235 * Returns Nothing. 1236 * 1237 ******************************************************************************/ 1238 void avdt_scb_cb_err(tAVDT_SCB* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1239 tAVDT_CTRL avdt_ctrl; 1240 1241 /* set error code and parameter */ 1242 avdt_ctrl.hdr.err_code = AVDT_ERR_BAD_STATE; 1243 avdt_ctrl.hdr.err_param = 0; 1244 1245 /* call callback, using lookup table to get callback event */ 1246 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, 1247 avdt_scb_cback_evt[p_scb->curr_evt], &avdt_ctrl); 1248 } 1249 1250 /******************************************************************************* 1251 * 1252 * Function avdt_scb_cong_state 1253 * 1254 * Description This function sets the congestion state of the SCB media 1255 * transport channel. 1256 * 1257 * Returns Nothing. 1258 * 1259 ******************************************************************************/ 1260 void avdt_scb_cong_state(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1261 p_scb->cong = p_data->llcong; 1262 } 1263 1264 /******************************************************************************* 1265 * 1266 * Function avdt_scb_rej_state 1267 * 1268 * Description This function sends a reject message to the peer indicating 1269 * incorrect state for the received command message. 1270 * 1271 * Returns Nothing. 1272 * 1273 ******************************************************************************/ 1274 void avdt_scb_rej_state(UNUSED_ATTR tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1275 p_data->msg.hdr.err_code = AVDT_ERR_BAD_STATE; 1276 p_data->msg.hdr.err_param = 0; 1277 avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), 1278 p_data->msg.hdr.sig_id, &p_data->msg); 1279 } 1280 1281 /******************************************************************************* 1282 * 1283 * Function avdt_scb_rej_in_use 1284 * 1285 * Description This function sends a reject message to the peer indicating 1286 * the stream is in use. 1287 * 1288 * Returns Nothing. 1289 * 1290 ******************************************************************************/ 1291 void avdt_scb_rej_in_use(UNUSED_ATTR tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1292 p_data->msg.hdr.err_code = AVDT_ERR_IN_USE; 1293 p_data->msg.hdr.err_param = 0; 1294 avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), 1295 p_data->msg.hdr.sig_id, &p_data->msg); 1296 } 1297 1298 /******************************************************************************* 1299 * 1300 * Function avdt_scb_rej_not_in_use 1301 * 1302 * Description This function sends a reject message to the peer indicating 1303 * the stream is in use. 1304 * 1305 * Returns Nothing. 1306 * 1307 ******************************************************************************/ 1308 void avdt_scb_rej_not_in_use(UNUSED_ATTR tAVDT_SCB* p_scb, 1309 tAVDT_SCB_EVT* p_data) { 1310 p_data->msg.hdr.err_code = AVDT_ERR_NOT_IN_USE; 1311 p_data->msg.hdr.err_param = 0; 1312 avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), 1313 p_data->msg.hdr.sig_id, &p_data->msg); 1314 } 1315 1316 /******************************************************************************* 1317 * 1318 * Function avdt_scb_set_remove 1319 * 1320 * Description This function marks an SCB to be removed. 1321 * 1322 * Returns Nothing. 1323 * 1324 ******************************************************************************/ 1325 void avdt_scb_set_remove(tAVDT_SCB* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1326 p_scb->remove = true; 1327 } 1328 1329 /******************************************************************************* 1330 * 1331 * Function avdt_scb_free_pkt 1332 * 1333 * Description This function frees the media packet passed in. 1334 * 1335 * Returns Nothing. 1336 * 1337 ******************************************************************************/ 1338 void avdt_scb_free_pkt(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { 1339 tAVDT_CTRL avdt_ctrl; 1340 1341 /* set error code and parameter */ 1342 avdt_ctrl.hdr.err_code = AVDT_ERR_BAD_STATE; 1343 avdt_ctrl.hdr.err_param = 0; 1344 1345 osi_free_and_reset((void**)&p_data->apiwrite.p_buf); 1346 1347 AVDT_TRACE_WARNING("Dropped media packet"); 1348 1349 /* we need to call callback to keep data flow going */ 1350 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_WRITE_CFM_EVT, 1351 &avdt_ctrl); 1352 } 1353 1354 /******************************************************************************* 1355 * 1356 * Function avdt_scb_clr_pkt 1357 * 1358 * Description This function frees the media packet stored in the SCB. 1359 * 1360 * Returns Nothing. 1361 * 1362 ******************************************************************************/ 1363 void avdt_scb_clr_pkt(tAVDT_SCB* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1364 tAVDT_CTRL avdt_ctrl; 1365 tAVDT_CCB* p_ccb; 1366 uint8_t tcid; 1367 uint16_t lcid; 1368 1369 /* set error code and parameter */ 1370 avdt_ctrl.hdr.err_code = AVDT_ERR_BAD_STATE; 1371 avdt_ctrl.hdr.err_param = 0; 1372 /* flush the media data queued at L2CAP */ 1373 p_ccb = p_scb->p_ccb; 1374 if (p_ccb != NULL) { 1375 /* get tcid from type, scb */ 1376 tcid = avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb); 1377 1378 lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 1379 L2CA_FlushChannel(lcid, L2CAP_FLUSH_CHANS_ALL); 1380 } 1381 1382 if (p_scb->p_pkt != NULL) { 1383 osi_free_and_reset((void**)&p_scb->p_pkt); 1384 1385 AVDT_TRACE_DEBUG("Dropped stored media packet"); 1386 1387 /* we need to call callback to keep data flow going */ 1388 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_WRITE_CFM_EVT, 1389 &avdt_ctrl); 1390 } 1391 } 1392 1393 /******************************************************************************* 1394 * 1395 * Function avdt_scb_chk_snd_pkt 1396 * 1397 * Description This function checks if the SCB is congested, and if not 1398 * congested it sends a stored media packet, if any. After it 1399 * sends the packet it calls the application callback function 1400 * with a write confirm. 1401 * 1402 * Returns Nothing. 1403 * 1404 ******************************************************************************/ 1405 void avdt_scb_chk_snd_pkt(tAVDT_SCB* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1406 tAVDT_CTRL avdt_ctrl; 1407 BT_HDR* p_pkt; 1408 1409 avdt_ctrl.hdr.err_code = 0; 1410 1411 if (!p_scb->cong) { 1412 if (p_scb->p_pkt != NULL) { 1413 p_pkt = p_scb->p_pkt; 1414 p_scb->p_pkt = NULL; 1415 avdt_ad_write_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, p_pkt); 1416 1417 (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, 1418 AVDT_WRITE_CFM_EVT, &avdt_ctrl); 1419 } 1420 } 1421 } 1422 1423 /******************************************************************************* 1424 * 1425 * Function avdt_scb_transport_channel_timer 1426 * 1427 * Description This function is called to start a timer when the peer 1428 * initiates closing of the stream. The timer verifies that 1429 * the peer disconnects the transport channel. 1430 * 1431 * Returns Nothing. 1432 * 1433 ******************************************************************************/ 1434 void avdt_scb_transport_channel_timer(tAVDT_SCB* p_scb, 1435 UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1436 alarm_set_on_queue( 1437 p_scb->transport_channel_timer, AVDT_SCB_TC_DISC_TIMEOUT_MS, 1438 avdt_scb_transport_channel_timer_timeout, p_scb, btu_general_alarm_queue); 1439 } 1440 1441 /******************************************************************************* 1442 * 1443 * Function avdt_scb_clr_vars 1444 * 1445 * Description This function initializes certain SCB variables. 1446 * 1447 * Returns Nothing. 1448 * 1449 ******************************************************************************/ 1450 void avdt_scb_clr_vars(tAVDT_SCB* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) { 1451 p_scb->in_use = false; 1452 p_scb->p_ccb = NULL; 1453 p_scb->peer_seid = 0; 1454 } 1455