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 functions for managing the SCO connection used in AG. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_co.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_co.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AG_SCO_DEBUG 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_SCO_DEBUG FALSE 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AG_CODEC_NEGO_TIMEOUT 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CODEC_NEGO_TIMEOUT 3000 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_evt_str(UINT8 event); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_state_str(UINT8 state); 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_NO_EDR_ESCO (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | \ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* sco events */ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_LISTEN_E, /* listen request */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_OPEN_E, /* open request */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_XFER_E, /* transfer request */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CN_DONE_E, /* codec negotiation done */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_REOPEN_E, /* Retry with other codec when failed */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CLOSE_E, /* close request */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_SHUTDOWN_E, /* shutdown request */ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CONN_OPEN_E, /* sco open */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CONN_CLOSE_E, /* sco closed */ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CI_DATA_E /* SCO data ready */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_NUM_CODECS 3 7366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD */ 7466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_ESCO_SETTING_IDX_T1 1 /* eSCO setting for mSBC T1 */ 7566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_ESCO_SETTING_IDX_T2 2 /* eSCO setting for mSBC T2 */ 7666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CVSD */ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5 + 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission effort */ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }, 9566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* mSBC T1 */ 9666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 9766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ 9866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ 9966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 8, /* 8 ms */ 10066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ 10166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + NO_2_EV3 */ 10266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 10366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 10466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 | 10566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 ), 10666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ 10766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie }, 10866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* mSBC T2*/ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13, /* 13 ms */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + 2-EV3 */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 12266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie/* WBS not included, CVSD by default */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS bta_ag_esco_params = 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5 + 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission effort */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_cback 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM SCO connection callback. 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_conn_cback(UINT16 sco_idx) 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match callback to scb; first check current sco scb */ 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb->in_use) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_scb_to_idx(bta_ag_cb.sco.p_curr_scb); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* then check for scb connected to this peer */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if SLC is up */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_idx_by_bdaddr(BTM_ReadScoBdAddr(sco_idx)); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = bta_ag_scb_by_idx(handle); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb && !p_scb->svc_conn) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = 0; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle != 0) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTA_AG_SCO_OPEN_EVT; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific = handle; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no match found; disconnect sco, init sco variables */ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_SHUTDOWN_ST; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoveSco(sco_idx); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_disc_cback 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM SCO disconnection callback. 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_disc_cback(UINT16 sco_idx) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = 0; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 205e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): sco_idx: 0x%x p_cur_scb: 0x%08x sco.state: %d", sco_idx, bta_ag_cb.sco.p_curr_scb, bta_ag_cb.sco.state); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 207e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u", 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &bta_ag_cb.scb[0], bta_ag_cb.scb[0].in_use, bta_ag_cb.scb[0].sco_idx, bta_ag_cb.scb[0].state); 209e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u", 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &bta_ag_cb.scb[1], bta_ag_cb.scb[1].in_use, bta_ag_cb.scb[1].sco_idx, bta_ag_cb.scb[1].state); 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match callback to scb */ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb->in_use) 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We only care about callbacks for the active SCO */ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb->sco_idx != sco_idx) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb->sco_idx != 0xFFFF) 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_scb_to_idx(bta_ag_cb.sco.p_curr_scb); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle != 0) 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ConfigScoPath(BTM_SCO_ROUTE_PCM, NULL, NULL, TRUE); 228e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sco_disc_cback sco close config status = %d", status); 22966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* SCO clean up here */ 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_close(); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Restore settings */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_ag_cb.sco.p_curr_scb->inuse_codec == BTA_AG_CODEC_MSBC) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* set_sco_codec(BTM_SCO_CODEC_NONE); we should get a close */ 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* If SCO open was initiated by AG and failed for mSBC, then attempt 24166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie mSBC with T1 settings i.e. 'Safe Settings'. If this fails, then switch to CVSD */ 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_opening (bta_ag_cb.sco.p_curr_scb)) 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (bta_ag_cb.sco.p_curr_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) 24566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 24666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("Fallback to mSBC T1 settings"); 24766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_cb.sco.p_curr_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T1; 24866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 24966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 25066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 25166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("Fallback to CVSD settings"); 25266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE; 25366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->inuse_codec = BTA_AG_CODEC_NONE; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTA_AG_SCO_CLOSE_EVT; 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific = handle; 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no match found */ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 270e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("no scb for ag_sco_disc_cback"); 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco could be closed after scb dealloc'ed */ 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_SHUTDOWN_ST; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_read_cback 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Callback function is the callback function for incoming 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SCO data over HCI. 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_read_cback (UINT16 sco_inx, BT_HDR *p_data, tBTM_SCO_DATA_FLAG status) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_SCO_DATA_CORRECT) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 296e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sco_read_cback: status(%d)", status); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Callout function must free the data. */ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_in_data (p_data, status); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_remove_sco 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes the specified SCO from the system. 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If only_active is TRUE, then SCO is only removed if connected 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN - TRUE if Sco removal was started 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_remove_sco(tBTA_AG_SCB *p_scb, BOOLEAN only_active) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN removed_started = FALSE; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!only_active || p_scb->sco_idx == bta_ag_cb.sco.cur_idx) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_RemoveSco(p_scb->sco_idx); 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 324e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status); 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sco is connected; set current control block */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project removed_started = TRUE; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no connection reset the sco handle */ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR) ) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = BTM_INVALID_SCO_INDEX; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return removed_started; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_esco_connreq_cback 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM eSCO connection requests and eSCO change requests 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Only the connection requests are processed by BTA. 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_esco_connreq_cback(tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle; 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sco_inx = p_data->conn_evt.sco_inx; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Only process connection requests */ 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_ESCO_CONN_REQ_EVT) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((handle = bta_ag_idx_by_bdaddr(BTM_ReadScoBdAddr(sco_inx))) != 0 && 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_scb = bta_ag_scb_by_idx(handle)) != NULL) && p_scb->svc_conn) 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = sco_inx; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no other SCO active, allow this one */ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_cb.sco.p_curr_scb) 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 371e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Begin a transfer: Close current SCO before responding */ 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 380e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_esco_connreq_cback: Begin XFER"); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_xfer_scb = p_scb; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.conn_data = p_data->conn_evt; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_OPEN_XFER_ST; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, TRUE)) 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 387e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_xfer_scb = NULL; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If error occurred send reject response immediately */ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 398e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("no scb for bta_ag_esco_connreq_cback or no resources"); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, NULL); 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Received a change in the esco link */ 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_ESCO_CHG_EVT) 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 405e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d", 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.sco_inx, 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.retrans_window, p_data->chg_evt.rx_pkt_len, 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.tx_pkt_len, p_data->chg_evt.tx_interval); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_cback_sco 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Call application callback function with SCO event. 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_cback_sco(tBTA_AG_SCB *p_scb, UINT8 event) 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_HDR sco; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco.handle = bta_ag_scb_to_idx(p_scb); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco.app_id = p_scb->app_id; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call close cback */ 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &sco); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_create_sco 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bd_addr = NULL; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS params; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC esco_codec = BTM_SCO_CODEC_CVSD; 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int codec_index = 0; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_ROUTE_TYPE sco_route; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 pcm_sample_rate; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure this sco handle is not already in use */ 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 461e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_ag_create_sco: Index 0x%04x Already In Use!", 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sco_codec == BTM_SCO_CODEC_MSBC) && 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_scb->codec_fallback && 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_scb->retry_with_sco_only) 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project esco_codec = BTM_SCO_CODEC_MSBC; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_fallback = FALSE; 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Force AG to send +BCS for the next audio connection. */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = TRUE; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* If WBS included, use CVSD by default, index is 0 for CVSD by initialization */ 48166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* If eSCO codec is mSBC, index is T2 or T1 */ 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTM_SCO_CODEC_MSBC) 48366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 48466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) 48566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 48666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie codec_index = BTA_AG_ESCO_SETTING_IDX_T2; 48766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 48866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 48966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 49066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie codec_index = BTA_AG_ESCO_SETTING_IDX_T1; 49166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 49266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_esco_params[codec_index]; 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 49666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* When WBS is not included, use CVSD by default */ 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_esco_params; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_ag_cb.sco.param_updated) /* If we do not use the default parameters */ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_cb.sco.params; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bta_ag_cb.sco.param_updated) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 50666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (esco_codec == BTM_SCO_CODEC_CVSD) /* For CVSD */ 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the application packet types (5 slot EV packets not allowed) */ 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params.packet_types = p_bta_ag_cfg->sco_pkt_types | 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if initiating set current scb and peer bd addr */ 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Attempt to use eSCO if remote host supports HFP >= 1.5 */ 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to find out from SIG if HSP can use eSCO; for now use SCO */ 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->conn_service == BTA_AG_HFP && p_scb->peer_version >= HFP_VERSION_1_5 && !p_scb->retry_with_sco_only) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, ¶ms); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If ESCO or EDR ESCO, retry with SCO only in case of failure */ 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||!((params.packet_types & ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ BTA_AG_NO_EDR_ESCO)) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec != BTA_AG_CODEC_MSBC) 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = TRUE; 533e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("Setting retry_with_sco_only to TRUE"); 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Do not use SCO when using mSBC */ 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 538e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("Setting retry_with_sco_only to FALSE"); 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = TRUE; 542e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("Setting retry_with_sco_only to TRUE"); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->retry_with_sco_only) 549e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("retrying with SCO only"); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE ) 56166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* Allow any platform specific pre-SCO set up to take place */ 56266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,\ 56366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie esco_codec); 56466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 56566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* This setting may not be necessary */ 56666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* To be verified with stable 2049 boards */ 56766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (esco_codec == BTA_AG_CODEC_MSBC) 56866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS); 56966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 57066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD); 57166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* save the current codec because sco_codec can be updated while SCO is open. */ 57266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->inuse_codec = esco_codec; 57366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allow any platform specific pre-SCO set up to take place */ 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP); 57666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTA_AG_CODEC_MSBC) 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_16K; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco_route = bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */ 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigScoPath(sco_route, bta_ag_sco_read_cback, NULL, TRUE); 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_addr = p_scb->peer_addr; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_CreateSco(p_bd_addr, is_orig, params.packet_types, 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_scb->sco_idx, bta_ag_sco_conn_cback, 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_disc_cback); 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_orig) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RegForEScoEvts(p_scb->sco_idx, bta_ag_esco_connreq_cback); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Initiating the connection, set the current sco handle */ 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 616e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x", 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig, p_scb->sco_idx, status, params.packet_types); 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** Function bta_ag_attempt_msbc_safe_settings 62466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 62566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** Description Checks if ESCO connection needs to be attempted using mSBC T1(safe) settings 62666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 62766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 62866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** Returns TRUE if T1 settings has to be used, FALSE otherwise 62966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 63066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie*******************************************************************************/ 63166432dcffe211e317d35978283a04a96d5620bdfMatthew XieBOOLEAN bta_ag_attempt_msbc_safe_settings(tBTA_AG_SCB *p_scb) 63266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie{ 63366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (p_scb->svc_conn && p_scb->sco_codec == BTM_SCO_CODEC_MSBC && 63466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T1) 63566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie return TRUE; 63666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 63766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie return FALSE; 63866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie} 63966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 64066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie/******************************************************************************* 64166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_cn_timer_cback 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_cn_timer_cback (TIMER_LIST_ENT *p_tle) 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tle) 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = (tBTA_AG_SCB *)p_tle->param; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb) 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Announce that codec negotiation failed. */ 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, FALSE); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_codec_negotiate 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initiate codec negotiation by sending AT command. 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If not necessary, skip negotiation. 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_codec_negotiate(tBTA_AG_SCB *p_scb) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 68366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if ((p_scb->codec_updated || p_scb->codec_fallback || 68466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_attempt_msbc_safe_settings(p_scb)) && 68566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie (p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC)) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the power mode to Active until sco open is completed. */ 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send +BCS to the peer */ 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_bcs(p_scb, NULL); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer to handle timeout */ 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cn_timer.p_cback = (TIMER_CBACK*)&bta_ag_cn_timer_cback; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cn_timer.param = (INT32)p_scb; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->cn_timer, 0, BTA_AG_CODEC_NEGO_TIMEOUT); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use same codec type as previous SCO connection, skip codec negotiation */ 70166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("use same codec type as previous SCO connection,skip codec negotiation"); 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, TRUE); 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 70566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif /* (BTM_WBS_INCLUDED == TRUE ) */ 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_event 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_event(tBTA_AG_SCB *p_scb, UINT8 event) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCO_CB *p_sco = &bta_ag_cb.sco; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_cn_scb = NULL; /* For codec negotiation */ 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 in_state = p_sco->state; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 729e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)", 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx, 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state, bta_ag_sco_state_str(p_sco->state), 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, bta_ag_sco_evt_str(event)); 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 734e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d, Event %d", 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx, p_sco->state, event); 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTA_AG_SCO_CI_DATA_E) 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (TRUE) 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_out_data(&p_buf); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf) 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->state == BTA_AG_SCO_OPEN_ST) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteScoData(p_sco->p_curr_scb->sco_idx, p_buf); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_sco->state) 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_ST: 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection */ 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 771e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_ST: 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ignore the event. We need to keep listening SCO for the active SLC */ 816e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 826e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CODEC_ST: 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CN_DONE_E: 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco open is not started yet. just go back to listening */ 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 878e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event); 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPENING_ST: 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* second headset has now joined */ 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_REOPEN_E: 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPEN_CL_ST; 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not opening scb, just close it */ 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPEN_ST; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 937e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event); 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_CL_ST: 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not opening scb, just close it */ 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection */ 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 982e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event); 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_XFER_ST: 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection */ 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove all connection */ 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* closed sco; place in listen mode and 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project accept the transferred connection */ 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); /* Back into listen mode */ 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Accept sco connection with xfer scb */ 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_sco->p_xfer_scb, &p_sco->conn_data); 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = p_sco->p_xfer_scb; 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->cur_idx = p_sco->p_xfer_scb->sco_idx; 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1018e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event); 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_ST: 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* second headset has now joined */ 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close current sco connection */ 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_sco->p_curr_scb, TRUE); 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection if active */ 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_remove_sco(p_scb, TRUE)) 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove all listening connections */ 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO was active on this scb, close it */ 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer closed sco; create sco listen connection */ 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1071e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event); 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSING_ST: 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_OP_ST; 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not closing scb, just close it */ 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer closed sco; create sco listen connection */ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1118e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event); 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_OP_ST: 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open sco connection */ 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1155e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_XFER_ST: 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection so headset can be transferred 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Probably entered this state from "opening state" */ 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear xfer scb */ 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear xfer scb */ 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* closed sco; place old sco in listen mode, 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project take current sco out of listen, and 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project create originating sco for current */ 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_sco->p_xfer_scb, FALSE); 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_sco->p_xfer_scb; 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_sco->p_xfer_scb, TRUE); 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1204e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event); 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTTING_ST: 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection; wait for conn close event */ 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Other instance is still listening */ 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Other instance is still listening */ 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1261e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event); 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->state != in_state) 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1272e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]", 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_state_str(in_state), 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_state_str(p_sco->state), 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_evt_str(event)); 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cn_scb) 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_codec_negotiate(p_cn_scb); 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_is_open 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check if sco is open for this scb. 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sco open for this scb, FALSE otherwise. 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sco_is_open(tBTA_AG_SCB *p_scb) 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_ST) && 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_is_opening 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check if sco is in Opening state. 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sco is in Opening state for this scb, FALSE otherwise. 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sco_is_opening(tBTA_AG_SCB *p_scb) 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (((bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST) || 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST)) && 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST) && 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_listen 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_listen(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_LISTEN_E); 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_open 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 event; 13545cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if another scb using sco, this is a transfer */ 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb != p_scb) 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_SCO_XFER_E; 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else it is an open */ 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_SCO_OPEN_E; 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, event); 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_close 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 13835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if scb is in use */ 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco_idx is not allocated in SCO_CODEC_ST, we still need to move to listening state. */ 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sco_idx != BTM_INVALID_SCO_INDEX) || (bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST)) 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1392e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx); 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_codec_nego 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_codec_nego(tBTA_AG_SCB *p_scb, BOOLEAN result) 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(result == TRUE) 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Subsequent sco connection will skip codec negotiation */ 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = FALSE; 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CN_DONE_E); 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* codec negotiation failed */ 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_shutdown 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_shutdown(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 14365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_SHUTDOWN_E); 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_open 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14525cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 14535cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_OPEN_E); 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 145866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 145966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON, 146066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->inuse_codec); 146166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON); 146366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open SCO codec if SCO is routed through transport */ 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_open(bta_ag_scb_to_idx(p_scb), BTA_SCO_OUT_PKT_SIZE, BTA_AG_CI_SCO_DATA_EVT); 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT); 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 147466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 147566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* reset to mSBC T2 settings as the preferred */ 147666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; 147766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_close 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = bta_ag_scb_to_idx(p_scb); 14935cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear current scb */ 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = BTM_INVALID_SCO_INDEX; 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* codec_fallback is set when AG is initiator and connection failed for mSBC. */ 150166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* OR if codec is msbc and T2 settings failed, then retry Safe T1 settings */ 150266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if ((p_scb->codec_fallback && p_scb->svc_conn) || 150366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_attempt_msbc_safe_settings(p_scb)) 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_REOPEN_E); 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->retry_with_sco_only && p_scb->svc_conn) 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* retry_with_sco_only is set when AG is initiator and connection failed for eSCO */ 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* retry_with_sco_only, will be set only when AG is initiator 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** and AG is first trying to establish an eSCO connection */ 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->retry_with_sco_only && p_scb->svc_conn) 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 152266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Indicate if the closing of audio is because of transfer */ 152466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\ 152566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF,p_scb->inuse_codec); 152666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 152766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* Indicate if the closing of audio is because of transfer */ 152866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\ 152966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF); 153066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E); 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In case call stays alive regardless of sco, av should not be affected. */ 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(((p_scb->call_ind == BTA_AG_CALL_INACTIVE) && (p_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE)) 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END)) 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); 154566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 154666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; 154766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 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_ag_sco_conn_rsp 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the SCO connection request 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data) 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS resp; 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 hci_status = HCI_SUCCESS; 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 pcm_sample_rate; 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.state == BTA_AG_SCO_LISTEN_ST || 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state == BTA_AG_SCO_CLOSE_XFER_ST || 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_XFER_ST) 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If script overrided sco parameter by BTA_CMD_SET_ESCO_PARAM */ 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.param_updated) 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = bta_ag_cb.sco.params; 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.rx_bw = BTM_64KBITS_RATE; 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.tx_bw = BTM_64KBITS_RATE; 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.max_latency = 10; 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.voice_contfmt = 0x60; 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.retrans_effort = BTM_ESCO_RETRANS_POWER; 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->link_type == BTM_LINK_TYPE_SCO) 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.packet_types = (BTM_SCO_LINK_ONLY_MASK | 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Allow controller to use all types available except 5-slot EDR */ 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.packet_types = (BTM_SCO_LINK_ALL_PKT_MASK | 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 160766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == FALSE ) 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allow any platform specific pre-SCO set up to take place */ 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP); 161066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When HS initiated SCO, it cannot be WBS. */ 161266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* Allow any platform specific pre-SCO set up to take place */ 161366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP, 161466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTA_AG_CODEC_CVSD); 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */ 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigScoPath(bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id), 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_read_cback, NULL, TRUE); 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_status = HCI_ERR_HOST_REJECT_DEVICE; 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO open was initiated from HS, it must be CVSD */ 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inuse_codec = BTA_AG_CODEC_NONE; 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp); 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_ci_sco_data 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the SCO data ready callin event 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_ci_sco_data(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_scb); 16495cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 16505cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CI_DATA_E); 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_set_esco_param 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update esco parameters from script wrapper. 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_set_esco_param(BOOLEAN set_reset, tBTM_ESCO_PARAMS *param) 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(set_reset == FALSE) /* reset the parameters to default */ 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.param_updated = FALSE; 1671e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_set_esco_param : Resetting ESCO parameters to default"); 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.param_updated = TRUE; 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.params = *param; 1677e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_set_esco_param : Setting ESCO parameters"); 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Debugging functions 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_evt_str(UINT8 event) 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Listen Request"; 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open Request"; 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Transfer Request"; 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CN_DONE_E: 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Codec Negotiation Done"; 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_REOPEN_E: 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Reopen Request"; 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close Request"; 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutdown Request"; 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opened"; 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Closed"; 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CI_DATA_E : 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Sco Data"; 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown SCO Event"; 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_state_str(UINT8 state) 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_ST: 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutdown"; 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_ST: 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Listening"; 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CODEC_ST: 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Codec Negotiation"; 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPENING_ST: 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opening"; 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_CL_ST: 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open while closing"; 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_XFER_ST: 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opening while Transferring"; 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_ST: 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open"; 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSING_ST: 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Closing"; 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_OP_ST: 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close while Opening"; 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_XFER_ST: 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close while Transferring"; 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTTING_ST: 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutting Down"; 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown SCO State"; 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1751