From 5ef33f85f610320fc95687f5e2f532101cfabfa4 Mon Sep 17 00:00:00 2001 From: Andre Eisenbach Date: Mon, 14 May 2012 20:38:15 -0700 Subject: AV/HFP profile connection serialization Change-Id: Id70d24986badf09b31fd171e130936dd01ed7987 --- btif/include/btif_profile_queue.h | 65 +++++++++++++ btif/src/btif_av.c | 21 ++++- btif/src/btif_hf.c | 15 ++- btif/src/btif_profile_queue.c | 192 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 286 insertions(+), 7 deletions(-) create mode 100644 btif/include/btif_profile_queue.h create mode 100644 btif/src/btif_profile_queue.c (limited to 'btif') diff --git a/btif/include/btif_profile_queue.h b/btif/include/btif_profile_queue.h new file mode 100644 index 0000000..c9ed0e7 --- /dev/null +++ b/btif/include/btif_profile_queue.h @@ -0,0 +1,65 @@ +/************************************************************************************ + * + * Copyright (C) 2009-2012 Broadcom Corporation + * + * This program is the proprietary software of Broadcom Corporation and/or its + * licensors, and may only be used, duplicated, modified or distributed + * pursuant to the terms and conditions of a separate, written license + * agreement executed between you and Broadcom (an "Authorized License"). + * Except as set forth in an Authorized License, Broadcom grants no license + * (express or implied), right to use, or waiver of any kind with respect to + * the Software, and Broadcom expressly reserves all rights in and to the + * Software and all intellectual property rights therein. + * IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS + * SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE + * ALL USE OF THE SOFTWARE. + * + * Except as expressly set forth in the Authorized License, + * + * 1. This program, including its structure, sequence and organization, + * constitutes the valuable trade secrets of Broadcom, and you shall + * use all reasonable efforts to protect the confidentiality thereof, + * and to use this information only in connection with your use of + * Broadcom integrated circuit products. + * + * 2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED + * "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, + * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, + * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE. BROADCOM SPECIFICALLY + * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, + * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, + * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR + * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE. + * + * 3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR + * ITS LICENSORS BE LIABLE FOR + * (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY + * DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO + * YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM + * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; OR + * (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE + * SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE + * LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF + * ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. + * + ************************************************************************************/ + +/************************************************************************************ + * + * Filename: btif_profile_queue.h + * + * Description: Bluetooth remote device connection queuing + * + ***********************************************************************************/ +#ifndef BTIF_QUEUE_H +#define BTIF_QUEUE_H + +typedef bt_status_t (btif_connect_cb_t) (bt_bdaddr_t *bda); + +bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda, + btif_connect_cb_t *connect_cb); + +void btif_queue_advance(); + +#endif diff --git a/btif/src/btif_av.c b/btif/src/btif_av.c index 637387c..d8805df 100644 --- a/btif/src/btif_av.c +++ b/btif/src/btif_av.c @@ -61,6 +61,7 @@ #include "btif_av.h" #include "btif_util.h" +#include "btif_profile_queue.h" #include "bta_api.h" #include "btif_media.h" #include "bta_av_api.h" @@ -373,6 +374,8 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data state, &(btif_av_cb.peer_bda)); /* change state to open/idle based on the status */ btif_sm_change_state(btif_av_cb.sm_handle, av_state); + btif_queue_advance(); + } break; CHECK_RC_EVENT(event, p_data); @@ -723,16 +726,26 @@ static bt_status_t init(btav_callbacks_t* callbacks ) ** Returns bt_status_t ** *******************************************************************************/ -static bt_status_t connect(bt_bdaddr_t *bd_addr) + +static bt_status_t connect_int(bt_bdaddr_t *bd_addr) { BTIF_TRACE_EVENT1("%s", __FUNCTION__); BTIF_TRACE_ERROR1("callbacks is 0x%x", bt_av_callbacks); CHECK_BTAV_INIT(); - /* Switch to BTIF context */ - return btif_transfer_context(btif_av_handle_event, BTIF_AV_CONNECT_REQ_EVT, - (char*)bd_addr, sizeof(bt_bdaddr_t), NULL); + memcpy(&btif_av_cb.peer_bda, bd_addr, sizeof(bt_bdaddr_t)); + BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle, + TRUE, BTA_SEC_NONE); + btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING); + + return BT_STATUS_SUCCESS; +} + +static bt_status_t connect(bt_bdaddr_t *bd_addr) +{ + CHECK_BTAV_INIT(); + return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int); } /******************************************************************************* diff --git a/btif/src/btif_hf.c b/btif/src/btif_hf.c index 7881936..f413c42 100755 --- a/btif/src/btif_hf.c +++ b/btif/src/btif_hf.c @@ -61,6 +61,7 @@ #define LOG_TAG "BTIF_HF" #include "btif_common.h" #include "btif_util.h" +#include "btif_profile_queue.h" #include "bd.h" #include "bta_ag_api.h" @@ -313,6 +314,9 @@ static void btif_hf_upstreams_evt(UINT16 event, char* p_param) if (btif_hf_cb.state == BTHF_CONNECTION_STATE_DISCONNECTED) bdsetany(btif_hf_cb.connected_bda.address); + + if (p_data->open.status != BTA_AG_SUCCESS) + btif_queue_advance(); break; case BTA_AG_CLOSE_EVT: @@ -321,7 +325,6 @@ static void btif_hf_upstreams_evt(UINT16 event, char* p_param) bdsetany(btif_hf_cb.connected_bda.address); btif_hf_cb.peer_feat = 0; clear_phone_state(); - break; case BTA_AG_CONN_EVT: @@ -330,7 +333,7 @@ static void btif_hf_upstreams_evt(UINT16 event, char* p_param) HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state, &btif_hf_cb.connected_bda); - + btif_queue_advance(); break; case BTA_AG_AUDIO_OPEN_EVT: @@ -490,7 +493,7 @@ static bt_status_t init( bthf_callbacks_t* callbacks ) ** Returns bt_status_t ** *******************************************************************************/ -static bt_status_t connect( bt_bdaddr_t *bd_addr ) +static bt_status_t connect_int( bt_bdaddr_t *bd_addr ) { CHECK_BTHF_INIT(); @@ -507,6 +510,12 @@ static bt_status_t connect( bt_bdaddr_t *bd_addr ) return BT_STATUS_BUSY; } +static bt_status_t connect( bt_bdaddr_t *bd_addr ) +{ + CHECK_BTHF_INIT(); + return btif_queue_connect(UUID_SERVCLASS_AG_HANDSFREE, bd_addr, connect_int); +} + /******************************************************************************* ** ** Function disconnect diff --git a/btif/src/btif_profile_queue.c b/btif/src/btif_profile_queue.c new file mode 100644 index 0000000..f0b6db2 --- /dev/null +++ b/btif/src/btif_profile_queue.c @@ -0,0 +1,192 @@ +/******************************************************************************* + * + * Copyright (C) 2009-2012 Broadcom Corporation + * + * This program is the proprietary software of Broadcom Corporation and/or its + * licensors, and may only be used, duplicated, modified or distributed + * pursuant to the terms and conditions of a separate, written license + * agreement executed between you and Broadcom (an "Authorized License"). + * Except as set forth in an Authorized License, Broadcom grants no license + * (express or implied), right to use, or waiver of any kind with respect to + * the Software, and Broadcom expressly reserves all rights in and to the + * Software and all intellectual property rights therein. + * IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS + * SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE + * ALL USE OF THE SOFTWARE. + * + * Except as expressly set forth in the Authorized License, + * + * 1. This program, including its structure, sequence and organization, + * constitutes the valuable trade secrets of Broadcom, and you shall + * use all reasonable efforts to protect the confidentiality thereof, + * and to use this information only in connection with your use of + * Broadcom integrated circuit products. + * + * 2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED + * "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, + * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, + * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE. BROADCOM SPECIFICALLY + * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, + * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, + * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR + * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE. + * + * 3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR + * ITS LICENSORS BE LIABLE FOR + * (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY + * DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO + * YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM + * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; OR + * (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE + * SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE + * LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF + * ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. + * + ******************************************************************************/ + +/******************************************************************************* + * + * Filename: btif_profile_queue.c + * + * Description: Bluetooth remote device connection queuing implementation. + * + ******************************************************************************/ + +#include + +#define LOG_TAG "BTIF_QUEUE" +#include "btif_common.h" +#include "btif_profile_queue.h" +#include "gki.h" + +/******************************************************************************* +** Local type definitions +*******************************************************************************/ + +typedef enum { + BTIF_QUEUE_CONNECT_EVT, + BTIF_QUEUE_ADVANCE_EVT +} btif_queue_event_t; + +typedef struct connect_node_tag +{ + bt_bdaddr_t bda; + uint16_t uuid; + uint16_t busy; + void *p_cb; + struct connect_node_tag *p_next; +} __attribute__((packed))connect_node_t; + + +/******************************************************************************* +** Static variables +*******************************************************************************/ + +static connect_node_t *connect_queue; + + +/******************************************************************************* +** Queue helper functions +*******************************************************************************/ + +static void queue_int_add(connect_node_t *p_param) +{ + connect_node_t *p_list = connect_queue; + connect_node_t *p_node = GKI_getbuf(sizeof(connect_node_t)); + ASSERTC(p_node != NULL, "Failed to allocate new list node", 0); + + memcpy(p_node, p_param, sizeof(connect_node_t)); + + if (connect_queue == NULL) + { + connect_queue = p_node; + return; + } + + while (p_list->p_next) + p_list = p_list->p_next; + p_list->p_next = p_node; +} + +static void queue_int_advance() +{ + connect_node_t *p_head = connect_queue; + if (connect_queue == NULL) + return; + + connect_queue = connect_queue->p_next; + GKI_freebuf(p_head); +} + +static bt_status_t queue_int_connect_next() +{ + connect_node_t* p_head = connect_queue; + + if (p_head == NULL) + return BT_STATUS_FAIL; + + /* If the queue is currently busy, we return success anyway, + * since the connection has been queued... */ + if (p_head->busy != FALSE) + return BT_STATUS_SUCCESS; + + p_head->busy = TRUE; + return (*(btif_connect_cb_t*)p_head->p_cb)(&p_head->bda); +} + +static void queue_int_handle_evt(UINT16 event, char *p_param) +{ + switch(event) + { + case BTIF_QUEUE_CONNECT_EVT: + queue_int_add((connect_node_t*)p_param); + break; + + case BTIF_QUEUE_ADVANCE_EVT: + queue_int_advance(); + break; + } + + queue_int_connect_next(); +} + +/******************************************************************************* +** +** Function btif_queue_connect +** +** Description Add a new connection to the queue and trigger the next +** scheduled connection. +** +** Returns BT_STATUS_SUCCESS if successful +** +*******************************************************************************/ +bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda, + btif_connect_cb_t *connect_cb) +{ + connect_node_t node; + memset(&node, 0, sizeof(connect_node_t)); + memcpy(&(node.bda), bda, sizeof(bt_bdaddr_t)); + node.uuid = uuid; + node.p_cb = connect_cb; + + return btif_transfer_context(queue_int_handle_evt, BTIF_QUEUE_CONNECT_EVT, + (char*)&node, sizeof(connect_node_t), NULL); +} + +/******************************************************************************* +** +** Function btif_queue_advance +** +** Description Clear the queue's busy status and advance to the next +** scheduled connection. +** +** Returns void +** +*******************************************************************************/ +void btif_queue_advance() +{ + btif_transfer_context(queue_int_handle_evt, BTIF_QUEUE_ADVANCE_EVT, + NULL, 0, NULL); +} + -- cgit v1.1