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 25933926c92e1378cc76bc9c149107e670c4872d4eScott James Remnant#include <stddef.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_co.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_co.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_int.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 34258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AG_SCO_DEBUG 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_SCO_DEBUG FALSE 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Codec negotiation timeout */ 4278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#ifndef BTA_AG_CODEC_NEGOTIATION_TIMEOUT_MS 4378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_AG_CODEC_NEGOTIATION_TIMEOUT_MS (3 * 1000) /* 3 seconds */ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_bta_alarm_queue; 4778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_evt_str(UINT8 event); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_state_str(UINT8 state); 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_NO_EDR_ESCO (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | \ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* sco events */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_LISTEN_E, /* listen request */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_OPEN_E, /* open request */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_XFER_E, /* transfer request */ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CN_DONE_E, /* codec negotiation done */ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_REOPEN_E, /* Retry with other codec when failed */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CLOSE_E, /* close request */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_SHUTDOWN_E, /* shutdown request */ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CONN_OPEN_E, /* sco open */ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CONN_CLOSE_E, /* sco closed */ 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CI_DATA_E /* SCO data ready */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_NUM_CODECS 3 7766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD */ 7866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_ESCO_SETTING_IDX_T1 1 /* eSCO setting for mSBC T1 */ 7966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#define BTA_AG_ESCO_SETTING_IDX_T2 2 /* eSCO setting for mSBC T2 */ 8066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CVSD */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5 + 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission effort */ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }, 9966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* mSBC T1 */ 10066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 10166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ 10266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ 10366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 8, /* 8 ms */ 10466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ 10566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + NO_2_EV3 */ 10666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 10766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 10866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 | 10966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 ), 11066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ 11166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie }, 11266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* mSBC T2*/ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13, /* 13 ms */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + 2-EV3 */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 12666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie/* WBS not included, CVSD by default */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS bta_ag_esco_params = 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5 + 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission effort */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_cback 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM SCO connection callback. 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_conn_cback(UINT16 sco_idx) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match callback to scb; first check current sco scb */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb->in_use) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_scb_to_idx(bta_ag_cb.sco.p_curr_scb); 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* then check for scb connected to this peer */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if SLC is up */ 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_idx_by_bdaddr(BTM_ReadScoBdAddr(sco_idx)); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = bta_ag_scb_by_idx(handle); 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb && !p_scb->svc_conn) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = 0; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (handle != 0) { 1765fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 1775fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->event = BTA_AG_SCO_OPEN_EVT; 1785fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->layer_specific = handle; 1795fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_sys_sendmsg(p_buf); 1805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov } else { 1815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov /* no match found; disconnect sco, init sco variables */ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_SHUTDOWN_ST; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoveSco(sco_idx); 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_disc_cback 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM SCO disconnection callback. 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_disc_cback(UINT16 sco_idx) 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = 0; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 202e8c3d75b75493911ebf0f99c83676359657178f7Sharvil 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); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 204e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u", 2055738f83aeb59361a0a2eda2460113f6dc919427The 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); 206e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u", 2075738f83aeb59361a0a2eda2460113f6dc919427The 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); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match callback to scb */ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb->in_use) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We only care about callbacks for the active SCO */ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb->sco_idx != sco_idx) 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb->sco_idx != 0xFFFF) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_scb_to_idx(bta_ag_cb.sco.p_curr_scb); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle != 0) 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ConfigScoPath(BTM_SCO_ROUTE_PCM, NULL, NULL, TRUE); 225e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sco_disc_cback sco close config status = %d", status); 22666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* SCO clean up here */ 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_close(); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Restore settings */ 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_ag_cb.sco.p_curr_scb->inuse_codec == BTA_AG_CODEC_MSBC) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* set_sco_codec(BTM_SCO_CODEC_NONE); we should get a close */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* If SCO open was initiated by AG and failed for mSBC, then attempt 23866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie mSBC with T1 settings i.e. 'Safe Settings'. If this fails, then switch to CVSD */ 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_opening (bta_ag_cb.sco.p_curr_scb)) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (bta_ag_cb.sco.p_curr_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) 24266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 24366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("Fallback to mSBC T1 settings"); 24466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_cb.sco.p_curr_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T1; 24566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 24666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 24766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 24866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("Fallback to CVSD settings"); 24966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE; 25066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->inuse_codec = BTA_AG_CODEC_NONE; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 2585fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->event = BTA_AG_SCO_CLOSE_EVT; 2595fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->layer_specific = handle; 2605fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_sys_sendmsg(p_buf); 2615fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov } else { 2625fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov /* no match found */ 263e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("no scb for ag_sco_disc_cback"); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco could be closed after scb dealloc'ed */ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_SHUTDOWN_ST; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_read_cback 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Callback function is the callback function for incoming 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SCO data over HCI. 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_read_cback (UINT16 sco_inx, BT_HDR *p_data, tBTM_SCO_DATA_FLAG status) 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_SCO_DATA_CORRECT) 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 289e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sco_read_cback: status(%d)", status); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Callout function must free the data. */ 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_in_data (p_data, status); 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_remove_sco 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes the specified SCO from the system. 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If only_active is TRUE, then SCO is only removed if connected 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN - TRUE if Sco removal was started 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_remove_sco(tBTA_AG_SCB *p_scb, BOOLEAN only_active) 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN removed_started = FALSE; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!only_active || p_scb->sco_idx == bta_ag_cb.sco.cur_idx) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_RemoveSco(p_scb->sco_idx); 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 317e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status); 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sco is connected; set current control block */ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project removed_started = TRUE; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no connection reset the sco handle */ 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR) ) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = BTM_INVALID_SCO_INDEX; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return removed_started; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_esco_connreq_cback 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM eSCO connection requests and eSCO change requests 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Only the connection requests are processed by BTA. 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_esco_connreq_cback(tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data) 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle; 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sco_inx = p_data->conn_evt.sco_inx; 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Only process connection requests */ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_ESCO_CONN_REQ_EVT) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((handle = bta_ag_idx_by_bdaddr(BTM_ReadScoBdAddr(sco_inx))) != 0 && 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_scb = bta_ag_scb_by_idx(handle)) != NULL) && p_scb->svc_conn) 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = sco_inx; 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no other SCO active, allow this one */ 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_cb.sco.p_curr_scb) 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 364e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx); 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST; 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Begin a transfer: Close current SCO before responding */ 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 373e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_esco_connreq_cback: Begin XFER"); 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_xfer_scb = p_scb; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.conn_data = p_data->conn_evt; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_OPEN_XFER_ST; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, TRUE)) 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 380e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_xfer_scb = NULL; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If error occurred send reject response immediately */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 391e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("no scb for bta_ag_esco_connreq_cback or no resources"); 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, NULL); 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Received a change in the esco link */ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_ESCO_CHG_EVT) 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 398e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d", 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.sco_inx, 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.retrans_window, p_data->chg_evt.rx_pkt_len, 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.tx_pkt_len, p_data->chg_evt.tx_interval); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_cback_sco 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Call application callback function with SCO event. 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_cback_sco(tBTA_AG_SCB *p_scb, UINT8 event) 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_HDR sco; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco.handle = bta_ag_scb_to_idx(p_scb); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco.app_id = p_scb->app_id; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call close cback */ 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &sco); 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_create_sco 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig) 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bd_addr = NULL; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS params; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC esco_codec = BTM_SCO_CODEC_CVSD; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int codec_index = 0; 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_ROUTE_TYPE sco_route; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 pcm_sample_rate; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure this sco handle is not already in use */ 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 454e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_ag_create_sco: Index 0x%04x Already In Use!", 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx); 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sco_codec == BTM_SCO_CODEC_MSBC) && 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_scb->codec_fallback && 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_scb->retry_with_sco_only) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project esco_codec = BTM_SCO_CODEC_MSBC; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_fallback = FALSE; 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Force AG to send +BCS for the next audio connection. */ 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = TRUE; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* If WBS included, use CVSD by default, index is 0 for CVSD by initialization */ 47466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* If eSCO codec is mSBC, index is T2 or T1 */ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTM_SCO_CODEC_MSBC) 47666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 47766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) 47866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 47966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie codec_index = BTA_AG_ESCO_SETTING_IDX_T2; 48066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 48166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 48266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie { 48366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie codec_index = BTA_AG_ESCO_SETTING_IDX_T1; 48466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 48566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie } 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_esco_params[codec_index]; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 48966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* When WBS is not included, use CVSD by default */ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_esco_params; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_ag_cb.sco.param_updated) /* If we do not use the default parameters */ 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_cb.sco.params; 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bta_ag_cb.sco.param_updated) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 49966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (esco_codec == BTM_SCO_CODEC_CVSD) /* For CVSD */ 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the application packet types (5 slot EV packets not allowed) */ 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params.packet_types = p_bta_ag_cfg->sco_pkt_types | 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if initiating set current scb and peer bd addr */ 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Attempt to use eSCO if remote host supports HFP >= 1.5 */ 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to find out from SIG if HSP can use eSCO; for now use SCO */ 5145738f83aeb59361a0a2eda2460113f6dc919427The 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) 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, ¶ms); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If ESCO or EDR ESCO, retry with SCO only in case of failure */ 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||!((params.packet_types & ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ BTA_AG_NO_EDR_ESCO)) 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec != BTA_AG_CODEC_MSBC) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = TRUE; 526e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("Setting retry_with_sco_only to TRUE"); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Do not use SCO when using mSBC */ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 531e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("Setting retry_with_sco_only to FALSE"); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = TRUE; 535e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("Setting retry_with_sco_only to TRUE"); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->retry_with_sco_only) 542e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("retrying with SCO only"); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE ) 55466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* Allow any platform specific pre-SCO set up to take place */ 5556afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP, 5566afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth esco_codec); 55766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 55866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* This setting may not be necessary */ 55966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* To be verified with stable 2049 boards */ 56066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (esco_codec == BTA_AG_CODEC_MSBC) 56166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS); 56266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 56366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD); 56466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* save the current codec because sco_codec can be updated while SCO is open. */ 56566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->inuse_codec = esco_codec; 56666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allow any platform specific pre-SCO set up to take place */ 5686afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP); 56966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTA_AG_CODEC_MSBC) 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_16K; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco_route = bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id); 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigScoPath(sco_route, bta_ag_sco_read_cback, NULL, TRUE); 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_addr = p_scb->peer_addr; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_CreateSco(p_bd_addr, is_orig, params.packet_types, 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_scb->sco_idx, bta_ag_sco_conn_cback, 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_disc_cback); 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_orig) 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RegForEScoEvts(p_scb->sco_idx, bta_ag_esco_connreq_cback); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Initiating the connection, set the current sco handle */ 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 609e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_API("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x", 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig, p_scb->sco_idx, status, params.packet_types); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** Function bta_ag_attempt_msbc_safe_settings 61766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 61866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** Description Checks if ESCO connection needs to be attempted using mSBC T1(safe) settings 61966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 62066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 62166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** Returns TRUE if T1 settings has to be used, FALSE otherwise 62266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 62366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie*******************************************************************************/ 62466432dcffe211e317d35978283a04a96d5620bdfMatthew XieBOOLEAN bta_ag_attempt_msbc_safe_settings(tBTA_AG_SCB *p_scb) 62566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie{ 62666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if (p_scb->svc_conn && p_scb->sco_codec == BTM_SCO_CODEC_MSBC && 62766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T1) 62866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie return TRUE; 62966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie else 63066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie return FALSE; 63166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie} 63266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie 63366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie/******************************************************************************* 63466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie** 63578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function bta_ag_codec_negotiation_timer_cback 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 64378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void bta_ag_codec_negotiation_timer_cback(void *data) 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 64578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov tBTA_AG_SCB *p_scb = (tBTA_AG_SCB *)data; 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 64778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Announce that codec negotiation failed. */ 64878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_ag_sco_codec_nego(p_scb, FALSE); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 65078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* call app callback */ 65178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_codec_negotiate 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initiate codec negotiation by sending AT command. 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If not necessary, skip negotiation. 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_codec_negotiate(tBTA_AG_SCB *p_scb) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 66866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if ((p_scb->codec_updated || p_scb->codec_fallback || 66966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_attempt_msbc_safe_settings(p_scb)) && 67066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie (p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC)) 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the power mode to Active until sco open is completed. */ 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send +BCS to the peer */ 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_bcs(p_scb, NULL); 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer to handle timeout */ 67978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(p_scb->codec_negotiation_timer, 68078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTA_AG_CODEC_NEGOTIATION_TIMEOUT_MS, 68178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov bta_ag_codec_negotiation_timer_cback, 68278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov p_scb, 68378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_bta_alarm_queue); 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use same codec type as previous SCO connection, skip codec negotiation */ 68866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie APPL_TRACE_DEBUG("use same codec type as previous SCO connection,skip codec negotiation"); 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, TRUE); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 69266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif /* (BTM_WBS_INCLUDED == TRUE ) */ 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_event 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_event(tBTA_AG_SCB *p_scb, UINT8 event) 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCO_CB *p_sco = &bta_ag_cb.sco; 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_cn_scb = NULL; /* For codec negotiation */ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 in_state = p_sco->state; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 716e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)", 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx, 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state, bta_ag_sco_state_str(p_sco->state), 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, bta_ag_sco_evt_str(event)); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 721e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d, Event %d", 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx, p_sco->state, event); 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTA_AG_SCO_CI_DATA_E) 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (TRUE) 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_out_data(&p_buf); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf) 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->state == BTA_AG_SCO_OPEN_ST) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteScoData(p_sco->p_curr_scb->sco_idx, p_buf); 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 736abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_sco->state) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_ST: 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection */ 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 758e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event); 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_ST: 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ignore the event. We need to keep listening SCO for the active SLC */ 803e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 813e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CODEC_ST: 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CN_DONE_E: 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco open is not started yet. just go back to listening */ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 865e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event); 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPENING_ST: 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* second headset has now joined */ 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_REOPEN_E: 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPEN_CL_ST; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not opening scb, just close it */ 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPEN_ST; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 924e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_CL_ST: 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not opening scb, just close it */ 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection */ 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 969e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event); 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_XFER_ST: 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection */ 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove all connection */ 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* closed sco; place in listen mode and 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project accept the transferred connection */ 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); /* Back into listen mode */ 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Accept sco connection with xfer scb */ 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_sco->p_xfer_scb, &p_sco->conn_data); 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = p_sco->p_xfer_scb; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->cur_idx = p_sco->p_xfer_scb->sco_idx; 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1005e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event); 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_ST: 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* second headset has now joined */ 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close current sco connection */ 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_sco->p_curr_scb, TRUE); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection if active */ 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_remove_sco(p_scb, TRUE)) 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove all listening connections */ 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO was active on this scb, close it */ 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer closed sco; create sco listen connection */ 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1058e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event); 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSING_ST: 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_OP_ST; 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not closing scb, just close it */ 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer closed sco; create sco listen connection */ 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1105e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event); 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 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_CLOSE_OP_ST: 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open sco connection */ 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1142e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event); 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_XFER_ST: 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection so headset can be transferred 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Probably entered this state from "opening state" */ 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear xfer scb */ 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear xfer scb */ 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* closed sco; place old sco in listen mode, 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project take current sco out of listen, and 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project create originating sco for current */ 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_sco->p_xfer_scb, FALSE); 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_sco->p_xfer_scb; 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_sco->p_xfer_scb, TRUE); 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1191e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTTING_ST: 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection; wait for conn close event */ 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Other instance is still listening */ 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12158f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB /* If SCO closed for other HS which is not being disconnected, 12168f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB then create listen sco connection for it as scb still open */ 12178f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB if (bta_ag_scb_open(p_scb)) 12188f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB { 12198f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB bta_ag_create_sco(p_scb, FALSE); 12208f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB p_sco->state = BTA_AG_SCO_LISTEN_ST; 12218f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB } 12228f4fb27a66a83cc65eb7923b6912d0aaba279a8bMallikarjuna GB 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Other instance is still listening */ 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1256e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event); 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->state != in_state) 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1267e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]", 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_state_str(in_state), 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_state_str(p_sco->state), 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_evt_str(event)); 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cn_scb) 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_codec_negotiate(p_cn_scb); 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_is_open 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check if sco is open for this scb. 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sco open for this scb, FALSE otherwise. 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sco_is_open(tBTA_AG_SCB *p_scb) 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_ST) && 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_is_opening 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check if sco is in Opening state. 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sco is in Opening state for this scb, FALSE otherwise. 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sco_is_opening(tBTA_AG_SCB *p_scb) 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (((bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST) || 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST)) && 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST) && 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_listen 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_listen(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13325cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_LISTEN_E); 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_open 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 event; 13495cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if another scb using sco, this is a transfer */ 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb != p_scb) 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_SCO_XFER_E; 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else it is an open */ 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_SCO_OPEN_E; 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, event); 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_close 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 13785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if scb is in use */ 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco_idx is not allocated in SCO_CODEC_ST, we still need to move to listening state. */ 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sco_idx != BTM_INVALID_SCO_INDEX) || (bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST)) 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1387e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx); 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_codec_nego 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_codec_nego(tBTA_AG_SCB *p_scb, BOOLEAN result) 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(result == TRUE) 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Subsequent sco connection will skip codec negotiation */ 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = FALSE; 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CN_DONE_E); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* codec negotiation failed */ 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_shutdown 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_shutdown(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14305cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 14315cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_SHUTDOWN_E); 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_open 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14475cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 14485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_OPEN_E); 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 145366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 14546afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON, 145566432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->inuse_codec); 145666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 14576afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON); 145866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open SCO codec if SCO is routed through transport */ 14625738f83aeb59361a0a2eda2460113f6dc919427The 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); 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT); 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 146966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 147066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* reset to mSBC T2 settings as the preferred */ 147166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; 147266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_close 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = bta_ag_scb_to_idx(p_scb); 14885cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear current scb */ 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = BTM_INVALID_SCO_INDEX; 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* codec_fallback is set when AG is initiator and connection failed for mSBC. */ 149666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* OR if codec is msbc and T2 settings failed, then retry Safe T1 settings */ 149766432dcffe211e317d35978283a04a96d5620bdfMatthew Xie if ((p_scb->codec_fallback && p_scb->svc_conn) || 149866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie bta_ag_attempt_msbc_safe_settings(p_scb)) 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_REOPEN_E); 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->retry_with_sco_only && p_scb->svc_conn) 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* retry_with_sco_only is set when AG is initiator and connection failed for eSCO */ 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* retry_with_sco_only, will be set only when AG is initiator 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** and AG is first trying to establish an eSCO connection */ 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->retry_with_sco_only && p_scb->svc_conn) 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15176afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth sco_state_t sco_state = bta_ag_cb.sco.p_xfer_scb ? SCO_STATE_OFF_TRANSFER : SCO_STATE_OFF; 151866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Indicate if the closing of audio is because of transfer */ 15206afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(handle, p_scb->app_id, sco_state, p_scb->inuse_codec); 152166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 152266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* Indicate if the closing of audio is because of transfer */ 15236afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(handle, p_scb->app_id, sco_state); 152466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E); 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In case call stays alive regardless of sco, av should not be affected. */ 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(((p_scb->call_ind == BTA_AG_CALL_INACTIVE) && (p_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE)) 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END)) 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); 153966432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == TRUE) 154066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; 154166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#endif 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_rsp 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the SCO connection request 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data) 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS resp; 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 hci_status = HCI_SUCCESS; 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 pcm_sample_rate; 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.state == BTA_AG_SCO_LISTEN_ST || 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state == BTA_AG_SCO_CLOSE_XFER_ST || 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_XFER_ST) 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If script overrided sco parameter by BTA_CMD_SET_ESCO_PARAM */ 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.param_updated) 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = bta_ag_cb.sco.params; 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.rx_bw = BTM_64KBITS_RATE; 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.tx_bw = BTM_64KBITS_RATE; 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.max_latency = 10; 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.voice_contfmt = 0x60; 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.retrans_effort = BTM_ESCO_RETRANS_POWER; 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->link_type == BTM_LINK_TYPE_SCO) 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.packet_types = (BTM_SCO_LINK_ONLY_MASK | 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Allow controller to use all types available except 5-slot EDR */ 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.packet_types = (BTM_SCO_LINK_ALL_PKT_MASK | 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 } 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 160166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#if (BTM_WBS_INCLUDED == FALSE ) 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allow any platform specific pre-SCO set up to take place */ 16036afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP); 160466432dcffe211e317d35978283a04a96d5620bdfMatthew Xie#else 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When HS initiated SCO, it cannot be WBS. */ 160666432dcffe211e317d35978283a04a96d5620bdfMatthew Xie /* Allow any platform specific pre-SCO set up to take place */ 16076afb248849399cfba59fb1e683a06e31d88e5d1dMudumba Ananth bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP, 160866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie BTA_AG_CODEC_CVSD); 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */ 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigScoPath(bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id), 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_read_cback, NULL, TRUE); 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_status = HCI_ERR_HOST_REJECT_DEVICE; 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO open was initiated from HS, it must be CVSD */ 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inuse_codec = BTA_AG_CODEC_NONE; 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp); 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_ci_sco_data 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the SCO data ready callin event 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_ci_sco_data(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16425cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_scb); 16435cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 16445cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CI_DATA_E); 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_set_esco_param 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update esco parameters from script wrapper. 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_set_esco_param(BOOLEAN set_reset, tBTM_ESCO_PARAMS *param) 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(set_reset == FALSE) /* reset the parameters to default */ 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.param_updated = FALSE; 1665e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_set_esco_param : Resetting ESCO parameters to default"); 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.param_updated = TRUE; 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.params = *param; 1671e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_set_esco_param : Setting ESCO parameters"); 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Debugging functions 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_evt_str(UINT8 event) 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Listen Request"; 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open Request"; 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Transfer Request"; 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CN_DONE_E: 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Codec Negotiation Done"; 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_REOPEN_E: 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Reopen Request"; 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close Request"; 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutdown Request"; 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opened"; 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Closed"; 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CI_DATA_E : 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Sco Data"; 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown SCO Event"; 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_state_str(UINT8 state) 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_ST: 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutdown"; 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_ST: 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Listening"; 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CODEC_ST: 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Codec Negotiation"; 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPENING_ST: 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opening"; 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_CL_ST: 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open while closing"; 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_XFER_ST: 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opening while Transferring"; 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_ST: 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open"; 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSING_ST: 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Closing"; 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_OP_ST: 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close while Opening"; 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_XFER_ST: 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close while Transferring"; 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTTING_ST: 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutting Down"; 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown SCO State"; 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1745