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