Home | History | Annotate | Download | only in ag
      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