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 30d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton#include <assert.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 326a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 342998946db9b820806d4a3e6decf1d01f090a8031Jakub Pawlowski#include "bta_av_int.h" 3547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule#include "bt_utils.h" 362998946db9b820806d4a3e6decf1d01f090a8031Jakub Pawlowski#include "l2cdefs.h" 372998946db9b820806d4a3e6decf1d01f090a8031Jakub Pawlowski#include "l2c_api.h" 382998946db9b820806d4a3e6decf1d01f090a8031Jakub Pawlowski#include "osi/include/properties.h" 392998946db9b820806d4a3e6decf1d01f090a8031Jakub Pawlowski#include "utl.h" 4047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule#include "vendor.h" 4147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ar_api.h" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the delay time in milliseconds to start service discovery on AVRCP */ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AV_RC_DISC_TIME_VAL 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_RC_DISC_TIME_VAL 3500 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the timer in milliseconds to guard against link busy and AVDT_CloseReq failed to be sent */ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AV_CLOSE_REQ_TIME_VAL 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CLOSE_REQ_TIME_VAL 4000 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* number to retry on reconfigure failure - some headsets requirs this number to be more than 1 */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AV_RECONFIG_RETRY 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_RECONFIG_RETRY 6 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule/* ACL quota we are letting FW use for A2DP Offload Tx. */ 6647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule#define BTA_AV_A2DP_OFFLOAD_XMIT_QUOTA 4 6747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 68d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Mantonstatic void bta_av_st_rc_timer(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data); 69d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton 70271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghoshstatic const size_t SBC_MAX_BITPOOL_OFFSET = 6; 71271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghoshstatic const size_t SBC_MAX_BITPOOL = 53; 72271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state machine states */ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_INIT_SST, 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_INCOMING_SST, 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_OPENING_SST, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_OPEN_SST, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_RCFG_SST, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CLOSING_SST 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the call out functions for audio stream */ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AV_CO_FUNCTS bta_av_a2d_cos = 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_init, 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_disc_res, 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_getconfig, 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_setconfig, 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_open, 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_close, 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_start, 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_stop, 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_src_data_path, 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_delay 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* ssm action functions for audio stream */ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AV_SACT bta_av_a2d_action[] = 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d, /* BTA_AV_DO_DISC */ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup, /* BTA_AV_CLEANUP */ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_free_sdb, /* BTA_AV_FREE_SDB */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_config_ind, /* BTA_AV_CONFIG_IND */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_disconnect_req, /* BTA_AV_DISCONNECT_REQ */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_req, /* BTA_AV_SECURITY_REQ */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_rsp, /* BTA_AV_SECURITY_RSP */ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_setconfig_rsp, /* BTA_AV_SETCONFIG_RSP */ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_st_rc_timer, /* BTA_AV_ST_RC_TIMER */ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_opened, /* BTA_AV_STR_OPENED */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_ind, /* BTA_AV_SECURITY_IND */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_cfm, /* BTA_AV_SECURITY_CFM */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_close, /* BTA_AV_DO_CLOSE */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_connect_req, /* BTA_AV_CONNECT_REQ */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_sdp_failed, /* BTA_AV_SDP_FAILED */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_disc_results, /* BTA_AV_DISC_RESULTS */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_disc_res_as_acp, /* BTA_AV_DISC_RES_AS_ACP */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_open_failed, /* BTA_AV_OPEN_FAILED */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_getcap_results, /* BTA_AV_GETCAP_RESULTS */ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_setconfig_rej, /* BTA_AV_SETCONFIG_REJ */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_discover_req, /* BTA_AV_DISCOVER_REQ */ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_failed, /* BTA_AV_CONN_FAILED */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_start, /* BTA_AV_DO_START */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped, /* BTA_AV_STR_STOPPED */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_reconfig, /* BTA_AV_RECONFIG */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_data_path, /* BTA_AV_DATA_PATH */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok, /* BTA_AV_START_OK */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_failed, /* BTA_AV_START_FAILED */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed, /* BTA_AV_STR_CLOSED */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_clr_cong, /* BTA_AV_CLR_CONG */ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_suspend_cfm, /* BTA_AV_SUSPEND_CFM */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_str_ok, /* BTA_AV_RCFG_STR_OK */ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_failed, /* BTA_AV_RCFG_FAILED */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_connect, /* BTA_AV_RCFG_CONNECT */ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_discntd, /* BTA_AV_RCFG_DISCNTD */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_suspend_cont, /* BTA_AV_SUSPEND_CONT */ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_cfm, /* BTA_AV_RCFG_CFM */ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_open, /* BTA_AV_RCFG_OPEN */ 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_security_rej, /* BTA_AV_SECURITY_REJ */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_open_rc, /* BTA_AV_OPEN_RC */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_chk_2nd_start, /* BTA_AV_CHK_2ND_START */ 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_caps, /* BTA_AV_SAVE_CAPS */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_use_rc, /* BTA_AV_SET_USE_RC */ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close, /* BTA_AV_CCO_CLOSE */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_switch_role, /* BTA_AV_SWITCH_ROLE */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_role_res, /* BTA_AV_ROLE_RES */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_delay_co, /* BTA_AV_DELAY_CO */ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_open_at_inc, /* BTA_AV_OPEN_AT_INC */ 15147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule bta_av_offload_req, /* BTA_AV_OFFLOAD_REQ */ 15247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule bta_av_offload_rsp, /* BTA_AV_OFFLOAD_RSP */ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* these tables translate AVDT events to SSM events */ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT16 bta_av_stream_evt_ok[] = { 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_DISC_OK_EVT, /* AVDT_DISCOVER_CFM_EVT */ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_GETCAP_OK_EVT, /* AVDT_GETCAP_CFM_EVT */ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_OK_EVT, /* AVDT_OPEN_CFM_EVT */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_OK_EVT, /* AVDT_OPEN_IND_EVT */ 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CONFIG_IND_EVT, /* AVDT_CONFIG_IND_EVT */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_OK_EVT, /* AVDT_START_CFM_EVT */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_OK_EVT, /* AVDT_START_IND_EVT */ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_CFM_EVT */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_IND_EVT */ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_CFM_EVT */ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_IND_EVT */ 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_RECONFIG_CFM_EVT, /* AVDT_RECONFIG_CFM_EVT */ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* AVDT_RECONFIG_IND_EVT */ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_CFM_EVT, /* AVDT_SECURITY_CFM_EVT */ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_IND_EVT, /* AVDT_SECURITY_IND_EVT */ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_WRITE_CFM_EVT, /* AVDT_WRITE_CFM_EVT */ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_CONNECT_EVT, /* AVDT_CONNECT_IND_EVT */ 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DISCONNECT_EVT, /* AVDT_DISCONNECT_IND_EVT */ 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVDT_REPORTING == TRUE) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_CONN_EVT */ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_DISCONN_EVT */ 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DELAY_RPT_EVT, /* AVDT_DELAY_REPORT_EVT */ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0 /* AVDT_DELAY_REPORT_CFM_EVT */ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT16 bta_av_stream_evt_fail[] = { 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_DISC_FAIL_EVT, /* AVDT_DISCOVER_CFM_EVT */ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_GETCAP_FAIL_EVT, /* AVDT_GETCAP_CFM_EVT */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_FAIL_EVT, /* AVDT_OPEN_CFM_EVT */ 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_OPEN_OK_EVT, /* AVDT_OPEN_IND_EVT */ 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CONFIG_IND_EVT, /* AVDT_CONFIG_IND_EVT */ 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_FAIL_EVT, /* AVDT_START_CFM_EVT */ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_START_OK_EVT, /* AVDT_START_IND_EVT */ 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_CFM_EVT */ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SUSPEND_CFM_EVT, /* AVDT_SUSPEND_IND_EVT */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_CFM_EVT */ 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_CLOSE_EVT, /* AVDT_CLOSE_IND_EVT */ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_RECONFIG_CFM_EVT, /* AVDT_RECONFIG_CFM_EVT */ 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* AVDT_RECONFIG_IND_EVT */ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_CFM_EVT, /* AVDT_SECURITY_CFM_EVT */ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_SECURITY_IND_EVT, /* AVDT_SECURITY_IND_EVT */ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_STR_WRITE_CFM_EVT, /* AVDT_WRITE_CFM_EVT */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_CONNECT_EVT, /* AVDT_CONNECT_IND_EVT */ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DISCONNECT_EVT, /* AVDT_DISCONNECT_IND_EVT */ 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVDT_REPORTING == TRUE) 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_CONN_EVT */ 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_DISCONN_EVT */ 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_AVDT_DELAY_RPT_EVT, /* AVDT_DELAY_REPORT_EVT */ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0 /* AVDT_DELAY_REPORT_CFM_EVT */ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 211f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt); 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* the array of callback functions to receive events from AVDT control channel */ 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVDT_CTRL_CBACK * const bta_av_dt_cback[] = 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream0_cback 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream1_cback 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream2_cback 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream3_cback 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream4_cback 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ,bta_av_stream5_cback 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 244f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*********************************************** 245f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 246f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function bta_get_scb_handle 247f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 248f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description gives the registered AVDT handle.by checking with sep_type. 249f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 250f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 251f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns void 252f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta***********************************************/ 253d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Mantonstatic UINT8 bta_av_get_scb_handle(tBTA_AV_SCB *p_scb, UINT8 local_sep) 254f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 2555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov for (int i = 0; i < BTA_AV_MAX_SEPS; i++) { 2565fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if ((p_scb->seps[i].tsep == local_sep) && 2575fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (p_scb->seps[i].codec_type == p_scb->codec_type)) 2585fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov return (p_scb->seps[i].av_handle); 259f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 260e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" bta_av_get_scb_handle appropiate sep_type not found") 261f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return 0; /* return invalid handle */ 262f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 263f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 264f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*********************************************** 265f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 266f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function bta_av_get_scb_sep_type 267f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 268f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description gives the sep type by cross-checking with AVDT handle 269f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 270f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 271f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns void 272f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta***********************************************/ 273d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Mantonstatic UINT8 bta_av_get_scb_sep_type(tBTA_AV_SCB *p_scb, UINT8 tavdt_handle) 274f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 2755fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov for (int i = 0; i < BTA_AV_MAX_SEPS; i++) { 2765fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (p_scb->seps[i].av_handle == tavdt_handle) 2775fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov return (p_scb->seps[i].tsep); 278f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 279e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" bta_av_get_scb_sep_type appropiate handle not found") 280f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return 3; /* return invalid sep type */ 281f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_save_addr 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description copy the bd_addr and maybe reset the supported flags 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 295e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_save_addr r:%d, s:%d", 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup, p_scb->suspend_sup); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bdcmp(p_scb->peer_addr, b) != 0) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 299e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("reset flags"); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a new addr, reset the supported flags */ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup = TRUE; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->suspend_sup = TRUE; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do this copy anyway, just in case the first addr matches 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the control block one by accident */ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_scb->peer_addr, b); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 312379743beded881127703334e1dda2cd327ec651dZhihai Xu** Function notify_start_failed 313379743beded881127703334e1dda2cd327ec651dZhihai Xu** 314379743beded881127703334e1dda2cd327ec651dZhihai Xu** Description notify up-layer AV start failed 315379743beded881127703334e1dda2cd327ec651dZhihai Xu** 316379743beded881127703334e1dda2cd327ec651dZhihai Xu** 317379743beded881127703334e1dda2cd327ec651dZhihai Xu** Returns void 318379743beded881127703334e1dda2cd327ec651dZhihai Xu** 319379743beded881127703334e1dda2cd327ec651dZhihai Xu*******************************************************************************/ 320379743beded881127703334e1dda2cd327ec651dZhihai Xustatic void notify_start_failed(tBTA_AV_SCB *p_scb) 321379743beded881127703334e1dda2cd327ec651dZhihai Xu{ 322379743beded881127703334e1dda2cd327ec651dZhihai Xu tBTA_AV_START start; 323379743beded881127703334e1dda2cd327ec651dZhihai Xu /* if start failed, clear role */ 324379743beded881127703334e1dda2cd327ec651dZhihai Xu p_scb->role &= ~BTA_AV_ROLE_START_INT; 325379743beded881127703334e1dda2cd327ec651dZhihai Xu start.chnl = p_scb->chnl; 326379743beded881127703334e1dda2cd327ec651dZhihai Xu start.status = BTA_AV_FAIL; 327379743beded881127703334e1dda2cd327ec651dZhihai Xu start.initiator = TRUE; 328379743beded881127703334e1dda2cd327ec651dZhihai Xu start.hndl = p_scb->hndl; 329379743beded881127703334e1dda2cd327ec651dZhihai Xu (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 330379743beded881127703334e1dda2cd327ec651dZhihai Xu} 331379743beded881127703334e1dda2cd327ec651dZhihai Xu 332379743beded881127703334e1dda2cd327ec651dZhihai Xu/******************************************************************************* 333379743beded881127703334e1dda2cd327ec651dZhihai Xu** 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_st_rc_timer 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description start the AVRC timer if no RC connection & CT is supported & 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RC is used or 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as ACP (we do not really know if we want AVRC) 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 343d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Mantonstatic void bta_av_st_rc_timer(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3455cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 347e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_st_rc_timer rc_handle:%d, use_rc: %d", 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rc_handle, p_scb->use_rc); 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for outgoing RC connection as INT/CT */ 35078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if ((p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) && 35178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* (bta_av_cb.features & BTA_AV_FEAT_RCCT) && */ 35278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (p_scb->use_rc == TRUE || (p_scb->role & BTA_AV_ROLE_AD_ACP))) 35378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov { 35478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) == 0) { 35578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_sys_start_timer(p_scb->avrc_ct_timer, BTA_AV_RC_DISC_TIME_VAL, 35678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AV_AVRC_TIMER_EVT, p_scb->hndl); 35778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } else { 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_CHECK_RC; 35978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_next_getcap 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description The function gets the capabilities of the next available 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stream found in the discovery results. 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if we sent request to AVDT, FALSE otherwise. 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_next_getcap(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_GETCAP_REQ *p_req; 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN sent_cmd = FALSE; 379f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 uuid_int = p_scb->uuid_int; 380f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 sep_requested = 0; 381f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 382f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) 383f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sep_requested = AVDT_TSEP_SNK; 384f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if(uuid_int == UUID_SERVCLASS_AUDIO_SINK) 385f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sep_requested = AVDT_TSEP_SRC; 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = p_scb->sep_info_idx; i < p_scb->num_seps; i++) 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam not in use, is a sink, and is the right media type (audio/video) */ 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].in_use == FALSE) && 391f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (p_scb->sep_info[i].tsep == sep_requested) && 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = i; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we got a stream; get its capabilities */ 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 3985fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->p_cap = (tAVDT_CFG *)osi_malloc(sizeof(tAVDT_CFG)); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->avdt_version >= AVDT_VERSION_SYNC) 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_req = AVDT_GetAllCapReq; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_req = AVDT_GetCapReq; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_req)(p_scb->peer_addr, 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].seid, 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap, bta_av_dt_cback[p_scb->hdi]); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sent_cmd = TRUE; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no streams available then stream open fails */ 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!sent_cmd) 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_GETCAP_FAIL_EVT, p_data); 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return sent_cmd; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_proc_stream_evt 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Utility function to compose stream events. 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 434d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Mantonstatic void bta_av_proc_stream_evt(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data, int index) 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_len = 0; 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scb = bta_av_cb.p_scb[index]; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == AVDT_SECURITY_IND_EVT) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_len = (p_data->security_ind.len < BTA_AV_SECURITY_MAX_LEN) ? 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->security_ind.len : BTA_AV_SECURITY_MAX_LEN; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == AVDT_SECURITY_CFM_EVT && p_data->hdr.err_code == 0) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_len = (p_data->security_cfm.len < BTA_AV_SECURITY_MAX_LEN) ? 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->security_cfm.len : BTA_AV_SECURITY_MAX_LEN; 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (p_scb) { 4545fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTA_AV_STR_MSG *p_msg = 4555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBTA_AV_STR_MSG *)osi_malloc(sizeof(tBTA_AV_STR_MSG) + sec_len); 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy event data, bd addr, and handle to event message buffer */ 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.offset = 0; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_addr != NULL) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_msg->bd_addr, bd_addr); 463e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[2], bd_addr[3], 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[4], bd_addr[5]); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data != NULL) 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_msg->msg, p_data, sizeof (tAVDT_CTRL)); 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy config params to event message buffer */ 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case AVDT_RECONFIG_CFM_EVT: 476e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x", 477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh 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], 478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh 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], 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh 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], 480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->msg.reconfig_cfm.p_cfg->codec_info[9]); 481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_CONFIG_IND_EVT: 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We might have 2 SEP signallings(A2DP + VDP) with one peer device on one L2CAP. 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we already have a signalling connection with the bd_addr and the streaming 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SST is at INIT state, change it to INCOMING state to handle the signalling 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * from the 2nd SEP. */ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_find_lcb(bd_addr, BTA_AV_LCB_FIND) != NULL) && (bta_av_is_scb_init(p_scb))) 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_set_scb_sst_incoming (p_scb); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When ACP_CONNECT_EVT was received, we put first available scb to incoming state. 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Later when we receive AVDT_CONFIG_IND_EVT, we use a new p_scb and set its state to 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * incoming which we do it above. 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We also have to set the old p_scb state to init to be used later */ 4985fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov for (int i = 0; i < BTA_AV_NUM_STRS; i++) { 4995fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if ((bta_av_cb.p_scb[i]) && (i != index)) { 5005fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (bta_av_cb.p_scb[i]->state == BTA_AV_INCOMING_SST) { 5015fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_av_cb.p_scb[i]->state = BTA_AV_INIT_SST; 5025fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_av_cb.p_scb[i]->coll_mask = 0; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_msg->cfg, p_data->config_ind.p_cfg, sizeof(tAVDT_CFG)); 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SECURITY_IND_EVT: 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.security_ind.p_data = (UINT8 *) (p_msg + 1); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_msg->msg.security_ind.p_data, p_data->security_ind.p_data, sec_len); 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SECURITY_CFM_EVT: 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.security_cfm.p_data = (UINT8 *) (p_msg + 1); 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->hdr.err_code == 0) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_msg->msg.security_cfm.p_data, p_data->security_cfm.p_data, sec_len); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_SUSPEND_IND_EVT: 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.hdr.err_code = 0; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->msg.hdr.err_code = 0; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up application event */ 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_data == NULL) || (p_data->hdr.err_code == 0)) 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = bta_av_stream_evt_ok[event]; 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.event = bta_av_stream_evt_fail[event]; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->initiator = FALSE; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == AVDT_SUSPEND_CFM_EVT) 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->initiator = TRUE; 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 549e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_VERBOSE("hndl:x%x", p_scb->hndl); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->hdr.layer_specific = p_scb->hndl; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->handle = handle; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->avdt_event = event; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_msg); 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* coverity[var_deref_model] */ 557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* false-positive: bta_av_conn_cback only processes AVDT_CONNECT_IND_EVT and AVDT_DISCONNECT_IND_EVT event 558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * these 2 events always have associated p_data */ 55946d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB if (p_data) 56046d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB { 56146d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB bta_av_conn_cback(handle, bd_addr, event, p_data); 56246d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB } 56346d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB else 56446d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB { 56546d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB APPL_TRACE_ERROR("%s: p_data is null", __func__); 56646d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB } 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 571f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function bta_av_stream_data_cback 572f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 573f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description This is the AVDTP callback function for stream events. 574f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 575f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns void 576f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 577f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta*******************************************************************************/ 578f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt) 579f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 580f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int index = 0; 581f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tBTA_AV_SCB *p_scb ; 582e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_stream_data_cback avdt_handle: %d pkt_len=0x%x ofst = 0x%x", handle,p_pkt->len,p_pkt->offset); 583e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Number of frames 0x%x",*((UINT8*)(p_pkt + 1) + p_pkt->offset)); 584e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Sequence Number 0x%x",p_pkt->layer_specific); 585f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* Get SCB and correct sep type*/ 586f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta for(index = 0; index < BTA_AV_NUM_STRS;index ++ ) 587f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 588f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb = bta_av_cb.p_scb[index]; 589f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->avdt_handle == handle)&&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK)) 590f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 591f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 592f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(index == BTA_AV_NUM_STRS) /* cannot find correct handler */ 593f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 594abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_pkt); 595f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 596f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 597f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_pkt->event = BTA_AV_MEDIA_DATA_EVT; 598f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_DATA_EVT, (tBTA_AV_MEDIA*)p_pkt); 599abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_pkt); /* a copy of packet had been delivered, we free this buffer */ 600f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 601f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 602f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 603f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream0_cback 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 613e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_VERBOSE("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event); 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 0); 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream1_cback 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 628e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event); 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 1); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 2 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream2_cback 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 644e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 2); 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 3 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream3_cback 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 661e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 3); 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream4_cback 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 4 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 678e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 4); 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_stream5_cback 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the AVDTP callback function for stream events. 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AV_NUM_STRS > 5 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 695e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event); 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 5); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_a2d_sdp_cback 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description A2DP service discovery callback. 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_a2d_sdp_cback(BOOLEAN found, tA2D_Service *p_service) 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7115fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTA_AV_SCB *p_scb = bta_av_hndl_to_scb(bta_av_cb.handle); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (p_scb == NULL) { 7145fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov APPL_TRACE_ERROR("%s, no scb found for handle(0x%x)", __func__, 7155fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_av_cb.handle); 7165fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov return; 7175fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov } 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTA_AV_SDP_RES *p_msg = 7205fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBTA_AV_SDP_RES *)osi_malloc(sizeof(tBTA_AV_SDP_RES)); 7215fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->hdr.event = (found) ? 7225fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BTA_AV_SDP_DISC_OK_EVT : BTA_AV_SDP_DISC_FAIL_EVT; 7235fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (found && (p_service != NULL)) 7245fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->avdt_version = p_service->avdt_version; 7255fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov else 7265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->avdt_version = 0x00; 7275fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->hdr.layer_specific = bta_av_cb.handle; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_sys_sendmsg(p_msg); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_adjust_seps_idx 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description adjust the sep_idx 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 741f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb, UINT8 avdt_handle) 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 743e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type); 7445fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov for (int i = 0; i < BTA_AV_MAX_SEPS; i++) { 745e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("av_handle: %d codec_type: %d", 7465fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->seps[i].av_handle, p_scb->seps[i].codec_type); 7475fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if((p_scb->seps[i].av_handle && p_scb->codec_type == p_scb->seps[i].codec_type) 7485fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov && (p_scb->seps[i].av_handle == avdt_handle)) 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7505fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->sep_idx = i; 7515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->avdt_handle = p_scb->seps[i].av_handle; 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_switch_role 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switch role was not started and a timer was started. 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** another attempt to switch role now - still opening. 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_switch_role (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RS_RES switch_res = BTA_AV_RS_NONE; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_OPEN *p_buf = &p_scb->q_info.open; 7715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 773e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_switch_role wait:x%x", p_scb->wait); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START) 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RETRY; 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the masks set when the timer is started */ 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~(BTA_AV_WAIT_ROLE_SW_RES_OPEN|BTA_AV_WAIT_ROLE_SW_RES_START); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_switch_if_needed(p_scb) || !bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this should not happen in theory. Just in case... 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * continue to do_disc_a2d */ 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch_res = BTA_AV_RS_DONE; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure on OPEN */ 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch_res = BTA_AV_RS_FAIL; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (switch_res != BTA_AV_RS_NONE) 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.rs_idx == (p_scb->hdi + 1)) 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_RETRY; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = 0; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->switch_res = switch_res; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d(p_scb, (tBTA_AV_DATA *)p_buf); 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_role_res 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the role changed event 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_role_res (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN initiator = FALSE; 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_OPEN av_open; 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 828e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role); 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role & BTA_AV_ROLE_START_INT) 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project initiator = TRUE; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->q_tag == BTA_AV_Q_TAG_START) 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_STARTED) 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->role_res.hci_status != HCI_SUCCESS) 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 83977d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy p_scb->role &= ~BTA_AV_ROLE_START_INT; 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start failed because of role switch. */ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok(p_scb, p_data); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START) 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_FAILED; 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->q_tag == BTA_AV_Q_TAG_OPEN) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_OPEN) 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_START_INT; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->role_res.hci_status != HCI_SUCCESS) 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Open failed because of role switch. */ 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(av_open.bd_addr, p_scb->peer_addr); 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_open.chnl = p_scb->chnl; 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_open.hndl = p_scb->hndl; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 870f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 871f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta av_open.sep = AVDT_TSEP_SNK; 872f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 873f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta av_open.sep = AVDT_TSEP_SRC; 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *)&av_open); 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Continue av open process */ 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_info.open.switch_res = BTA_AV_RS_DONE; 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_do_disc_a2d (p_scb, (tBTA_AV_DATA *)&(p_scb->q_info.open)); 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 885e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 889e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("wait:x%x, role:x%x", p_scb->wait, p_scb->role); 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_delay_co 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Call the delay call-out function to report the delay report 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from SNK 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_delay_co (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->delay(p_scb->hndl, p_data->str_msg.msg.delay_rpt_cmd.delay); 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_disc_a2d 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Do service discovery for A2DP. 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_disc_a2d (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN ok_continue = FALSE; 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SDP_DB_PARAMS db_params; 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_PROTOCOL_DESC_LIST, 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_BT_PROFILE_DESC_LIST}; 923f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 sdp_uuid = 0; /* UUID for which SDP has to be done */ 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d", 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_open.use_rc, p_data->api_open.switch_res, bta_av_cb.audio_open_cnt); 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_data->api_open.switch_res) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_NONE: 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_switch_if_needed(p_scb) || !bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* waiting for role switch result. save the api to control block */ 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_scb->q_info.open, &p_data->api_open, sizeof(tBTA_AV_API_OPEN)); 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_OPEN; 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_FAIL: 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report a new failure event */ 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_ROLE; 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_SDP_DISC_FAIL_EVT, NULL); 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_OK: 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (tBTA_AV_DATA *)&p_scb->q_info.open; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* continue to open if link role is ok */ 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_link_role_ok(p_scb, A2D_SET_MULTL_BIT)) 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RES_OPEN; 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RS_DONE: 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ok_continue = TRUE; 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 970e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag); 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!ok_continue) 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the role switch bits */ 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_CHECK_RC) 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_CHECK_RC; 98078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_sys_start_timer(p_scb->avrc_ct_timer, BTA_AV_RC_DISC_TIME_VAL, 98178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AV_AVRC_TIMER_EVT, p_scb->hndl); 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_MASTER) 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 986d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 988d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie if (bta_av_cb.audio_open_cnt == 1) 989d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie { 990d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie /* there's already an A2DP connection. do not allow switch */ 991d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH); 992d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie } 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store peer addr other parameters */ 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_addr(p_scb, p_data->api_open.bd_addr); 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sec_mask = p_data->api_open.sec_mask; 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = p_data->api_open.use_rc; 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_app_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1001b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh if (p_scb->skip_sdp == TRUE) 1002b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh { 1003b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh tA2D_Service a2d_ser; 1004b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh a2d_ser.avdt_version = AVDT_VERSION; 1005b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh p_scb->skip_sdp = FALSE; 1006b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh p_scb->uuid_int = p_data->api_open.uuid; 1007b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh /* only one A2D find service is active at a time */ 1008b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh bta_av_cb.handle = p_scb->hndl; 1009b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh APPL_TRACE_WARNING("%s: Skip Sdp for incoming A2dp connection", __func__); 1010b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh bta_av_a2d_sdp_cback(TRUE, &a2d_ser); 1011b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh return; 1012b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh } 1013ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only one A2D find service is active at a time */ 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.handle = p_scb->hndl; 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1017ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh /* set up parameters */ 1018ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh db_params.db_len = BTA_AV_DISC_BUF_SIZE; 1019ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh db_params.num_attr = 3; 1020ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh db_params.p_attrs = attr_list; 1021ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->uuid_int = p_data->api_open.uuid; 1022ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->sdp_discovery_started = TRUE; 1023ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SINK) 1024ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh sdp_uuid = UUID_SERVCLASS_AUDIO_SOURCE; 1025ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh else if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) 1026ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh sdp_uuid = UUID_SERVCLASS_AUDIO_SINK; 1027ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh 1028ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh APPL_TRACE_DEBUG("%s: uuid_int 0x%x, Doing SDP For 0x%x", __func__, 1029ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->uuid_int, sdp_uuid); 1030ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh if (A2D_FindService(sdp_uuid, p_scb->peer_addr, &db_params, 1031ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh bta_av_a2d_sdp_cback) == A2D_SUCCESS) 1032ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh return; 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1034ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh /* when the code reaches here, either the DB is NULL 1035ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh * or A2D_FindService is not successful */ 1036ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh bta_av_a2d_sdp_cback(FALSE, NULL); 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_cleanup 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description cleanup AV stream control block. 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_cleanup(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CONN_CHG msg; 10515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov UINT8 role = BTA_AV_ROLE_AD_INT; 10525cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1054e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_cleanup"); 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free any buffers */ 1057abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_scb->p_cap); 1058ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->sdp_discovery_started = FALSE; 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = 0; 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize some control block variables */ 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_SUCCESS; 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if de-registering shut everything down */ 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.hdr.layer_specific = p_scb->hndl; 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role = role; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = 0; 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait = 0; 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = 0; 107278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->avrc_ct_timer); 107347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 107412265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov vendor_get_interface()->send_command( 107512265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov (vendor_opcode_t)BT_VND_OP_A2DP_OFFLOAD_STOP, (void*)&p_scb->l2c_cid); 107647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (p_scb->offload_start_pending) { 107747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule tBTA_AV_STATUS status = BTA_AV_FAIL_STREAM; 107847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV *)&status); 107947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 108047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->offload_start_pending = FALSE; 108147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 1082b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh p_scb->skip_sdp = FALSE; 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->deregistring) 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove stream */ 10865fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov for (int i = 0; i < BTA_AV_MAX_SEPS; i++) { 10875fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (p_scb->seps[i].av_handle) 10885fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov AVDT_RemoveStream(p_scb->seps[i].av_handle); 10895fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->seps[i].av_handle = 0; 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_dereg_comp((tBTA_AV_DATA *) &msg); 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report stream closed to main SM */ 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.is_up = FALSE; 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(msg.peer_addr, p_scb->peer_addr); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_chg((tBTA_AV_DATA *) &msg); 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_free_sdb 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free service discovery db buffer. 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_free_sdb(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11145cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 1115ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->sdp_discovery_started = FALSE; 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_config_ind 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle a stream configuration indication from the peer. 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_config_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CI_SETCONFIG setconfig; 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info; 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG *p_evt_cfg = &p_data->str_msg.cfg; 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 psc_mask = (p_evt_cfg->psc_mask | p_scb->cfg.psc_mask); 1133f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 local_sep; /* sep type of local handle on which connection was received */ 1134f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tBTA_AV_STR_MSG *p_msg = (tBTA_AV_STR_MSG *)p_data; 11355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1137f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta local_sep = bta_av_get_scb_sep_type(p_scb, p_msg->handle); 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_label = p_data->str_msg.msg.hdr.label; 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_scb->cfg.codec_info, p_evt_cfg->codec_info, AVDT_CODEC_SIZE); 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = p_evt_cfg->codec_info[BTA_AV_CODEC_TYPE_IDX]; 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_save_addr(p_scb, p_data->str_msg.bd_addr); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear collision mask */ 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask = 0; 114578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(bta_av_cb.accept_signalling_timer); 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no codec parameters in configuration, fail */ 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_evt_cfg->num_codec == 0) || 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* or the peer requests for a service we do not support */ 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((psc_mask != p_scb->cfg.psc_mask) && 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (psc_mask != (p_scb->cfg.psc_mask&~AVDT_PSC_DELAY_RPT))) ) 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setconfig.hndl = p_scb->hndl; /* we may not need this */ 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project setconfig.err_code = AVDT_ERR_UNSUP_CFG; 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_CI_SETCONFIG_FAIL_EVT, (tBTA_AV_DATA *) &setconfig); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info = &p_scb->sep_info[0]; 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->in_use = 0; 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->media_type = p_scb->media_type; 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->seid = p_data->str_msg.msg.config_ind.int_seid; 1163f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1164f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* Sep type of Peer will be oppsite role to our local sep */ 1165f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SRC) 1166f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_info->tsep = AVDT_TSEP_SNK; 1167f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (local_sep == AVDT_TSEP_SNK) 1168f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_info->tsep = AVDT_TSEP_SRC; 1169f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_AD_ACP; 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = p_evt_cfg->psc_mask; 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_RCTG) 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = TRUE; 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = FALSE; 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = 1; 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 1179e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_config_ind: SEID: %d use_rc: %d cur_psc_mask:0x%x", p_info->seid, p_scb->use_rc, p_scb->cur_psc_mask); 1180f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* in case of A2DP SINK this is the first time peer data is being sent to co functions */ 1181f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SNK) 1182f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1183f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type, 1184f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->codec_info, 1185f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_info->seid, 1186f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->peer_addr, 1187f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->num_protect, 1188f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->protect_info, 1189f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta AVDT_TSEP_SNK, 1190f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->handle); 1191f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1192f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else 1193f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1194f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type, 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->codec_info, 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_info->seid, 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_addr, 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_evt_cfg->num_protect, 1199f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_evt_cfg->protect_info, 1200f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta AVDT_TSEP_SRC, 1201f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->handle); 1202f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disconnect_req 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disconnect AVDTP connection. 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disconnect_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RCB *p_rcb; 12185cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 12195cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 122078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_DEBUG("%s conn_lcb: 0x%x", __func__, bta_av_cb.conn_lcb); 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 122278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(bta_av_cb.link_signalling_timer); 122378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->avrc_ct_timer); 122478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 122578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (bta_av_cb.conn_lcb) { 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rcb = bta_av_get_rcb_by_shdl((UINT8)(p_scb->hdi + 1)); 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_rcb) 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_del_rc(p_rcb); 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 123078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } else { 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AVDT_DISCONNECT_EVT, NULL); 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_req 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security request. 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityReq(p_scb->avdt_handle, p_data->api_protect_req.p_data, 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_protect_req.len); 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_rsp 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security response. 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->api_protect_rsp.error_code, 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->api_protect_rsp.p_data, p_data->api_protect_rsp.len); 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_NSC, 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 0); 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_setconfig_rsp 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description setconfig is OK 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_setconfig_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num = p_data->ci_setconfig.num_seid + 1; 1288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 avdt_handle = p_data->ci_setconfig.avdt_handle; 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_seid = p_data->ci_setconfig.p_seid; 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 1291f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 local_sep; 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we like this codec_type. find the sep_idx */ 1294f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta local_sep = bta_av_get_scb_sep_type(p_scb,avdt_handle); 1295f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, avdt_handle); 1296e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask); 1297948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach 1298f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((AVDT_TSEP_SNK == local_sep) && (p_data->ci_setconfig.err_code == AVDT_SUCCESS) && 12996b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL)) { 13006b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta tBTA_AV_MEDIA av_sink_codec_info; 13016b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta memcpy(av_sink_codec_info.avk_config.bd_addr,p_scb->peer_addr,sizeof(BD_ADDR)); 13026b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta av_sink_codec_info.avk_config.codec_info = p_scb->cfg.codec_info; 1303f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT, 13046b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta &av_sink_codec_info); 13056b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 1306f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1307f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->ci_setconfig.err_code, 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->ci_setconfig.category); 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 131178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(bta_av_cb.link_signalling_timer); 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->ci_setconfig.err_code == AVDT_SUCCESS) 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait = BTA_AV_WAIT_ACP_CAPS_ON; 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->ci_setconfig.recfg_needed) 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_SUSPEND_OPT; 1318948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach APPL_TRACE_DEBUG("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d", 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->ci_setconfig.recfg_needed, p_scb->role, num); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* callout module tells BTA the number of "good" SEPs and their SEIDs. 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * getcap on these SEID */ 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = num; 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->cur_psc_mask & AVDT_PSC_DELAY_RPT) 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_version = AVDT_VERSION_SYNC; 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1) 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind. 1331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta * call disc_res now */ 1332f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* this is called in A2DP SRC path only, In case of SINK we don't need it */ 1333f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SRC) 1334f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->disc_res(p_scb->hndl, num, num, 0, p_scb->peer_addr, 1335f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UUID_SERVCLASS_AUDIO_SOURCE); 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we do not know the peer device and it is using non-SBC codec 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * we need to know all the SEPs on SNK */ 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_discover_req(p_scb, NULL); 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 1; i < num; i++) 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1347e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("sep_info[%d] SEID: %d", i, p_seid[i-1]); 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize the sep_info[] to get capabilities */ 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].in_use = FALSE; 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].tsep = AVDT_TSEP_SNK; 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].media_type = p_scb->media_type; 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].seid = p_seid[i-1]; 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1354948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach 1355f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* only in case of local sep as SRC we need to look for other SEPs, In case of SINK we don't */ 1356f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (local_sep == AVDT_TSEP_SRC) 1357948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach { 1358948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach /* Make sure UUID has been initialized... */ 1359948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach if (p_scb->uuid_int == 0) 1360948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach p_scb->uuid_int = p_scb->open_api.uuid; 1361f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_next_getcap(p_scb, p_data); 1362948bea0b8cf0f8b9a99dec278bf518195028ccbeAndre Eisenbach } 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_opened 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream opened OK (incoming/outgoing). 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_opened (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CONN_CHG msg; 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_OPEN open; 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.hdr.layer_specific = p_scb->hndl; 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.is_up = TRUE; 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(msg.peer_addr, p_scb->peer_addr); 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle); 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_conn_chg((tBTA_AV_DATA *) &msg); 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the congestion flag, so AV would not send media packets by accident */ 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; 138947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->offload_start_pending = FALSE; 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->stream_mtu = p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE; 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu); 1394e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d", 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid, p_scb->stream_mtu, mtu); 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(mtu == 0 || mtu > p_scb->stream_mtu) 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = p_scb->stream_mtu; 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the media channel as medium priority */ 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetTxPriority(p_scb->l2c_cid, L2CAP_CHNL_PRIORITY_MEDIUM); 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetChnlFlushability (p_scb->l2c_cid, TRUE); 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_scb->q_info, 0, sizeof(tBTA_AV_Q_INFO)); 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = 0; 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->open(p_scb->hndl, 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type, p_scb->cfg.codec_info, mtu); 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO check if other audio channel is open. 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If yes, check if reconfig is needed 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Rigt now we do not do this kind of checking. 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BTA-AV is INT for 2nd audio connection. 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The application needs to make sure the current codec_info is proper. 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If one audio connection is open and another SNK attempts to connect to AV, 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection will be rejected. 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if other audio channel is started. If yes, start */ 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(open.bd_addr, p_scb->peer_addr); 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.chnl = p_scb->chnl; 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.hndl = p_scb->hndl; 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.status = BTA_AV_SUCCESS; 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.starting = bta_av_chk_start(p_scb); 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr = 0; 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( NULL != (p = BTM_ReadRemoteFeatures(p_scb->peer_addr))) 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HCI_EDR_ACL_2MPS_SUPPORTED(p)) 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr |= BTA_AV_EDR_2MBPS; 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(HCI_EDR_ACL_3MPS_SUPPORTED(p)) 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project open.edr |= BTA_AV_EDR_3MBPS; 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ar_avdt_conn(BTA_ID_AV, open.bd_addr); 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1436f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 1437f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SNK; 1438f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 1439f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SRC; 1440f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open); 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(open.starting) 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14476a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta 14486a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta // This code is used to pass PTS TC for AVDTP ABORT 14496a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta char value[PROPERTY_VALUE_MAX] = {0}; 14502998946db9b820806d4a3e6decf1d01f090a8031Jakub Pawlowski if ((osi_property_get("bluetooth.pts.force_a2dp_abort", value, "false")) 14516a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta && (!strcmp(value, "true"))) 14526a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta { 14536a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta APPL_TRACE_ERROR ("%s: Calling AVDT_AbortReq", __func__); 14546a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta AVDT_AbortReq(p_scb->avdt_handle); 14556a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta } 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_ind 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle an AVDTP security indication. 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_PROTECT_REQ protect_req; 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->avdt_label = p_data->str_msg.msg.hdr.label; 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.chnl = p_scb->chnl; 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.hndl = p_scb->hndl; 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 1478e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("sec ind handle: x%x", protect_req.hndl); 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.p_data = p_data->str_msg.msg.security_ind.p_data; 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_req.len = p_data->str_msg.msg.security_ind.len; 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_PROTECT_REQ_EVT, (tBTA_AV *) &protect_req); 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* app doesn't support security indication; respond with failure */ 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_NSC, NULL, 0); 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_cfm 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle an AVDTP security confirm. 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_PROTECT_RSP protect_rsp; 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.features & BTA_AV_FEAT_PROTECT) 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.chnl = p_scb->chnl; 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.hndl = p_scb->hndl; 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.p_data = p_data->str_msg.msg.security_cfm.p_data; 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.len = p_data->str_msg.msg.security_cfm.len; 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect_rsp.err_code= p_data->str_msg.msg.hdr.err_code; 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_PROTECT_RSP_EVT, (tBTA_AV *) &protect_rsp); 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_close 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Close stream. 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_close (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 15295cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop stream if started */ 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->co_started) 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 153578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(bta_av_cb.link_signalling_timer); 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close stream */ 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* just in case that the link is congested, link is flow controled by peer or 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * for whatever reason the the close request can not be sent in time. 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * when this timer expires, AVDT_DisconnectReq will be called to disconnect the link 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 154878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_sys_start_timer(p_scb->avrc_ct_timer, BTA_AV_CLOSE_REQ_TIME_VAL, 154978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AV_API_CLOSE_EVT, p_scb->hndl); 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_connect_req 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connect AVDTP connection. 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 156120524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavovvoid bta_av_connect_req(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15635cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 15645cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 1565ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->sdp_discovery_started = FALSE; 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SNK initiated L2C connection while SRC was doing SDP. */ 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Wait until timeout to check if SNK starts signalling. */ 1570e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask); 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_sdp_failed 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Service discovery failed. 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 158620524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavovvoid bta_av_sdp_failed(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_scb->open_status) 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_SDP; 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1591ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_scb->sdp_discovery_started = FALSE; 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed(p_scb, p_data); 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disc_results 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP discover results. Search through the 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** results and find the first available stream, and get 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its capabilities. 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disc_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1608f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 num_snks = 0, num_srcs =0, i; 1609f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* our uuid in case we initiate connection */ 1610f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 uuid_int = p_scb->uuid_int; 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1612e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" initiator UUID 0x%x", uuid_int); 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store number of stream endpoints returned */ 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps; 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_scb->num_seps; i++) 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam not in use, is a sink, and is audio */ 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].in_use == FALSE) && 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1622f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 1623f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)) 1624f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_snks++; 1625f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1626f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if((p_scb->sep_info[i].tsep == AVDT_TSEP_SRC) && 1627f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (uuid_int == UUID_SERVCLASS_AUDIO_SINK)) 1628f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_srcs++; 1629f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1633f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, num_srcs, p_scb->peer_addr, 1634f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta uuid_int); 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = num_snks; 1636f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->num_disc_srcs = num_srcs; 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we got any */ 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_seps > 0) 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize index into discovery results */ 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the capabilities of the first available stream */ 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we got discover response but with no streams; we're done */ 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, p_data); 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_disc_res_as_acp 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP discover results. Search through the 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** results and find the first available stream, and get 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its capabilities. 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_disc_res_as_acp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_snks = 0, i; 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store number of stream endpoints returned */ 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < p_scb->num_seps; i++) 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* steam is a sink, and is audio */ 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) && 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->sep_info[i].media_type == p_scb->media_type)) 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[i].in_use = FALSE; 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_snks++; 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1684f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, 0, p_scb->peer_addr, 16856b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta UUID_SERVCLASS_AUDIO_SOURCE); 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_disc_snks = num_snks; 1687f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->num_disc_srcs = 0; 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we got any */ 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_seps > 0) 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize index into discovery results */ 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the capabilities of the first available stream */ 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else we got discover response but with no streams; we're done */ 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, p_data); 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_save_caps 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description report the SNK SEP capabilities to application 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_save_caps(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG cfg; 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx]; 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_wait = p_scb->wait; 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN getcap_done = FALSE; 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1721e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x", 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_seps, p_scb->sep_info_idx, p_scb->wait); 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cfg, p_scb->p_cap, sizeof(tAVDT_CFG)); 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* let application know the capability of the SNK */ 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->getcfg(p_scb->hndl, cfg.codec_info[BTA_AV_CODEC_TYPE_IDX], 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.codec_info, &p_scb->sep_info_idx, p_info->seid, 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cfg.num_protect, cfg.protect_info); 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx++; 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_seps > p_scb->sep_info_idx) 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some devices have seps at the end of the discover list, which is not */ 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* matching media type(video not audio). */ 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In this case, we are done with getcap without sending another */ 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request to AVDT. */ 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_next_getcap(p_scb, p_data)) 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap_done = TRUE; 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap_done = TRUE; 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (getcap_done) 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are done getting capabilities. restore the p_cb->sep_info_idx */ 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = 0; 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON|BTA_AV_WAIT_ACP_CAPS_STARTED); 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_wait & BTA_AV_WAIT_ACP_CAPS_STARTED) 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok (p_scb, NULL); 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_set_use_rc 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description set to use AVRC for this stream control block. 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_set_use_rc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17655cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 17665cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->use_rc = TRUE; 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_cco_close 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description call close call-out function. 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_cco_close (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 17825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 17835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU); 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->close(p_scb->hndl, p_scb->codec_type, mtu); 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_failed 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Failed to open an AVDT stream 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_av_opened = FALSE; 1802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_AV_SCB * p_opened_scb = NULL; 1803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 idx; 1804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTA_AV_OPEN open; 1805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1806e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_open_failed"); 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_STREAM; 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close(p_scb, p_data); 1809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* check whether there is already an opened audio or video connection with the same device */ 1811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (idx = 0; (idx < BTA_AV_NUM_STRS) && (is_av_opened == FALSE); idx++ ) 1812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_opened_scb = bta_av_cb.p_scb[idx]; 1814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_opened_scb && (p_opened_scb->state == BTA_AV_OPEN_SST) && (!bdcmp(p_opened_scb->peer_addr,p_scb->peer_addr )) ) 1815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_av_opened = TRUE; 1816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if there is already an active AV connnection with the same bd_addr, 1820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta don't send disconnect req, just report the open event with BTA_AV_FAIL_GET_CAP status */ 1821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_av_opened == TRUE) 1822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdcpy(open.bd_addr, p_scb->peer_addr); 1824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.chnl = p_scb->chnl; 1825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.hndl = p_scb->hndl; 1826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.status = BTA_AV_FAIL_GET_CAP; 1827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.starting = bta_av_chk_start(p_scb); 1828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta open.edr = 0; 1829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* set the state back to initial state */ 1830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_av_set_scb_sst_init(p_scb); 1831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1832f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 1833f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SNK; 1834f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 1835f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta open.sep = AVDT_TSEP_SRC; 1836f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open); 1838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1841ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1842ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 1843ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1846ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_getcap_results 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle the AVDTP get capabilities results. Check the codec 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type and see if it matches ours. If it does not, get the 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capabilities of the next stream, if any. 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_getcap_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG cfg; 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 media_type; 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SEP_INFO *p_info = &p_scb->sep_info[p_scb->sep_info_idx]; 1863f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 uuid_int; /* UUID for which connection was initiatied */ 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&cfg, &p_scb->cfg, sizeof(tAVDT_CFG)); 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.num_codec = 1; 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.num_protect = p_scb->p_cap->num_protect; 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE); 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(cfg.protect_info, p_scb->p_cap->protect_info, AVDT_PROTECT_SIZE); 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_type = p_scb->p_cap->codec_info[BTA_AV_MEDIA_TYPE_IDX] >> 4; 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1872e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("num_codec %d", p_scb->p_cap->num_codec); 1873e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("media type x%x, x%x", media_type, p_scb->media_type); 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE 1875e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask); 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if codec present and we get a codec configuration */ 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->p_cap->num_codec != 0) && 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (media_type == p_scb->media_type) && 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_scb->p_cos->getcfg(p_scb->hndl, p_scb->p_cap->codec_info[BTA_AV_CODEC_TYPE_IDX], 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.codec_info, &p_scb->sep_info_idx, p_info->seid, 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cfg.num_protect, cfg.protect_info) == 0)) 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.mux_mask &= p_scb->p_cap->mux_mask; 1887e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("mux_mask used x%x", cfg.mux_mask); 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save copy of codec type and configuration */ 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = cfg.codec_info[BTA_AV_CODEC_TYPE_IDX]; 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_scb->cfg, &cfg, sizeof(tAVDT_CFG)); 1892f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1893f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta uuid_int = p_scb->uuid_int; 1894e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" initiator UUID = 0x%x ", uuid_int); 1895f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) 1896f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC)); 1897f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (uuid_int == UUID_SERVCLASS_AUDIO_SINK) 1898f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SNK)); 1899f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use only the services peer supports */ 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cfg.psc_mask &= p_scb->p_cap->psc_mask; 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cur_psc_mask = cfg.psc_mask; 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1904f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((uuid_int == UUID_SERVCLASS_AUDIO_SINK) && 1905f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL)) 1906f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 19076b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta APPL_TRACE_DEBUG("%s Configure Decoder for Sink Connection.", __func__); 19086b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta tBTA_AV_MEDIA av_sink_codec_info; 19096b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta memcpy(av_sink_codec_info.avk_config.bd_addr,p_scb->peer_addr,sizeof(BD_ADDR)); 19106b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta av_sink_codec_info.avk_config.codec_info = p_scb->cfg.codec_info; 1911f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT, 19126b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta &av_sink_codec_info); 1913f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1914f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1915271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh if ((uuid_int == UUID_SERVCLASS_AUDIO_SOURCE) && 1916271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh (cfg.codec_info[SBC_MAX_BITPOOL_OFFSET] > SBC_MAX_BITPOOL)) 1917271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh { 1918271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh APPL_TRACE_WARNING("%s max bitpool length received for SBC is out of range." 1919271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh "Clamping the codec bitpool configuration from %d to %d.", __func__, 1920271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh cfg.codec_info[SBC_MAX_BITPOOL_OFFSET], SBC_MAX_BITPOOL); 1921271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh cfg.codec_info[SBC_MAX_BITPOOL_OFFSET] = SBC_MAX_BITPOOL; 1922271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh } 1923271c217a2c82b92a4d52dcace40bedea227a6c24Ayan Ghosh 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open the stream */ 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_OpenReq(p_scb->seps[p_scb->sep_idx].av_handle, p_scb->peer_addr, 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[p_scb->sep_info_idx].seid, &cfg); 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_is_rcfg_sst(p_scb)) 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* free capabilities buffer */ 1931abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_scb->p_cap); 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try the next stream, if any */ 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx++; 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_next_getcap(p_scb, p_data); 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_setconfig_rej 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send AVDTP set config reject. 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_setconfig_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_REJECT reject; 1955f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 avdt_handle = p_data->ci_setconfig.avdt_handle; 1956f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1957f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, avdt_handle); 1958e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_setconfig_rej: sep_idx: %d",p_scb->sep_idx); 1959f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_UNSUP_CFG, 0); 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(reject.bd_addr, p_data->str_msg.bd_addr); 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reject.hndl = p_scb->hndl; 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_REJECT_EVT, (tBTA_AV *) &reject); 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_discover_req 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP discover request to the peer. 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_discover_req (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 19785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send avdtp discover request */ 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19815738f83aeb59361a0a2eda2460113f6dc919427The 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]); 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_conn_failed 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDTP connection failed. 19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_conn_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_FAIL_STREAM; 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_closed(p_scb, p_data); 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_do_start 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start stream. 20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_do_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cur_role; 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2013e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started); 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.sco_occupied) 20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_failed(p_scb, p_data); 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* disallow role switch during streaming, only if we are the master role 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * i.e. allow role switch, if we are slave. 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * It would not hurt us, if the peer device wants us to be master */ 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_GetRole (p_scb->peer_addr, &cur_role) == BTM_SUCCESS) && 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (cur_role == BTM_ROLE_MASTER) ) 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_clear_policy(BTA_ID_AV, policy, p_scb->peer_addr); 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->started == FALSE) && ((p_scb->role & BTA_AV_ROLE_START_INT) == 0)) 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_START_INT; 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_StartReq(&p_scb->avdt_handle, 1); 20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 203877d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy else if (p_scb->started) 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 204077d1cb6ff904b48ee85c09a06c5e05dd0ed049b9Kausik Sinnaswamy p_scb->role |= BTA_AV_ROLE_START_INT; 2041379743beded881127703334e1dda2cd327ec651dZhihai Xu if ( p_scb->wait == 0 ) { 2042379743beded881127703334e1dda2cd327ec651dZhihai Xu if (p_scb->role & BTA_AV_ROLE_SUSPEND) { 2043379743beded881127703334e1dda2cd327ec651dZhihai Xu notify_start_failed(p_scb); 2044379743beded881127703334e1dda2cd327ec651dZhihai Xu } else { 2045379743beded881127703334e1dda2cd327ec651dZhihai Xu bta_av_start_ok(p_scb, NULL); 2046379743beded881127703334e1dda2cd327ec651dZhihai Xu } 2047379743beded881127703334e1dda2cd327ec651dZhihai Xu } 20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2049e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("started %d role:x%x", p_scb->started, p_scb->role); 20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_stopped 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream stopped. 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_stopped (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SUSPEND suspend_rsp; 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 start = p_scb->started; 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN sus_evt = TRUE; 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2069e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_str_stopped:audio_open_cnt=%d, p_data %x", 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.audio_open_cnt, p_data); 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2077d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (p_scb->co_started) 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 207912265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov vendor_get_interface()->send_command( 208012265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov (vendor_opcode_t)BT_VND_OP_A2DP_OFFLOAD_STOP, 208112265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov (void*)&p_scb->l2c_cid); 208247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (p_scb->offload_start_pending) { 208347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule tBTA_AV_STATUS status = BTA_AV_FAIL_STREAM; 208447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV *)&status); 208547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 208647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->offload_start_pending = FALSE; 208747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, FALSE); 20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, L2CAP_DEFAULT_FLUSH_TO); 20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095725278f12ed5f0931fb361e8e5a0ae563afc287bChris Manton /* if q_info.a2d_list is not empty, drop it now */ 2096d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (BTA_AV_CHNL_AUDIO == p_scb->chnl) { 2097d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton while (!list_is_empty(p_scb->a2d_list)) 2098d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton { 2099d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton p_buf = (BT_HDR *)list_front(p_scb->a2d_list); 2100d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton list_remove(p_scb->a2d_list, p_buf); 2101abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 2102d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton } 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the audio buffers queued in L2CAP */ 2105d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (p_data && p_data->api_stop.flush) 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.chnl = p_scb->chnl; 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.hndl = p_scb->hndl; 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && p_data->api_stop.suspend) 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2114e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("suspending: %d, sup:%d", start, p_scb->suspend_sup); 21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((start) && (p_scb->suspend_sup)) 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sus_evt = FALSE; 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_bufs = 0; 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SuspendReq(&p_scb->avdt_handle, 1); 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2122ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* send SUSPEND_EVT event only if not in reconfiguring state and sus_evt is TRUE*/ 2123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((sus_evt)&&(p_scb->state != BTA_AV_RCFG_SST)) 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = TRUE; 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_SUSPEND_EVT, (tBTA_AV *) &suspend_rsp); 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = TRUE; 2134e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_str_stopped status %d", suspend_rsp.status); 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2136ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* send STOP_EVT event only if not in reconfiguring state */ 2137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->state != BTA_AV_RCFG_SST) 2138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2139ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*bta_av_cb.p_cback)(BTA_AV_STOP_EVT, (tBTA_AV *) &suspend_rsp); 2140ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_reconfig 21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the reconfigure request. 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** save the parameter in control block and 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** suspend, reconfigure or close the stream 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_reconfig (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CFG *p_cfg; 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_STOP stop; 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_RCFG *p_rcfg = &p_data->api_reconfig; 21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2161e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)", 21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->recfg_sup, p_scb->suspend_sup, 21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rcfg_idx, p_scb->sep_info_idx); 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg = 0; 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* store the new configuration in control block */ 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_cap == NULL) 21685fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->p_cap = (tAVDT_CFG *)osi_malloc(sizeof(tAVDT_CFG)); 21695fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_cfg = p_scb->p_cap; 21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 217178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->avrc_ct_timer); 21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg, &p_scb->cfg, sizeof(tAVDT_CFG)); 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->num_protect = p_rcfg->num_protect; 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg->codec_info, p_rcfg->codec_info, AVDT_CODEC_SIZE); 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cfg->protect_info, p_rcfg->p_protect_info, p_rcfg->num_protect); 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->rcfg_idx = p_rcfg->sep_info_idx; 21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the requested index differs from the current one, we can only close/open */ 21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->rcfg_idx == p_scb->sep_info_idx) && 21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_rcfg->suspend)&& (p_scb->recfg_sup) && (p_scb->suspend_sup)) 21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started) 21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.flush = FALSE; 21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.suspend = TRUE; 21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, (tBTA_AV_DATA *)&stop); 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2192e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Reconfig"); 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap); 21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close the stream */ 2200e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("close/open num_protect: %d", p_cfg->num_protect); 22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started) 220215050770d16ebe2a66b01b0bec7dda7dfb8a0e02Kim Schulz { 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 221015050770d16ebe2a66b01b0bec7dda7dfb8a0e02Kim Schulz } 22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_data_path 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handle stream data path. 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_data_path (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2225d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton BT_HDR *p_buf = NULL; 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 data_len; 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 timestamp; 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_buf = FALSE; 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 m_pt = 0x60 | p_scb->codec_type; 2230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tAVDT_DATA_OPT_MASK opt; 22315cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2233d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (p_scb->cong) 22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton return; 2236d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton } 22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2238d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* 2239d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton APPL_TRACE_ERROR("q: %d", p_scb->l2c_bufs); 2240d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton */ 2241d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton //Always get the current number of bufs que'd up 2242d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton p_scb->l2c_bufs = (UINT8)L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_GET); 22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2244d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (!list_is_empty(p_scb->a2d_list)) { 2245d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton p_buf = (BT_HDR *)list_front(p_scb->a2d_list); 2246d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton list_remove(p_scb->a2d_list, p_buf); 2247d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* use q_info.a2d data, read the timestamp */ 2248d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton timestamp = *(UINT32 *)(p_buf + 1); 2249d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton } 2250d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton else 2251d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton { 2252d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton new_buf = TRUE; 2253d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* a2d_list empty, call co_data, dup data to other channels */ 2254d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton p_buf = (BT_HDR *)p_scb->p_cos->data(p_scb->codec_type, &data_len, 2255d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton ×tamp); 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2257d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (p_buf) 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2259d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* use the offset area for the time stamp */ 2260d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton *(UINT32 *)(p_buf + 1) = timestamp; 2261d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton 2262d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* dup the data to other channels */ 2263d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton bta_av_dup_audio_buf(p_scb, p_buf); 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2265d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton } 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2267d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if(p_buf) 2268d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton { 2269d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if(p_scb->l2c_bufs < (BTA_AV_QUEUE_DATA_CHK_NUM)) 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2271d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* there's a buffer, just queue it to L2CAP */ 2272d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* There's no need to increment it here, it is always read from L2CAP see above */ 2273d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* p_scb->l2c_bufs++; */ 2274d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* 2275d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton APPL_TRACE_ERROR("qw: %d", p_scb->l2c_bufs); 2276d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton */ 2277d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton 2278d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* opt is a bit mask, it could have several options set */ 2279d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton opt = AVDT_DATA_OPT_NONE; 2280d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (p_scb->no_rtp_hdr) 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2282d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton opt |= AVDT_DATA_OPT_NO_RTP; 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton AVDT_WriteReqOpt(p_scb->avdt_handle, p_buf, timestamp, m_pt, opt); 2286d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton p_scb->cong = TRUE; 2287d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton } 2288d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton else 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2290d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* there's a buffer, but L2CAP does not seem to be moving data */ 2291d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if(new_buf) 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2293d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* just got this buffer from co_data, 2294d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton * put it in queue */ 2295d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton list_append(p_scb->a2d_list, p_buf); 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2299d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* just dequeue it from the a2d_list */ 2300d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton if (list_length(p_scb->a2d_list) < 3) { 2301d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* put it back to the queue */ 2302d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton list_prepend(p_scb->a2d_list, p_buf); 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2306d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton /* too many buffers in a2d_list, drop it. */ 2307d44d6401d2c0e0309f0d28a1412c295ea9fa6d7eChris Manton bta_av_co_audio_drop(p_scb->hndl); 2308abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_start_ok 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream started. 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_start_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_API_STOP stop; 23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN initiator = FALSE; 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN suspend = FALSE; 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 flush_to; 23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 new_role = p_scb->role; 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR hdr; 2333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 policy = HCI_ENABLE_SNIFF_MODE; 2334ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 cur_role; 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2336e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role); 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = TRUE; 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_suspend) 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_suspend = FALSE; 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_role & BTA_AV_ROLE_START_INT) 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project initiator = TRUE; 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2347f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* for A2DP SINK we do not send get_caps */ 2348f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ((p_scb->avdt_handle == p_scb->seps[p_scb->sep_idx].av_handle) 2349f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta &&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK)) 2350f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2351f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON); 2352e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Local SEP type is SNK new wait is 0x%x",p_scb->wait); 2353f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_FAILED) 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role switch has failed */ 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_FAILED; 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data = (tBTA_AV_DATA *)&hdr; 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hdr.offset = BTA_AV_RS_FAIL; 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2361e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("wait:x%x", p_scb->wait); 23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && (p_data->hdr.offset != BTA_AV_RS_NONE)) 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->hdr.offset == BTA_AV_RS_FAIL) 23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT)) 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_START; 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The wait flag may be set here while we are already master on the link */ 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this could happen if a role switch complete event occurred during reconfig */ 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we are now master on the link, there is no need to wait for the role switch, */ 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complete anymore so we can clear the wait for role switch flag */ 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait & (BTA_AV_WAIT_ROLE_SW_RES_OPEN|BTA_AV_WAIT_ROLE_SW_RES_START)) 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_ROLE_SW_STARTED; 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_START; 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->wait) 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2397afa6e1abbedaad8fe854b0f43999b8aeb801af91Matthew Xie APPL_TRACE_ERROR("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag); 2398ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh /* Clear first bit of p_scb->wait and not to return from this point else 2399ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh * HAL layer gets blocked. And if there is delay in Get Capability response as 2400ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh * first bit of p_scb->wait is cleared hence it ensures bt_av_start_ok is not called 2401ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh * again from bta_av_save_caps. 2402ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh */ 2403ffc849a2958b812161e3e67964cd96efe13e31f3Rohit Singh p_scb->wait &= ~BTA_AV_WAIT_ACP_CAPS_ON; 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell role manager to check M/S role */ 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->media_type == AVDT_MEDIA_AUDIO) 24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in normal logic, conns should be bta_av_cb.audio_count - 1, 24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, bta_av_stream_chg is not called to increase bta_av_cb.audio_count yet. 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the code were to be re-arranged for some reasons, this number may need to be changed 24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = bta_av_cb.audio_open_cnt; 24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flush_to = p_bta_av_cfg->p_audio_flush_to[p_scb->co_started - 1]; 24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project flush_to = p_bta_av_cfg->video_flush_to; 24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, flush_to ); 24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the congestion flag */ 24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_role & BTA_AV_ROLE_START_INT) 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_role &= ~BTA_AV_ROLE_START_INT; 24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((new_role & BTA_AV_ROLE_AD_ACP) && (new_role & BTA_AV_ROLE_SUSPEND_OPT)) 24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend = TRUE; 24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!suspend) 24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->q_tag = BTA_AV_Q_TAG_STREAM; 24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, TRUE); 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If sink starts stream, disable sniff mode here */ 2446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!initiator) 2447ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If souce is the master role, disable role switch during streaming. 2449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Otherwise allow role switch, if source is slave. 2450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Because it would not hurt source, if the peer device wants source to be master */ 2451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((BTM_GetRole (p_scb->peer_addr, &cur_role) == BTM_SUCCESS) && 2452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (cur_role == BTM_ROLE_MASTER) ) 2453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 2455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2457ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_sys_clear_policy(BTA_ID_AV, policy, p_scb->peer_addr); 2458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role = new_role; 24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_AD_ACP; 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND_OPT; 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2464ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->no_rtp_hdr = FALSE; 2465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->p_cos->start(p_scb->hndl, p_scb->codec_type, p_scb->cfg.codec_info, &p_scb->no_rtp_hdr); 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = TRUE; 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2468e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_start_ok suspending: %d, role:x%x, init %d", 24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend, p_scb->role, initiator); 24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.suspending = suspend; 24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = initiator; 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_SUCCESS; 24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(suspend) 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role |= BTA_AV_ROLE_SUSPEND; 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = TRUE; /* do not allow the media data to go through */ 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do not duplicate the media packets to this channel */ 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.flush = FALSE; 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stop.suspend = TRUE; 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_STOP_EVT, (tBTA_AV_DATA *)&stop); 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_start_failed 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream start failed. 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_start_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25035cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 25045cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->started == FALSE && p_scb->co_started == FALSE) 25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 2508379743beded881127703334e1dda2cd327ec651dZhihai Xu notify_start_failed(p_scb); 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_SNIFF_MODE|HCI_ENABLE_MASTER_SLAVE_SWITCH), p_scb->peer_addr); 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_suspend = FALSE; 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_str_closed 25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Stream closed. 25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_str_closed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV data; 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_EVT event; 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_cb.audio_open_cnt <= 1) 25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* last connection - restore the allow switch flag */ 25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetDesireRole(L2CAP_ROLE_ALLOW_SWITCH); 25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->open_status) 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* must be failure when opening the stream */ 25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(data.open.bd_addr, p_scb->peer_addr); 25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.status = p_scb->open_status; 25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.chnl = p_scb->chnl; 25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.open.hndl = p_scb->hndl; 2547f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2548f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC ) 2549f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta data.open.sep = AVDT_TSEP_SNK; 2550f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK ) 2551f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta data.open.sep = AVDT_TSEP_SRC; 2552f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AV_OPEN_EVT; 25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->open_status = BTA_AV_SUCCESS; 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup(p_scb, p_data); 25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(event, &data); 25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do stop if we were started */ 25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->co_started) 25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_str_stopped(p_scb, NULL); 25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update common mtu shared by remaining connectons */ 25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU); 25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->close(p_scb->hndl, p_scb->codec_type, mtu); 25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.close.chnl = p_scb->chnl; 25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.close.hndl = p_scb->hndl; 25755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AV_CLOSE_EVT; 25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_conn_close(BTA_ID_AV, p_scb->app_id, p_scb->peer_addr); 25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cleanup(p_scb, p_data); 25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(event, &data); 25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_clr_cong 25875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Clear stream congestion flag. 25895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 25915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_clr_cong (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 25945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25955cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 25965cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_suspend_cfm 26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process the suspend response 26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_suspend_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SUSPEND suspend_rsp; 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 policy = HCI_ENABLE_SNIFF_MODE; 26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2616e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d", 26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.audio_open_cnt, err_code); 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26195ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu if (p_scb->started == FALSE) 26205ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu { 26215ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu /* handle the condition where there is a collision of SUSPEND req from either side 26225ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu ** Second SUSPEND req could be rejected. Do not treat this as a failure 26235ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu */ 2624e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_av_suspend_cfm: already suspended, ignore, err_code %d", 26255ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu err_code); 26265ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu return; 26275ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu } 26285ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu 26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_SUCCESS; 26305ae72cf049004ac3c0f2f2bc048d1638a3b13d55Zhihai Xu if (err_code && (err_code != AVDT_ERR_BAD_STATE)) 26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable suspend feature only with explicit rejection(not with timeout) */ 2633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2635ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->suspend_sup = FALSE; 2636ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.status = BTA_AV_FAIL; 26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2639e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR ("bta_av_suspend_cfm: suspend failed, closing connection"); 26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SUSPEND failed. Close connection. */ 26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL); 26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only set started to FALSE when suspend is successful */ 26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_scb->role & BTA_AV_ROLE_SUSPEND) 26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND; 26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); 26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 || bta_av_cb.audio_open_cnt == 1) 26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_set_policy(BTA_ID_AV, policy, p_scb->peer_addr); 26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* in case that we received suspend_ind, we may need to call co_stop here */ 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->co_started) 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 266412265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov vendor_get_interface()->send_command( 266512265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov (vendor_opcode_t)BT_VND_OP_A2DP_OFFLOAD_STOP, 266612265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov (void*)&p_scb->l2c_cid); 266747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (p_scb->offload_start_pending) { 266847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule tBTA_AV_STATUS status = BTA_AV_FAIL_STREAM; 266947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV *)&status); 267047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 267147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->offload_start_pending = FALSE; 267247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_stream_chg(p_scb, FALSE); 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->co_started = FALSE; 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scb->peer_addr, L2CAP_DEFAULT_FLUSH_TO); 26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.chnl = p_scb->chnl; 26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.hndl = p_scb->hndl; 26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend_rsp.initiator = p_data->str_msg.initiator; 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_SUSPEND_EVT, (tBTA_AV *) &suspend_rsp); 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_str_ok 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description report reconfigure successful 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_str_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 27025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->l2c_cid = AVDT_GetL2CapChannel(p_scb->avdt_handle); 2705e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid); 27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* rc listen */ 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_st_rc_timer(p_scb, NULL); 2709abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_scb->p_cap); 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No need to keep the role bits once reconfig is done. */ 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_AD_ACP; 27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_SUSPEND_OPT; 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->role &= ~BTA_AV_ROLE_START_INT; 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reconfigure success */ 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_SUCCESS; 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_failed 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description process reconfigure failed 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2738e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x", 27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg, bta_av_cb.conn_lcb); 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cco_close(p_scb, p_data); 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_STREAM; 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* go to closing state */ 27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL); 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open failed. try again */ 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.conn_lcb) 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_DisconnectReq(p_scb->peer_addr, bta_av_dt_cback[p_scb->hdi]); 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_connect_req(p_scb, NULL); 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_connect 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description stream closed. reconnect the stream 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_connect (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 27785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 2781e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg); 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* let bta_av_rcfg_failed report fail */ 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rcfg_failed(p_scb, NULL); 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_discntd 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDT disconnected. reconnect the stream 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_discntd (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 28035cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg); 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->num_recfg++; 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY) 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL_STREAM; 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.chnl = p_scb->chnl; 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.hndl = p_scb->hndl; 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report close event & go to init state */ 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, NULL); 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ConnectReq(p_scb->peer_addr, p_scb->sec_mask, bta_av_dt_cback[p_scb->hdi]); 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_suspend_cont 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description received the suspend response. 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** continue to reconfigure the stream 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_suspend_cont (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_RECONFIG evt; 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->started = FALSE; 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cong = FALSE; 2838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code) 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (AVDT_ERR_CONNECT == err_code) 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report failure */ 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.status = BTA_AV_FAIL; 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_RECONFIG_EVT, (tBTA_AV *)&evt); 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_DISC_FAIL_EVT, NULL); 28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2849e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("suspend rejected, try close"); 2850ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable suspend feature only with explicit rejection(not with timeout) */ 2851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->suspend_sup = FALSE; 2854ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2863e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_suspend_cont calling AVDT_ReconfigReq"); 28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reconfig the stream */ 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap); 28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cap->psc_mask = p_scb->cur_psc_mask; 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_cfm 28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description if reconfigure is successful, report the event 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, close the stream. 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_cfm (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = p_data->str_msg.msg.hdr.err_code; 28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 2886e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_cfm"); 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code) 28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2890e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("reconfig rejected, try close"); 2891ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable reconfiguration feature only with explicit rejection(not with timeout) */ 2892ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (err_code != AVDT_ERR_TIMEOUT) 2893ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2894ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_scb->recfg_sup = FALSE; 2895ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* started flag is FALSE when reconfigure command is sent */ 28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* drop the buffers queued in L2CAP */ 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_ALL); 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_CloseReq(p_scb->avdt_handle); 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2903ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* update the codec info after rcfg cfm */ 2904ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(p_scb->cfg.codec_info,p_data->str_msg.msg.reconfig_cfm.p_cfg->codec_info,AVDT_CODEC_SIZE); 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* take the SSM back to OPEN state */ 29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_STR_OPEN_OK_EVT, NULL); 29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_rcfg_open 29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description AVDT is connected. open the stream with the new configuration 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_rcfg_open (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29215cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 29225cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 2923e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks); 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->num_disc_snks == 0) 29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to update call-out module so that it will be ready for discover */ 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_cos->stop(p_scb->hndl, p_scb->codec_type); 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send avdtp discover request */ 29315738f83aeb59361a0a2eda2460113f6dc919427The 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]); 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_type = p_scb->p_cap->codec_info[BTA_AV_CODEC_TYPE_IDX]; 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_scb->cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE); 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we may choose to use a different SEP at reconfig. 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * adjust the sep_idx now */ 2939f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC)); 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open the stream with the new config */ 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info_idx = p_scb->rcfg_idx; 29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_OpenReq(p_scb->avdt_handle, p_scb->peer_addr, 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sep_info[p_scb->sep_info_idx].seid, p_scb->p_cap); 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_security_rej 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send an AVDTP security reject. 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_security_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 29615cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_SecurityRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_BAD_STATE, 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 0); 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_chk_2nd_start 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description check if this is 2nd stream and if it needs to be started. 29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function needs to be kept very similar to bta_av_chk_start 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_chk_2nd_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_SCB *p_scbi; 29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN new_started = FALSE; 29815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->chnl == BTA_AV_CHNL_AUDIO) && (bta_av_cb.audio_open_cnt >= 2)) 29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* more than one audio channel is connected */ 29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_scb->role & BTA_AV_ROLE_SUSPEND_OPT)) 29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this channel does not need to be reconfigured. 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * if there is other channel streaming, start the stream now */ 29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_AV_NUM_STRS; i++) 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scbi = bta_av_cb.p_scb[i]; 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started) 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!new_started) 29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start the new stream */ 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_started = TRUE; 29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* may need to update the flush timeout of this already started stream */ 30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scbi->co_started != bta_av_cb.audio_open_cnt) 30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scbi->co_started = bta_av_cb.audio_open_cnt; 30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_SetFlushTimeout(p_scbi->peer_addr, p_bta_av_cfg->p_audio_flush_to[p_scbi->co_started - 1] ); 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_rc 30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a message to main SM to open RC channel. 30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_rc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_START start; 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3026e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role); 30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) && (p_scb->q_tag == BTA_AV_Q_TAG_START)) 30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* waiting for role switch for some reason & the timer expires */ 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT)) 30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3032e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR ("failed to start streaming for role management reasons!!"); 303378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_scb->avrc_ct_timer); 30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.chnl = p_scb->chnl; 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.status = BTA_AV_FAIL_ROLE; 30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.initiator = TRUE; 30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start.hndl = p_scb->hndl; 30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS; 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); 30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role switch is done. continue to start streaming */ 30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_cb.rs_idx = 0; 30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->hdr.offset = BTA_AV_RS_OK; 30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_start_ok (p_scb, p_data); 30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->use_rc == TRUE || (p_scb->role & BTA_AV_ROLE_AD_ACP) ) 30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_av_cb.disc) 30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* AVRC discover db is in use */ 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) 30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* AVRC channel is not connected. delay a little bit */ 306078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) == 0) { 306178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_sys_start_timer(p_scb->avrc_ct_timer, 306278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AV_RC_DISC_TIME_VAL, 306378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AV_AVRC_TIMER_EVT, p_scb->hndl); 306478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } else { 30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->wait |= BTA_AV_WAIT_CHECK_RC; 306678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use main SM for AVRC SDP activities */ 30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_rc_disc((UINT8)(p_scb->hdi + 1)); 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTA_AV_RC_HANDLE_NONE != p_scb->rc_handle) 30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the open API said that this handle does not want a RC connection. 30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect it now */ 30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVRC_Close(p_scb->rc_handle); 30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_av_open_at_inc 30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called if API open is called by application 30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** while state-machine is at incoming state. 30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_open_at_inc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); 30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask |= BTA_AV_COLL_API_CALLED; 31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* API open will be handled at timeout if SNK did not start signalling. */ 31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* API open will be ignored if SNK starts signalling. */ 31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SNK did not start signalling, API was called N seconds timeout. */ 31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to switch to INIT state and start opening connection. */ 31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->coll_mask = 0; 31125fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_av_set_scb_sst_init(p_scb); 31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31145fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTA_AV_API_OPEN *p_buf = 31155fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBTA_AV_API_OPEN *)osi_malloc(sizeof(tBTA_AV_API_OPEN)); 31165fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(p_buf, &(p_scb->open_api), sizeof(tBTA_AV_API_OPEN)); 3117b5b7552826d1fb17eb98956e7b60e3b2288709b1Ayan Ghosh p_scb->skip_sdp = TRUE; 31185fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_sys_sendmsg(p_buf); 31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 312247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule/******************************************************************************* 312347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 312447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Function bta_av_offload_req 312547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 312647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Description This function is called if application requests offload of 312747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** a2dp audio. 312847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 312947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Returns void 313047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 313147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule*******************************************************************************/ 313247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsulevoid bta_av_offload_req(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 313347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule{ 313447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule tBTA_AV_STATUS status = BTA_AV_FAIL_RESOURCES; 313547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule UINT16 mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu); 313647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 313747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule APPL_TRACE_DEBUG("%s stream %s, audio channels open %d", __func__, 313847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->started ? "STARTED" : "STOPPED", bta_av_cb.audio_open_cnt); 313947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 314047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule /* Check if stream has already been started. */ 314147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule /* Support offload if only one audio source stream is open. */ 314247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (p_scb->started != TRUE) { 314347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule status = BTA_AV_FAIL_STREAM; 314447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 314547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } else if (bta_av_cb.audio_open_cnt == 1 && 314647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC && 314747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->chnl == BTA_AV_CHNL_AUDIO) { 314847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 314947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule bt_vendor_op_a2dp_offload_t a2dp_offload_start; 315047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 315147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (L2CA_GetConnectionConfig(p_scb->l2c_cid, &a2dp_offload_start.acl_data_size, 315247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule &a2dp_offload_start.remote_cid, &a2dp_offload_start.lm_handle)) { 315347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 315447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule APPL_TRACE_DEBUG("%s l2cmtu %d lcid 0x%02X rcid 0x%02X lm_handle 0x%02X", __func__, 315547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.acl_data_size, p_scb->l2c_cid, 315647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.remote_cid, a2dp_offload_start.lm_handle); 315747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 315847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.bta_av_handle = p_scb->hndl; 315947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.xmit_quota = BTA_AV_A2DP_OFFLOAD_XMIT_QUOTA; 316047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.stream_mtu = (mtu < p_scb->stream_mtu) ? mtu : p_scb->stream_mtu; 316147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.local_cid = p_scb->l2c_cid; 316247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.is_flushable = TRUE; 316347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_offload_start.stream_source = ((UINT32)(p_scb->cfg.codec_info[1] | p_scb->cfg.codec_info[2])); 316447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 316547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule memcpy(a2dp_offload_start.codec_info, p_scb->cfg.codec_info, 316647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule sizeof(a2dp_offload_start.codec_info)); 316747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 316812265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov if (!vendor_get_interface()->send_command( 316912265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov (vendor_opcode_t)BT_VND_OP_A2DP_OFFLOAD_START, 317012265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavov &a2dp_offload_start)) { 317147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule status = BTA_AV_SUCCESS; 317247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->offload_start_pending = TRUE; 317347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 317447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 317547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 317647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 317747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (status != BTA_AV_SUCCESS) 317847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV *)&status); 317947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule} 318047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 318147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule/******************************************************************************* 318247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 318347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Function bta_av_offload_rsp 318447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 318547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Description This function is called when the vendor lib responds to 318647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** BT_VND_OP_A2DP_OFFLOAD_START. 318747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 318847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Returns void 318947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 319047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule*******************************************************************************/ 319147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsulevoid bta_av_offload_rsp(tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) 319247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule{ 319347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule tBTA_AV_STATUS status = p_data->api_status_rsp.status; 319447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 319547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule APPL_TRACE_DEBUG("%s stream %s status %s", __func__, 319647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->started ? "STARTED" : "STOPPED", 319747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule status ? "FAIL" : "SUCCESS"); 319847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 319947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule /* Check if stream has already been started. */ 320047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule if (status == BTA_AV_SUCCESS && p_scb->started != TRUE) { 320147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule status = BTA_AV_FAIL_STREAM; 320247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 320347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 320447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule p_scb->offload_start_pending = FALSE; 320547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV *)&status); 320647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule} 320747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED */ 3209