15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions for managing the SCO connection used in AG. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_co.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_co.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AG_SCO_DEBUG 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_SCO_DEBUG FALSE 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AG_CODEC_NEGO_TIMEOUT 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CODEC_NEGO_TIMEOUT 3000 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_evt_str(UINT8 event); 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_state_str(UINT8 state); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_NO_EDR_ESCO (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | \ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* sco events */ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_LISTEN_E, /* listen request */ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_OPEN_E, /* open request */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_XFER_E, /* transfer request */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CN_DONE_E, /* codec negotiation done */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_REOPEN_E, /* Retry with other codec when failed */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CLOSE_E, /* close request */ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_SHUTDOWN_E, /* shutdown request */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CONN_OPEN_E, /* sco open */ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CONN_CLOSE_E, /* sco closed */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AG_SCO_CI_DATA_E /* SCO data ready */ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_NUM_CODECS 2 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CVSD */ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5 + 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission effort */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }, 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mSBC */ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13, /* 13 ms */ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + 2-EV3 */ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS bta_ag_esco_params = 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5 + 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission effort */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_cback 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM SCO connection callback. 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_conn_cback(UINT16 sco_idx) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match callback to scb; first check current sco scb */ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb->in_use) 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_scb_to_idx(bta_ag_cb.sco.p_curr_scb); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* then check for scb connected to this peer */ 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if SLC is up */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_idx_by_bdaddr(BTM_ReadScoBdAddr(sco_idx)); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = bta_ag_scb_by_idx(handle); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb && !p_scb->svc_conn) 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = 0; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle != 0) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTA_AG_SCO_OPEN_EVT; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific = handle; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no match found; disconnect sco, init sco variables */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_SHUTDOWN_ST; 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoveSco(sco_idx); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_disc_cback 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM SCO disconnection callback. 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_disc_cback(UINT16 sco_idx) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = 0; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3 ("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); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG4 ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u", 1895738f83aeb59361a0a2eda2460113f6dc919427The 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); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG4 ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x in_use: %u sco_idx: 0x%x sco state: %u", 1915738f83aeb59361a0a2eda2460113f6dc919427The 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); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* match callback to scb */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb->in_use) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We only care about callbacks for the active SCO */ 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb->sco_idx != sco_idx) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb->sco_idx != 0xFFFF) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = bta_ag_scb_to_idx(bta_ag_cb.sco.p_curr_scb); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle != 0) 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ConfigScoPath(BTM_SCO_ROUTE_PCM, NULL, NULL, TRUE); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_ag_sco_disc_cback sco close config status = %d", status); 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SCO clean up here */ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_close(); 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Restore settings */ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_ag_cb.sco.p_curr_scb->inuse_codec == BTA_AG_CODEC_MSBC) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetWBSCodec (BTM_SCO_CODEC_NONE); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD); 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO open was initiated by AG and failed for mSBC, try CVSD again. */ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_sco_is_opening (bta_ag_cb.sco.p_curr_scb)) 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("Fallback to CVSD"); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->inuse_codec = BTA_AG_CODEC_NONE; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTA_AG_SCO_CLOSE_EVT; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific = handle; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no match found */ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("no scb for ag_sco_disc_cback"); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco could be closed after scb dealloc'ed */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL) 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_SHUTDOWN_ST; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_read_cback 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Callback function is the callback function for incoming 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SCO data over HCI. 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_read_cback (UINT16 sco_inx, BT_HDR *p_data, tBTM_SCO_DATA_FLAG status) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_SCO_DATA_CORRECT) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_ag_sco_read_cback: status(%d)", status); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Callout function must free the data. */ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_in_data (p_data, status); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_remove_sco 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes the specified SCO from the system. 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If only_active is TRUE, then SCO is only removed if connected 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN - TRUE if Sco removal was started 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_remove_sco(tBTA_AG_SCB *p_scb, BOOLEAN only_active) 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN removed_started = FALSE; 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!only_active || p_scb->sco_idx == bta_ag_cb.sco.cur_idx) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_RemoveSco(p_scb->sco_idx); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sco is connected; set current control block */ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project removed_started = TRUE; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no connection reset the sco handle */ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR) ) 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = BTM_INVALID_SCO_INDEX; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return removed_started; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_esco_connreq_cback 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM eSCO connection requests and eSCO change requests 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Only the connection requests are processed by BTA. 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_esco_connreq_cback(tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data) 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sco_inx = p_data->conn_evt.sco_inx; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Only process connection requests */ 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_ESCO_CONN_REQ_EVT) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((handle = bta_ag_idx_by_bdaddr(BTM_ReadScoBdAddr(sco_inx))) != 0 && 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_scb = bta_ag_scb_by_idx(handle)) != NULL) && p_scb->svc_conn) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = sco_inx; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no other SCO active, allow this one */ 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_cb.sco.p_curr_scb) 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Begin a transfer: Close current SCO before responding */ 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_ag_esco_connreq_cback: Begin XFER"); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_xfer_scb = p_scb; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.conn_data = p_data->conn_evt; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_OPEN_XFER_ST; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, TRUE)) 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx); 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_xfer_scb = NULL; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If error occurred send reject response immediately */ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING0("no scb for bta_ag_esco_connreq_cback or no resources"); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, NULL); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Received a change in the esco link */ 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_ESCO_CHG_EVT) 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT5("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d", 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.sco_inx, 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.retrans_window, p_data->chg_evt.rx_pkt_len, 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->chg_evt.tx_pkt_len, p_data->chg_evt.tx_interval); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_cback_sco 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Call application callback function with SCO event. 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_cback_sco(tBTA_AG_SCB *p_scb, UINT8 event) 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_HDR sco; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco.handle = bta_ag_scb_to_idx(p_scb); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco.app_id = p_scb->app_id; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call close cback */ 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &sco); 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_create_sco 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 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_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig) 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bd_addr = NULL; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS params; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_PEER_CODEC esco_codec = BTM_SCO_CODEC_CVSD; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int codec_index = 0; 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_ROUTE_TYPE sco_route; 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 pcm_sample_rate; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure this sco handle is not already in use */ 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("bta_ag_create_sco: Index 0x%04x Already In Use!", 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx); 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sco_codec == BTM_SCO_CODEC_MSBC) && 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_scb->codec_fallback && 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !p_scb->retry_with_sco_only) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project esco_codec = BTM_SCO_CODEC_MSBC; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback) 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_fallback = FALSE; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Force AG to send +BCS for the next audio connection. */ 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = TRUE; 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTM_SCO_CODEC_MSBC) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_index = esco_codec - 1; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_esco_params[codec_index]; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_esco_params; 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_ag_cb.sco.param_updated) /* If we do not use the default parameters */ 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params = bta_ag_cb.sco.params; 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bta_ag_cb.sco.param_updated) 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!codec_index) /* For non-WBS */ 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the application packet types (5 slot EV packets not allowed) */ 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project params.packet_types = p_bta_ag_cfg->sco_pkt_types | 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if initiating set current scb and peer bd addr */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Attempt to use eSCO if remote host supports HFP >= 1.5 */ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to find out from SIG if HSP can use eSCO; for now use SCO */ 4815738f83aeb59361a0a2eda2460113f6dc919427The 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) 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, ¶ms); 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If ESCO or EDR ESCO, retry with SCO only in case of failure */ 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||!((params.packet_types & ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ BTA_AG_NO_EDR_ESCO)) 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec != BTA_AG_CODEC_MSBC) 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = TRUE; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_API0("Setting retry_with_sco_only to TRUE"); 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Do not use SCO when using mSBC */ 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_API0("Setting retry_with_sco_only to FALSE"); 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = TRUE; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_API0("Setting retry_with_sco_only to TRUE"); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->retry_with_sco_only) 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_API0("retrying with SCO only"); 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allow any platform specific pre-SCO set up to take place */ 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTA_AG_CODEC_MSBC) 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_16K; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco_route = bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTA_AG_CODEC_MSBC) 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Enable mSBC codec in fw */ 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetWBSCodec (esco_codec); 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Specify PCM input for SBC codec in fw */ 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigI2SPCM (esco_codec, (UINT8)HCI_BRCM_I2SPCM_IS_DEFAULT_ROLE, (UINT8)HCI_BRCM_I2SPCM_SAMPLE_DEFAULT, (UINT8)HCI_BRCM_I2SPCM_CLOCK_DEFAULT); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This setting may not be necessary */ 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* To be verified with stable 2049 boards */ 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (esco_codec == BTA_AG_CODEC_MSBC) 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the current codec because sco_codec can be updated while SCO is open. */ 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inuse_codec = esco_codec; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */ 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigScoPath(sco_route, bta_ag_sco_read_cback, NULL, TRUE); 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_addr = p_scb->peer_addr; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_CreateSco(p_bd_addr, is_orig, params.packet_types, 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &p_scb->sco_idx, bta_ag_sco_conn_cback, 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_disc_cback); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!is_orig) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RegForEScoEvts(p_scb->sco_idx, bta_ag_esco_connreq_cback); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Initiating the connection, set the current sco handle */ 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.cur_idx = p_scb->sco_idx; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_API4("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x", 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig, p_scb->sco_idx, status, params.packet_types); 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_cn_timer_cback 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_cn_timer_cback (TIMER_LIST_ENT *p_tle) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_tle) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb = (tBTA_AG_SCB *)p_tle->param; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb) 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Announce that codec negotiation failed. */ 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, FALSE); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_codec_negotiate 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initiate codec negotiation by sending AT command. 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If not necessary, skip negotiation. 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_codec_negotiate(tBTA_AG_SCB *p_scb) 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = p_scb; 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_updated || p_scb->codec_fallback) 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the power mode to Active until sco open is completed. */ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send +BCS to the peer */ 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_send_bcs(p_scb, NULL); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer to handle timeout */ 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cn_timer.p_cback = (TIMER_CBACK*)&bta_ag_cn_timer_cback; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->cn_timer.param = (INT32)p_scb; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&p_scb->cn_timer, 0, BTA_AG_CODEC_NEGO_TIMEOUT); 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use same codec type as previous SCO connection, skip codec negotiation */ 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_codec_nego(p_scb, TRUE); 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_event 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sco_event(tBTA_AG_SCB *p_scb, UINT8 event) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCO_CB *p_sco = &bta_ag_cb.sco; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_cn_scb = NULL; /* For codec negotiation */ 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 in_state = p_sco->state; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT5("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)", 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx, 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state, bta_ag_sco_state_str(p_sco->state), 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, bta_ag_sco_evt_str(event)); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT3("BTA ag sco evt (hdl 0x%04x): State %d, Event %d", 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx, p_sco->state, event); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTA_AG_SCO_CI_DATA_E) 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (TRUE) 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_sco_co_out_data(&p_buf); 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf) 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->state == BTA_AG_SCO_OPEN_ST) 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_WriteScoData(p_sco->p_curr_scb->sco_idx, p_buf); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_sco->state) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_ST: 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection */ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event); 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_ST: 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ignore the event. We need to keep listening SCO for the active SLC */ 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CODEC_ST: 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CN_DONE_E: 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco open is not started yet. just go back to listening */ 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event); 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPENING_ST: 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* second headset has now joined */ 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_REOPEN_E: 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 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 p_sco->state = BTA_AG_SCO_OPEN_CL_ST; 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not opening scb, just close it */ 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPEN_ST; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event); 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_CL_ST: 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not opening scb, just close it */ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection */ 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco failed; create sco listen connection */ 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_XFER_ST: 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection */ 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove all connection */ 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* closed sco; place in listen mode and 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project accept the transferred connection */ 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); /* Back into listen mode */ 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Accept sco connection with xfer scb */ 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_conn_rsp(p_sco->p_xfer_scb, &p_sco->conn_data); 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = p_sco->p_xfer_scb; 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->cur_idx = p_sco->p_xfer_scb->sco_idx; 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event); 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_ST: 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* second headset has now joined */ 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close current sco connection */ 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_sco->p_curr_scb, TRUE); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection if active */ 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_remove_sco(p_scb, TRUE)) 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove all listening connections */ 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO was active on this scb, close it */ 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer closed sco; create sco listen connection */ 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event); 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSING_ST: 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_OP_ST; 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save xfer scb */ 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = p_scb; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSE_XFER_ST; 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If not closing scb, just close it */ 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remove listening connection */ 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, FALSE); 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer closed sco; create sco listen connection */ 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event); 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_OP_ST: 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_scb; 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open sco connection */ 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_XFER_ST: 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection so headset can be transferred 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Probably entered this state from "opening state" */ 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear xfer scb */ 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CLOSING_ST; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear xfer scb */ 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTTING_ST; 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* closed sco; place old sco in listen mode, 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project take current sco out of listen, and 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project create originating sco for current */ 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_sco->p_xfer_scb, FALSE); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start codec negotiation */ 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_CODEC_ST; 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cn_scb = p_sco->p_xfer_scb; 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco connection to peer */ 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_sco->p_xfer_scb, TRUE); 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_xfer_scb = NULL; 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_OPENING_ST; 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event); 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTTING_ST: 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* close sco connection; wait for conn close event */ 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_remove_sco(p_scb, TRUE); 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SCO instance then finish shutting down */ 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Other instance is still listening */ 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* create sco listen connection (Additional channel) */ 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb != p_sco->p_curr_scb) 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, FALSE); 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_ag_other_scb_open(p_scb)) 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_SHUTDOWN_ST; 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Other instance is still listening */ 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = BTA_AG_SCO_LISTEN_ST; 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p_sco->p_curr_scb) 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_curr_scb = NULL; 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event); 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->state != in_state) 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT3("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]", 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_state_str(in_state), 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_state_str(p_sco->state), 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_evt_str(event)); 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cn_scb) 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_codec_negotiate(p_cn_scb); 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_is_open 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check if sco is open for this scb. 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sco open for this scb, FALSE otherwise. 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sco_is_open(tBTA_AG_SCB *p_scb) 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_ST) && 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_is_opening 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check if sco is in Opening state. 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sco is in Opening state for this scb, FALSE otherwise. 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sco_is_opening(tBTA_AG_SCB *p_scb) 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (((bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST) || 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST)) && 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((bta_ag_cb.sco.state == BTA_AG_SCO_OPENING_ST) && 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_ag_cb.sco.p_curr_scb == p_scb)); 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_listen 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_listen(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_LISTEN_E); 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_open 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 event; 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if another scb using sco, this is a transfer */ 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_curr_scb != NULL && bta_ag_cb.sco.p_curr_scb != p_scb) 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_SCO_XFER_E; 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else it is an open */ 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_SCO_OPEN_E; 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, event); 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_close 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if scb is in use */ 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sco_idx is not allocated in SCO_CODEC_ST, we still need to move to listening state. */ 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb->sco_idx != BTM_INVALID_SCO_INDEX) || (bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST)) 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx); 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_codec_nego 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_codec_nego(tBTA_AG_SCB *p_scb, BOOLEAN result) 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(result == TRUE) 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Subsequent sco connection will skip codec negotiation */ 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->codec_updated = FALSE; 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CN_DONE_E); 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* codec negotiation failed */ 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_shutdown 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_shutdown(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_SHUTDOWN_E); 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_open 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_OPEN_E); 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON); 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* open SCO codec if SCO is routed through transport */ 13975738f83aeb59361a0a2eda2460113f6dc919427The 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); 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT); 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_close 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 handle = bta_ag_scb_to_idx(p_scb); 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear current scb */ 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.p_curr_scb = NULL; 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->sco_idx = BTM_INVALID_SCO_INDEX; 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE) 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* codec_fallback is set when AG is initiator and connection failed for mSBC. */ 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->codec_fallback && p_scb->svc_conn) 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_REOPEN_E); 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_scb->retry_with_sco_only && p_scb->svc_conn) 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* retry_with_sco_only is set when AG is initiator and connection failed for eSCO */ 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* retry_with_sco_only, will be set only when AG is initiator 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** and AG is first trying to establish an eSCO connection */ 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->retry_with_sco_only && p_scb->svc_conn) 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_create_sco(p_scb, TRUE); 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Indicate if the closing of audio is because of transfer */ 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.p_xfer_scb) 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(handle, p_scb->app_id, BTA_AG_CO_AUD_STATE_OFF_XFER); 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(handle, p_scb->app_id, BTA_AG_CO_AUD_STATE_OFF); 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E); 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if av got suspended by this call, let it resume. */ 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In case call stays alive regardless of sco, av should not be affected. */ 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(((p_scb->call_ind == BTA_AG_CALL_INACTIVE) && (p_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE)) 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END)) 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* call app callback */ 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->retry_with_sco_only = FALSE; 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sco_conn_rsp 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the SCO connection request 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data) 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS resp; 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 hci_status = HCI_SUCCESS; 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 pcm_sample_rate; 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.state == BTA_AG_SCO_LISTEN_ST || 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state == BTA_AG_SCO_CLOSE_XFER_ST || 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_XFER_ST) 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If script overrided sco parameter by BTA_CMD_SET_ESCO_PARAM */ 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.sco.param_updated) 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp = bta_ag_cb.sco.params; 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.rx_bw = BTM_64KBITS_RATE; 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.tx_bw = BTM_64KBITS_RATE; 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.max_latency = 10; 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.voice_contfmt = 0x60; 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.retrans_effort = BTM_ESCO_RETRANS_POWER; 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->link_type == BTM_LINK_TYPE_SCO) 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.packet_types = (BTM_SCO_LINK_ONLY_MASK | 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Allow controller to use all types available except 5-slot EDR */ 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project resp.packet_types = (BTM_SCO_LINK_ALL_PKT_MASK | 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell sys to stop av if any */ 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allow any platform specific pre-SCO set up to take place */ 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP); 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When HS initiated SCO, it cannot be WBS. */ 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigI2SPCM (BTM_SCO_CODEC_CVSD, (UINT8)HCI_BRCM_I2SPCM_IS_DEFAULT_ROLE, (UINT8)HCI_BRCM_I2SPCM_SAMPLE_DEFAULT, (UINT8)HCI_BRCM_I2SPCM_CLOCK_DEFAULT); 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */ 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfigScoPath(bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id), 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_read_cback, NULL, TRUE); 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project hci_status = HCI_ERR_HOST_REJECT_DEVICE; 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO open was initiated from HS, it must be CVSD */ 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->inuse_codec = BTA_AG_CODEC_NONE; 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp); 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_ci_sco_data 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process the SCO data ready callin event 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_ci_sco_data(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE ) 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sco_event(p_scb, BTA_AG_SCO_CI_DATA_E); 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_set_esco_param 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update esco parameters from script wrapper. 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_set_esco_param(BOOLEAN set_reset, tBTM_ESCO_PARAMS *param) 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(set_reset == FALSE) /* reset the parameters to default */ 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.param_updated = FALSE; 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_ag_set_esco_param : Resetting ESCO parameters to default"); 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.param_updated = TRUE; 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.sco.params = *param; 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("bta_ag_set_esco_param : Setting ESCO parameters"); 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Debugging functions 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_AG_SCO_DEBUG == TRUE 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_evt_str(UINT8 event) 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_E: 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Listen Request"; 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_E: 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open Request"; 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_XFER_E: 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Transfer Request"; 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CN_DONE_E: 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Codec Negotiation Done"; 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_REOPEN_E: 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Reopen Request"; 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_E: 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close Request"; 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_E: 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutdown Request"; 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_OPEN_E: 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opened"; 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CONN_CLOSE_E: 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Closed"; 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CI_DATA_E : 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Sco Data"; 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown SCO Event"; 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_ag_sco_state_str(UINT8 state) 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTDOWN_ST: 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutdown"; 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_LISTEN_ST: 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Listening"; 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE ) 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CODEC_ST: 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Codec Negotiation"; 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPENING_ST: 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opening"; 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_CL_ST: 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open while closing"; 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_XFER_ST: 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Opening while Transferring"; 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_OPEN_ST: 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Open"; 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSING_ST: 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Closing"; 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_OP_ST: 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close while Opening"; 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_CLOSE_XFER_ST: 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Close while Transferring"; 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AG_SCO_SHUTTING_ST: 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Shutting Down"; 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "Unknown SCO State"; 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1663