summaryrefslogtreecommitdiffstats
path: root/btif
diff options
context:
space:
mode:
authorAndre Eisenbach <andre@broadcom.com>2012-05-14 20:38:15 -0700
committerMatthew Xie <mattx@google.com>2012-07-14 11:19:20 -0700
commit5ef33f85f610320fc95687f5e2f532101cfabfa4 (patch)
treedb4d36ec19f6b4404fa0a79081fbcfcc1e6a0f62 /btif
parent2a94fdee439de90cc137113f679689cd75db5515 (diff)
downloadexternal_bluetooth_bluedroid-5ef33f85f610320fc95687f5e2f532101cfabfa4.zip
external_bluetooth_bluedroid-5ef33f85f610320fc95687f5e2f532101cfabfa4.tar.gz
external_bluetooth_bluedroid-5ef33f85f610320fc95687f5e2f532101cfabfa4.tar.bz2
AV/HFP profile connection serialization
Change-Id: Id70d24986badf09b31fd171e130936dd01ed7987
Diffstat (limited to 'btif')
-rw-r--r--btif/include/btif_profile_queue.h65
-rw-r--r--btif/src/btif_av.c21
-rwxr-xr-xbtif/src/btif_hf.c15
-rw-r--r--btif/src/btif_profile_queue.c192
4 files changed, 286 insertions, 7 deletions
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 <hardware/bluetooth.h>
+
+#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);
+}
+