Bluetooth: Check A2dp device priority.
Check for device priority in stack before sending connect
request on time-out for remote open event.
Change-Id: I191f5f3089d7945cbd6facc223a341452462421c
CRs-Fixed: 510957
diff --git a/bta/av/bta_av_main.c b/bta/av/bta_av_main.c
index 749756d..8e60de3 100644
--- a/bta/av/bta_av_main.c
+++ b/bta/av/bta_av_main.c
@@ -116,7 +116,7 @@
/* API_VENDOR_CMD_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
/* API_VENDOR_RSP_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
/* API_META_RSP_EVT */ {BTA_AV_RC_FREE_RSP, BTA_AV_INIT_ST },
-/* API_RC_CLOSE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
+/* API_RC_CLOSE_EVT */ {BTA_AV_RC_CLOSE, BTA_AV_INIT_ST },
/* AVRC_OPEN_EVT */ {BTA_AV_RC_OPENED, BTA_AV_OPEN_ST },
/* AVRC_MSG_EVT */ {BTA_AV_RC_FREE_MSG, BTA_AV_INIT_ST },
/* AVRC_NONE_EVT */ {BTA_AV_IGNORE, BTA_AV_INIT_ST },
diff --git a/btif/src/btif_av.c b/btif/src/btif_av.c
index f173f6a..bb7ff1d 100755
--- a/btif/src/btif_av.c
+++ b/btif/src/btif_av.c
@@ -84,6 +84,9 @@
static btav_callbacks_t *bt_av_callbacks = NULL;
static btif_av_cb_t btif_av_cb;
static TIMER_LIST_ENT tle_av_open_on_rc;
+static btif_sm_event_t idle_rc_event;
+static tBTA_AV idle_rc_data;
+
/* both interface and media task needs to be ready to alloc incoming request */
#define CHECK_BTAV_INIT() if ((bt_av_callbacks == NULL) || (btif_av_cb.sm_handle == NULL))\
@@ -252,22 +255,16 @@
btif_av_cb.bta_handle = ((tBTA_AV*)p_data)->registr.hndl;
break;
- case BTA_AV_PENDING_EVT:
case BTIF_AV_CONNECT_REQ_EVT:
- {
- if (event == BTIF_AV_CONNECT_REQ_EVT)
- {
- memcpy(&btif_av_cb.peer_bda, (bt_bdaddr_t*)p_data, sizeof(bt_bdaddr_t));
- }
- else if (event == BTA_AV_PENDING_EVT)
- {
- bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr);
- }
+ /* For outgoing connect stack and app are in sync.
+ */
+ memcpy(&btif_av_cb.peer_bda, (bt_bdaddr_t*)p_data, 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);
- } break;
+ break;
+ case BTA_AV_PENDING_EVT:
case BTA_AV_RC_OPEN_EVT:
/* IOP_FIX: Jabra 620 only does RC open without AV open whenever it connects. So
* as per the AV WP, an AVRC connection cannot exist without an AV connection. Therefore,
@@ -279,12 +276,24 @@
* TODO: We may need to do this only on an AVRCP Play. FixMe
*/
- BTIF_TRACE_DEBUG0("BTA_AV_RC_OPEN_EVT received w/o AV");
- memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc));
- tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr;
- btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC,
- BTIF_TIMEOUT_AV_OPEN_ON_RC_SECS);
- btif_rc_handler(event, p_data);
+ /* Check if connection allowed with this device */
+ BTIF_TRACE_DEBUG0("Check A2dp priority of device");
+ if (idle_rc_event != 0)
+ {
+ BTIF_TRACE_DEBUG0("Processing another RC Event ");
+ return FALSE;
+ }
+ idle_rc_event = event;
+ memcpy(&idle_rc_data, ((tBTA_AV*)p_data), sizeof(tBTA_AV));
+ if (event == BTA_AV_RC_OPEN_EVT )
+ {
+ bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->rc_open.peer_addr);
+ }
+ else
+ {
+ bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr);
+ }
+ HAL_CBACK(bt_av_callbacks, connection_priority_cb, &(btif_av_cb.peer_bda));
break;
case BTA_AV_REMOTE_CMD_EVT:
@@ -856,12 +865,56 @@
return;
}
+static void allow_connection(int is_valid)
+{
+ BTIF_TRACE_EVENT3(" %s isValid is %d event %d", __FUNCTION__,is_valid,idle_rc_event);
+ switch (idle_rc_event)
+ {
+ case BTA_AV_RC_OPEN_EVT:
+ if (is_valid)
+ {
+ memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc));
+ tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr;
+ btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC,
+ BTIF_TIMEOUT_AV_OPEN_ON_RC_SECS);
+ btif_rc_handler(idle_rc_event, &idle_rc_data);
+ }
+ else
+ {
+ UINT8 rc_handle = idle_rc_data.rc_open.rc_handle;
+ BTA_AvCloseRc(rc_handle);
+ }
+ break;
+
+ case BTA_AV_PENDING_EVT:
+ if (is_valid)
+ {
+ 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);
+ }
+ else
+ {
+ BTA_AvDisconnect(idle_rc_data.pend.bd_addr);
+ memset(&btif_av_cb.peer_bda, 0, sizeof(bt_bdaddr_t));
+ }
+ break;
+
+ default:
+ BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+ dump_av_sm_event_name(idle_rc_event));
+ }
+ idle_rc_event = 0;
+ memset(&idle_rc_data, 0, sizeof(tBTA_AV));
+}
+
static const btav_interface_t bt_av_interface = {
sizeof(btav_interface_t),
init,
connect,
disconnect,
cleanup,
+ allow_connection,
};
/*******************************************************************************