13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************
23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  Copyright (c) 2014 The Android Open Source Project
43fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Copyright (C) 2004-2012 Broadcom Corporation
53fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
63fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Licensed under the Apache License, Version 2.0 (the "License");
73fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  you may not use this file except in compliance with the License.
83fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  You may obtain a copy of the License at:
93fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  http://www.apache.org/licenses/LICENSE-2.0
113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Unless required by applicable law or agreed to in writing, software
133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  distributed under the License is distributed on an "AS IS" BASIS,
143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  See the License for the specific language governing permissions and
163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  limitations under the License.
173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/
193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_int.h"
211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include <bt_trace.h>
221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include <string.h>
231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bt_utils.h"
243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_NO_EDR_ESCO  (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | \
261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                    BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \
271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                    BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \
281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                    BTM_SCO_PKT_TYPES_MASK_NO_3_EV5)
293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
301025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = {
311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        /* SCO CVSD */
321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        {
331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .rx_bw = BTM_64KBITS_RATE,
341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .tx_bw = BTM_64KBITS_RATE,
351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .max_latency = 10,
361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .voice_contfmt = BTM_VOICE_SETTING_CVSD,
371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .packet_types = (BTM_SCO_LINK_ONLY_MASK          |
381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 |
391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                 .retrans_effort = BTM_ESCO_RETRANS_POWER,
431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        },
441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        /* ESCO CVSD */
451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        {
461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .rx_bw = BTM_64KBITS_RATE,
471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .tx_bw = BTM_64KBITS_RATE,
481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .max_latency = 10,
491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .voice_contfmt = BTM_VOICE_SETTING_CVSD,
501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                /* Allow controller to use all types available except 5-slot EDR */
511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .packet_types = (BTM_SCO_LINK_ALL_PKT_MASK |
521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .retrans_effort = BTM_ESCO_RETRANS_POWER,
551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        },
561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        /* ESCO mSBC */
571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        {
581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .rx_bw = BTM_64KBITS_RATE,
591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .tx_bw = BTM_64KBITS_RATE,
601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .max_latency = 13,
611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .voice_contfmt = BTM_VOICE_SETTING_TRANS,
621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                /* Packet Types : EV3 + 2-EV3               */
631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .packet_types = (BTM_SCO_PKT_TYPES_MASK_EV3  |
641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                .retrans_effort = BTM_ESCO_RETRANS_QUALITY,
681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        }
693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta};
701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
711025687c6679608fe9df918f37011414ffc72b62Hemant Guptaenum
723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTA_HF_CLIENT_SCO_LISTEN_E,
741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTA_HF_CLIENT_SCO_OPEN_E,          /* open request */
751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTA_HF_CLIENT_SCO_CLOSE_E,         /* close request */
761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTA_HF_CLIENT_SCO_SHUTDOWN_E,      /* shutdown request */
771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTA_HF_CLIENT_SCO_CONN_OPEN_E,     /* sco opened */
781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTA_HF_CLIENT_SCO_CONN_CLOSE_E,    /* sco closed */
793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta};
803fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_remove_sco
843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
851025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      Removes the specified SCO from the system.
861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**                  If only_active is TRUE, then SCO is only removed if connected
873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Returns          BOOLEAN   - TRUE if Sco removal was started
893fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
911025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic BOOLEAN bta_hf_client_sco_remove(BOOLEAN only_active)
923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BOOLEAN     removed_started = FALSE;
941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    tBTM_STATUS status;
953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
96e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, only_active);
973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
1001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        status = BTM_RemoveSco(bta_hf_client_cb.scb.sco_idx);
1011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
102e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("%s idx 0x%04x, status:0x%x", __FUNCTION__, bta_hf_client_cb.scb.sco_idx, status);
1031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
1041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        if (status == BTM_CMD_STARTED)
1053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        {
1061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            removed_started = TRUE;
1071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        }
1081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        /* If no connection reset the sco handle */
1091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        else if ( (status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR) )
1101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        {
1111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
1123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        }
1133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
1141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    return removed_started;
1153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_cback_sco
1203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      Call application callback function with SCO event.
1223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
1253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
1271025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_cback_sco(UINT8 event)
1283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
1291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    tBTA_HF_CLIENT    evt;
1303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    memset(&evt, 0, sizeof(evt));
1323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    /* call app cback */
1341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    (*bta_hf_client_cb.p_cback)(event, (tBTA_HF_CLIENT *) &evt);
1351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
1363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/*******************************************************************************
1381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**
1391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_conn_rsp
1401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**
1411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      Process the SCO connection request
1421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**
1431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**
1441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Returns          void
1451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**
1461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta*******************************************************************************/
1471025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_sco_conn_rsp(tBTM_ESCO_CONN_REQ_EVT_DATA *p_data)
1481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta{
1491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    tBTM_ESCO_PARAMS    resp;
1501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    UINT8               hci_status = HCI_SUCCESS;
1511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
152e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s", __FUNCTION__);
1533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST)
1553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
1561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        if (p_data->link_type == BTM_LINK_TYPE_SCO)
1573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        {
1581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            resp = bta_hf_client_esco_params[0];
1593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        }
1601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        else
1613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        {
1621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            resp = bta_hf_client_esco_params[bta_hf_client_cb.scb.negotiated_codec];
1633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        }
1641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
1651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        /* tell sys to stop av if any */
1661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
1673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
1683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    else
1693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
1701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        hci_status = HCI_ERR_HOST_REJECT_DEVICE;
1713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
1721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
1731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp);
1743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
1763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_connreq_cback
1793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      BTM eSCO connection requests and eSCO change requests
1811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**                  Only the connection requests are processed by BTA.
1823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
1843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
1853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
1861025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_esco_connreq_cback(tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data)
1873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
188e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, event);
1891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
1901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (event != BTM_ESCO_CONN_REQ_EVT)
1913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
1921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        return;
1933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
1943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1951025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    /* TODO check remote bdaddr, should allow connect only from device with
1961025687c6679608fe9df918f37011414ffc72b62Hemant Gupta     * active SLC  */
1973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_cb.scb.sco_idx = p_data->conn_evt.sco_inx;
1993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_sco_conn_rsp(&p_data->conn_evt);
2013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
2033fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_conn_cback
2081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta**
2091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      BTM SCO connection callback.
2103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
2133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
2151025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_sco_conn_cback(UINT16 sco_idx)
2163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
2171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    UINT8 *rem_bd;
2183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
219e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, sco_idx);
2203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    rem_bd = BTM_ReadScoBdAddr(sco_idx);
2223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (rem_bd && bdcmp(bta_hf_client_cb.scb.peer_addr, rem_bd) == 0 &&
2241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            bta_hf_client_cb.scb.svc_conn && bta_hf_client_cb.scb.sco_idx == sco_idx)
2251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    {
2265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
2275fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->event = BTA_HF_CLIENT_SCO_OPEN_EVT;
2285fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->layer_specific = bta_hf_client_cb.scb.conn_handle;
2295fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        bta_sys_sendmsg(p_buf);
2303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
2311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    /* no match found; disconnect sco, init sco variables */
2321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    else
2333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
2341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
2351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        BTM_RemoveSco(sco_idx);
2363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
2373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_disc_cback
2423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      BTM SCO disconnection callback.
2443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
2473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
2491025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_sco_disc_cback(UINT16 sco_idx)
2503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
2515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    APPL_TRACE_DEBUG("%s %d", __func__, sco_idx);
2523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    if (bta_hf_client_cb.scb.sco_idx == sco_idx) {
2545fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
2555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->event = BTA_HF_CLIENT_SCO_CLOSE_EVT;
2565fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->layer_specific = bta_hf_client_cb.scb.conn_handle;;
2575fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        bta_sys_sendmsg(p_buf);
2581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    }
2593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_create_sco
2643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description
2663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
2693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
2703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
2711025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_sco_create(BOOLEAN is_orig)
2723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
2733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    tBTM_STATUS       status;
2743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    UINT8            *p_bd_addr = NULL;
2753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    tBTM_ESCO_PARAMS params;
2761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
277e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, is_orig);
2783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    /* Make sure this sco handle is not already in use */
2801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
2813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
282e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("%s: Index 0x%04x already in use", __FUNCTION__,
2831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                            bta_hf_client_cb.scb.sco_idx);
2843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        return;
2853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
2863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    params = bta_hf_client_esco_params[1];
2883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2893fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    /* if initiating set current scb and peer bd addr */
2903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    if (is_orig)
2913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
2923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        /* Attempt to use eSCO if remote host supports HFP >= 1.5 */
2931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        if (bta_hf_client_cb.scb.peer_version >= HFP_VERSION_1_5 && !bta_hf_client_cb.scb.retry_with_sco_only)
2943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        {
2953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, &params);
2963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            /* If ESCO or EDR ESCO, retry with SCO only in case of failure */
2973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            if((params.packet_types & BTM_ESCO_LINK_ONLY_MASK)
2981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta               ||!((params.packet_types & ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ BTA_HF_CLIENT_NO_EDR_ESCO))
2993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
3001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                bta_hf_client_cb.scb.retry_with_sco_only = TRUE;
301e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
3023fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
3033fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        }
3043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        else
3053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        {
3061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            if(bta_hf_client_cb.scb.retry_with_sco_only)
307e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_API("retrying with SCO only");
3081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
3093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            BTM_SetEScoMode(BTM_LINK_TYPE_SCO, &params);
3113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        }
3123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        /* tell sys to stop av if any */
3141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
3153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
3163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    else
3173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
3181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
3193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
3203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    p_bd_addr = bta_hf_client_cb.scb.peer_addr;
3223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    status = BTM_CreateSco(p_bd_addr, is_orig, params.packet_types,
3241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                           &bta_hf_client_cb.scb.sco_idx, bta_hf_client_sco_conn_cback,
3251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                           bta_hf_client_sco_disc_cback);
3261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (status == BTM_CMD_STARTED && !is_orig)
3273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
3281025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        if(!BTM_RegForEScoEvts(bta_hf_client_cb.scb.sco_idx, bta_hf_client_esco_connreq_cback))
329e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("%s SCO registration success", __FUNCTION__);
3303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
3313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
332e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_API("%s: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
3331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                      __FUNCTION__, is_orig, bta_hf_client_cb.scb.sco_idx,
3341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                      status, params.packet_types);
3353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
3361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
3373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
3393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
3401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_event
3413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
3421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      Handle SCO events
3433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
3443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
3453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
3463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
3473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
3481025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_sco_event(UINT8 event)
3493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
350e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s state: %d event: %d", __FUNCTION__,
3511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                        bta_hf_client_cb.scb.sco_state, event);
3523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    switch (bta_hf_client_cb.scb.sco_state)
3543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
3551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_SHUTDOWN_ST:
3563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
3573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
3581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_LISTEN_E:
3593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* create sco listen connection */
3601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(FALSE);
3611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
3623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
3633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
365e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTDOWN_ST: Ignoring event %d", event);
3663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
3673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
3683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
3693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_LISTEN_ST:
3713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
3723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
3731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_LISTEN_E:
3743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* create sco listen connection (Additional channel) */
3751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(FALSE);
3763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
3773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_OPEN_E:
3793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* remove listening connection */
3801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_remove(FALSE);
3813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* create sco connection to peer */
3831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(TRUE);
3841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
3853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
3863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
3883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* remove listening connection */
3891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_remove(FALSE);
3903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
3923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
3933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CLOSE_E:
3953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* remove listening connection */
3963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* Ignore the event. We need to keep listening SCO for the active SLC */
397e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", event);
3983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
3993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4001025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* sco failed; create sco listen connection */
4021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(FALSE);
4031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
4043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
407e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", event);
4083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
4103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
4113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_OPENING_ST:
4133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
4143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
4151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CLOSE_E:
4161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPEN_CL_ST;
4173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
4201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
4213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
4241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPEN_ST;
4253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* sco failed; create sco listen connection */
4291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(FALSE);
4301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
4313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
434e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPENING_ST: Ignoring event %d", event);
4353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
4373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
4383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_OPEN_CL_ST:
4403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
4413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
4421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_OPEN_E:
4431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
4443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
4471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
4483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
4513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* close sco connection */
4521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_remove(TRUE);
4533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
4553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* sco failed; create sco listen connection */
4593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
4613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
464e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_CL_ST: Ignoring event %d", event);
4653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
4673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
4683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_OPEN_ST:
4703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
4713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
4721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CLOSE_E:
4733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* close sco connection if active */
4741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    if (bta_hf_client_sco_remove(TRUE))
4753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    {
4761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                        bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
4773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    }
4783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
4813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* remove all listening connections */
4821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_remove(FALSE);
4833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
4853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* peer closed sco; create sco listen connection */
4891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(FALSE);
4901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
4913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
494e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_ST: Ignoring event %d", event);
4953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
4963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
4973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
4983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_CLOSING_ST:
5003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
5013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
5021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_OPEN_E:
5031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSE_OP_ST;
5043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
5071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
5083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
5113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* peer closed sco; create sco listen connection */
5121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(FALSE);
5133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
5153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
518e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSING_ST: Ignoring event %d", event);
5193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
5213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
5223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_CLOSE_OP_ST:
5243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
5253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
5261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CLOSE_E:
5271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
5283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
5311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
5323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
5353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* open sco connection */
5361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_create(TRUE);
5371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
5383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
541e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSE_OP_ST: Ignoring event %d", event);
5423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
5443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
5453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        case BTA_HF_CLIENT_SCO_SHUTTING_ST:
5473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            switch (event)
5483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            {
5491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
5503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    /* close sco connection; wait for conn close event */
5511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_sco_remove(TRUE);
5523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
5551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
5563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
5591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
5603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                default:
563e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTTING_ST: Ignoring event %d", event);
5643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta                    break;
5653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            }
5663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
5673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        default:
5693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta            break;
5703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
5713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_listen
5763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description      Initialize SCO listener
5783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5803fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
5813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
5831025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_sco_listen(tBTA_HF_CLIENT_DATA *p_data)
5843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
5853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    UNUSED(p_data);
5863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
587e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s", __FUNCTION__);
5883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_LISTEN_E);
5903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_shutdown
5953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description
5973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
5993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
6003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
6021025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_sco_shutdown(tBTA_HF_CLIENT_DATA *p_data)
6033fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
6043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    UNUSED(p_data);
6053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
606e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s", __FUNCTION__);
6073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_SHUTDOWN_E);
6093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_conn_open
6143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description
6163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
6193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
6211025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_sco_conn_open(tBTA_HF_CLIENT_DATA *p_data)
6223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
6233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    UNUSED(p_data);
6243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
625e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s", __FUNCTION__);
6263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CONN_OPEN_E);
6283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_sys_sco_open(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
6303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_MSBC)
6321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    {
6331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT);
6341025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    }
6351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    else
6361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    {
6371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_OPEN_EVT);
6381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    }
6393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
6413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_conn_close
6463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description
6483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
6513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
6531025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_sco_conn_close(tBTA_HF_CLIENT_DATA *p_data)
6543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
655e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s", __FUNCTION__);
6563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    /* clear current scb */
6581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
6593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    /* retry_with_sco_only, will be set only when initiator
6611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    ** and HFClient is first trying to establish an eSCO connection */
6621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (bta_hf_client_cb.scb.retry_with_sco_only && bta_hf_client_cb.scb.svc_conn)
6633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
6641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_sco_create(TRUE);
6653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
6663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    else
6673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
6681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CONN_CLOSE_E);
6693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_sys_sco_close(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
6713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_sys_sco_unuse(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
6733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        /* call app callback */
6751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_CLOSE_EVT);
6763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        if (bta_hf_client_cb.scb.sco_close_rfc == TRUE)
6783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        {
6791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            bta_hf_client_cb.scb.sco_close_rfc = FALSE;
6801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta            bta_hf_client_rfc_do_close(p_data);
6813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        }
6823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
6831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
6843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6881025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_open
6893fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description
6913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
6943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
6953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
6961025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_sco_open(tBTA_HF_CLIENT_DATA *p_data)
6973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
6983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    UNUSED(p_data);
6993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
700e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s", __FUNCTION__);
7011025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
7021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_OPEN_E);
7033fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
7043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
7053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
7063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
7071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function         bta_hf_client_sco_close
7083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
7091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description
7103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
7113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
7123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns          void
7133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta**
7143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/
7151025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_sco_close(tBTA_HF_CLIENT_DATA *p_data)
7163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{
7171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    UNUSED(p_data);
7183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
719e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("%s  0x%x", __FUNCTION__, bta_hf_client_cb.scb.sco_idx);
7203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
7211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
7223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    {
7231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CLOSE_E);
7243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
7253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
726