15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains action functions for advanced audio/video stream 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * state machine. these functions are shared by both audio and video 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * streams. 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE) 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ar_api.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the delay time in milliseconds to start service discovery on AVRCP */ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AV_RC_DISC_TIME_VAL 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_RC_DISC_TIME_VAL 3500 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the timer in milliseconds to guard against link busy and AVDT_CloseReq failed to be sent */ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AV_CLOSE_REQ_TIME_VAL 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CLOSE_REQ_TIME_VAL 4000 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* number to retry on reconfigure failure - some headsets requirs this number to be more than 1 */ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AV_RECONFIG_RETRY 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_RECONFIG_RETRY 6 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state machine states */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_INIT_SST, 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_INCOMING_SST, 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_OPENING_SST, 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_OPEN_SST, 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_RCFG_SST, 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CLOSING_SST 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the call out functions for audio stream */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AV_CO_FUNCTS bta_av_a2d_cos = 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_init, 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_disc_res, 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_getconfig, 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_setconfig, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_open, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_close, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_start, 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_stop, 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_src_data_path, 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_delay 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* ssm action functions for audio stream */ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AV_SACT bta_av_a2d_action[] = 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d, /* BTA_AV_DO_DISC */ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup, /* BTA_AV_CLEANUP */ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_free_sdb, /* BTA_AV_FREE_SDB */ 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_config_ind, /* BTA_AV_CONFIG_IND */ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_disconnect_req, /* BTA_AV_DISCONNECT_REQ */ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_req, /* BTA_AV_SECURITY_REQ */ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_rsp, /* BTA_AV_SECURITY_RSP */ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_setconfig_rsp, /* BTA_AV_SETCONFIG_RSP */ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_st_rc_timer, /* BTA_AV_ST_RC_TIMER */ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_opened, /* BTA_AV_STR_OPENED */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_ind, /* BTA_AV_SECURITY_IND */ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_cfm, /* BTA_AV_SECURITY_CFM */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_close, /* BTA_AV_DO_CLOSE */ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_connect_req, /* BTA_AV_CONNECT_REQ */ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_sdp_failed, /* BTA_AV_SDP_FAILED */ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_disc_results, /* BTA_AV_DISC_RESULTS */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_disc_res_as_acp, /* BTA_AV_DISC_RES_AS_ACP */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_open_failed, /* BTA_AV_OPEN_FAILED */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_getcap_results, /* BTA_AV_GETCAP_RESULTS */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_setconfig_rej, /* BTA_AV_SETCONFIG_REJ */ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_discover_req, /* BTA_AV_DISCOVER_REQ */ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_failed, /* BTA_AV_CONN_FAILED */ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_start, /* BTA_AV_DO_START */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped, /* BTA_AV_STR_STOPPED */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_reconfig, /* BTA_AV_RECONFIG */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_data_path, /* BTA_AV_DATA_PATH */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok, /* BTA_AV_START_OK */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_failed, /* BTA_AV_START_FAILED */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed, /* BTA_AV_STR_CLOSED */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_clr_cong, /* BTA_AV_CLR_CONG */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_suspend_cfm, /* BTA_AV_SUSPEND_CFM */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_str_ok, /* BTA_AV_RCFG_STR_OK */ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_failed, /* BTA_AV_RCFG_FAILED */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_connect, /* BTA_AV_RCFG_CONNECT */ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_discntd, /* BTA_AV_RCFG_DISCNTD */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_suspend_cont, /* BTA_AV_SUSPEND_CONT */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_cfm, /* BTA_AV_RCFG_CFM */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_open, /* BTA_AV_RCFG_OPEN */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_rej, /* BTA_AV_SECURITY_REJ */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_open_rc, /* BTA_AV_OPEN_RC */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_chk_2nd_start, /* BTA_AV_CHK_2ND_START */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_caps, /* BTA_AV_SAVE_CAPS */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_use_rc, /* BTA_AV_SET_USE_RC */ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close, /* BTA_AV_CCO_CLOSE */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_switch_role, /* BTA_AV_SWITCH_ROLE */ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_role_res, /* BTA_AV_ROLE_RES */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_delay_co, /* BTA_AV_DELAY_CO */ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_open_at_inc, /* BTA_AV_OPEN_AT_INC */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* these tables translate AVDT events to SSM events */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT16 bta_av_stream_evt_ok[] = { 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_DISC_OK_EVT, /* AVDT_DISCOVER_CFM_EVT */ 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_GETCAP_OK_EVT, /* AVDT_GETCAP_CFM_EVT */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_OK_EVT, /* AVDT_OPEN_CFM_EVT */ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_OK_EVT, /* AVDT_OPEN_IND_EVT */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CONFIG_IND_EVT, /* AVDT_CONFIG_IND_EVT */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_OK_EVT, /* AVDT_START_CFM_EVT */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_OK_EVT, /* AVDT_START_IND_EVT */ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_CFM_EVT */ 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_IND_EVT */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_CFM_EVT */ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_IND_EVT */ 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_RECONFIG_CFM_EVT, /* AVDT_RECONFIG_CFM_EVT */ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* AVDT_RECONFIG_IND_EVT */ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_CFM_EVT, /* AVDT_SECURITY_CFM_EVT */ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_IND_EVT, /* AVDT_SECURITY_IND_EVT */ 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_WRITE_CFM_EVT, /* AVDT_WRITE_CFM_EVT */ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_CONNECT_EVT, /* AVDT_CONNECT_IND_EVT */ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DISCONNECT_EVT, /* AVDT_DISCONNECT_IND_EVT */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVDT_REPORTING == TRUE) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_CONN_EVT */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_DISCONN_EVT */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DELAY_RPT_EVT, /* AVDT_DELAY_REPORT_EVT */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0 /* AVDT_DELAY_REPORT_CFM_EVT */ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT16 bta_av_stream_evt_fail[] = { 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_DISC_FAIL_EVT, /* AVDT_DISCOVER_CFM_EVT */ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_GETCAP_FAIL_EVT, /* AVDT_GETCAP_CFM_EVT */ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_FAIL_EVT, /* AVDT_OPEN_CFM_EVT */ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_OK_EVT, /* AVDT_OPEN_IND_EVT */ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CONFIG_IND_EVT, /* AVDT_CONFIG_IND_EVT */ 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_FAIL_EVT, /* AVDT_START_CFM_EVT */ 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_OK_EVT, /* AVDT_START_IND_EVT */ 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_CFM_EVT */ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_IND_EVT */ 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_CFM_EVT */ 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_IND_EVT */ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_RECONFIG_CFM_EVT, /* AVDT_RECONFIG_CFM_EVT */ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* AVDT_RECONFIG_IND_EVT */ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_CFM_EVT, /* AVDT_SECURITY_CFM_EVT */ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_IND_EVT, /* AVDT_SECURITY_IND_EVT */ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_WRITE_CFM_EVT, /* AVDT_WRITE_CFM_EVT */ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_CONNECT_EVT, /* AVDT_CONNECT_IND_EVT */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DISCONNECT_EVT, /* AVDT_DISCONNECT_IND_EVT */ 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVDT_REPORTING == TRUE) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_CONN_EVT */ 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_DISCONN_EVT */ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DELAY_RPT_EVT, /* AVDT_DELAY_REPORT_EVT */ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0 /* AVDT_DELAY_REPORT_CFM_EVT */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 196f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the array of callback functions to receive events from AVDT control channel */ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVDT_CTRL_CBACK * const bta_av_dt_cback[] = 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream0_cback 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream1_cback 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream2_cback 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream3_cback 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream4_cback 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream5_cback 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 229f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*********************************************** 230f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 231f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function bta_get_scb_handle 232f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 233f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description gives the registered AVDT handle.by checking with sep_type. 234f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 235f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 236f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns void 237f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta***********************************************/ 238f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaUINT8 bta_av_get_scb_handle ( tBTA_AV_SCB *p_scb, UINT8 local_sep ) 239f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 240f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 xx =0; 241f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta for (xx = 0; xx<BTA_AV_MAX_SEPS; xx++) 242f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 243f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((p_scb->seps[xx].tsep == local_sep) && 244f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (p_scb->seps[xx].codec_type == p_scb->codec_type)) 245f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return (p_scb->seps[xx].av_handle); 246f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 247e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" bta_av_get_scb_handle appropiate sep_type not found") 248f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return 0; /* return invalid handle */ 249f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 250f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 251f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*********************************************** 252f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 253f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function bta_av_get_scb_sep_type 254f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 255f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description gives the sep type by cross-checking with AVDT handle 256f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 257f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 258f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns void 259f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta***********************************************/ 260f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaUINT8 bta_av_get_scb_sep_type ( tBTA_AV_SCB *p_scb, UINT8 tavdt_handle) 261f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 262f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 xx =0; 263f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta for (xx = 0; xx<BTA_AV_MAX_SEPS; xx++) 264f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 265f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[xx].av_handle == tavdt_handle) 266f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return (p_scb->seps[xx].tsep); 267f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 268e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" bta_av_get_scb_sep_type appropiate handle not found") 269f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return 3; /* return invalid sep type */ 270f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_save_addr 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description copy the bd_addr and maybe reset the supported flags 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b) 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 284e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_save_addr r:%d, s:%d", 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup, p_scb->suspend_sup); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bdcmp(p_scb->peer_addr, b) != 0) 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 288e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("reset flags"); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a new addr, reset the supported flags */ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup = TRUE; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->suspend_sup = TRUE; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do this copy anyway, just in case the first addr matches 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the control block one by accident */ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_scb->peer_addr, b); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 301379743beded881127703334e1dda2cd327ec651dZhihai Xu** Function notify_start_failed 302379743beded881127703334e1dda2cd327ec651dZhihai Xu** 303379743beded881127703334e1dda2cd327ec651dZhihai Xu** Description notify up-layer AV start failed 304379743beded881127703334e1dda2cd327ec651dZhihai Xu** 305379743beded881127703334e1dda2cd327ec651dZhihai Xu** 306379743beded881127703334e1dda2cd327ec651dZhihai Xu** Returns void 307379743beded881127703334e1dda2cd327ec651dZhihai Xu** 308379743beded881127703334e1dda2cd327ec651dZhihai Xu*******************************************************************************/ 309379743beded881127703334e1dda2cd327ec651dZhihai Xustatic void notify_start_failed(tBTA_AV_SCB *p_scb) 310379743beded881127703334e1dda2cd327ec651dZhihai Xu{ 311379743beded881127703334e1dda2cd327ec651dZhihai Xu tBTA_AV_START start; 312379743beded881127703334e1dda2cd327ec651dZhihai Xu /* if start failed, clear role */ 313379743beded881127703334e1dda2cd327ec651dZhihai Xu p_scb->role &= ~BTA_AV_ROLE_START_INT; 314379743beded881127703334e1dda2cd327ec651dZhihai Xu start.chnl = p_scb->chnl; 315379743beded881127703334e1dda2cd327ec651dZhihai Xu start.status = BTA_AV_FAIL; 316379743beded881127703334e1dda2cd327ec651dZhihai Xu start.initiator = TRUE; 317379743beded881127703334e1dda2cd327ec651dZhihai Xu start.hndl = p_scb->hndl; 318379743beded881127703334e1dda2cd327ec651dZhihai Xu (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 319379743beded881127703334e1dda2cd327ec651dZhihai Xu} 320379743beded881127703334e1dda2cd327ec651dZhihai Xu 321379743beded881127703334e1dda2cd327ec651dZhihai Xu/******************************************************************************* 322379743beded881127703334e1dda2cd327ec651dZhihai Xu** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_st_rc_timer 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description start the AVRC timer if no RC connection & CT is supported & 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RC is used or 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as ACP (we do not really know if we want AVRC) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_st_rc_timer(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 336e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_st_rc_timer rc_handle:%d, use_rc: %d", 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rc_handle, p_scb->use_rc); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for outgoing RC connection as INT/CT */ 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) && 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*(bta_av_cb.features & BTA_AV_FEAT_RCCT) &&*/ 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->use_rc == TRUE || (p_scb->role & BTA_AV_ROLE_AD_ACP)) ) 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) == 0) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RC_DISC_TIME_VAL); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_CHECK_RC; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_next_getcap 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function gets the capabilities of the next available 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stream found in the discovery results. 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if we sent request to AVDT, FALSE otherwise. 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_next_getcap(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_GETCAP_REQ *p_req; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN sent_cmd = FALSE; 366f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 uuid_int = p_scb->uuid_int; 367f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 sep_requested = 0; 368f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 369f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) 370f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sep_requested = AVDT_TSEP_SNK; 371f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if(uuid_int == UUID_SERVCLASS_AUDIO_SINK) 372f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sep_requested = AVDT_TSEP_SRC; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = p_scb->sep_info_idx; i < p_scb->num_seps; i++) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam not in use, is a sink, and is the right media type (audio/video) */ 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].in_use == FALSE) && 378f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (p_scb->sep_info[i].tsep == sep_requested) && 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = i; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we got a stream; get its capabilities */ 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap = (tAVDT_CFG *) GKI_getbuf(sizeof(tAVDT_CFG)); 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = p_scb->num_seps; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->avdt_version >= AVDT_VERSION_SYNC) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_req = AVDT_GetAllCapReq; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_req = AVDT_GetCapReq; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_req)(p_scb->peer_addr, 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].seid, 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap, bta_av_dt_cback[p_scb->hdi]); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sent_cmd = TRUE; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no streams available then stream open fails */ 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!sent_cmd) 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_GETCAP_FAIL_EVT, p_data); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return sent_cmd; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_proc_stream_evt 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Utility function to compose stream events. 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_proc_stream_evt(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data, int index) 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_STR_MSG *p_msg; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_len = 0; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scb = bta_av_cb.p_scb[index]; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == AVDT_SECURITY_IND_EVT) 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_len = (p_data->security_ind.len < BTA_AV_SECURITY_MAX_LEN) ? 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->security_ind.len : BTA_AV_SECURITY_MAX_LEN; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == AVDT_SECURITY_CFM_EVT && p_data->hdr.err_code == 0) 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_len = (p_data->security_cfm.len < BTA_AV_SECURITY_MAX_LEN) ? 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->security_cfm.len : BTA_AV_SECURITY_MAX_LEN; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb && (p_msg = (tBTA_AV_STR_MSG *) GKI_getbuf((UINT16) (sizeof(tBTA_AV_STR_MSG) + sec_len))) != NULL) 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy event data, bd addr, and handle to event message buffer */ 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.offset = 0; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_addr != NULL) 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_msg->bd_addr, bd_addr); 458e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[2], bd_addr[3], 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[4], bd_addr[5]); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data != NULL) 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_msg->msg, p_data, sizeof (tAVDT_CTRL)); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy config params to event message buffer */ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 470ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case AVDT_RECONFIG_CFM_EVT: 471e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x", 472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_msg->msg.reconfig_cfm.p_cfg->codec_info[0]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[1]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[2], 473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_msg->msg.reconfig_cfm.p_cfg->codec_info[3]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[4]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[5], 474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_msg->msg.reconfig_cfm.p_cfg->codec_info[6]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[7]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[8], 475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->msg.reconfig_cfm.p_cfg->codec_info[9]); 476ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_CONFIG_IND_EVT: 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We might have 2 SEP signallings(A2DP + VDP) with one peer device on one L2CAP. 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we already have a signalling connection with the bd_addr and the streaming 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SST is at INIT state, change it to INCOMING state to handle the signalling 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * from the 2nd SEP. */ 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_find_lcb(bd_addr, BTA_AV_LCB_FIND) != NULL) && (bta_av_is_scb_init(p_scb))) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_scb_sst_incoming (p_scb); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When ACP_CONNECT_EVT was received, we put first available scb to incoming state. 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Later when we receive AVDT_CONFIG_IND_EVT, we use a new p_scb and set its state to 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * incoming which we do it above. 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We also have to set the old p_scb state to init to be used later */ 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTA_AV_NUM_STRS; xx++) 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.p_scb[xx]) && (xx != index)) 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.p_scb[xx]->state == BTA_AV_INCOMING_SST) 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.p_scb[xx]->state = BTA_AV_INIT_SST; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.p_scb[xx]->coll_mask = 0; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_msg->cfg, p_data->config_ind.p_cfg, sizeof(tAVDT_CFG)); 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SECURITY_IND_EVT: 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.security_ind.p_data = (UINT8 *) (p_msg + 1); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_msg->msg.security_ind.p_data, p_data->security_ind.p_data, sec_len); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SECURITY_CFM_EVT: 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.security_cfm.p_data = (UINT8 *) (p_msg + 1); 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->hdr.err_code == 0) 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_msg->msg.security_cfm.p_data, p_data->security_cfm.p_data, sec_len); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SUSPEND_IND_EVT: 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.hdr.err_code = 0; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.hdr.err_code = 0; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up application event */ 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_data == NULL) || (p_data->hdr.err_code == 0)) 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = bta_av_stream_evt_ok[event]; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = bta_av_stream_evt_fail[event]; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->initiator = FALSE; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == AVDT_SUSPEND_CFM_EVT) 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->initiator = TRUE; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 547e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_VERBOSE("hndl:x%x", p_scb->hndl); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.layer_specific = p_scb->hndl; 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->handle = handle; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->avdt_event = event; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_msg); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* coverity[var_deref_model] */ 555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* false-positive: bta_av_conn_cback only processes AVDT_CONNECT_IND_EVT and AVDT_DISCONNECT_IND_EVT event 556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * these 2 events always have associated p_data */ 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_cback(handle, bd_addr, event, p_data); 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 562f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function bta_av_stream_data_cback 563f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 564f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description This is the AVDTP callback function for stream events. 565f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 566f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns void 567f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 568f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta*******************************************************************************/ 569f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt) 570f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 571f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int index = 0; 572f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tBTA_AV_SCB *p_scb ; 573e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_stream_data_cback avdt_handle: %d pkt_len=0x%x ofst = 0x%x", handle,p_pkt->len,p_pkt->offset); 574e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Number of frames 0x%x",*((UINT8*)(p_pkt + 1) + p_pkt->offset)); 575e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Sequence Number 0x%x",p_pkt->layer_specific); 576f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* Get SCB and correct sep type*/ 577f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta for(index = 0; index < BTA_AV_NUM_STRS;index ++ ) 578f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 579f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb = bta_av_cb.p_scb[index]; 580f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->avdt_handle == handle)&&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK)) 581f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 582f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 583f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(index == BTA_AV_NUM_STRS) /* cannot find correct handler */ 584f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 585f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta GKI_freebuf(p_pkt); 586f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 587f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 588f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_pkt->event = BTA_AV_MEDIA_DATA_EVT; 589f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_DATA_EVT, (tBTA_AV_MEDIA*)p_pkt); 590f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta GKI_freebuf(p_pkt); /* a copy of packet had been delivered, we free this buffer */ 591f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 592f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 593f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 594f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream0_cback 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 604e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_VERBOSE("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event); 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 0); 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream1_cback 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 619e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event); 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 1); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream2_cback 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 635e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 2); 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream3_cback 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 652e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 3); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream4_cback 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 669e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 4); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream5_cback 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 686e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event); 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 5); 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_a2d_sdp_cback 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description A2DP service discovery callback. 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_a2d_sdp_cback(BOOLEAN found, tA2D_Service *p_service) 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SDP_RES *p_msg; 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scb; 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (tBTA_AV_SDP_RES *) GKI_getbuf(sizeof(tBTA_AV_SDP_RES))) != NULL) 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = (found) ? BTA_AV_SDP_DISC_OK_EVT : BTA_AV_SDP_DISC_FAIL_EVT; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = bta_av_hndl_to_scb(bta_av_cb.handle); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb) 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (found && (p_service != NULL)) 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = p_service->avdt_version; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = 0x00; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.layer_specific = bta_av_cb.handle; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_msg); 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 722e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR ("bta_av_a2d_sdp_cback, no scb found for handle(0x%x)", bta_av_cb.handle); 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_adjust_seps_idx 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description adjust the sep_idx 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 736f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb, UINT8 avdt_handle) 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 738f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int xx; 739e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type); 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(xx=0; xx<BTA_AV_MAX_SEPS; xx++) 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 742e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("av_handle: %d codec_type: %d", 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->seps[xx].av_handle, p_scb->seps[xx].codec_type); 744f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->seps[xx].av_handle && p_scb->codec_type == p_scb->seps[xx].codec_type) 745f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta && (p_scb->seps[xx].av_handle == avdt_handle)) 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_idx = xx; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_handle = p_scb->seps[xx].av_handle; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_switch_role 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switch role was not started and a timer was started. 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** another attempt to switch role now - still opening. 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_switch_role (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RS_RES switch_res = BTA_AV_RS_NONE; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_OPEN *p_buf = &p_scb->q_info.open; 7685cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 770e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_switch_role wait:x%x", p_scb->wait); 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START) 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RETRY; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the masks set when the timer is started */ 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~(BTA_AV_WAIT_ROLE_SW_RES_OPEN|BTA_AV_WAIT_ROLE_SW_RES_START); 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_switch_if_needed(p_scb) || !bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this should not happen in theory. Just in case... 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * continue to do_disc_a2d */ 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch_res = BTA_AV_RS_DONE; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure on OPEN */ 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch_res = BTA_AV_RS_FAIL; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (switch_res != BTA_AV_RS_NONE) 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.rs_idx == (p_scb->hdi + 1)) 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_RETRY; 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = 0; 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->switch_res = switch_res; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d(p_scb, (tBTA_AV_DATA *)p_buf); 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_role_res 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the role changed event 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_role_res (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN initiator = FALSE; 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_OPEN av_open; 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 825e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role); 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role & BTA_AV_ROLE_START_INT) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project initiator = TRUE; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->q_tag == BTA_AV_Q_TAG_START) 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_STARTED) 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->role_res.hci_status != HCI_SUCCESS) 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 83677d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy p_scb->role &= ~BTA_AV_ROLE_START_INT; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start failed because of role switch. */ 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok(p_scb, p_data); 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START) 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_FAILED; 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_OPEN) 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_START_INT; 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->role_res.hci_status != HCI_SUCCESS) 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Open failed because of role switch. */ 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(av_open.bd_addr, p_scb->peer_addr); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_open.chnl = p_scb->chnl; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_open.hndl = p_scb->hndl; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 867f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 868f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta av_open.sep = AVDT_TSEP_SNK; 869f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 870f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta av_open.sep = AVDT_TSEP_SRC; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *)&av_open); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Continue av open process */ 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_info.open.switch_res = BTA_AV_RS_DONE; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d (p_scb, (tBTA_AV_DATA *)&(p_scb->q_info.open)); 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 882e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait); 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 886e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("wait:x%x, role:x%x", p_scb->wait, p_scb->role); 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_delay_co 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Call the delay call-out function to report the delay report 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from SNK 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_delay_co (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->delay(p_scb->hndl, p_data->str_msg.msg.delay_rpt_cmd.delay); 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_disc_a2d 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Do service discovery for A2DP. 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_disc_a2d (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ok_continue = FALSE; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SDP_DB_PARAMS db_params; 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_PROTOCOL_DESC_LIST, 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_BT_PROFILE_DESC_LIST}; 920f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 sdp_uuid = 0; /* UUID for which SDP has to be done */ 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 922e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d", 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_open.use_rc, p_data->api_open.switch_res, bta_av_cb.audio_open_cnt); 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_data->api_open.switch_res) 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_NONE: 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_switch_if_needed(p_scb) || !bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* waiting for role switch result. save the api to control block */ 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_scb->q_info.open, &p_data->api_open, sizeof(tBTA_AV_API_OPEN)); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_OPEN; 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_FAIL: 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report a new failure event */ 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_ROLE; 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_SDP_DISC_FAIL_EVT, NULL); 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_OK: 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (tBTA_AV_DATA *)&p_scb->q_info.open; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* continue to open if link role is ok */ 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_DONE: 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 967e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag); 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!ok_continue) 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the role switch bits */ 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_CHECK_RC) 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_CHECK_RC; 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RC_DISC_TIME_VAL); 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_MASTER) 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 982d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH); 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 984d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie if (bta_av_cb.audio_open_cnt == 1) 985d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie { 986d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie /* there's already an A2DP connection. do not allow switch */ 987d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH); 988d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie } 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store peer addr other parameters */ 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_addr(p_scb, p_data->api_open.bd_addr); 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sec_mask = p_data->api_open.sec_mask; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = p_data->api_open.use_rc; 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_app_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate discovery database */ 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_disc_db == NULL) 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(BTA_AV_DISC_BUF_SIZE); 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only one A2D find service is active at a time */ 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.handle = p_scb->hndl; 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->p_disc_db) 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up parameters */ 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.db_len = BTA_AV_DISC_BUF_SIZE; 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.num_attr = 3; 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.p_db = p_scb->p_disc_db; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.p_attrs = attr_list; 1013f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->uuid_int = p_data->api_open.uuid; 1014f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SINK) 1015f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sdp_uuid = UUID_SERVCLASS_AUDIO_SOURCE; 1016f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) 1017f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sdp_uuid = UUID_SERVCLASS_AUDIO_SINK; 1018f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1019e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("uuid_int 0x%x, Doing SDP For 0x%x", p_scb->uuid_int, sdp_uuid); 1020f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(A2D_FindService(sdp_uuid, p_scb->peer_addr, &db_params, 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_a2d_sdp_cback) == A2D_SUCCESS) 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* when the code reaches here, either the DB is NULL 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * or A2D_FindService is not successful */ 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_a2d_sdp_cback(FALSE, NULL); 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_cleanup 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description cleanup AV stream control block. 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_cleanup(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CONN_CHG msg; 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 role = BTA_AV_ROLE_AD_INT; 10465cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1048e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_cleanup"); 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free any buffers */ 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_cap); 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = 0; 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize some control block variables */ 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_SUCCESS; 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if de-registering shut everything down */ 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.hdr.layer_specific = p_scb->hndl; 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role = role; 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = 0; 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait = 0; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = 0; 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->deregistring) 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove stream */ 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(xx=0; xx<BTA_AV_MAX_SEPS; xx++) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->seps[xx].av_handle) 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_RemoveStream(p_scb->seps[xx].av_handle); 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->seps[xx].av_handle = 0; 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_dereg_comp((tBTA_AV_DATA *) &msg); 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report stream closed to main SM */ 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.is_up = FALSE; 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(msg.peer_addr, p_scb->peer_addr); 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_chg((tBTA_AV_DATA *) &msg); 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_free_sdb 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free service discovery db buffer. 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_free_sdb(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10995cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_config_ind 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle a stream configuration indication from the peer. 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_config_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CI_SETCONFIG setconfig; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info; 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG *p_evt_cfg = &p_data->str_msg.cfg; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 psc_mask = (p_evt_cfg->psc_mask | p_scb->cfg.psc_mask); 1118f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 local_sep; /* sep type of local handle on which connection was received */ 1119f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 count = 0; 1120f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tBTA_AV_STR_MSG *p_msg = (tBTA_AV_STR_MSG *)p_data; 11215cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1123f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta local_sep = bta_av_get_scb_sep_type(p_scb, p_msg->handle); 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_label = p_data->str_msg.msg.hdr.label; 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_scb->cfg.codec_info, p_evt_cfg->codec_info, AVDT_CODEC_SIZE); 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = p_evt_cfg->codec_info[BTA_AV_CODEC_TYPE_IDX]; 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_addr(p_scb, p_data->str_msg.bd_addr); 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear collision mask */ 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask = 0; 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.acp_sig_tmr); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no codec parameters in configuration, fail */ 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_evt_cfg->num_codec == 0) || 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* or the peer requests for a service we do not support */ 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((psc_mask != p_scb->cfg.psc_mask) && 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (psc_mask != (p_scb->cfg.psc_mask&~AVDT_PSC_DELAY_RPT))) ) 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setconfig.hndl = p_scb->hndl; /* we may not need this */ 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setconfig.err_code = AVDT_ERR_UNSUP_CFG; 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_CI_SETCONFIG_FAIL_EVT, (tBTA_AV_DATA *) &setconfig); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info = &p_scb->sep_info[0]; 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->in_use = 0; 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->media_type = p_scb->media_type; 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->seid = p_data->str_msg.msg.config_ind.int_seid; 1149f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1150f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* Sep type of Peer will be oppsite role to our local sep */ 1151f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SRC) 1152f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_info->tsep = AVDT_TSEP_SNK; 1153f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (local_sep == AVDT_TSEP_SNK) 1154f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_info->tsep = AVDT_TSEP_SRC; 1155f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_AD_ACP; 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = p_evt_cfg->psc_mask; 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_RCTG) 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = TRUE; 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = FALSE; 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = 1; 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 1165e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_config_ind: SEID: %d use_rc: %d cur_psc_mask:0x%x", p_info->seid, p_scb->use_rc, p_scb->cur_psc_mask); 1166f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* in case of A2DP SINK this is the first time peer data is being sent to co functions */ 1167f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SNK) 1168f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1169f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type, 1170f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->codec_info, 1171f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_info->seid, 1172f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->peer_addr, 1173f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->num_protect, 1174f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->protect_info, 1175f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta AVDT_TSEP_SNK, 1176f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->handle); 1177f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1178f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else 1179f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1180f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type, 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->codec_info, 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->seid, 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_addr, 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->num_protect, 1185f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->protect_info, 1186f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta AVDT_TSEP_SRC, 1187f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->handle); 1188f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disconnect_req 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disconnect AVDTP connection. 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disconnect_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RCB *p_rcb; 12045cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 12055cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 1206e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_disconnect_req conn_lcb: 0x%x", bta_av_cb.conn_lcb); 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.sig_tmr); 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.conn_lcb) 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = bta_av_get_rcb_by_shdl((UINT8)(p_scb->hdi + 1)); 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb) 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_del_rc(p_rcb); 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AVDT_DISCONNECT_EVT, NULL); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_req 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security request. 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityReq(p_scb->avdt_handle, p_data->api_protect_req.p_data, 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_protect_req.len); 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_rsp 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security response. 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->api_protect_rsp.error_code, 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_protect_rsp.p_data, p_data->api_protect_rsp.len); 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_NSC, 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 0); 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_setconfig_rsp 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description setconfig is OK 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_setconfig_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num = p_data->ci_setconfig.num_seid + 1; 1276f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 avdt_handle = p_data->ci_setconfig.avdt_handle; 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_seid = p_data->ci_setconfig.p_seid; 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 1279f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 local_sep; 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we like this codec_type. find the sep_idx */ 1282f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta local_sep = bta_av_get_scb_sep_type(p_scb,avdt_handle); 1283f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, avdt_handle); 1284e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask); 1285948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach 1286f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((AVDT_TSEP_SNK == local_sep) && (p_data->ci_setconfig.err_code == AVDT_SUCCESS) && 1287f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL)) 1288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT, 1289f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (tBTA_AV_MEDIA*)p_scb->cfg.codec_info); 1290f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1291f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->ci_setconfig.err_code, 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->ci_setconfig.category); 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.sig_tmr); 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->ci_setconfig.err_code == AVDT_SUCCESS) 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait = BTA_AV_WAIT_ACP_CAPS_ON; 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->ci_setconfig.recfg_needed) 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_SUSPEND_OPT; 1302948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach APPL_TRACE_DEBUG("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d", 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->ci_setconfig.recfg_needed, p_scb->role, num); 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* callout module tells BTA the number of "good" SEPs and their SEIDs. 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * getcap on these SEID */ 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = num; 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->cur_psc_mask & AVDT_PSC_DELAY_RPT) 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = AVDT_VERSION_SYNC; 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1) 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind. 1315f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta * call disc_res now */ 1316f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* this is called in A2DP SRC path only, In case of SINK we don't need it */ 1317f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SRC) 1318f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->disc_res(p_scb->hndl, num, num, 0, p_scb->peer_addr, 1319f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UUID_SERVCLASS_AUDIO_SOURCE); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we do not know the peer device and it is using non-SBC codec 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * we need to know all the SEPs on SNK */ 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_discover_req(p_scb, NULL); 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 1; i < num; i++) 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1331e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("sep_info[%d] SEID: %d", i, p_seid[i-1]); 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize the sep_info[] to get capabilities */ 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].in_use = FALSE; 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].tsep = AVDT_TSEP_SNK; 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].media_type = p_scb->media_type; 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].seid = p_seid[i-1]; 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1338948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach 1339f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* only in case of local sep as SRC we need to look for other SEPs, In case of SINK we don't */ 1340f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SRC) 1341948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach { 1342948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach /* Make sure UUID has been initialized... */ 1343948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach if (p_scb->uuid_int == 0) 1344948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach p_scb->uuid_int = p_scb->open_api.uuid; 1345f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_next_getcap(p_scb, p_data); 1346948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach } 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_opened 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream opened OK (incoming/outgoing). 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_opened (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CONN_CHG msg; 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_OPEN open; 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.hdr.layer_specific = p_scb->hndl; 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.is_up = TRUE; 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(msg.peer_addr, p_scb->peer_addr); 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle); 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_chg((tBTA_AV_DATA *) &msg); 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the congestion flag, so AV would not send media packets by accident */ 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->stream_mtu = p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE; 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu); 1377e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d", 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid, p_scb->stream_mtu, mtu); 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(mtu == 0 || mtu > p_scb->stream_mtu) 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = p_scb->stream_mtu; 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the media channel as medium priority */ 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetTxPriority(p_scb->l2c_cid, L2CAP_CHNL_PRIORITY_MEDIUM); 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetChnlFlushability (p_scb->l2c_cid, TRUE); 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_scb->q_info, 0, sizeof(tBTA_AV_Q_INFO)); 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = 0; 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->open(p_scb->hndl, 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type, p_scb->cfg.codec_info, mtu); 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO check if other audio channel is open. 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If yes, check if reconfig is needed 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Rigt now we do not do this kind of checking. 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BTA-AV is INT for 2nd audio connection. 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The application needs to make sure the current codec_info is proper. 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If one audio connection is open and another SNK attempts to connect to AV, 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection will be rejected. 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if other audio channel is started. If yes, start */ 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(open.bd_addr, p_scb->peer_addr); 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.chnl = p_scb->chnl; 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.hndl = p_scb->hndl; 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.status = BTA_AV_SUCCESS; 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.starting = bta_av_chk_start(p_scb); 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr = 0; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( NULL != (p = BTM_ReadRemoteFeatures(p_scb->peer_addr))) 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HCI_EDR_ACL_2MPS_SUPPORTED(p)) 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr |= BTA_AV_EDR_2MBPS; 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HCI_EDR_ACL_3MPS_SUPPORTED(p)) 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr |= BTA_AV_EDR_3MBPS; 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ar_avdt_conn(BTA_ID_AV, open.bd_addr); 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1419f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 1420f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SNK; 1421f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 1422f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SRC; 1423f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open); 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(open.starting) 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_ind 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle an AVDTP security indication. 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_PROTECT_REQ protect_req; 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_label = p_data->str_msg.msg.hdr.label; 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.chnl = p_scb->chnl; 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.hndl = p_scb->hndl; 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 1452e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("sec ind handle: x%x", protect_req.hndl); 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.p_data = p_data->str_msg.msg.security_ind.p_data; 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.len = p_data->str_msg.msg.security_ind.len; 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_PROTECT_REQ_EVT, (tBTA_AV *) &protect_req); 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* app doesn't support security indication; respond with failure */ 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_NSC, NULL, 0); 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_cfm 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle an AVDTP security confirm. 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_PROTECT_RSP protect_rsp; 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.chnl = p_scb->chnl; 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.hndl = p_scb->hndl; 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.p_data = p_data->str_msg.msg.security_cfm.p_data; 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.len = p_data->str_msg.msg.security_cfm.len; 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.err_code= p_data->str_msg.msg.hdr.err_code; 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_PROTECT_RSP_EVT, (tBTA_AV *) &protect_rsp); 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_close 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Close stream. 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_close (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 15035cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop stream if started */ 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->co_started) 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.sig_tmr); 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close stream */ 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just in case that the link is congested, link is flow controled by peer or 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * for whatever reason the the close request can not be sent in time. 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * when this timer expires, AVDT_DisconnectReq will be called to disconnect the link 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT16)BTA_AV_API_CLOSE_EVT, 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CLOSE_REQ_TIME_VAL); 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_connect_req 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connect AVDTP connection. 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_connect_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15395cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 15405cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SNK initiated L2C connection while SRC was doing SDP. */ 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Wait until timeout to check if SNK starts signalling. */ 1547e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask); 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_sdp_failed 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Service discovery failed. 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_sdp_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->open_status) 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_SDP; 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed(p_scb, p_data); 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disc_results 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP discover results. Search through the 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** results and find the first available stream, and get 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its capabilities. 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disc_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1585f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 num_snks = 0, num_srcs =0, i; 1586f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* our uuid in case we initiate connection */ 1587f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 uuid_int = p_scb->uuid_int; 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1589e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" initiator UUID 0x%x", uuid_int); 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store number of stream endpoints returned */ 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps; 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_scb->num_seps; i++) 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam not in use, is a sink, and is audio */ 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].in_use == FALSE) && 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1599f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 1600f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)) 1601f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_snks++; 1602f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1603f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->sep_info[i].tsep == AVDT_TSEP_SRC) && 1604f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (uuid_int == UUID_SERVCLASS_AUDIO_SINK)) 1605f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_srcs++; 1606f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1610f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, num_srcs, p_scb->peer_addr, 1611f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta uuid_int); 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = num_snks; 1613f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->num_disc_srcs = num_srcs; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we got any */ 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_seps > 0) 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize index into discovery results */ 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the capabilities of the first available stream */ 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we got discover response but with no streams; we're done */ 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, p_data); 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disc_res_as_acp 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP discover results. Search through the 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** results and find the first available stream, and get 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its capabilities. 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disc_res_as_acp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_snks = 0, i; 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store number of stream endpoints returned */ 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps; 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_scb->num_seps; i++) 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam is a sink, and is audio */ 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].in_use = FALSE; 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_snks++; 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1661f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, 0, p_scb->peer_addr, 1662f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UUID_SERVCLASS_AUDIO_SOURCE); 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = num_snks; 1664f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->num_disc_srcs = 0; 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we got any */ 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_seps > 0) 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize index into discovery results */ 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the capabilities of the first available stream */ 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we got discover response but with no streams; we're done */ 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, p_data); 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_save_caps 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description report the SNK SEP capabilities to application 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_save_caps(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG cfg; 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx]; 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_wait = p_scb->wait; 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN getcap_done = FALSE; 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1698e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x", 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps, p_scb->sep_info_idx, p_scb->wait); 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cfg, p_scb->p_cap, sizeof(tAVDT_CFG)); 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* let application know the capability of the SNK */ 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->getcfg(p_scb->hndl, cfg.codec_info[BTA_AV_CODEC_TYPE_IDX], 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.codec_info, &p_scb->sep_info_idx, p_info->seid, 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cfg.num_protect, cfg.protect_info); 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx++; 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_seps > p_scb->sep_info_idx) 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some devices have seps at the end of the discover list, which is not */ 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* matching media type(video not audio). */ 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In this case, we are done with getcap without sending another */ 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request to AVDT. */ 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_next_getcap(p_scb, p_data)) 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap_done = TRUE; 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap_done = TRUE; 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (getcap_done) 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are done getting capabilities. restore the p_cb->sep_info_idx */ 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON|BTA_AV_WAIT_ACP_CAPS_STARTED); 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_wait & BTA_AV_WAIT_ACP_CAPS_STARTED) 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok (p_scb, NULL); 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_set_use_rc 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description set to use AVRC for this stream control block. 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_set_use_rc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17425cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 17435cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = TRUE; 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_cco_close 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description call close call-out function. 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_cco_close (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 17595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 17605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU); 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->close(p_scb->hndl, p_scb->codec_type, mtu); 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_failed 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Failed to open an AVDT stream 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1778ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_av_opened = FALSE; 1779ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_AV_SCB * p_opened_scb = NULL; 1780ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 idx; 1781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_AV_OPEN open; 1782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1783e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_open_failed"); 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_STREAM; 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close(p_scb, p_data); 1786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* check whether there is already an opened audio or video connection with the same device */ 1788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (idx = 0; (idx < BTA_AV_NUM_STRS) && (is_av_opened == FALSE); idx++ ) 1789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1790ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_opened_scb = bta_av_cb.p_scb[idx]; 1791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_opened_scb && (p_opened_scb->state == BTA_AV_OPEN_SST) && (!bdcmp(p_opened_scb->peer_addr,p_scb->peer_addr )) ) 1792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_av_opened = TRUE; 1793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if there is already an active AV connnection with the same bd_addr, 1797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta don't send disconnect req, just report the open event with BTA_AV_FAIL_GET_CAP status */ 1798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_av_opened == TRUE) 1799ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdcpy(open.bd_addr, p_scb->peer_addr); 1801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.chnl = p_scb->chnl; 1802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.hndl = p_scb->hndl; 1803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.status = BTA_AV_FAIL_GET_CAP; 1804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.starting = bta_av_chk_start(p_scb); 1805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.edr = 0; 1806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* set the state back to initial state */ 1807ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_av_set_scb_sst_init(p_scb); 1808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1809f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 1810f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SNK; 1811f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 1812f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SRC; 1813f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open); 1815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 1820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_getcap_results 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP get capabilities results. Check the codec 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type and see if it matches ours. If it does not, get the 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capabilities of the next stream, if any. 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_getcap_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG cfg; 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 media_type; 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx]; 1840f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 uuid_int; /* UUID for which connection was initiatied */ 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cfg, &p_scb->cfg, sizeof(tAVDT_CFG)); 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.num_codec = 1; 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.num_protect = p_scb->p_cap->num_protect; 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE); 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cfg.protect_info, p_scb->p_cap->protect_info, AVDT_PROTECT_SIZE); 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_type = p_scb->p_cap->codec_info[BTA_AV_MEDIA_TYPE_IDX] >> 4; 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1849e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("num_codec %d", p_scb->p_cap->num_codec); 1850e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("media type x%x, x%x", media_type, p_scb->media_type); 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE 1852e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask); 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if codec present and we get a codec configuration */ 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->p_cap->num_codec != 0) && 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (media_type == p_scb->media_type) && 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->p_cos->getcfg(p_scb->hndl, p_scb->p_cap->codec_info[BTA_AV_CODEC_TYPE_IDX], 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.codec_info, &p_scb->sep_info_idx, p_info->seid, 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cfg.num_protect, cfg.protect_info) == 0)) 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mux_mask &= p_scb->p_cap->mux_mask; 1864e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("mux_mask used x%x", cfg.mux_mask); 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save copy of codec type and configuration */ 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = cfg.codec_info[BTA_AV_CODEC_TYPE_IDX]; 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_scb->cfg, &cfg, sizeof(tAVDT_CFG)); 1869f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1870f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta uuid_int = p_scb->uuid_int; 1871e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" initiator UUID = 0x%x ", uuid_int); 1872f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) 1873f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC)); 1874f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (uuid_int == UUID_SERVCLASS_AUDIO_SINK) 1875f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SNK)); 1876f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use only the services peer supports */ 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.psc_mask &= p_scb->p_cap->psc_mask; 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = cfg.psc_mask; 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1881f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((uuid_int == UUID_SERVCLASS_AUDIO_SINK) && 1882f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL)) 1883f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1884e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Configure Deoder for Sink Connection "); 1885f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT, 1886f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (tBTA_AV_MEDIA*)p_scb->cfg.codec_info); 1887f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1888f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open the stream */ 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_OpenReq(p_scb->seps[p_scb->sep_idx].av_handle, p_scb->peer_addr, 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[p_scb->sep_info_idx].seid, &cfg); 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_is_rcfg_sst(p_scb)) 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free capabilities buffer */ 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_cap); 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try the next stream, if any */ 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx++; 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_setconfig_rej 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send AVDTP set config reject. 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_setconfig_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_REJECT reject; 1920f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 avdt_handle = p_data->ci_setconfig.avdt_handle; 1921f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1922f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, avdt_handle); 1923e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_setconfig_rej: sep_idx: %d",p_scb->sep_idx); 1924f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_UNSUP_CFG, 0); 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(reject.bd_addr, p_data->str_msg.bd_addr); 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reject.hndl = p_scb->hndl; 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_REJECT_EVT, (tBTA_AV *) &reject); 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_discover_req 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP discover request to the peer. 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_discover_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19425cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 19435cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send avdtp discover request */ 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DiscoverReq(p_scb->peer_addr, p_scb->sep_info, BTA_AV_NUM_SEPS, bta_av_dt_cback[p_scb->hdi]); 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_conn_failed 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDTP connection failed. 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_conn_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_STREAM; 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed(p_scb, p_data); 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_start 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start stream. 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cur_role; 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1978e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started); 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.sco_occupied) 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_failed(p_scb, p_data); 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disallow role switch during streaming, only if we are the master role 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * i.e. allow role switch, if we are slave. 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * It would not hurt us, if the peer device wants us to be master */ 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_GetRole (p_scb->peer_addr, &cur_role) == BTM_SUCCESS) && 19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (cur_role == BTM_ROLE_MASTER) ) 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_clear_policy(BTA_ID_AV, policy, p_scb->peer_addr); 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->started == FALSE) && ((p_scb->role & BTA_AV_ROLE_START_INT) == 0)) 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_START_INT; 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_StartReq(&p_scb->avdt_handle, 1); 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 200377d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy else if (p_scb->started) 20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 200577d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy p_scb->role |= BTA_AV_ROLE_START_INT; 2006379743beded881127703334e1dda2cd327ec651dZhihai Xu if ( p_scb->wait == 0 ) { 2007379743beded881127703334e1dda2cd327ec651dZhihai Xu if (p_scb->role & BTA_AV_ROLE_SUSPEND) { 2008379743beded881127703334e1dda2cd327ec651dZhihai Xu notify_start_failed(p_scb); 2009379743beded881127703334e1dda2cd327ec651dZhihai Xu } else { 2010379743beded881127703334e1dda2cd327ec651dZhihai Xu bta_av_start_ok(p_scb, NULL); 2011379743beded881127703334e1dda2cd327ec651dZhihai Xu } 2012379743beded881127703334e1dda2cd327ec651dZhihai Xu } 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2014e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("started %d role:x%x", p_scb->started, p_scb->role); 20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_stopped 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream stopped. 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_stopped (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SUSPEND suspend_rsp; 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 start = p_scb->started; 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN sus_evt = TRUE; 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2034e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_str_stopped:audio_open_cnt=%d, p_data %x", 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.audio_open_cnt, p_data); 20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, FALSE); 20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, L2CAP_DEFAULT_FLUSH_TO); 20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if q_info.a2d is not empty, drop it now */ 20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTA_AV_CHNL_AUDIO == p_scb->chnl) 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while((p_buf = (BT_HDR*)GKI_dequeue (&p_scb->q_info.a2d)) != NULL) 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the audio buffers queued in L2CAP */ 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data && p_data->api_stop.flush) 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.chnl = p_scb->chnl; 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.hndl = p_scb->hndl; 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && p_data->api_stop.suspend) 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2067e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("suspending: %d, sup:%d", start, p_scb->suspend_sup); 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((start) && (p_scb->suspend_sup)) 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sus_evt = FALSE; 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = 0; 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SuspendReq(&p_scb->avdt_handle, 1); 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* send SUSPEND_EVT event only if not in reconfiguring state and sus_evt is TRUE*/ 2076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((sus_evt)&&(p_scb->state != BTA_AV_RCFG_SST)) 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = TRUE; 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_SUSPEND_EVT, (tBTA_AV *) &suspend_rsp); 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = TRUE; 2087e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_str_stopped status %d", suspend_rsp.status); 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2089ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* send STOP_EVT event only if not in reconfiguring state */ 2090ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->state != BTA_AV_RCFG_SST) 2091ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2092ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*bta_av_cb.p_cback)(BTA_AV_STOP_EVT, (tBTA_AV *) &suspend_rsp); 2093ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_reconfig 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the reconfigure request. 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** save the parameter in control block and 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** suspend, reconfigure or close the stream 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_reconfig (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG *p_cfg; 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_STOP stop; 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_RCFG *p_rcfg = &p_data->api_reconfig; 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)", 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup, p_scb->suspend_sup, 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rcfg_idx, p_scb->sep_info_idx); 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg = 0; 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the new configuration in control block */ 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap = (tAVDT_CFG *) GKI_getbuf(sizeof(tAVDT_CFG)); 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_cfg = p_scb->p_cap) == NULL) 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_RESOURCES; 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this event is not possible in this state. 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it to bring the SSM back to open state */ 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_SDP_DISC_OK_EVT, NULL); 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*if(bta_av_cb.features & BTA_AV_FEAT_RCCT)*/ 21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg, &p_scb->cfg, sizeof(tAVDT_CFG)); 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->num_protect = p_rcfg->num_protect; 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg->codec_info, p_rcfg->codec_info, AVDT_CODEC_SIZE); 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg->protect_info, p_rcfg->p_protect_info, p_rcfg->num_protect); 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rcfg_idx = p_rcfg->sep_info_idx; 21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the requested index differs from the current one, we can only close/open */ 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->rcfg_idx == p_scb->sep_info_idx) && 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_rcfg->suspend)&& (p_scb->recfg_sup) && (p_scb->suspend_sup)) 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started) 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.flush = FALSE; 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.suspend = TRUE; 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, (tBTA_AV_DATA *)&stop); 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2161e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Reconfig"); 21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap); 21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close the stream */ 2169e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("close/open num_protect: %d", p_cfg->num_protect); 21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started) 21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_data_path 21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle stream data path. 21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_data_path (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 data_len; 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 timestamp; 21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_buf = FALSE; 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 m_pt = 0x60 | p_scb->codec_type; 2198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tAVDT_DATA_OPT_MASK opt; 21995cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->cong) 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 2204e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("q: %d", p_scb->l2c_bufs); 22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //Always get the current number of bufs que'd up 22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = (UINT8)L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_GET); 22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (BT_HDR *)GKI_dequeue (&p_scb->q_info.a2d); 22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_buf) 22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use q_info.a2d data, read the timestamp */ 22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project timestamp = *(UINT32 *)(p_buf + 1); 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_buf = TRUE; 22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* q_info.a2d empty, call co_data, dup data to other channels */ 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (BT_HDR *)p_scb->p_cos->data(p_scb->codec_type, &data_len, 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ×tamp); 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf) 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use the offset area for the time stamp */ 22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(UINT32 *)(p_buf + 1) = timestamp; 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* dup the data to other channels */ 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_dup_audio_buf(p_scb, p_buf); 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_buf) 22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->l2c_bufs < (BTA_AV_QUEUE_DATA_CHK_NUM)) 22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there's a buffer, just queue it to L2CAP */ 22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There's no need to increment it here, it is always read from L2CAP see above */ 22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p_scb->l2c_bufs++; */ 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 2240e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("qw: %d", p_scb->l2c_bufs); 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* opt is a bit mask, it could have several options set */ 2244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta opt = AVDT_DATA_OPT_NONE; 2245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->no_rtp_hdr) 2246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta opt |= AVDT_DATA_OPT_NO_RTP; 2248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2249ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta AVDT_WriteReqOpt(p_scb->avdt_handle, p_buf, timestamp, m_pt, opt); 22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; 22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there's a buffer, but L2CAP does not seem to be moving data */ 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(new_buf) 22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just got this buffer from co_data, 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * put it in queue */ 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue(&p_scb->q_info.a2d, p_buf); 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just dequeue it from the q_info.a2d */ 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->q_info.a2d.count < 3) 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* put it back to the queue */ 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue_head (&p_scb->q_info.a2d, p_buf); 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* too many buffers in q_info.a2d, drop it. */ 22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_drop(p_scb->hndl); 22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_start_ok 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream started. 22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_start_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_STOP stop; 22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN initiator = FALSE; 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN suspend = FALSE; 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 flush_to; 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 new_role = p_scb->role; 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR hdr; 2300ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 policy = HCI_ENABLE_SNIFF_MODE; 2301ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 cur_role; 23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2303e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role); 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = TRUE; 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_suspend) 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_suspend = FALSE; 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_role & BTA_AV_ROLE_START_INT) 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project initiator = TRUE; 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2314f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* for A2DP SINK we do not send get_caps */ 2315f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((p_scb->avdt_handle == p_scb->seps[p_scb->sep_idx].av_handle) 2316f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta &&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK)) 2317f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2318f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON); 2319e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Local SEP type is SNK new wait is 0x%x",p_scb->wait); 2320f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_FAILED) 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role switch has failed */ 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_FAILED; 23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (tBTA_AV_DATA *)&hdr; 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hdr.offset = BTA_AV_RS_FAIL; 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2328e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("wait:x%x", p_scb->wait); 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && (p_data->hdr.offset != BTA_AV_RS_NONE)) 23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->hdr.offset == BTA_AV_RS_FAIL) 23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT)) 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_START; 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The wait flag may be set here while we are already master on the link */ 23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this could happen if a role switch complete event occurred during reconfig */ 23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we are now master on the link, there is no need to wait for the role switch, */ 23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complete anymore so we can clear the wait for role switch flag */ 23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & (BTA_AV_WAIT_ROLE_SW_RES_OPEN|BTA_AV_WAIT_ROLE_SW_RES_START)) 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_STARTED; 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_START; 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait) 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2364afa6e1abbedaad8fe854b0f43999b8aeb801af91Matthew Xie APPL_TRACE_ERROR("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag); 2365ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh /* Clear first bit of p_scb->wait and not to return from this point else 2366ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh * HAL layer gets blocked. And if there is delay in Get Capability response as 2367ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh * first bit of p_scb->wait is cleared hence it ensures bt_av_start_ok is not called 2368ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh * again from bta_av_save_caps. 2369ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh */ 2370ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh p_scb->wait &= ~BTA_AV_WAIT_ACP_CAPS_ON; 23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell role manager to check M/S role */ 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->media_type == AVDT_MEDIA_AUDIO) 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in normal logic, conns should be bta_av_cb.audio_count - 1, 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, bta_av_stream_chg is not called to increase bta_av_cb.audio_count yet. 23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the code were to be re-arranged for some reasons, this number may need to be changed 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = bta_av_cb.audio_open_cnt; 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flush_to = p_bta_av_cfg->p_audio_flush_to[p_scb->co_started - 1]; 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flush_to = p_bta_av_cfg->video_flush_to; 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, flush_to ); 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the congestion flag */ 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_role & BTA_AV_ROLE_START_INT) 23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_role &= ~BTA_AV_ROLE_START_INT; 23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((new_role & BTA_AV_ROLE_AD_ACP) && (new_role & BTA_AV_ROLE_SUSPEND_OPT)) 24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend = TRUE; 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!suspend) 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_STREAM; 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, TRUE); 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If sink starts stream, disable sniff mode here */ 2413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!initiator) 2414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If souce is the master role, disable role switch during streaming. 2416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Otherwise allow role switch, if source is slave. 2417ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Because it would not hurt source, if the peer device wants source to be master */ 2418ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((BTM_GetRole (p_scb->peer_addr, &cur_role) == BTM_SUCCESS) && 2419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (cur_role == BTM_ROLE_MASTER) ) 2420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 2422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_sys_clear_policy(BTA_ID_AV, policy, p_scb->peer_addr); 2425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role = new_role; 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_AD_ACP; 24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND_OPT; 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->no_rtp_hdr = FALSE; 2432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->p_cos->start(p_scb->hndl, p_scb->codec_type, p_scb->cfg.codec_info, &p_scb->no_rtp_hdr); 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = TRUE; 24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_start_ok suspending: %d, role:x%x, init %d", 24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend, p_scb->role, initiator); 24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.suspending = suspend; 24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_SUCCESS; 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(suspend) 24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_SUSPEND; 24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; /* do not allow the media data to go through */ 24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do not duplicate the media packets to this channel */ 24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.flush = FALSE; 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.suspend = TRUE; 24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_STOP_EVT, (tBTA_AV_DATA *)&stop); 24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_start_failed 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream start failed. 24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_start_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24705cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 24715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started == FALSE && p_scb->co_started == FALSE) 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 2475379743beded881127703334e1dda2cd327ec651dZhihai Xu notify_start_failed(p_scb); 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_SNIFF_MODE|HCI_ENABLE_MASTER_SLAVE_SWITCH), p_scb->peer_addr); 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_suspend = FALSE; 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_closed 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream closed. 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_closed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV data; 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_EVT event; 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.audio_open_cnt <= 1) 25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* last connection - restore the allow switch flag */ 25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetDesireRole(L2CAP_ROLE_ALLOW_SWITCH); 25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->open_status) 25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* must be failure when opening the stream */ 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(data.open.bd_addr, p_scb->peer_addr); 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.status = p_scb->open_status; 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.chnl = p_scb->chnl; 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.hndl = p_scb->hndl; 2514f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2515f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 2516f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta data.open.sep = AVDT_TSEP_SNK; 2517f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 2518f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta data.open.sep = AVDT_TSEP_SRC; 2519f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AV_OPEN_EVT; 25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_SUCCESS; 25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup(p_scb, p_data); 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(event, &data); 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do stop if we were started */ 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->co_started) 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update common mtu shared by remaining connectons */ 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU); 25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->close(p_scb->hndl, p_scb->codec_type, mtu); 25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.close.chnl = p_scb->chnl; 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.close.hndl = p_scb->hndl; 25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AV_CLOSE_EVT; 25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup(p_scb, p_data); 25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(event, &data); 25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_clr_cong 25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Clear stream congestion flag. 25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_clr_cong (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25625cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 25635cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_suspend_cfm 25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the suspend response 25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_suspend_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SUSPEND suspend_rsp; 25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2583e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d", 25845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.audio_open_cnt, err_code); 25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25865ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu if (p_scb->started == FALSE) 25875ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu { 25885ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu /* handle the condition where there is a collision of SUSPEND req from either side 25895ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu ** Second SUSPEND req could be rejected. Do not treat this as a failure 25905ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu */ 2591e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_av_suspend_cfm: already suspended, ignore, err_code %d", 25925ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu err_code); 25935ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu return; 25945ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu } 25955ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu 25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 25975ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu if (err_code && (err_code != AVDT_ERR_BAD_STATE)) 25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable suspend feature only with explicit rejection(not with timeout) */ 2600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->suspend_sup = FALSE; 2603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_FAIL; 26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2606e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR ("bta_av_suspend_cfm: suspend failed, closing connection"); 26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SUSPEND failed. Close connection. */ 26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL); 26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only set started to FALSE when suspend is successful */ 26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->role & BTA_AV_ROLE_SUSPEND) 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND; 26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in case that we received suspend_ind, we may need to call co_stop here */ 26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, FALSE); 26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, L2CAP_DEFAULT_FLUSH_TO); 26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.chnl = p_scb->chnl; 26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.hndl = p_scb->hndl; 26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = p_data->str_msg.initiator; 26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_SUSPEND_EVT, (tBTA_AV *) &suspend_rsp); 26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_str_ok 26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description report reconfigure successful 26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_str_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 26605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle); 2663e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid); 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* rc listen */ 26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_st_rc_timer(p_scb, NULL); 26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&p_scb->p_cap); 26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No need to keep the role bits once reconfig is done. */ 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_AD_ACP; 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND_OPT; 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_START_INT; 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reconfigure success */ 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_SUCCESS; 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_failed 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process reconfigure failed 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2696e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x", 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg, bta_av_cb.conn_lcb); 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close(p_scb, p_data); 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_STREAM; 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* go to closing state */ 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL); 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open failed. try again */ 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.conn_lcb) 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_connect_req(p_scb, NULL); 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_connect 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description stream closed. reconnect the stream 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_connect (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 27365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 2739e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg); 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* let bta_av_rcfg_failed report fail */ 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_failed(p_scb, NULL); 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_discntd 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDT disconnected. reconnect the stream 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_discntd (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 27615cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2763e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg); 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_STREAM; 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report close event & go to init state */ 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, NULL); 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_suspend_cont 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description received the suspend response. 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** continue to reconfigure the stream 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_suspend_cont (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 2796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code) 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (AVDT_ERR_CONNECT == err_code) 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL; 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, NULL); 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2807e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("suspend rejected, try close"); 2808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable suspend feature only with explicit rejection(not with timeout) */ 2809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->suspend_sup = FALSE; 2812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2821e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_suspend_cont calling AVDT_ReconfigReq"); 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reconfig the stream */ 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap); 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_cfm 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description if reconfigure is successful, report the event 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, close the stream. 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 2844e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_cfm"); 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2846ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code) 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2848e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("reconfig rejected, try close"); 2849ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable reconfiguration feature only with explicit rejection(not with timeout) */ 2850ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->recfg_sup = FALSE; 2853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* started flag is FALSE when reconfigure command is sent */ 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2861ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* update the codec info after rcfg cfm */ 2862ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(p_scb->cfg.codec_info,p_data->str_msg.msg.reconfig_cfm.p_cfg->codec_info,AVDT_CODEC_SIZE); 28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* take the SSM back to OPEN state */ 28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_OPEN_OK_EVT, NULL); 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_open 28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDT is connected. open the stream with the new configuration 28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_open (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28795cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 28805cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 2881e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks); 28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_disc_snks == 0) 28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to update call-out module so that it will be ready for discover */ 28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send avdtp discover request */ 28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DiscoverReq(p_scb->peer_addr, p_scb->sep_info, BTA_AV_NUM_SEPS, bta_av_dt_cback[p_scb->hdi]); 28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = p_scb->p_cap->codec_info[BTA_AV_CODEC_TYPE_IDX]; 28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_scb->cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE); 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we may choose to use a different SEP at reconfig. 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * adjust the sep_idx now */ 2897f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC)); 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open the stream with the new config */ 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = p_scb->rcfg_idx; 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_OpenReq(p_scb->avdt_handle, p_scb->peer_addr, 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[p_scb->sep_info_idx].seid, p_scb->p_cap); 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_rej 29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security reject. 29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29185cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 29195cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_BAD_STATE, 29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 0); 29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_chk_2nd_start 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check if this is 2nd stream and if it needs to be started. 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function needs to be kept very similar to bta_av_chk_start 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_chk_2nd_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scbi; 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_started = FALSE; 29395cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->chnl == BTA_AV_CHNL_AUDIO) && (bta_av_cb.audio_open_cnt >= 2)) 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* more than one audio channel is connected */ 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->role & BTA_AV_ROLE_SUSPEND_OPT)) 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this channel does not need to be reconfigured. 29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * if there is other channel streaming, start the stream now */ 29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_AV_NUM_STRS; i++) 29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scbi = bta_av_cb.p_scb[i]; 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started) 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!new_started) 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start the new stream */ 29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_started = TRUE; 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* may need to update the flush timeout of this already started stream */ 29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scbi->co_started != bta_av_cb.audio_open_cnt) 29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scbi->co_started = bta_av_cb.audio_open_cnt; 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scbi->peer_addr, p_bta_av_cfg->p_audio_flush_to[p_scbi->co_started - 1] ); 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_rc 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a message to main SM to open RC channel. 29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_rc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2984e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role); 29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) && (p_scb->q_tag == BTA_AV_Q_TAG_START)) 29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* waiting for role switch for some reason & the timer expires */ 29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT)) 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2990e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR ("failed to start streaming for role management reasons!!"); 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = TRUE; 29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role switch is done. continue to start streaming */ 30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hdr.offset = BTA_AV_RS_OK; 30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok (p_scb, p_data); 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->use_rc == TRUE || (p_scb->role & BTA_AV_ROLE_AD_ACP) ) 30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.disc) 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* AVRC discover db is in use */ 30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) 30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* AVRC channel is not connected. delay a little bit */ 30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) == 0) 30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RC_DISC_TIME_VAL); 30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_CHECK_RC; 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use main SM for AVRC SDP activities */ 30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rc_disc((UINT8)(p_scb->hdi + 1)); 30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTA_AV_RC_HANDLE_NONE != p_scb->rc_handle) 30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the open API said that this handle does not want a RC connection. 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect it now */ 30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVRC_Close(p_scb->rc_handle); 30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_at_inc 30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called if API open is called by application 30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** while state-machine is at incoming state. 30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_at_inc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_OPEN *p_buf; 30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); 30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask |= BTA_AV_COLL_API_CALLED; 30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* API open will be handled at timeout if SNK did not start signalling. */ 30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* API open will be ignored if SNK starts signalling. */ 30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SNK did not start signalling, API was called N seconds timeout. */ 30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to switch to INIT state and start opening connection. */ 30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask = 0; 30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_scb_sst_init (p_scb); 30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tBTA_AV_API_OPEN *) GKI_getbuf(sizeof(tBTA_AV_API_OPEN))) != NULL) 30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, &(p_scb->open_api), sizeof(tBTA_AV_API_OPEN)); 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED */ 3080