1 /****************************************************************************** 2 * 3 * Copyright (C) 2003-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This is the implementation of the API for the audio gateway (AG) 22 * subsystem of BTA, Broadcom's Bluetooth application layer for mobile 23 * phones. 24 * 25 ******************************************************************************/ 26 27 #include "bta_api.h" 28 #include "bta_sys.h" 29 #include "bta_ag_api.h" 30 #include "bta_ag_int.h" 31 #include "bt_common.h" 32 #include <string.h> 33 34 /***************************************************************************** 35 ** Constants 36 *****************************************************************************/ 37 38 static const tBTA_SYS_REG bta_ag_reg = 39 { 40 bta_ag_hdl_event, 41 BTA_AgDisable 42 }; 43 44 /******************************************************************************* 45 ** 46 ** Function BTA_AgEnable 47 ** 48 ** Description Enable the audio gateway service. When the enable 49 ** operation is complete the callback function will be 50 ** called with a BTA_AG_ENABLE_EVT. This function must 51 ** be called before other function in the AG API are 52 ** called. 53 ** 54 ** Returns BTA_SUCCESS if OK, BTA_FAILURE otherwise. 55 ** 56 *******************************************************************************/ 57 tBTA_STATUS BTA_AgEnable(tBTA_AG_PARSE_MODE parse_mode, tBTA_AG_CBACK *p_cback) 58 { 59 /* Error if AG is already enabled, or AG is in the middle of disabling. */ 60 for (int idx = 0; idx < BTA_AG_NUM_SCB; idx++) { 61 if (bta_ag_cb.scb[idx].in_use) { 62 APPL_TRACE_ERROR ("BTA_AgEnable: FAILED, AG already enabled."); 63 return BTA_FAILURE; 64 } 65 } 66 67 /* register with BTA system manager */ 68 bta_sys_register(BTA_ID_AG, &bta_ag_reg); 69 70 tBTA_AG_API_ENABLE *p_buf = 71 (tBTA_AG_API_ENABLE *)osi_malloc(sizeof(tBTA_AG_API_ENABLE)); 72 p_buf->hdr.event = BTA_AG_API_ENABLE_EVT; 73 p_buf->parse_mode = parse_mode; 74 p_buf->p_cback = p_cback; 75 76 bta_sys_sendmsg(p_buf); 77 78 return BTA_SUCCESS; 79 } 80 81 /******************************************************************************* 82 ** 83 ** Function BTA_AgDisable 84 ** 85 ** Description Disable the audio gateway service 86 ** 87 ** 88 ** Returns void 89 ** 90 *******************************************************************************/ 91 void BTA_AgDisable(void) 92 { 93 BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 94 95 p_buf->event = BTA_AG_API_DISABLE_EVT; 96 97 bta_sys_sendmsg(p_buf); 98 } 99 100 /******************************************************************************* 101 ** 102 ** Function BTA_AgRegister 103 ** 104 ** Description Register an Audio Gateway service. 105 ** 106 ** 107 ** Returns void 108 ** 109 *******************************************************************************/ 110 void BTA_AgRegister(tBTA_SERVICE_MASK services, tBTA_SEC sec_mask,tBTA_AG_FEAT features, 111 char * p_service_names[], UINT8 app_id) 112 { 113 tBTA_AG_API_REGISTER *p_buf = 114 (tBTA_AG_API_REGISTER *)osi_malloc(sizeof(tBTA_AG_API_REGISTER)); 115 116 p_buf->hdr.event = BTA_AG_API_REGISTER_EVT; 117 p_buf->features = features; 118 p_buf->sec_mask = sec_mask; 119 p_buf->services = services; 120 p_buf->app_id = app_id; 121 for (int i = 0; i < BTA_AG_NUM_IDX; i++) { 122 if (p_service_names[i]) 123 strlcpy(p_buf->p_name[i], p_service_names[i], BTA_SERVICE_NAME_LEN); 124 else 125 p_buf->p_name[i][0] = 0; 126 } 127 128 bta_sys_sendmsg(p_buf); 129 } 130 131 /******************************************************************************* 132 ** 133 ** Function BTA_AgDeregister 134 ** 135 ** Description Deregister an audio gateway service. 136 ** 137 ** 138 ** Returns void 139 ** 140 *******************************************************************************/ 141 void BTA_AgDeregister(UINT16 handle) 142 { 143 BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 144 145 p_buf->event = BTA_AG_API_DEREGISTER_EVT; 146 p_buf->layer_specific = handle; 147 148 bta_sys_sendmsg(p_buf); 149 } 150 151 /******************************************************************************* 152 ** 153 ** Function BTA_AgOpen 154 ** 155 ** Description Opens a connection to a headset or hands-free device. 156 ** When connection is open callback function is called 157 ** with a BTA_AG_OPEN_EVT. Only the data connection is 158 ** opened. The audio connection is not opened. 159 ** 160 ** 161 ** Returns void 162 ** 163 *******************************************************************************/ 164 void BTA_AgOpen(UINT16 handle, BD_ADDR bd_addr, tBTA_SEC sec_mask, tBTA_SERVICE_MASK services) 165 { 166 tBTA_AG_API_OPEN *p_buf = 167 (tBTA_AG_API_OPEN *)osi_malloc(sizeof(tBTA_AG_API_OPEN)); 168 169 p_buf->hdr.event = BTA_AG_API_OPEN_EVT; 170 p_buf->hdr.layer_specific = handle; 171 bdcpy(p_buf->bd_addr, bd_addr); 172 p_buf->services = services; 173 p_buf->sec_mask = sec_mask; 174 175 bta_sys_sendmsg(p_buf); 176 } 177 178 /******************************************************************************* 179 ** 180 ** Function BTA_AgClose 181 ** 182 ** Description Close the current connection to a headset or a handsfree 183 ** Any current audio connection will also be closed. 184 ** 185 ** 186 ** Returns void 187 ** 188 *******************************************************************************/ 189 void BTA_AgClose(UINT16 handle) 190 { 191 BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 192 193 p_buf->event = BTA_AG_API_CLOSE_EVT; 194 p_buf->layer_specific = handle; 195 196 bta_sys_sendmsg(p_buf); 197 } 198 199 /******************************************************************************* 200 ** 201 ** Function BTA_AgAudioOpen 202 ** 203 ** Description Opens an audio connection to the currently connected 204 ** headset or hnadsfree. 205 ** 206 ** 207 ** Returns void 208 ** 209 *******************************************************************************/ 210 void BTA_AgAudioOpen(UINT16 handle) 211 { 212 BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 213 214 p_buf->event = BTA_AG_API_AUDIO_OPEN_EVT; 215 p_buf->layer_specific = handle; 216 217 bta_sys_sendmsg(p_buf); 218 } 219 220 /******************************************************************************* 221 ** 222 ** Function BTA_AgAudioClose 223 ** 224 ** Description Close the currently active audio connection to a headset 225 ** or hnadsfree. The data connection remains open 226 ** 227 ** 228 ** Returns void 229 ** 230 *******************************************************************************/ 231 void BTA_AgAudioClose(UINT16 handle) 232 { 233 BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 234 235 p_buf->event = BTA_AG_API_AUDIO_CLOSE_EVT; 236 p_buf->layer_specific = handle; 237 238 bta_sys_sendmsg(p_buf); 239 } 240 241 /******************************************************************************* 242 ** 243 ** Function BTA_AgResult 244 ** 245 ** Description Send an AT result code to a headset or hands-free device. 246 ** This function is only used when the AG parse mode is set 247 ** to BTA_AG_PARSE. 248 ** 249 ** 250 ** Returns void 251 ** 252 *******************************************************************************/ 253 void BTA_AgResult(UINT16 handle, tBTA_AG_RES result, tBTA_AG_RES_DATA *p_data) 254 { 255 tBTA_AG_API_RESULT *p_buf = 256 (tBTA_AG_API_RESULT *)osi_malloc(sizeof(tBTA_AG_API_RESULT)); 257 258 p_buf->hdr.event = BTA_AG_API_RESULT_EVT; 259 p_buf->hdr.layer_specific = handle; 260 p_buf->result = result; 261 if (p_data) 262 memcpy(&p_buf->data, p_data, sizeof(p_buf->data)); 263 264 bta_sys_sendmsg(p_buf); 265 } 266 267 /******************************************************************************* 268 ** 269 ** Function BTA_AgSetCodec 270 ** 271 ** Description Specify the codec type to be used for the subsequent 272 ** audio connection. 273 ** 274 ** 275 ** 276 ** Returns void 277 ** 278 *******************************************************************************/ 279 void BTA_AgSetCodec(UINT16 handle, tBTA_AG_PEER_CODEC codec) 280 { 281 tBTA_AG_API_SETCODEC *p_buf = 282 (tBTA_AG_API_SETCODEC *)osi_malloc(sizeof(tBTA_AG_API_SETCODEC)); 283 284 p_buf->hdr.event = BTA_AG_API_SETCODEC_EVT; 285 p_buf->hdr.layer_specific = handle; 286 p_buf->codec = codec; 287 288 bta_sys_sendmsg(p_buf); 289 } 290