13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Copyright (c) 2014 The Android Open Source Project 43fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Copyright (C) 2009-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 20ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Filename: btif_hf_client.c 233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Description: Handsfree Profile (HF role) Bluetooth Interface 253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 266664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * Notes: 276664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * a) Lifecycle of a control block 286664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * Control block handles the lifecycle for a particular remote device's 296664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * connection. The connection can go via the classic phases but more 306664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * importantly there's only two messages from BTA that affect this. 316664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * BTA_HF_CLIENT_OPEN_EVT and BTA_HF_CLIENT_CLOSE_EVT. Since the API between 326664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * BTIF and BTA is controlled entirely by handles it's important to know where 336664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * the handles are created and destroyed. Handles can be created at two 346664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * locations: 356664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * -- While connect() is called from BTIF. This is an outgoing connection 366664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * -- While accepting an incoming connection (see BTA_HF_CLIENT_OPEN_EVT 376664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * handling). 386664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * 396664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * The destruction or rather reuse of handles can be done when 406664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * BTA_HF_CLIENT_CLOSE_EVT is called. Refer to the event handling for details 416664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal * of this. 423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btif_hfc" 4649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include <stdlib.h> 48c7503db23f91676b2df732becb9579d5ccdcc7a7Ian Coolidge#include <string.h> 49d30195cbf09735da593e186c4c99cce6232b072eArman Uguray 5049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <hardware/bluetooth.h> 5149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <hardware/bt_hf_client.h> 5249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bt_utils.h" 541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_api.h" 5549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btcore/include/bdaddr.h" 5649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_common.h" 5749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_profile_queue.h" 5849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_util.h" 59d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 603eb4a4827c9436ddd8333457be3474b6fadfb38fJakub Pawlowski#include "osi/include/properties.h" 613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Constants & Macros 64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifndef BTIF_HF_CLIENT_SERVICE_NAME 671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTIF_HF_CLIENT_SERVICE_NAME ("Handsfree") 683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#endif 693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifndef BTIF_HF_CLIENT_SECURITY 716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#define BTIF_HF_CLIENT_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT) 723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#endif 733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifndef BTIF_HF_CLIENT_FEATURES 756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#define BTIF_HF_CLIENT_FEATURES \ 766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (BTA_HF_CLIENT_FEAT_ECNR | BTA_HF_CLIENT_FEAT_3WAY | \ 776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_HF_CLIENT_FEAT_CLI | BTA_HF_CLIENT_FEAT_VREC | BTA_HF_CLIENT_FEAT_VOL | \ 786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_HF_CLIENT_FEAT_ECS | BTA_HF_CLIENT_FEAT_ECC | BTA_HF_CLIENT_FEAT_CODEC) 793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#endif 803fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Local type definitions 83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/* BTIF-HF control block to map bdaddr to BTA handle */ 855eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwaltypedef struct { 865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal uint16_t handle; // Handle obtained frm the BTA 875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bt_bdaddr_t peer_bda; // Device corresponding to handle 885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bthf_client_connection_state_t state; // State of current connection 895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal tBTA_HF_CLIENT_PEER_FEAT peer_feat; // HF features 905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal tBTA_HF_CLIENT_CHLD_FEAT chld_feat; // AT+CHLD=<> command features 915eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal} btif_hf_client_cb_t; 925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/* Max devices supported by BTIF (useful to match the value in BTA) */ 945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal#define HF_CLIENT_MAX_DEVICES 10 955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwaltypedef struct { 965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t cb[HF_CLIENT_MAX_DEVICES]; 975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal} btif_hf_client_cb_arr_t; 985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/****************************************************************************** 1005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Local function declarations 1015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/ 1025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_handle(uint16_t handle); 1035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_bda(const uint8_t* addr); 1045eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbool is_connected(const btif_hf_client_cb_t* cb); 1053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Static variables 108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bthf_client_callbacks_t* bt_hf_client_callbacks = NULL; 1103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 111d30195cbf09735da593e186c4c99cce6232b072eArman Uguraychar btif_hf_client_version[PROPERTY_VALUE_MAX]; 1121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 11340cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson#define CHECK_BTHF_CLIENT_INIT() \ 11440cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson do { \ 11540cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson if (bt_hf_client_callbacks == NULL) { \ 11640cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __func__); \ 11740cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson return BT_STATUS_NOT_READY; \ 11840cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } else { \ 11940cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson BTIF_TRACE_EVENT("BTHF CLIENT: %s", __func__); \ 12040cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } \ 12140cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } while (0) 12240cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson 1235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal#define CHECK_BTHF_CLIENT_SLC_CONNECTED(cb) \ 12440cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson do { \ 12540cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson if (bt_hf_client_callbacks == NULL) { \ 12640cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __func__); \ 12740cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson return BT_STATUS_NOT_READY; \ 1285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } else if ((cb)->state != BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED) { \ 12940cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson BTIF_TRACE_WARNING("BTHF CLIENT: %s: SLC connection not up. state=%s", \ 1305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal __func__, dump_hf_conn_state((cb)->state)); \ 13140cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson return BT_STATUS_NOT_READY; \ 13240cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } else { \ 13340cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson BTIF_TRACE_EVENT("BTHF CLIENT: %s", __func__); \ 13440cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } \ 13540cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } while (0) 1363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic btif_hf_client_cb_arr_t btif_hf_client_cb_arr; 1383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Static functions 141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_in_hf_client_generic_evt 1466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Processes generic events to be sent to JNI that are not 148f45481678af0694902b5200ba69ced4cb61d73f0Myles Watson * triggered from the BTA. 1496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Always runs in BTIF context 1506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 1526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 1545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic void btif_in_hf_client_generic_evt(uint16_t event, char* p_param) { 1555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_DEBUG("%s", __func__); 1565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bt_bdaddr_t* bd_addr = (bt_bdaddr_t*)p_param; 1575eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 1585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) { 1595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_ERROR("%s: failed to find block for bda", __func__); 1605eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 1615eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 1626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s: event=%d", __func__, event); 1636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (event) { 1646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_HF_CLIENT_CB_AUDIO_CONNECTING: { 1655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda, 166f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal (bthf_client_audio_state_t)BTHF_AUDIO_STATE_CONNECTING); 1676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 1686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: { 169bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal BTIF_TRACE_WARNING("%s: : Unknown event 0x%x", __func__, event); 1706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 1716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 1723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1755eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Functions 176ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1775eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbool is_connected(const btif_hf_client_cb_t* cb) { 1785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if ((cb->state == BTHF_CLIENT_CONNECTION_STATE_CONNECTED) || 1795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal (cb->state == BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED)) 1805eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return true; 1815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 1825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_ERROR("%s: not connected!", __func__); 1835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return false; 1845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal} 1853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function btif_hf_client_get_cb_by_handle 1895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description Get control block by handle 1915eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns btif_hf_client_cb_t pointer if available NULL otherwise 1935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_handle(uint16_t handle) { 1965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_DEBUG("%s: cb by handle %d", __func__, handle); 1975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal for (int i = 0; i < HF_CLIENT_MAX_DEVICES; i++) { 1985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal // Block is valid only if it is allocated i.e. state is not DISCONNECTED 1995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (btif_hf_client_cb_arr.cb[i].state != 2005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED && 2015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_arr.cb[i].handle == handle) { 2025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return &btif_hf_client_cb_arr.cb[i]; 2035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2045eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2055eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_ERROR("%s: could not find block for handle %d", __func__, handle); 2065eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return NULL; 2075eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal} 2083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2095eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/******************************************************************************* 2105eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2115eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function btif_hf_client_get_cb_by_bda 2125eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2135eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description Get control block by bda 2145eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2155eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns btif_hf_client_cb_t pointer if available NULL otherwise 2165eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2175eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/ 2185eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_bda(const uint8_t* bd_addr) { 2196664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal BTIF_TRACE_DEBUG("%s incoming addr %02x:%02x:%02x:%02x:%02x:%02x", __func__, 2206664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], 2216664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal bd_addr[5]); 2226664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal 2235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal for (int i = 0; i < HF_CLIENT_MAX_DEVICES; i++) { 2245eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal // Block is valid only if it is allocated i.e. state is not DISCONNECTED 2255eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (btif_hf_client_cb_arr.cb[i].state != 2265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED && 2275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal !bdcmp(btif_hf_client_cb_arr.cb[i].peer_bda.address, bd_addr)) { 2285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return &btif_hf_client_cb_arr.cb[i]; 2295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_ERROR("%s: could not find block for bdaddr", __func__); 2325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return NULL; 2333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2355eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/******************************************************************************* 2365eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function btif_hf_client_allocate_cb 2385eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2395eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description Get control block by bda 2405eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2415eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns btif_hf_client_cb_t pointer if available NULL otherwise 2425eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 2435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/ 2445eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_allocate_cb() { 2455eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal for (int i = 0; i < HF_CLIENT_MAX_DEVICES; i++) { 2465eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = &btif_hf_client_cb_arr.cb[i]; 2475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED) { 2485eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return cb; 2495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2515eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_ERROR("%s: unable to allocate control block", __func__); 2525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return NULL; 2533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/***************************************************************************** 2576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * btif hf api functions (no context switch) 2596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ****************************************************************************/ 2613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 2636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_hf_client_init 2656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description initializes the hf interface 2676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 2696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 2716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t init(bthf_client_callbacks_t* callbacks) { 2726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s", __func__); 2733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_hf_client_callbacks = callbacks; 2753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_enable_service(BTA_HFP_HS_SERVICE_ID); 2773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal memset(&btif_hf_client_cb_arr, 0, sizeof(btif_hf_client_cb_arr_t)); 2793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 2813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 2846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function connect 2866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description connect to audio gateway 2886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 2906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 2926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t connect_int(bt_bdaddr_t* bd_addr, uint16_t uuid) { 2935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_allocate_cb(); 2945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL) { 2955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_ERROR("%s: could not allocate block!", __func__); 2965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return BT_STATUS_BUSY; 2975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } 2981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2999b2e40df051af05becf9672100e1004bb6f746aeliuchao bdcpy(cb->peer_bda.address, bd_addr->address); 3005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (is_connected(cb)) return BT_STATUS_BUSY; 3015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 3025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state = BTHF_CLIENT_CONNECTION_STATE_CONNECTING; 3035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bdcpy(cb->peer_bda.address, bd_addr->address); 3043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 305bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal /* Open HF connection to remote device and get the relevant handle. 306bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * The handle is valid until we have called BTA_HfClientClose or the LL 307bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * has notified us of channel close due to remote closing, error etc. 308bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal */ 3095eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientOpen(cb->peer_bda.address, BTIF_HF_CLIENT_SECURITY, &cb->handle); 3101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 3116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 3123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 3133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t connect(bt_bdaddr_t* bd_addr) { 3156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("HFP Client version is %s", btif_hf_client_version); 3166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson CHECK_BTHF_CLIENT_INIT(); 3176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int); 3183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 3193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 3216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function disconnect 3236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description disconnect from audio gateway 3256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 3276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 329f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwalstatic bt_status_t disconnect(const bt_bdaddr_t* bd_addr) { 3306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson CHECK_BTHF_CLIENT_INIT(); 3313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 3335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb != NULL) { 3345eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientClose(cb->handle); 3356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 3365eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } else { 3375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return BT_STATUS_BUSY; 3386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 3393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 3403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 3426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function connect_audio 3446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description create an audio connection 3466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 3486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 350f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwalstatic bt_status_t connect_audio(const bt_bdaddr_t* bd_addr) { 3515eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 3525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 3533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 3555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 3565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if ((BTIF_HF_CLIENT_FEATURES & BTA_HF_CLIENT_FEAT_CODEC) && 3575eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal (cb->peer_feat & BTA_HF_CLIENT_PEER_CODEC)) { 3585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BCC, 0, 0, NULL); 3595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } else { 3605eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientAudioOpen(cb->handle); 3616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 3626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 3635eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal /* Inform the application that the audio connection has been initiated 3645eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * successfully */ 3655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_transfer_context(btif_in_hf_client_generic_evt, 3665eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_HF_CLIENT_CB_AUDIO_CONNECTING, (char*)bd_addr, 3675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal sizeof(bt_bdaddr_t), NULL); 3685eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return BT_STATUS_SUCCESS; 3693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 3703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 3726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function disconnect_audio 3746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description close the audio connection 3766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 3786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 380f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwalstatic bt_status_t disconnect_audio(const bt_bdaddr_t* bd_addr) { 3815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 3825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 3833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 3856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 3865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientAudioClose(cb->handle); 3875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal return BT_STATUS_SUCCESS; 3883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 3893fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 3916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function start_voice_recognition 3936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description start voice recognition 3956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 3976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 3995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t start_voice_recognition(const bt_bdaddr_t* bd_addr) { 4005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 4015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 4026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 4043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4055eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC) { 4065eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BVRA, 1, 0, NULL); 4076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 4086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 4096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 4103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 4113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 4136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function stop_voice_recognition 4156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description stop voice recognition 4176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 4196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 4215eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t stop_voice_recognition(const bt_bdaddr_t* bd_addr) { 4225eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 4235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 4246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4255eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 4263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC) { 4285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BVRA, 0, 0, NULL); 4291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return BT_STATUS_SUCCESS; 4306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 4316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 4323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 4333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 4356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function volume_control 4376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description volume control 4396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 4416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 4435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t volume_control(const bt_bdaddr_t* bd_addr, 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bthf_client_volume_type_t type, int volume) { 4455eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 4465eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 4475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 4485eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 4496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (type) { 4516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTHF_CLIENT_VOLUME_TYPE_SPK: 4525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_VGS, volume, 0, NULL); 4536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 4546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTHF_CLIENT_VOLUME_TYPE_MIC: 4555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_VGM, volume, 0, NULL); 4566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 4576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: 4586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 4596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 4603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 4623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 4633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 4656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function dial 4676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description place a call 4696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 4716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bt_status_t dial(UNUSED_ATTR const bt_bdaddr_t* bd_addr, 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* number) { 4755eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 4765eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 4775eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 4785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 4796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (number) { 4815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATD, 0, 0, number); 4826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 4835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BLDN, 0, 0, NULL); 4846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 4856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 4866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson} 4873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 4886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson/******************************************************************************* 4896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function dial_memory 4916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description place a call with number specified by location (speed dial) 4936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 4956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 4975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t dial_memory(const bt_bdaddr_t* bd_addr, int location) { 4985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 4995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 5006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 5015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 5026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 5035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATD, location, 0, NULL); 5046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 5053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 5063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 5073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 5086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function handle_call_action 5106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description handle specified call related action 5126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 5146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 5165eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t handle_call_action(const bt_bdaddr_t* bd_addr, 517f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal bthf_client_call_action_t action, 5186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson int idx) { 5195eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 5205eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 5215eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 5225eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 5236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 5246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (action) { 5251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_0: 5265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->chld_feat & BTA_HF_CLIENT_CHLD_REL) { 5275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 0, 0, NULL); 5286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_1: 5326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // CHLD 1 is mandatory for 3 way calling 5335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY) { 5345eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, 0, NULL); 5356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_2: 5396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // CHLD 2 is mandatory for 3 way calling 5405eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY) { 5415eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, 0, NULL); 5426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_3: 5465eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->chld_feat & BTA_HF_CLIENT_CHLD_MERGE) { 5475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 3, 0, NULL); 5486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_4: 5525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->chld_feat & BTA_HF_CLIENT_CHLD_MERGE_DETACH) { 5535eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 4, 0, NULL); 5546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_1x: 5585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_ECC) { 5596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (idx < 1) { 5606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_FAIL; 5611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 5625eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, idx, NULL); 5636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHLD_2x: 5675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_ECC) { 5686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (idx < 1) { 5696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_FAIL; 5701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 5715eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, idx, NULL); 5721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 5736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 5756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTHF_CLIENT_CALL_ACTION_ATA: 5765eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATA, 0, 0, NULL); 5776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_CHUP: 5795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHUP, 0, 0, NULL); 5806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_BTRH_0: 5825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BTRH, 0, 0, NULL); 5836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_BTRH_1: 5855eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BTRH, 1, 0, NULL); 5866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta case BTHF_CLIENT_CALL_ACTION_BTRH_2: 5885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BTRH, 2, 0, NULL); 5896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 5901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta default: 5916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_FAIL; 5926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 5946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 5953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 5963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 5973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 5986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function query_current_calls 6006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description query list of current calls 6026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 6046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bt_status_t query_current_calls(UNUSED_ATTR const bt_bdaddr_t* bd_addr) { 6075eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 6085eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 6096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6105eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 6116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6125eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_ECS) { 6135eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CLCC, 0, 0, NULL); 6146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 6156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 6163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 6183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 6193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 6216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function query_current_operator_name 6236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description query current selected operator name 6256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 6276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 6295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t query_current_operator_name(const bt_bdaddr_t* bd_addr) { 6305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 6315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 6323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 6346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6355eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_COPS, 0, 0, NULL); 6366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 6371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/******************************************************************************* 6406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function retieve_subscriber_info 6426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description retrieve subscriber number information 6446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 6466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 6485eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t retrieve_subscriber_info(const bt_bdaddr_t* bd_addr) { 6495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 6505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 6511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 6525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 6536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CNUM, 0, 0, NULL); 6556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 6563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 6573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 6596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function send_dtmf 6616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description send dtmf 6636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 6656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 6675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t send_dtmf(const bt_bdaddr_t* bd_addr, char code) { 6685eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 6695eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 6703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6715eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 6726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6735eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_VTS, code, 0, NULL); 6746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 6751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 6763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/******************************************************************************* 6786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function request_last_voice_tag_number 6806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Request number from AG for VR purposes 6826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 6846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 6865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t request_last_voice_tag_number(const bt_bdaddr_t* bd_addr) { 6875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 6885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 6896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 6913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_VTAG) { 6935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BINP, 1, 0, NULL); 6946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 6956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 6966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_UNSUPPORTED; 6973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 6983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 6993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 7006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function cleanup 7026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Closes the HF interface 7046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 7066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 7086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void cleanup(void) { 7096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s", __func__); 7106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (bt_hf_client_callbacks) { 7126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_disable_service(BTA_HFP_HS_SERVICE_ID); 7136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_hf_client_callbacks = NULL; 7146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 7151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 7161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 7171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/******************************************************************************* 7186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function send_at_cmd 7206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Send requested AT command to rempte device. 7226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 7246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 7265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t send_at_cmd(const bt_bdaddr_t* bd_addr, int cmd, int val1, 7275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal int val2, const char* arg) { 7285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address); 7295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL; 7305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 7315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal CHECK_BTHF_CLIENT_SLC_CONNECTED(cb); 7325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 733bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal BTIF_TRACE_EVENT("%s: Cmd %d val1 %d val2 %d arg %s", __func__, cmd, val1, 7346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson val2, (arg != NULL) ? arg : "<null>"); 7355eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTA_HfClientSendAT(cb->handle, cmd, val1, val2, arg); 7363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 7376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 7381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 7393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 7401025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic const bthf_client_interface_t bthfClientInterface = { 7411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sizeof(bthf_client_interface_t), 7421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .init = init, 7431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .connect = connect, 7441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .disconnect = disconnect, 7451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .connect_audio = connect_audio, 7461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .disconnect_audio = disconnect_audio, 7471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .start_voice_recognition = start_voice_recognition, 7481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .stop_voice_recognition = stop_voice_recognition, 7491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .volume_control = volume_control, 7501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .dial = dial, 7511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .dial_memory = dial_memory, 7521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .handle_call_action = handle_call_action, 7531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .query_current_calls = query_current_calls, 7541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .query_current_operator_name = query_current_operator_name, 7551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .retrieve_subscriber_info = retrieve_subscriber_info, 7561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .send_dtmf = send_dtmf, 7571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .request_last_voice_tag_number = request_last_voice_tag_number, 7581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .cleanup = cleanup, 7591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta .send_at_cmd = send_at_cmd, 7601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}; 7613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 7626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void process_ind_evt(tBTA_HF_CLIENT_IND* ind) { 7635eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_DEBUG("%s", __func__); 7645eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 7655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(ind->bd_addr); 7665eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb == NULL || !is_connected(cb)) return; 7675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 7686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (ind->type) { 7696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_CALL: 7705eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, call_cb, &cb->peer_bda, 7716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_call_t)ind->value); 7726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_CALLSETUP: 7755eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, callsetup_cb, &cb->peer_bda, 7766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_callsetup_t)ind->value); 7776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_CALLHELD: 7795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, callheld_cb, &cb->peer_bda, 7806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_callheld_t)ind->value); 7816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_SERVICE: 7845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, network_state_cb, &cb->peer_bda, 7856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_network_state_t)ind->value); 7866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_SIGNAL: 7895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, network_signal_cb, &cb->peer_bda, 7905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ind->value); 7916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_ROAM: 7945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, network_roaming_cb, &cb->peer_bda, 7956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_service_type_t)ind->value); 7966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_BATTCH: 7995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, battery_level_cb, &cb->peer_bda, 8005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ind->value); 8016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: 8046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 8061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 8073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 8081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/******************************************************************************* 8096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_hf_client_upstreams_evt 8116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Executes HF CLIENT UPSTREAMS events in btif context 8136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 8156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 8176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_hf_client_upstreams_evt(uint16_t event, char* p_param) { 8186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTA_HF_CLIENT* p_data = (tBTA_HF_CLIENT*)p_param; 8196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bdstr_t bdstr; 8206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8215eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(p_data->bd_addr); 8226664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal if (cb == NULL && event == BTA_HF_CLIENT_OPEN_EVT) { 8236664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal BTIF_TRACE_DEBUG("%s: event BTA_HF_CLIENT_OPEN_EVT allocating block", 8246664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal __func__); 8256664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal cb = btif_hf_client_allocate_cb(); 8266664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal cb->handle = p_data->open.handle; 8276664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal bdcpy(cb->peer_bda.address, p_data->open.bd_addr); 8286664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal } else if (cb == NULL) { 8296664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal BTIF_TRACE_ERROR("%s: event %d but not allocating block: cb not found", 8306664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal __func__, event); 8316664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal return; 8326664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal } 8335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 8346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_DEBUG("%s: event=%s (%u)", __func__, dump_hf_client_event(event), 8356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson event); 8366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (event) { 8386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_OPEN_EVT: 8396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p_data->open.status == BTA_HF_CLIENT_SUCCESS) { 8405eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state = BTHF_CLIENT_CONNECTION_STATE_CONNECTED; 8415eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->peer_feat = 0; 8425eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->chld_feat = 0; 8435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal } else if (cb->state == BTHF_CLIENT_CONNECTION_STATE_CONNECTING) { 8445eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED; 8456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 8466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_WARNING( 8476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson "%s: HF CLient open failed, but another device connected. " 8486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson "status=%d state=%d connected device=%s", 8495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal __func__, p_data->open.status, cb->state, 8505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bdaddr_to_string(&cb->peer_bda, bdstr, sizeof(bdstr))); 8516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 8536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, &cb->peer_bda, 8555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state, 0, /* peer feat */ 856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0 /* AT+CHLD feat */); 8576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED) 8595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bdsetany(cb->peer_bda.address); 8606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p_data->open.status != BTA_HF_CLIENT_SUCCESS) btif_queue_advance(); 8626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_CONN_EVT: 8655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->peer_feat = p_data->conn.peer_feat; 8665eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->chld_feat = p_data->conn.chld_feat; 8675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state = BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED; 8686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8695eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, &cb->peer_bda, 8705eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state, cb->peer_feat, cb->chld_feat); 8716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* Inform the application about in-band ringtone */ 8735eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal if (cb->peer_feat & BTA_HF_CLIENT_PEER_INBAND) { 8745eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, &cb->peer_bda, 8756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED); 8766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 8776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_queue_advance(); 8796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_CLOSE_EVT: 8825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED; 8835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, &cb->peer_bda, 8845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->state, 0, 0); 8855eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal bdsetany(cb->peer_bda.address); 8865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->peer_feat = 0; 8875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal cb->chld_feat = 0; 8886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_queue_advance(); 8896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_IND_EVT: 8926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson process_ind_evt(&p_data->ind); 8936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_MIC_EVT: 8965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, &cb->peer_bda, 8975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTHF_CLIENT_VOLUME_TYPE_MIC, p_data->val.value); 8986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 8996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_SPK_EVT: 9015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, &cb->peer_bda, 9025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTHF_CLIENT_VOLUME_TYPE_SPK, p_data->val.value); 9036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_VOICE_REC_EVT: 9065eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, vr_cmd_cb, &cb->peer_bda, 9076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_vr_state_t)p_data->val.value); 9086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_OPERATOR_NAME_EVT: 9115eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, current_operator_cb, &cb->peer_bda, 9125eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->operator_name.name); 9136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_CLIP_EVT: 9165eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, clip_cb, &cb->peer_bda, 9175eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->number.number); 9186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_BINP_EVT: 9216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hf_client_callbacks, last_voice_tag_number_callback, 9225eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal &cb->peer_bda, p_data->number.number); 9236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_CCWA_EVT: 9265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, call_waiting_cb, &cb->peer_bda, 9275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->number.number); 9286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_AT_RESULT_EVT: 9315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, cmd_complete_cb, &cb->peer_bda, 9326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_cmd_complete_t)p_data->result.type, 9336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_data->result.cme); 9346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_CLCC_EVT: 9375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, current_calls_cb, &cb->peer_bda, 9385eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->clcc.idx, 9396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_data->clcc.inc ? BTHF_CLIENT_CALL_DIRECTION_INCOMING 9406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson : BTHF_CLIENT_CALL_DIRECTION_OUTGOING, 9416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_call_state_t)p_data->clcc.status, 9426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_data->clcc.mpty ? BTHF_CLIENT_CALL_MPTY_TYPE_MULTI 9436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson : BTHF_CLIENT_CALL_MPTY_TYPE_SINGLE, 9446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_data->clcc.number_present ? p_data->clcc.number : NULL); 9456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_CNUM_EVT: 9486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p_data->cnum.service == 4) { 9495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, &cb->peer_bda, 9505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->cnum.number, BTHF_CLIENT_SERVICE_VOICE); 9516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else if (p_data->cnum.service == 5) { 9525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, &cb->peer_bda, 9535eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->cnum.number, BTHF_CLIENT_SERVICE_FAX); 9546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 9555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, &cb->peer_bda, 9565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal p_data->cnum.number, BTHF_CLIENT_SERVICE_UNKNOWN); 9576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 9586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_BTRH_EVT: 9616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p_data->val.value <= BTRH_CLIENT_RESP_AND_HOLD_REJECT) { 9625eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, resp_and_hold_cb, &cb->peer_bda, 9636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (bthf_client_resp_and_hold_t)p_data->val.value); 9646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 9656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_BSIR_EVT: 9686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p_data->val.value != 0) { 9695eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, &cb->peer_bda, 9706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED); 9716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 9725eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, &cb->peer_bda, 9736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTHF_CLIENT_IN_BAND_RINGTONE_NOT_PROVIDED); 9746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 9756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_AUDIO_OPEN_EVT: 9785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda, 979f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal BTHF_CLIENT_AUDIO_STATE_CONNECTED); 9806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT: 9835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda, 984f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal BTHF_CLIENT_AUDIO_STATE_CONNECTED_MSBC); 9856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_AUDIO_CLOSE_EVT: 9885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda, 989f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal BTHF_CLIENT_AUDIO_STATE_DISCONNECTED); 9906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTA_HF_CLIENT_RING_INDICATION: 9925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb, &cb->peer_bda); 9936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: 9956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_WARNING("%s: Unhandled event: %d", __func__, event); 9966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 9983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 9993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 10003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 10016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1002bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Function bta_hf_client_evt 10036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1004bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Description Switches context from BTA to BTIF for all HF Client events 10056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 10076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1010bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalstatic void bta_hf_client_evt(tBTA_HF_CLIENT_EVT event, 10116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTA_HF_CLIENT* p_data) { 10126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_status_t status; 10136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* switch context to btif task context (copy full union size for convenience) 10156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson */ 10166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = btif_transfer_context(btif_hf_client_upstreams_evt, (uint16_t)event, 10176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (char*)p_data, sizeof(*p_data), NULL); 10186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* catch any failed context transfers */ 10206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); 10211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta} 10223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 10233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 10246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_hf_client_execute_service 10266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Initializes/Shuts down the service 10286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 10306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_hf_client_execute_service(bool b_enable) { 10335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_EVENT("%s: enable: %d", __func__, b_enable); 10346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (b_enable) { 10366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* Enable and register with BTA-HFClient */ 10375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal BTIF_TRACE_EVENT("%s: support codec negotiation %d ", __func__, 1038bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal BTIF_HF_CLIENT_FEATURES); 1039bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal BTA_HfClientEnable(bta_hf_client_evt, BTIF_HF_CLIENT_SECURITY, 1040bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal BTIF_HF_CLIENT_FEATURES, BTIF_HF_CLIENT_SERVICE_NAME); 10416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 10426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_HfClientDisable(); 10436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 10446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 10453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 10463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 10473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 10486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_hf_get_interface 10506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Get the hf callback interface 10526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bthf_interface_t 10546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonconst bthf_client_interface_t* btif_hf_client_get_interface(void) { 10576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s", __func__); 10586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return &bthfClientInterface; 10593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1060