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 ******************************************************************************/
19f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson#include <string.h>
203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
21f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson#include "bt_trace.h"
221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bt_utils.h"
2357f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth#include "bta_ag_api.h"
24cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_hf_client_int.h"
2557f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth#include "device/include/esco_parameters.h"
26d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2857f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth#define BTA_HF_CLIENT_NO_EDR_ESCO                                \
2957f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth  (ESCO_PKT_TYPES_MASK_NO_2_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 | \
3057f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth   ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5)
31cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
32cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonenum {
33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BTA_HF_CLIENT_SCO_LISTEN_E,
34cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BTA_HF_CLIENT_SCO_OPEN_E,       /* open request */
35cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BTA_HF_CLIENT_SCO_CLOSE_E,      /* close request */
36cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BTA_HF_CLIENT_SCO_SHUTDOWN_E,   /* shutdown request */
374a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo  BTA_HF_CLIENT_SCO_CONN_OPEN_E,  /* SCO opened */
384a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo  BTA_HF_CLIENT_SCO_CONN_CLOSE_E, /* SCO closed */
393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta};
403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_remove_sco
448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Removes the specified SCO from the system.
468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
471baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * Returns          bool   - true if SCO removal was started
488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
50ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwalstatic bool bta_hf_client_sco_remove(tBTA_HF_CLIENT_CB* client_cb) {
51cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bool removed_started = false;
52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTM_STATUS status;
533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
54ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal  APPL_TRACE_DEBUG("%s", __func__);
553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (client_cb->sco_idx != BTM_INVALID_SCO_INDEX) {
575eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    status = BTM_RemoveSco(client_cb->sco_idx);
58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
59bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_DEBUG("%s: idx 0x%04x, status:0x%x", __func__,
605eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                     client_cb->sco_idx, status);
61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (status == BTM_CMD_STARTED) {
63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      removed_started = true;
643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
654a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo    /* If no connection reset the SCO handle */
66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    else if ((status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR)) {
675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      client_cb->sco_idx = BTM_INVALID_SCO_INDEX;
68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
70cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return removed_started;
713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_cback_sco
768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Call application callback function with SCO event.
788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
83bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid bta_hf_client_cback_sco(tBTA_HF_CLIENT_CB* client_cb, uint8_t event) {
84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_HF_CLIENT evt;
853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  memset(&evt, 0, sizeof(evt));
87744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski  evt.bd_addr = client_cb->peer_addr;
883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* call app cback */
905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  bta_hf_client_app_callback(event, (tBTA_HF_CLIENT*)&evt);
911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/*******************************************************************************
948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_conn_rsp
968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Process the SCO connection request
988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
103bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalstatic void bta_hf_client_sco_conn_rsp(tBTA_HF_CLIENT_CB* client_cb,
104bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                                       tBTM_ESCO_CONN_REQ_EVT_DATA* p_data) {
10557f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth  enh_esco_params_t resp;
106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t hci_status = HCI_SUCCESS;
1071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s", __func__);
1093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1105eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (client_cb->sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) {
111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_data->link_type == BTM_LINK_TYPE_SCO) {
11257f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD);
113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
1144a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo      if (client_cb->negotiated_codec == BTA_AG_CODEC_MSBC) {
11557f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth        resp = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
1164a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo      } else {
1174a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo        // default codec
1184a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo        resp = esco_parameters_for_codec(ESCO_CODEC_CVSD);
1194a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo      }
1203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta    }
1211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* tell sys to stop av if any */
123c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski    bta_sys_sco_use(BTA_ID_HS, 1, client_cb->peer_addr);
124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    hci_status = HCI_ERR_HOST_REJECT_DEVICE;
126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp);
1293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
1313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_connreq_cback
1348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      BTM eSCO connection requests and eSCO change requests
1368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  Only the connection requests are processed by BTA.
1378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_hf_client_esco_connreq_cback(tBTM_ESCO_EVT event,
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                                             tBTM_ESCO_EVT_DATA* p_data) {
143bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  APPL_TRACE_DEBUG("%s: %d", __func__, event);
1441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
145bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb =
146bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      bta_hf_client_find_cb_by_sco_handle(p_data->conn_evt.sco_inx);
147bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
1484a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo    APPL_TRACE_ERROR("%s: wrong SCO handle to control block %d", __func__,
149bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     p_data->conn_evt.sco_inx);
150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
153bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (event != BTM_ESCO_CONN_REQ_EVT) {
154bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
155bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
1563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
157bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_hf_client_sco_conn_rsp(client_cb, &p_data->conn_evt);
1583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  client_cb->sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
1603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_conn_cback
1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      BTM SCO connection callback.
1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_hf_client_sco_conn_cback(uint16_t sco_idx) {
173bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  APPL_TRACE_DEBUG("%s: %d", __func__, sco_idx);
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
175bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb = bta_hf_client_find_cb_by_sco_handle(sco_idx);
176bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
177bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong SCO handle to control block %d", __func__,
178bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     sco_idx);
179bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
181bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
182bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
183bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  p_buf->event = BTA_HF_CLIENT_SCO_OPEN_EVT;
1845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  p_buf->layer_specific = client_cb->handle;
185bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_sys_sendmsg(p_buf);
1863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_disc_cback
1918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      BTM SCO disconnection callback.
1938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_hf_client_sco_disc_cback(uint16_t sco_idx) {
199bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  APPL_TRACE_DEBUG("%s: sco_idx %d", __func__, sco_idx);
200bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
201bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb = bta_hf_client_find_cb_by_sco_handle(sco_idx);
202bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
203bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong handle to control block %d", __func__, sco_idx);
204bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
206bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
207bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
208bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  p_buf->event = BTA_HF_CLIENT_SCO_CLOSE_EVT;
2095eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  p_buf->layer_specific = client_cb->handle;
210bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_sys_sendmsg(p_buf);
2113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_create_sco
2168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
2188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
223bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalstatic void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
224bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                                     bool is_orig) {
225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTM_STATUS status;
226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
227bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  APPL_TRACE_DEBUG("%s: %d", __func__, is_orig);
228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
2294a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo  /* Make sure this SCO handle is not already in use */
2305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (client_cb->sco_idx != BTM_INVALID_SCO_INDEX) {
231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_WARNING("%s: Index 0x%04x already in use", __func__,
2325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                       client_cb->sco_idx);
233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    return;
234cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
236fe695a557a92053d4c44428ba08c0b8e945d4711Jack He  enh_esco_params_t params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* if initiating set current scb and peer bd addr */
239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (is_orig) {
240d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He    BTM_SetEScoMode(&params);
241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* tell sys to stop av if any */
242c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski    bta_sys_sco_use(BTA_ID_HS, 1, client_cb->peer_addr);
243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
245744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski  status = BTM_CreateSco(&client_cb->peer_addr, is_orig, params.packet_types,
246744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski                         &client_cb->sco_idx, bta_hf_client_sco_conn_cback,
247744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski                         bta_hf_client_sco_disc_cback);
248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (status == BTM_CMD_STARTED && !is_orig) {
2495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    if (!BTM_RegForEScoEvts(client_cb->sco_idx,
250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                            bta_hf_client_esco_connreq_cback))
251bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      APPL_TRACE_DEBUG("%s: SCO registration success", __func__);
252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_API("%s: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
2555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                 __func__, is_orig, client_cb->sco_idx, status,
256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                 params.packet_types);
2573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
2593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_event
2628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Handle SCO events
2648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
269bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalstatic void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
270bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                                    uint8_t event) {
271ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal  APPL_TRACE_DEBUG("%s: before state: %d event: %d", __func__,
272ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal                   client_cb->sco_state, event);
273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
2745eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  switch (client_cb->sco_state) {
275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_SHUTDOWN_ST:
276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
277ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal        // For WBS we only listen to SCO requests. Even for outgoing SCO
278ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal        // requests we first do a AT+BCC and wait for remote to initiate SCO
279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_LISTEN_E:
2804a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* create SCO listen connection */
281bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal          bta_hf_client_sco_create(client_cb, false);
2825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
2843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
285ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal        // For non WBS cases and enabling outgoing SCO requests we need to force
286ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal        // open a SCO channel
287ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal        case BTA_HF_CLIENT_SCO_OPEN_E:
288ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal          /* remove listening connection */
289ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal          bta_hf_client_sco_remove(client_cb);
290ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal
2914a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* create SCO connection to peer */
292ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal          bta_hf_client_sco_create(client_cb, true);
293ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
294ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal          break;
295ad372cfa3376f882046284a5655ed9c6fdf24dafSanket Agarwal
296cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
297cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTDOWN_ST: Ignoring event %d",
298cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_LISTEN_ST:
304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
3054a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo        case BTA_HF_CLIENT_SCO_LISTEN_E:
3064a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* create SCO listen connection */
3074a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          bta_hf_client_sco_create(client_cb, false);
3084a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo
309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_OPEN_E:
310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          /* remove listening connection */
311ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          bta_hf_client_sco_remove(client_cb);
312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
3134a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* create SCO connection to peer */
314bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal          bta_hf_client_sco_create(client_cb, true);
3155eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
319ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal        case BTA_HF_CLIENT_SCO_CLOSE_E:
320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          /* remove listening connection */
321ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          bta_hf_client_sco_remove(client_cb);
322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
3235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
3274a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* SCO failed; create SCO listen connection */
328bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal          bta_hf_client_sco_create(client_cb, false);
3295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
3313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta        default:
333ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          APPL_TRACE_WARNING(
334ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal              "%s: BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", __func__,
335ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal              event);
336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_OPENING_ST:
341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CLOSE_E:
3435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_OPEN_CL_ST;
344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
345cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
3475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
3515eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_OPEN_ST;
352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
3554a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* SCO failed; create SCO listen connection */
3564a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          bta_hf_client_sco_create(client_cb, false);
3574a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPENING_ST: Ignoring event %d",
362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_OPEN_CL_ST:
368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_OPEN_E:
3705eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
3745eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
3784a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* close SCO connection */
379ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          bta_hf_client_sco_remove(client_cb);
380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
3815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
3854a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* SCO failed; create SCO listen connection */
386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
3875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_CL_ST: Ignoring event %d",
392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_OPEN_ST:
398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CLOSE_E:
400ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          if (bta_hf_client_sco_remove(client_cb)) {
4015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal            client_cb->sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          }
403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
406ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          /* remove listening connection */
407ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          bta_hf_client_sco_remove(client_cb);
408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
4095eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4134a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* peer closed SCO */
4144a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          bta_hf_client_sco_create(client_cb, false);
4154a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_ST: Ignoring event %d",
420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_CLOSING_ST:
426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_OPEN_E:
4285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_CLOSE_OP_ST;
429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
4325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
435cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4364a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* peer closed sco; create SCO listen connection */
4374a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          bta_hf_client_sco_create(client_cb, false);
4384a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSING_ST: Ignoring event %d",
443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
446cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_CLOSE_OP_ST:
449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CLOSE_E:
4515eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
452cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
4555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4594a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* open SCO connection */
460bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal          bta_hf_client_sco_create(client_cb, true);
4615eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSE_OP_ST: Ignoring event %d",
466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    case BTA_HF_CLIENT_SCO_SHUTTING_ST:
472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      switch (event) {
473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
4744a3ab51c0c2d3f80601aec0511e210c55f74a1a0Joseph Pirozzo          /* close SCO connection; wait for conn close event */
475ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal          bta_hf_client_sco_remove(client_cb);
476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
4795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
4835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        default:
487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTTING_ST: Ignoring event %d",
488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             event);
489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          break;
490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    default:
494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      break;
495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
496ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal
497ac109dc2256b90c5704bed20e4d15f2400502eaaSanket Agarwal  APPL_TRACE_DEBUG("%s: after state: %d", __func__, client_cb->sco_state);
4983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
4993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_listen
5038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Initialize SCO listener
5058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
510bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid bta_hf_client_sco_listen(tBTA_HF_CLIENT_DATA* p_data) {
511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s", __func__);
5123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
513bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb =
514bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      bta_hf_client_find_cb_by_handle(p_data->hdr.layer_specific);
515bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
516bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong handle to control block %d", __func__,
517bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     p_data->hdr.layer_specific);
518bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
519bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
520bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
521bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_hf_client_sco_event(client_cb, BTA_HF_CLIENT_SCO_LISTEN_E);
5223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_shutdown
5278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
5298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
534bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid bta_hf_client_sco_shutdown(tBTA_HF_CLIENT_CB* client_cb) {
535cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s", __func__);
5363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
537bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_hf_client_sco_event(client_cb, BTA_HF_CLIENT_SCO_SHUTDOWN_E);
5383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_conn_open
5438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
5458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
550bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid bta_hf_client_sco_conn_open(tBTA_HF_CLIENT_DATA* p_data) {
551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s", __func__);
5523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
553bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb =
554bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      bta_hf_client_find_cb_by_handle(p_data->hdr.layer_specific);
555bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
556bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong handle to control block %d", __func__,
557bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     p_data->hdr.layer_specific);
558bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
559bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
5603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
561bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_hf_client_sco_event(client_cb, BTA_HF_CLIENT_SCO_CONN_OPEN_E);
5623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
563c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski  bta_sys_sco_open(BTA_ID_HS, 1, client_cb->peer_addr);
564bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
5655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (client_cb->negotiated_codec == BTM_SCO_CODEC_MSBC) {
566bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    bta_hf_client_cback_sco(client_cb, BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT);
567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
568bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    bta_hf_client_cback_sco(client_cb, BTA_HF_CLIENT_AUDIO_OPEN_EVT);
569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
5703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_conn_close
5758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
5778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_hf_client_sco_conn_close(tBTA_HF_CLIENT_DATA* p_data) {
583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s", __func__);
5843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
585bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb =
586bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      bta_hf_client_find_cb_by_handle(p_data->hdr.layer_specific);
587bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
588bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong handle to control block %d", __func__,
589bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     p_data->hdr.layer_specific);
590bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
591bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
592bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* clear current scb */
5945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  client_cb->sco_idx = BTM_INVALID_SCO_INDEX;
5953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
596d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He  bta_hf_client_sco_event(client_cb, BTA_HF_CLIENT_SCO_CONN_CLOSE_E);
5973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
598c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski  bta_sys_sco_close(BTA_ID_HS, 1, client_cb->peer_addr);
5993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
600c752e135d66f80c0b2efc35292ab8ddfd8227d61Jakub Pawlowski  bta_sys_sco_unuse(BTA_ID_HS, 1, client_cb->peer_addr);
6013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
602d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He  /* call app callback */
603d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He  bta_hf_client_cback_sco(client_cb, BTA_HF_CLIENT_AUDIO_CLOSE_EVT);
6043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
605d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He  if (client_cb->sco_close_rfc == true) {
606d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He    client_cb->sco_close_rfc = false;
607d3ae18b3b3c65e38bbce5e3bf2882f4e050077ddJack He    bta_hf_client_rfc_do_close(p_data);
608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_open
6148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
6168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
621bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid bta_hf_client_sco_open(tBTA_HF_CLIENT_DATA* p_data) {
622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("%s", __func__);
6231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
624bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb =
625bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      bta_hf_client_find_cb_by_handle(p_data->hdr.layer_specific);
626bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
627bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong handle to control block %d", __func__,
628bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     p_data->hdr.layer_specific);
629bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
630bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
631bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
632bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  bta_hf_client_sco_event(client_cb, BTA_HF_CLIENT_SCO_OPEN_E);
6333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hf_client_sco_close
6388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description
6408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
645bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid bta_hf_client_sco_close(tBTA_HF_CLIENT_DATA* p_data) {
646bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  tBTA_HF_CLIENT_CB* client_cb =
647bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      bta_hf_client_find_cb_by_handle(p_data->hdr.layer_specific);
648bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  if (client_cb == NULL) {
649bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    APPL_TRACE_ERROR("%s: wrong handle to control block %d", __func__,
650bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     p_data->hdr.layer_specific);
651bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    return;
652bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  }
653bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal
6545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  APPL_TRACE_DEBUG("%s: sco_idx 0x%x", __func__, client_cb->sco_idx);
6553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (client_cb->sco_idx != BTM_INVALID_SCO_INDEX) {
657bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    bta_hf_client_sco_event(client_cb, BTA_HF_CLIENT_SCO_CLOSE_E);
658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
6593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
660