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 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the array of callback functions to receive events from AVDT control channel */ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVDT_CTRL_CBACK * const bta_av_dt_cback[] = 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream0_cback 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream1_cback 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream2_cback 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream3_cback 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream4_cback 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream5_cback 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_save_addr 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description copy the bd_addr and maybe reset the supported flags 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("bta_av_save_addr r:%d, s:%d", 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup, p_scb->suspend_sup); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bdcmp(p_scb->peer_addr, b) != 0) 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("reset flags"); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a new addr, reset the supported flags */ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup = TRUE; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->suspend_sup = TRUE; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do this copy anyway, just in case the first addr matches 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the control block one by accident */ 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_scb->peer_addr, b); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 258379743beded881127703334e1dda2cd327ec651dZhihai Xu** Function notify_start_failed 259379743beded881127703334e1dda2cd327ec651dZhihai Xu** 260379743beded881127703334e1dda2cd327ec651dZhihai Xu** Description notify up-layer AV start failed 261379743beded881127703334e1dda2cd327ec651dZhihai Xu** 262379743beded881127703334e1dda2cd327ec651dZhihai Xu** 263379743beded881127703334e1dda2cd327ec651dZhihai Xu** Returns void 264379743beded881127703334e1dda2cd327ec651dZhihai Xu** 265379743beded881127703334e1dda2cd327ec651dZhihai Xu*******************************************************************************/ 266379743beded881127703334e1dda2cd327ec651dZhihai Xustatic void notify_start_failed(tBTA_AV_SCB *p_scb) 267379743beded881127703334e1dda2cd327ec651dZhihai Xu{ 268379743beded881127703334e1dda2cd327ec651dZhihai Xu tBTA_AV_START start; 269379743beded881127703334e1dda2cd327ec651dZhihai Xu /* if start failed, clear role */ 270379743beded881127703334e1dda2cd327ec651dZhihai Xu p_scb->role &= ~BTA_AV_ROLE_START_INT; 271379743beded881127703334e1dda2cd327ec651dZhihai Xu start.chnl = p_scb->chnl; 272379743beded881127703334e1dda2cd327ec651dZhihai Xu start.status = BTA_AV_FAIL; 273379743beded881127703334e1dda2cd327ec651dZhihai Xu start.initiator = TRUE; 274379743beded881127703334e1dda2cd327ec651dZhihai Xu start.hndl = p_scb->hndl; 275379743beded881127703334e1dda2cd327ec651dZhihai Xu (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 276379743beded881127703334e1dda2cd327ec651dZhihai Xu} 277379743beded881127703334e1dda2cd327ec651dZhihai Xu 278379743beded881127703334e1dda2cd327ec651dZhihai Xu/******************************************************************************* 279379743beded881127703334e1dda2cd327ec651dZhihai Xu** 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_st_rc_timer 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description start the AVRC timer if no RC connection & CT is supported & 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RC is used or 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as ACP (we do not really know if we want AVRC) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_st_rc_timer(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("bta_av_st_rc_timer rc_handle:%d, use_rc: %d", 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rc_handle, p_scb->use_rc); 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for outgoing RC connection as INT/CT */ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) && 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*(bta_av_cb.features & BTA_AV_FEAT_RCCT) &&*/ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->use_rc == TRUE || (p_scb->role & BTA_AV_ROLE_AD_ACP)) ) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) == 0) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RC_DISC_TIME_VAL); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_CHECK_RC; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_next_getcap 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function gets the capabilities of the next available 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stream found in the discovery results. 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if we sent request to AVDT, FALSE otherwise. 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_next_getcap(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_GETCAP_REQ *p_req; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN sent_cmd = FALSE; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = p_scb->sep_info_idx; i < p_scb->num_seps; i++) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam not in use, is a sink, and is the right media type (audio/video) */ 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].in_use == FALSE) && 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = i; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we got a stream; get its capabilities */ 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap = (tAVDT_CFG *) GKI_getbuf(sizeof(tAVDT_CFG)); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = p_scb->num_seps; 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->avdt_version >= AVDT_VERSION_SYNC) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_req = AVDT_GetAllCapReq; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_req = AVDT_GetCapReq; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_req)(p_scb->peer_addr, 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].seid, 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap, bta_av_dt_cback[p_scb->hdi]); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sent_cmd = TRUE; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no streams available then stream open fails */ 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!sent_cmd) 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_GETCAP_FAIL_EVT, p_data); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return sent_cmd; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_proc_stream_evt 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Utility function to compose stream events. 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_proc_stream_evt(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data, int index) 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_STR_MSG *p_msg; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_len = 0; 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scb = bta_av_cb.p_scb[index]; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == AVDT_SECURITY_IND_EVT) 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_len = (p_data->security_ind.len < BTA_AV_SECURITY_MAX_LEN) ? 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->security_ind.len : BTA_AV_SECURITY_MAX_LEN; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == AVDT_SECURITY_CFM_EVT && p_data->hdr.err_code == 0) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_len = (p_data->security_cfm.len < BTA_AV_SECURITY_MAX_LEN) ? 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->security_cfm.len : BTA_AV_SECURITY_MAX_LEN; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb && (p_msg = (tBTA_AV_STR_MSG *) GKI_getbuf((UINT16) (sizeof(tBTA_AV_STR_MSG) + sec_len))) != NULL) 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy event data, bd addr, and handle to event message buffer */ 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.offset = 0; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_addr != NULL) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_msg->bd_addr, bd_addr); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG6(" bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[2], bd_addr[3], 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[4], bd_addr[5]); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data != NULL) 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_msg->msg, p_data, sizeof (tAVDT_CTRL)); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy config params to event message buffer */ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case AVDT_RECONFIG_CFM_EVT: 420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta APPL_TRACE_DEBUG4("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x", 421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh 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], 422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh 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], 423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh 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], 424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->msg.reconfig_cfm.p_cfg->codec_info[9]); 425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_CONFIG_IND_EVT: 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We might have 2 SEP signallings(A2DP + VDP) with one peer device on one L2CAP. 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we already have a signalling connection with the bd_addr and the streaming 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SST is at INIT state, change it to INCOMING state to handle the signalling 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * from the 2nd SEP. */ 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_find_lcb(bd_addr, BTA_AV_LCB_FIND) != NULL) && (bta_av_is_scb_init(p_scb))) 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_scb_sst_incoming (p_scb); 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When ACP_CONNECT_EVT was received, we put first available scb to incoming state. 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Later when we receive AVDT_CONFIG_IND_EVT, we use a new p_scb and set its state to 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * incoming which we do it above. 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We also have to set the old p_scb state to init to be used later */ 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTA_AV_NUM_STRS; xx++) 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.p_scb[xx]) && (xx != index)) 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.p_scb[xx]->state == BTA_AV_INCOMING_SST) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.p_scb[xx]->state = BTA_AV_INIT_SST; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.p_scb[xx]->coll_mask = 0; 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_msg->cfg, p_data->config_ind.p_cfg, sizeof(tAVDT_CFG)); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SECURITY_IND_EVT: 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.security_ind.p_data = (UINT8 *) (p_msg + 1); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_msg->msg.security_ind.p_data, p_data->security_ind.p_data, sec_len); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SECURITY_CFM_EVT: 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.security_cfm.p_data = (UINT8 *) (p_msg + 1); 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->hdr.err_code == 0) 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_msg->msg.security_cfm.p_data, p_data->security_cfm.p_data, sec_len); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SUSPEND_IND_EVT: 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.hdr.err_code = 0; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.hdr.err_code = 0; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up application event */ 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_data == NULL) || (p_data->hdr.err_code == 0)) 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = bta_av_stream_evt_ok[event]; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = bta_av_stream_evt_fail[event]; 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->initiator = FALSE; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == AVDT_SUSPEND_CFM_EVT) 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->initiator = TRUE; 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta APPL_TRACE_VERBOSE1("hndl:x%x", p_scb->hndl); 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.layer_specific = p_scb->hndl; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->handle = handle; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->avdt_event = event; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_msg); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* coverity[var_deref_model] */ 504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* false-positive: bta_av_conn_cback only processes AVDT_CONNECT_IND_EVT and AVDT_DISCONNECT_IND_EVT event 505ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * these 2 events always have associated p_data */ 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_cback(handle, bd_addr, event, p_data); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream0_cback 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta APPL_TRACE_VERBOSE2("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event); 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 0); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream1_cback 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT2("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 1); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream2_cback 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT2("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 2); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream3_cback 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT2("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 3); 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream4_cback 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT2("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event); 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 4); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream5_cback 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT2("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event); 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 5); 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_a2d_sdp_cback 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description A2DP service discovery callback. 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_a2d_sdp_cback(BOOLEAN found, tA2D_Service *p_service) 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SDP_RES *p_msg; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scb; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_msg = (tBTA_AV_SDP_RES *) GKI_getbuf(sizeof(tBTA_AV_SDP_RES))) != NULL) 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = (found) ? BTA_AV_SDP_DISC_OK_EVT : BTA_AV_SDP_DISC_FAIL_EVT; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = bta_av_hndl_to_scb(bta_av_cb.handle); 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (found && (p_service != NULL)) 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = p_service->avdt_version; 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = 0x00; 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.layer_specific = bta_av_cb.handle; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_msg); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1 ("bta_av_a2d_sdp_cback, no scb found for handle(0x%x)", bta_av_cb.handle); 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_adjust_seps_idx 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description adjust the sep_idx 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb) 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type); 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(xx=0; xx<BTA_AV_MAX_SEPS; xx++) 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("av_handle: %d codec_type: %d", 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->seps[xx].av_handle, p_scb->seps[xx].codec_type); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->seps[xx].av_handle && p_scb->codec_type == p_scb->seps[xx].codec_type) 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_idx = xx; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_handle = p_scb->seps[xx].av_handle; 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_switch_role 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switch role was not started and a timer was started. 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** another attempt to switch role now - still opening. 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_switch_role (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RS_RES switch_res = BTA_AV_RS_NONE; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_OPEN *p_buf = &p_scb->q_info.open; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_switch_role wait:x%x", p_scb->wait); 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START) 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RETRY; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the masks set when the timer is started */ 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~(BTA_AV_WAIT_ROLE_SW_RES_OPEN|BTA_AV_WAIT_ROLE_SW_RES_START); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_switch_if_needed(p_scb) || !bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this should not happen in theory. Just in case... 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * continue to do_disc_a2d */ 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch_res = BTA_AV_RS_DONE; 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure on OPEN */ 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch_res = BTA_AV_RS_FAIL; 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (switch_res != BTA_AV_RS_NONE) 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.rs_idx == (p_scb->hdi + 1)) 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_RETRY; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = 0; 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->switch_res = switch_res; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d(p_scb, (tBTA_AV_DATA *)p_buf); 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_role_res 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the role changed event 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_role_res (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN initiator = FALSE; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_OPEN av_open; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role & BTA_AV_ROLE_START_INT) 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project initiator = TRUE; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->q_tag == BTA_AV_Q_TAG_START) 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_STARTED) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->role_res.hci_status != HCI_SUCCESS) 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 75177d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy p_scb->role &= ~BTA_AV_ROLE_START_INT; 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start failed because of role switch. */ 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok(p_scb, p_data); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START) 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_FAILED; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_OPEN) 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_START_INT; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->role_res.hci_status != HCI_SUCCESS) 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Open failed because of role switch. */ 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(av_open.bd_addr, p_scb->peer_addr); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_open.chnl = p_scb->chnl; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_open.hndl = p_scb->hndl; 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *)&av_open); 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Continue av open process */ 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_info.open.switch_res = BTA_AV_RS_DONE; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d (p_scb, (tBTA_AV_DATA *)&(p_scb->q_info.open)); 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING2 ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("wait:x%x, role:x%x", p_scb->wait, p_scb->role); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_delay_co 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Call the delay call-out function to report the delay report 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from SNK 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_delay_co (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->delay(p_scb->hndl, p_data->str_msg.msg.delay_rpt_cmd.delay); 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_disc_a2d 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Do service discovery for A2DP. 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_disc_a2d (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ok_continue = FALSE; 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SDP_DB_PARAMS db_params; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_PROTOCOL_DESC_LIST, 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_BT_PROFILE_DESC_LIST}; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d", 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_open.use_rc, p_data->api_open.switch_res, bta_av_cb.audio_open_cnt); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_data->api_open.switch_res) 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_NONE: 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_switch_if_needed(p_scb) || !bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* waiting for role switch result. save the api to control block */ 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_scb->q_info.open, &p_data->api_open, sizeof(tBTA_AV_API_OPEN)); 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_OPEN; 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_FAIL: 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report a new failure event */ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_ROLE; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_SDP_DISC_FAIL_EVT, NULL); 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_OK: 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (tBTA_AV_DATA *)&p_scb->q_info.open; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* continue to open if link role is ok */ 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_DONE: 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag); 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!ok_continue) 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the role switch bits */ 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_CHECK_RC) 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_CHECK_RC; 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RC_DISC_TIME_VAL); 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_MASTER) 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH); 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.audio_open_cnt == 1) 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there's already an A2DP connection. do not allow switch */ 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH); 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store peer addr other parameters */ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_addr(p_scb, p_data->api_open.bd_addr); 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sec_mask = p_data->api_open.sec_mask; 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = p_data->api_open.use_rc; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_app_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate discovery database */ 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_disc_db == NULL) 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(BTA_AV_DISC_BUF_SIZE); 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only one A2D find service is active at a time */ 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.handle = p_scb->hndl; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->p_disc_db) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up parameters */ 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.db_len = BTA_AV_DISC_BUF_SIZE; 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.num_attr = 3; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.p_db = p_scb->p_disc_db; 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_params.p_attrs = attr_list; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(A2D_FindService(UUID_SERVCLASS_AUDIO_SINK, p_scb->peer_addr, &db_params, 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_a2d_sdp_cback) == A2D_SUCCESS) 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* when the code reaches here, either the DB is NULL 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * or A2D_FindService is not successful */ 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_a2d_sdp_cback(FALSE, NULL); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_cleanup 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description cleanup AV stream control block. 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_cleanup(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CONN_CHG msg; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 role = BTA_AV_ROLE_AD_INT; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_av_cleanup"); 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free any buffers */ 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_cap); 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = 0; 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize some control block variables */ 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_SUCCESS; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if de-registering shut everything down */ 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.hdr.layer_specific = p_scb->hndl; 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role = role; 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = 0; 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait = 0; 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = 0; 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->deregistring) 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove stream */ 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(xx=0; xx<BTA_AV_MAX_SEPS; xx++) 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->seps[xx].av_handle) 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_RemoveStream(p_scb->seps[xx].av_handle); 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->seps[xx].av_handle = 0; 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_dereg_comp((tBTA_AV_DATA *) &msg); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report stream closed to main SM */ 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.is_up = FALSE; 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(msg.peer_addr, p_scb->peer_addr); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_chg((tBTA_AV_DATA *) &msg); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_free_sdb 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free service discovery db buffer. 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_free_sdb(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_config_ind 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle a stream configuration indication from the peer. 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_config_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CI_SETCONFIG setconfig; 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG *p_evt_cfg = &p_data->str_msg.cfg; 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 psc_mask = (p_evt_cfg->psc_mask | p_scb->cfg.psc_mask); 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_label = p_data->str_msg.msg.hdr.label; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_scb->cfg.codec_info, p_evt_cfg->codec_info, AVDT_CODEC_SIZE); 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = p_evt_cfg->codec_info[BTA_AV_CODEC_TYPE_IDX]; 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_addr(p_scb, p_data->str_msg.bd_addr); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear collision mask */ 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask = 0; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.acp_sig_tmr); 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no codec parameters in configuration, fail */ 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_evt_cfg->num_codec == 0) || 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* or the peer requests for a service we do not support */ 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((psc_mask != p_scb->cfg.psc_mask) && 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (psc_mask != (p_scb->cfg.psc_mask&~AVDT_PSC_DELAY_RPT))) ) 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setconfig.hndl = p_scb->hndl; /* we may not need this */ 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setconfig.err_code = AVDT_ERR_UNSUP_CFG; 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_CI_SETCONFIG_FAIL_EVT, (tBTA_AV_DATA *) &setconfig); 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info = &p_scb->sep_info[0]; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->in_use = 0; 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->media_type = p_scb->media_type; 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->seid = p_data->str_msg.msg.config_ind.int_seid; 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->tsep = AVDT_TSEP_SNK; 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_AD_ACP; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = p_evt_cfg->psc_mask; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_RCTG) 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = TRUE; 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = FALSE; 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = 1; 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("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); 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type, 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->codec_info, 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->seid, 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_addr, 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->num_protect, 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->protect_info); 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disconnect_req 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disconnect AVDTP connection. 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disconnect_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RCB *p_rcb; 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_disconnect_req conn_lcb: 0x%x", bta_av_cb.conn_lcb); 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.sig_tmr); 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.conn_lcb) 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = bta_av_get_rcb_by_shdl((UINT8)(p_scb->hdi + 1)); 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb) 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_del_rc(p_rcb); 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AVDT_DISCONNECT_EVT, NULL); 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_req 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security request. 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityReq(p_scb->avdt_handle, p_data->api_protect_req.p_data, 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_protect_req.len); 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_rsp 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security response. 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->api_protect_rsp.error_code, 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_protect_rsp.p_data, p_data->api_protect_rsp.len); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_NSC, 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 0); 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_setconfig_rsp 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description setconfig is OK 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_setconfig_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num = p_data->ci_setconfig.num_seid + 1; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_seid = p_data->ci_setconfig.p_seid; 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we like this codec_type. find the sep_idx */ 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_adjust_seps_idx(p_scb); 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask); 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->ci_setconfig.err_code, 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->ci_setconfig.category); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.sig_tmr); 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->ci_setconfig.err_code == AVDT_SUCCESS) 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait = BTA_AV_WAIT_ACP_CAPS_ON; 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->ci_setconfig.recfg_needed) 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_SUSPEND_OPT; 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR3("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d", 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->ci_setconfig.recfg_needed, p_scb->role, num); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* callout module tells BTA the number of "good" SEPs and their SEIDs. 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * getcap on these SEID */ 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = num; 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->cur_psc_mask & AVDT_PSC_DELAY_RPT) 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = AVDT_VERSION_SYNC; 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1) 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind. 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * call disc_res now */ 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->disc_res(p_scb->hndl, num, num, p_scb->peer_addr); 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we do not know the peer device and it is using non-SBC codec 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * we need to know all the SEPs on SNK */ 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_discover_req(p_scb, NULL); 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 1; i < num; i++) 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("sep_info[%d] SEID: %d", i, p_seid[i-1]); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize the sep_info[] to get capabilities */ 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].in_use = FALSE; 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].tsep = AVDT_TSEP_SNK; 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].media_type = p_scb->media_type; 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].seid = p_seid[i-1]; 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_opened 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream opened OK (incoming/outgoing). 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_opened (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CONN_CHG msg; 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_OPEN open; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.hdr.layer_specific = p_scb->hndl; 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.is_up = TRUE; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(msg.peer_addr, p_scb->peer_addr); 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle); 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_chg((tBTA_AV_DATA *) &msg); 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the congestion flag, so AV would not send media packets by accident */ 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->stream_mtu = p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE; 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu); 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d", 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid, p_scb->stream_mtu, mtu); 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(mtu == 0 || mtu > p_scb->stream_mtu) 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = p_scb->stream_mtu; 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the media channel as medium priority */ 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetTxPriority(p_scb->l2c_cid, L2CAP_CHNL_PRIORITY_MEDIUM); 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetChnlFlushability (p_scb->l2c_cid, TRUE); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_scb->q_info, 0, sizeof(tBTA_AV_Q_INFO)); 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = 0; 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->open(p_scb->hndl, 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type, p_scb->cfg.codec_info, mtu); 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO check if other audio channel is open. 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If yes, check if reconfig is needed 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Rigt now we do not do this kind of checking. 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BTA-AV is INT for 2nd audio connection. 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The application needs to make sure the current codec_info is proper. 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If one audio connection is open and another SNK attempts to connect to AV, 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection will be rejected. 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if other audio channel is started. If yes, start */ 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(open.bd_addr, p_scb->peer_addr); 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.chnl = p_scb->chnl; 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.hndl = p_scb->hndl; 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.status = BTA_AV_SUCCESS; 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.starting = bta_av_chk_start(p_scb); 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr = 0; 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( NULL != (p = BTM_ReadRemoteFeatures(p_scb->peer_addr))) 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HCI_EDR_ACL_2MPS_SUPPORTED(p)) 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr |= BTA_AV_EDR_2MBPS; 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HCI_EDR_ACL_3MPS_SUPPORTED(p)) 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr |= BTA_AV_EDR_3MBPS; 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ar_avdt_conn(BTA_ID_AV, open.bd_addr); 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open); 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(open.starting) 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_ind 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle an AVDTP security indication. 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_PROTECT_REQ protect_req; 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_label = p_data->str_msg.msg.hdr.label; 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.chnl = p_scb->chnl; 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.hndl = p_scb->hndl; 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("sec ind handle: x%x", protect_req.hndl); 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.p_data = p_data->str_msg.msg.security_ind.p_data; 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.len = p_data->str_msg.msg.security_ind.len; 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_PROTECT_REQ_EVT, (tBTA_AV *) &protect_req); 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* app doesn't support security indication; respond with failure */ 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_NSC, NULL, 0); 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_cfm 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle an AVDTP security confirm. 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_PROTECT_RSP protect_rsp; 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.chnl = p_scb->chnl; 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.hndl = p_scb->hndl; 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.p_data = p_data->str_msg.msg.security_cfm.p_data; 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.len = p_data->str_msg.msg.security_cfm.len; 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.err_code= p_data->str_msg.msg.hdr.err_code; 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_PROTECT_RSP_EVT, (tBTA_AV *) &protect_rsp); 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_close 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Close stream. 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_close (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop stream if started */ 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->co_started) 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_av_cb.sig_tmr); 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close stream */ 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just in case that the link is congested, link is flow controled by peer or 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * for whatever reason the the close request can not be sent in time. 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * when this timer expires, AVDT_DisconnectReq will be called to disconnect the link 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT16)BTA_AV_API_CLOSE_EVT, 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CLOSE_REQ_TIME_VAL); 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_connect_req 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connect AVDTP connection. 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_connect_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SNK initiated L2C connection while SRC was doing SDP. */ 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Wait until timeout to check if SNK starts signalling. */ 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask); 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_sdp_failed 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Service discovery failed. 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_sdp_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->open_status) 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_SDP; 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_disc_db); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed(p_scb, p_data); 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disc_results 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP discover results. Search through the 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** results and find the first available stream, and get 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its capabilities. 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disc_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_snks = 0, i; 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store number of stream endpoints returned */ 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps; 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_scb->num_seps; i++) 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam not in use, is a sink, and is audio */ 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].in_use == FALSE) && 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_snks++; 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, p_scb->peer_addr); 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = num_snks; 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we got any */ 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_seps > 0) 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize index into discovery results */ 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the capabilities of the first available stream */ 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we got discover response but with no streams; we're done */ 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, p_data); 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disc_res_as_acp 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP discover results. Search through the 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** results and find the first available stream, and get 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its capabilities. 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disc_res_as_acp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_snks = 0, i; 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store number of stream endpoints returned */ 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps; 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_scb->num_seps; i++) 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam is a sink, and is audio */ 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].in_use = FALSE; 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_snks++; 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, p_scb->peer_addr); 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = num_snks; 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we got any */ 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_seps > 0) 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize index into discovery results */ 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the capabilities of the first available stream */ 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we got discover response but with no streams; we're done */ 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, p_data); 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_save_caps 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description report the SNK SEP capabilities to application 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_save_caps(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG cfg; 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx]; 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_wait = p_scb->wait; 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN getcap_done = FALSE; 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x", 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps, p_scb->sep_info_idx, p_scb->wait); 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cfg, p_scb->p_cap, sizeof(tAVDT_CFG)); 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* let application know the capability of the SNK */ 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->getcfg(p_scb->hndl, cfg.codec_info[BTA_AV_CODEC_TYPE_IDX], 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.codec_info, &p_scb->sep_info_idx, p_info->seid, 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cfg.num_protect, cfg.protect_info); 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx++; 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_seps > p_scb->sep_info_idx) 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some devices have seps at the end of the discover list, which is not */ 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* matching media type(video not audio). */ 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In this case, we are done with getcap without sending another */ 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request to AVDT. */ 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_next_getcap(p_scb, p_data)) 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap_done = TRUE; 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap_done = TRUE; 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (getcap_done) 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are done getting capabilities. restore the p_cb->sep_info_idx */ 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON|BTA_AV_WAIT_ACP_CAPS_STARTED); 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_wait & BTA_AV_WAIT_ACP_CAPS_STARTED) 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok (p_scb, NULL); 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_set_use_rc 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description set to use AVRC for this stream control block. 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_set_use_rc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = TRUE; 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_cco_close 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description call close call-out function. 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_cco_close (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU); 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->close(p_scb->hndl, p_scb->codec_type, mtu); 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_failed 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Failed to open an AVDT stream 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_av_opened = FALSE; 1606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_AV_SCB * p_opened_scb = NULL; 1607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 idx; 1608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_AV_OPEN open; 1609ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta APPL_TRACE_DEBUG0("bta_av_open_failed"); 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_STREAM; 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close(p_scb, p_data); 1613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* check whether there is already an opened audio or video connection with the same device */ 1615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (idx = 0; (idx < BTA_AV_NUM_STRS) && (is_av_opened == FALSE); idx++ ) 1616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_opened_scb = bta_av_cb.p_scb[idx]; 1618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_opened_scb && (p_opened_scb->state == BTA_AV_OPEN_SST) && (!bdcmp(p_opened_scb->peer_addr,p_scb->peer_addr )) ) 1619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_av_opened = TRUE; 1620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1622ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if there is already an active AV connnection with the same bd_addr, 1624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta don't send disconnect req, just report the open event with BTA_AV_FAIL_GET_CAP status */ 1625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_av_opened == TRUE) 1626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdcpy(open.bd_addr, p_scb->peer_addr); 1628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.chnl = p_scb->chnl; 1629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.hndl = p_scb->hndl; 1630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.status = BTA_AV_FAIL_GET_CAP; 1631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.starting = bta_av_chk_start(p_scb); 1632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.edr = 0; 1633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* set the state back to initial state */ 1634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_av_set_scb_sst_init(p_scb); 1635ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1636ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open); 1637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1638ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 1642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1645ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_getcap_results 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP get capabilities results. Check the codec 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type and see if it matches ours. If it does not, get the 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capabilities of the next stream, if any. 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_getcap_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG cfg; 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 media_type; 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx]; 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cfg, &p_scb->cfg, sizeof(tAVDT_CFG)); 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.num_codec = 1; 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.num_protect = p_scb->p_cap->num_protect; 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE); 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cfg.protect_info, p_scb->p_cap->protect_info, AVDT_PROTECT_SIZE); 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_type = p_scb->p_cap->codec_info[BTA_AV_MEDIA_TYPE_IDX] >> 4; 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("num_codec %d", p_scb->p_cap->num_codec); 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("media type x%x, x%x", media_type, p_scb->media_type); 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask); 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if codec present and we get a codec configuration */ 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->p_cap->num_codec != 0) && 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (media_type == p_scb->media_type) && 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->p_cos->getcfg(p_scb->hndl, p_scb->p_cap->codec_info[BTA_AV_CODEC_TYPE_IDX], 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.codec_info, &p_scb->sep_info_idx, p_info->seid, 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cfg.num_protect, cfg.protect_info) == 0)) 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mux_mask &= p_scb->p_cap->mux_mask; 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("mux_mask used x%x", cfg.mux_mask); 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save copy of codec type and configuration */ 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = cfg.codec_info[BTA_AV_CODEC_TYPE_IDX]; 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_scb->cfg, &cfg, sizeof(tAVDT_CFG)); 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_adjust_seps_idx(p_scb); 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use only the services peer supports */ 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.psc_mask &= p_scb->p_cap->psc_mask; 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = cfg.psc_mask; 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open the stream */ 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_OpenReq(p_scb->seps[p_scb->sep_idx].av_handle, p_scb->peer_addr, 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[p_scb->sep_info_idx].seid, &cfg); 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_is_rcfg_sst(p_scb)) 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free capabilities buffer */ 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **) &p_scb->p_cap); 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try the next stream, if any */ 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx++; 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_setconfig_rej 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send AVDTP set config reject. 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_setconfig_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_REJECT reject; 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_av_setconfig_rej"); 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConfigRsp(p_data->str_msg.handle, p_data->str_msg.msg.hdr.label, AVDT_ERR_BAD_STATE, 0); 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(reject.bd_addr, p_data->str_msg.bd_addr); 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reject.hndl = p_scb->hndl; 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_REJECT_EVT, (tBTA_AV *) &reject); 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_discover_req 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP discover request to the peer. 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_discover_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send avdtp discover request */ 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17475738f83aeb59361a0a2eda2460113f6dc919427The 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]); 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_conn_failed 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDTP connection failed. 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_conn_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_STREAM; 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed(p_scb, p_data); 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_start 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start stream. 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cur_role; 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started); 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.sco_occupied) 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_failed(p_scb, p_data); 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disallow role switch during streaming, only if we are the master role 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * i.e. allow role switch, if we are slave. 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * It would not hurt us, if the peer device wants us to be master */ 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_GetRole (p_scb->peer_addr, &cur_role) == BTM_SUCCESS) && 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (cur_role == BTM_ROLE_MASTER) ) 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_clear_policy(BTA_ID_AV, policy, p_scb->peer_addr); 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->started == FALSE) && ((p_scb->role & BTA_AV_ROLE_START_INT) == 0)) 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_START_INT; 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_StartReq(&p_scb->avdt_handle, 1); 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 180477d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy else if (p_scb->started) 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 180677d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy p_scb->role |= BTA_AV_ROLE_START_INT; 1807379743beded881127703334e1dda2cd327ec651dZhihai Xu if ( p_scb->wait == 0 ) { 1808379743beded881127703334e1dda2cd327ec651dZhihai Xu if (p_scb->role & BTA_AV_ROLE_SUSPEND) { 1809379743beded881127703334e1dda2cd327ec651dZhihai Xu notify_start_failed(p_scb); 1810379743beded881127703334e1dda2cd327ec651dZhihai Xu } else { 1811379743beded881127703334e1dda2cd327ec651dZhihai Xu bta_av_start_ok(p_scb, NULL); 1812379743beded881127703334e1dda2cd327ec651dZhihai Xu } 1813379743beded881127703334e1dda2cd327ec651dZhihai Xu } 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("started %d role:x%x", p_scb->started, p_scb->role); 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_stopped 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream stopped. 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_stopped (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SUSPEND suspend_rsp; 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 start = p_scb->started; 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN sus_evt = TRUE; 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR2("bta_av_str_stopped:audio_open_cnt=%d, p_data %x", 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.audio_open_cnt, p_data); 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, FALSE); 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, L2CAP_DEFAULT_FLUSH_TO); 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if q_info.a2d is not empty, drop it now */ 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTA_AV_CHNL_AUDIO == p_scb->chnl) 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while((p_buf = (BT_HDR*)GKI_dequeue (&p_scb->q_info.a2d)) != NULL) 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the audio buffers queued in L2CAP */ 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data && p_data->api_stop.flush) 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.chnl = p_scb->chnl; 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.hndl = p_scb->hndl; 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && p_data->api_stop.suspend) 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("suspending: %d, sup:%d", start, p_scb->suspend_sup); 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((start) && (p_scb->suspend_sup)) 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sus_evt = FALSE; 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = 0; 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SuspendReq(&p_scb->avdt_handle, 1); 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1876ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* send SUSPEND_EVT event only if not in reconfiguring state and sus_evt is TRUE*/ 1877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((sus_evt)&&(p_scb->state != BTA_AV_RCFG_SST)) 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = TRUE; 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_SUSPEND_EVT, (tBTA_AV *) &suspend_rsp); 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = TRUE; 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("bta_av_str_stopped status %d", suspend_rsp.status); 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1890ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* send STOP_EVT event only if not in reconfiguring state */ 1891ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->state != BTA_AV_RCFG_SST) 1892ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1893ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*bta_av_cb.p_cback)(BTA_AV_STOP_EVT, (tBTA_AV *) &suspend_rsp); 1894ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_reconfig 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the reconfigure request. 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** save the parameter in control block and 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** suspend, reconfigure or close the stream 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_reconfig (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG *p_cfg; 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_STOP stop; 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_RCFG *p_rcfg = &p_data->api_reconfig; 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG4("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)", 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup, p_scb->suspend_sup, 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rcfg_idx, p_scb->sep_info_idx); 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg = 0; 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the new configuration in control block */ 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap = (tAVDT_CFG *) GKI_getbuf(sizeof(tAVDT_CFG)); 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_cfg = p_scb->p_cap) == NULL) 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_RESOURCES; 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this event is not possible in this state. 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it to bring the SSM back to open state */ 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_SDP_DISC_OK_EVT, NULL); 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*if(bta_av_cb.features & BTA_AV_FEAT_RCCT)*/ 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg, &p_scb->cfg, sizeof(tAVDT_CFG)); 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->num_protect = p_rcfg->num_protect; 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg->codec_info, p_rcfg->codec_info, AVDT_CODEC_SIZE); 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg->protect_info, p_rcfg->p_protect_info, p_rcfg->num_protect); 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rcfg_idx = p_rcfg->sep_info_idx; 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the requested index differs from the current one, we can only close/open */ 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->rcfg_idx == p_scb->sep_info_idx) && 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_rcfg->suspend)&& (p_scb->recfg_sup) && (p_scb->suspend_sup)) 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started) 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.flush = FALSE; 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.suspend = TRUE; 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, (tBTA_AV_DATA *)&stop); 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("Reconfig"); 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap); 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close the stream */ 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("close/open num_protect: %d", p_cfg->num_protect); 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started) 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_data_path 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle stream data path. 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_data_path (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 data_len; 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 timestamp; 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_buf = FALSE; 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 m_pt = 0x60 | p_scb->codec_type; 1999ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tAVDT_DATA_OPT_MASK opt; 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->cong) 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("q: %d", p_scb->l2c_bufs); 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //Always get the current number of bufs que'd up 20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = (UINT8)L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_GET); 20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (BT_HDR *)GKI_dequeue (&p_scb->q_info.a2d); 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_buf) 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use q_info.a2d data, read the timestamp */ 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project timestamp = *(UINT32 *)(p_buf + 1); 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_buf = TRUE; 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* q_info.a2d empty, call co_data, dup data to other channels */ 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (BT_HDR *)p_scb->p_cos->data(p_scb->codec_type, &data_len, 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ×tamp); 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf) 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use the offset area for the time stamp */ 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(UINT32 *)(p_buf + 1) = timestamp; 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* dup the data to other channels */ 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_dup_audio_buf(p_scb, p_buf); 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_buf) 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->l2c_bufs < (BTA_AV_QUEUE_DATA_CHK_NUM)) 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there's a buffer, just queue it to L2CAP */ 20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There's no need to increment it here, it is always read from L2CAP see above */ 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p_scb->l2c_bufs++; */ 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("qw: %d", p_scb->l2c_bufs); 20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* opt is a bit mask, it could have several options set */ 2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta opt = AVDT_DATA_OPT_NONE; 2045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->no_rtp_hdr) 2046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta opt |= AVDT_DATA_OPT_NO_RTP; 2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta AVDT_WriteReqOpt(p_scb->avdt_handle, p_buf, timestamp, m_pt, opt); 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; 20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there's a buffer, but L2CAP does not seem to be moving data */ 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(new_buf) 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just got this buffer from co_data, 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * put it in queue */ 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue(&p_scb->q_info.a2d, p_buf); 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just dequeue it from the q_info.a2d */ 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->q_info.a2d.count < 3) 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* put it back to the queue */ 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue_head (&p_scb->q_info.a2d, p_buf); 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* too many buffers in q_info.a2d, drop it. */ 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_drop(p_scb->hndl); 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_start_ok 20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream started. 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_start_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_STOP stop; 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN initiator = FALSE; 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN suspend = FALSE; 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 flush_to; 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 new_role = p_scb->role; 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR hdr; 2100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 policy = HCI_ENABLE_SNIFF_MODE; 2101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 cur_role; 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role); 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = TRUE; 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_suspend) 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_suspend = FALSE; 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_role & BTA_AV_ROLE_START_INT) 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project initiator = TRUE; 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_FAILED) 21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role switch has failed */ 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_FAILED; 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (tBTA_AV_DATA *)&hdr; 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hdr.offset = BTA_AV_RS_FAIL; 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("wait:x%x", p_scb->wait); 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && (p_data->hdr.offset != BTA_AV_RS_NONE)) 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->hdr.offset == BTA_AV_RS_FAIL) 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT)) 21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_START; 21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The wait flag may be set here while we are already master on the link */ 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this could happen if a role switch complete event occurred during reconfig */ 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we are now master on the link, there is no need to wait for the role switch, */ 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complete anymore so we can clear the wait for role switch flag */ 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & (BTA_AV_WAIT_ROLE_SW_RES_OPEN|BTA_AV_WAIT_ROLE_SW_RES_START)) 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_STARTED; 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_START; 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ACP_CAPS_ON) 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ACP_CAPS_STARTED; 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait) 21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag); 21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell role manager to check M/S role */ 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->media_type == AVDT_MEDIA_AUDIO) 21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in normal logic, conns should be bta_av_cb.audio_count - 1, 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, bta_av_stream_chg is not called to increase bta_av_cb.audio_count yet. 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the code were to be re-arranged for some reasons, this number may need to be changed 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = bta_av_cb.audio_open_cnt; 21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flush_to = p_bta_av_cfg->p_audio_flush_to[p_scb->co_started - 1]; 21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flush_to = p_bta_av_cfg->video_flush_to; 21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, flush_to ); 21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the congestion flag */ 21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_role & BTA_AV_ROLE_START_INT) 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_role &= ~BTA_AV_ROLE_START_INT; 21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((new_role & BTA_AV_ROLE_AD_ACP) && (new_role & BTA_AV_ROLE_SUSPEND_OPT)) 21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend = TRUE; 21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!suspend) 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_STREAM; 22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, TRUE); 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If sink starts stream, disable sniff mode here */ 2206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!initiator) 2207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If souce is the master role, disable role switch during streaming. 2209ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Otherwise allow role switch, if source is slave. 2210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Because it would not hurt source, if the peer device wants source to be master */ 2211ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((BTM_GetRole (p_scb->peer_addr, &cur_role) == BTM_SUCCESS) && 2212ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (cur_role == BTM_ROLE_MASTER) ) 2213ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2214ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 2215ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2216ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2217ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_sys_clear_policy(BTA_ID_AV, policy, p_scb->peer_addr); 2218ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2219ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role = new_role; 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_AD_ACP; 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND_OPT; 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->no_rtp_hdr = FALSE; 2225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->p_cos->start(p_scb->hndl, p_scb->codec_type, p_scb->cfg.codec_info, &p_scb->no_rtp_hdr); 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = TRUE; 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_start_ok suspending: %d, role:x%x, init %d", 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend, p_scb->role, initiator); 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.suspending = suspend; 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_SUCCESS; 22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(suspend) 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_SUSPEND; 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; /* do not allow the media data to go through */ 22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do not duplicate the media packets to this channel */ 22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.flush = FALSE; 22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.suspend = TRUE; 22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_STOP_EVT, (tBTA_AV_DATA *)&stop); 22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_start_failed 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream start failed. 22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_start_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started == FALSE && p_scb->co_started == FALSE) 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 2266379743beded881127703334e1dda2cd327ec651dZhihai Xu notify_start_failed(p_scb); 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_SNIFF_MODE|HCI_ENABLE_MASTER_SLAVE_SWITCH), p_scb->peer_addr); 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_suspend = FALSE; 22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_closed 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream closed. 22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_closed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV data; 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_EVT event; 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.audio_open_cnt <= 1) 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* last connection - restore the allow switch flag */ 22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetDesireRole(L2CAP_ROLE_ALLOW_SWITCH); 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->open_status) 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* must be failure when opening the stream */ 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(data.open.bd_addr, p_scb->peer_addr); 23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.status = p_scb->open_status; 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.chnl = p_scb->chnl; 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.hndl = p_scb->hndl; 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AV_OPEN_EVT; 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_SUCCESS; 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup(p_scb, p_data); 23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(event, &data); 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do stop if we were started */ 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->co_started) 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update common mtu shared by remaining connectons */ 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU); 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->close(p_scb->hndl, p_scb->codec_type, mtu); 23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.close.chnl = p_scb->chnl; 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.close.hndl = p_scb->hndl; 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AV_CLOSE_EVT; 23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup(p_scb, p_data); 23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(event, &data); 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_clr_cong 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Clear stream congestion flag. 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_clr_cong (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_suspend_cfm 23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the suspend response 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_suspend_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SUSPEND suspend_rsp; 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2 ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d", 23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.audio_open_cnt, err_code); 23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23695ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu if (p_scb->started == FALSE) 23705ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu { 23715ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu /* handle the condition where there is a collision of SUSPEND req from either side 23725ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu ** Second SUSPEND req could be rejected. Do not treat this as a failure 23735ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu */ 23745ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu APPL_TRACE_WARNING1("bta_av_suspend_cfm: already suspended, ignore, err_code %d", 23755ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu err_code); 23765ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu return; 23775ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu } 23785ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 23805ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu if (err_code && (err_code != AVDT_ERR_BAD_STATE)) 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2382ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable suspend feature only with explicit rejection(not with timeout) */ 2383ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2384ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2385ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->suspend_sup = FALSE; 2386ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_FAIL; 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0 ("bta_av_suspend_cfm: suspend failed, closing connection"); 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SUSPEND failed. Close connection. */ 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL); 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only set started to FALSE when suspend is successful */ 23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->role & BTA_AV_ROLE_SUSPEND) 24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND; 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in case that we received suspend_ind, we may need to call co_stop here */ 24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, FALSE); 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, L2CAP_DEFAULT_FLUSH_TO); 24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.chnl = p_scb->chnl; 24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.hndl = p_scb->hndl; 24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = p_data->str_msg.initiator; 24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_SUSPEND_EVT, (tBTA_AV *) &suspend_rsp); 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_str_ok 24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description report reconfigure successful 24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_str_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle); 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid); 24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* rc listen */ 24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_st_rc_timer(p_scb, NULL); 24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project utl_freebuf((void **)&p_scb->p_cap); 24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No need to keep the role bits once reconfig is done. */ 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_AD_ACP; 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND_OPT; 24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_START_INT; 24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reconfigure success */ 24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_SUCCESS; 24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_failed 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process reconfigure failed 24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x", 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg, bta_av_cb.conn_lcb); 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close(p_scb, p_data); 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_STREAM; 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* go to closing state */ 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL); 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open failed. try again */ 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.conn_lcb) 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_connect_req(p_scb, NULL); 25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_connect 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description stream closed. reconnect the stream 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_connect (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg); 25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* let bta_av_rcfg_failed report fail */ 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_failed(p_scb, NULL); 25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_discntd 25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDT disconnected. reconnect the stream 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_discntd (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg); 25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_STREAM; 25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 25515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report close event & go to init state */ 25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, NULL); 25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_suspend_cont 25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description received the suspend response. 25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** continue to reconfigure the stream 25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_suspend_cont (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 2575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code) 25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (AVDT_ERR_CONNECT == err_code) 25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL; 25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, NULL); 25835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("suspend rejected, try close"); 2587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable suspend feature only with explicit rejection(not with timeout) */ 2588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->suspend_sup = FALSE; 2591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 25925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 25935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 25945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_av_suspend_cont calling AVDT_ReconfigReq"); 26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reconfig the stream */ 26025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap); 26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_cfm 26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description if reconfigure is successful, report the event 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, close the stream. 26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_av_rcfg_cfm"); 26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code) 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("reconfig rejected, try close"); 2628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable reconfiguration feature only with explicit rejection(not with timeout) */ 2629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->recfg_sup = FALSE; 2632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* started flag is FALSE when reconfigure command is sent */ 26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* update the codec info after rcfg cfm */ 2641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(p_scb->cfg.codec_info,p_data->str_msg.msg.reconfig_cfm.p_cfg->codec_info,AVDT_CODEC_SIZE); 26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* take the SSM back to OPEN state */ 26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_OPEN_OK_EVT, NULL); 26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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** Function bta_av_rcfg_open 26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDT is connected. open the stream with the new configuration 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_open (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks); 26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_disc_snks == 0) 26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to update call-out module so that it will be ready for discover */ 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send avdtp discover request */ 26665738f83aeb59361a0a2eda2460113f6dc919427The 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]); 26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = p_scb->p_cap->codec_info[BTA_AV_CODEC_TYPE_IDX]; 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_scb->cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE); 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we may choose to use a different SEP at reconfig. 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * adjust the sep_idx now */ 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_adjust_seps_idx(p_scb); 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open the stream with the new config */ 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = p_scb->rcfg_idx; 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_OpenReq(p_scb->avdt_handle, p_scb->peer_addr, 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[p_scb->sep_info_idx].seid, p_scb->p_cap); 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** 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_rej 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security reject. 26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_BAD_STATE, 26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 0); 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_chk_2nd_start 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check if this is 2nd stream and if it needs to be started. 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function needs to be kept very similar to bta_av_chk_start 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_chk_2nd_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scbi; 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_started = FALSE; 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->chnl == BTA_AV_CHNL_AUDIO) && (bta_av_cb.audio_open_cnt >= 2)) 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* more than one audio channel is connected */ 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->role & BTA_AV_ROLE_SUSPEND_OPT)) 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this channel does not need to be reconfigured. 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * if there is other channel streaming, start the stream now */ 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_AV_NUM_STRS; i++) 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scbi = bta_av_cb.p_scb[i]; 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started) 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!new_started) 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start the new stream */ 27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_started = TRUE; 27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* may need to update the flush timeout of this already started stream */ 27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scbi->co_started != bta_av_cb.audio_open_cnt) 27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scbi->co_started = bta_av_cb.audio_open_cnt; 27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scbi->peer_addr, p_bta_av_cfg->p_audio_flush_to[p_scbi->co_started - 1] ); 27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_rc 27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a message to main SM to open RC channel. 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_rc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role); 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) && (p_scb->q_tag == BTA_AV_Q_TAG_START)) 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* waiting for role switch for some reason & the timer expires */ 27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT)) 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0 ("failed to start streaming for role management reasons!!"); 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&p_scb->timer); 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = TRUE; 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role switch is done. continue to start streaming */ 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hdr.offset = BTA_AV_RS_OK; 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok (p_scb, p_data); 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->use_rc == TRUE || (p_scb->role & BTA_AV_ROLE_AD_ACP) ) 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.disc) 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* AVRC discover db is in use */ 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) 27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* AVRC channel is not connected. delay a little bit */ 27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) == 0) 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->timer, BTA_AV_AVRC_TIMER_EVT, BTA_AV_RC_DISC_TIME_VAL); 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_CHECK_RC; 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use main SM for AVRC SDP activities */ 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rc_disc((UINT8)(p_scb->hdi + 1)); 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTA_AV_RC_HANDLE_NONE != p_scb->rc_handle) 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the open API said that this handle does not want a RC connection. 28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect it now */ 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVRC_Close(p_scb->rc_handle); 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_at_inc 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called if API open is called by application 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** while state-machine is at incoming state. 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_at_inc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_OPEN *p_buf; 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask |= BTA_AV_COLL_API_CALLED; 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* API open will be handled at timeout if SNK did not start signalling. */ 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* API open will be ignored if SNK starts signalling. */ 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SNK did not start signalling, API was called N seconds timeout. */ 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to switch to INIT state and start opening connection. */ 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask = 0; 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_scb_sst_init (p_scb); 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tBTA_AV_API_OPEN *) GKI_getbuf(sizeof(tBTA_AV_API_OPEN))) != NULL) 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, &(p_scb->open_api), sizeof(tBTA_AV_API_OPEN)); 28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED */ 2855