13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Copyright (c) 2014 The Android Open Source Project 45b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 2003-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 203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * This is the implementation of the API for the handsfree (HF role) 231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * subsystem of BTA 243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/ 263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include <string.h> 28f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson 291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_api.h" 301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_int.h" 3147d68ee6229ccec3deeaaf694fa86438d97333a4Scott James Remnant#include "osi/include/compat.h" 323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/***************************************************************************** 348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * External Function Declarations 358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/ 361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfClientEnable 408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Description Enable the HF CLient service. It does the following: 42bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * 1. Sets the state to initialized (control blocks) 43bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * 2. Starts the SDP for the client role (HF) 44bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * 3. Starts the RFCOMM server to accept incoming connections 45bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * The function is synchronous and returns with an error code 46bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * if anything went wrong. This should be the first call to the 47bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * API before doing an BTA_HfClientOpen 488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns BTA_SUCCESS if OK, BTA_FAILURE otherwise. 508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 52bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket AgarwaltBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK* p_cback, tBTA_SEC sec_mask, 53bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal tBTA_HF_CLIENT_FEAT features, 54bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal const char* p_service_name) { 55bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal return bta_hf_client_api_enable(p_cback, sec_mask, features, p_service_name); 563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfClientDisable 618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Disable the HF Client service 638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 67bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalvoid BTA_HfClientDisable(void) { bta_hf_client_api_disable(); } 683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfClientOpen 728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 73bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Description Opens up a RF connection to the remote device and 74bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * subsequently set it up for a HF SLC 758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 79a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid BTA_HfClientOpen(const RawAddress& bd_addr, tBTA_SEC sec_mask, 80744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski uint16_t* p_handle) { 815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal APPL_TRACE_DEBUG("%s", __func__); 82cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HF_CLIENT_API_OPEN* p_buf = 83cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_HF_CLIENT_API_OPEN*)osi_malloc(sizeof(tBTA_HF_CLIENT_API_OPEN)); 843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 85bd3ae7cbf195caf91693046147b34d25b6317485Sanket Agarwal if (!bta_hf_client_allocate_handle(bd_addr, p_handle)) { 86bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal APPL_TRACE_ERROR("%s: could not allocate handle", __func__); 87bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal return; 88bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal } 89bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal 90cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = BTA_HF_CLIENT_API_OPEN_EVT; 91bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal p_buf->hdr.layer_specific = *p_handle; 92744eeca761b6d52d4e5fbbfa49c2d2adde0e6981Jakub Pawlowski p_buf->bd_addr = bd_addr; 93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->sec_mask = sec_mask; 94717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfClientClose 1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Close the current connection to an audio gateway. 1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Any current audio connection will also be closed 1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientClose(uint16_t handle) { 110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 1113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->event = BTA_HF_CLIENT_API_CLOSE_EVT; 113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->layer_specific = handle; 114717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 1163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfCllientAudioOpen 1218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Opens an audio connection to the currently connected 1238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * audio gateway 1248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientAudioOpen(uint16_t handle) { 130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 1313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->event = BTA_HF_CLIENT_API_AUDIO_OPEN_EVT; 133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->layer_specific = handle; 134717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 1363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfClientAudioClose 1418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Close the currently active audio connection to an audio 1438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * gateway. The data connection remains open 1448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientAudioClose(uint16_t handle) { 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 1513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->event = BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT; 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->layer_specific = handle; 154717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 1563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function BTA_HfClientSendAT 1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description send AT command 1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid BTA_HfClientSendAT(uint16_t handle, tBTA_HF_CLIENT_AT_CMD_TYPE at, 169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t val1, uint32_t val2, const char* str) { 170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_HF_CLIENT_DATA_VAL* p_buf = 171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_HF_CLIENT_DATA_VAL*)osi_malloc(sizeof(tBTA_HF_CLIENT_DATA_VAL)); 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = BTA_HF_CLIENT_SEND_AT_CMD_EVT; 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->uint8_val = at; 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->uint32_val1 = val1; 176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->uint32_val2 = val2; 177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (str) { 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy(p_buf->str, str, BTA_HF_CLIENT_NUMBER_LEN + 1); 180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->str[BTA_HF_CLIENT_NUMBER_LEN] = '\0'; 181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->str[0] = '\0'; 183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.layer_specific = handle; 186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 1883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal 1905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/******************************************************************************* 1915eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function BTA_HfClientDumpStatistics 1935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description Dump statistics about the various control blocks 1955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * and other relevant connection statistics 1965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns Void 1985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * 1995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/ 2005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalvoid BTA_HfClientDumpStatistics(int fd) { bta_hf_client_dump_statistics(fd); } 201