From 787caa4b8f9b5eff418eb89882e98116ff18d1fb Mon Sep 17 00:00:00 2001 From: Sumit Bajpai Date: Wed, 14 Jun 2017 14:15:25 +0530 Subject: [PATCH] AV: Use separate AV sig timeout timer for dual connections. In dual a2dp connection scenario, if both remote devices initiate connection at same time, DUT replaces AV signalling timeout timer which started for 1st device when avdtp l2cap sig channel was established with that of 2nd device when its channel is established. In case remote1 doesn't start AV signalling procedure hence, then DUT also fails to do so as timer for remote1 was lost. The fix keeps two separate timers for two connections. Change-Id: I3ceea4f035a115985d692d30f39c3a0e4729a323 --- bta/av/bta_av_aact.c | 3 ++- bta/av/bta_av_act.c | 8 ++++---- bta/av/bta_av_int.h | 2 +- bta/av/bta_av_main.c | 7 +++++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/bta/av/bta_av_aact.c b/bta/av/bta_av_aact.c index 5b32f6a8a..efca54927 100644 --- a/bta/av/bta_av_aact.c +++ b/bta/av/bta_av_aact.c @@ -1283,7 +1283,8 @@ void bta_av_config_ind (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) APPL_TRACE_WARNING(" bta_av_config_ind config_ind called before Open"); p_scb->coll_mask |= BTA_AV_COLL_SETCONFIG_IND; } - alarm_cancel(bta_av_cb.accept_signalling_timer); + APPL_TRACE_DEBUG(" bta_av_config_ind p_scb->hdi = %d ", p_scb->hdi); + alarm_cancel(bta_av_cb.accept_signalling_timer[p_scb->hdi]); /* if no codec parameters in configuration, fail */ if ((p_evt_cfg->num_codec == 0) || diff --git a/bta/av/bta_av_act.c b/bta/av/bta_av_act.c index 0bc5caab7..79d577eee 100755 --- a/bta/av/bta_av_act.c +++ b/bta/av/bta_av_act.c @@ -1547,12 +1547,12 @@ void bta_av_disable(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) { hdr.layer_specific = xx + 1; bta_av_api_deregister((tBTA_AV_DATA *)&hdr); + alarm_free(p_cb->accept_signalling_timer[xx]); + p_cb->accept_signalling_timer[xx] = NULL; } alarm_free(p_cb->link_signalling_timer); p_cb->link_signalling_timer = NULL; - alarm_free(p_cb->accept_signalling_timer); - p_cb->accept_signalling_timer = NULL; } /******************************************************************************* @@ -1667,7 +1667,7 @@ void bta_av_sig_chg(tBTA_AV_DATA *p_data) p_cb->p_scb[xx]->peer_addr); /* Possible collision : need to avoid outgoing processing while the timer is running */ p_cb->p_scb[xx]->coll_mask = BTA_AV_COLL_INC_TMR; - alarm_set_on_queue(p_cb->accept_signalling_timer, + alarm_set_on_queue(p_cb->accept_signalling_timer[xx], BTA_AV_ACCEPT_SIGNALLING_TIMEOUT_MS, bta_av_accept_signalling_timer_cback, UINT_TO_PTR(xx), @@ -1806,7 +1806,7 @@ static void bta_av_accept_signalling_timer_cback(void *data) /* We are still doing SDP. Run the timer again. */ p_scb->coll_mask |= BTA_AV_COLL_INC_TMR; - alarm_set_on_queue(p_cb->accept_signalling_timer, + alarm_set_on_queue(p_cb->accept_signalling_timer[inx], BTA_AV_ACCEPT_SIGNALLING_TIMEOUT_MS, bta_av_accept_signalling_timer_cback, UINT_TO_PTR(inx), diff --git a/bta/av/bta_av_int.h b/bta/av/bta_av_int.h index 7bb6e41a0..8e0124541 100644 --- a/bta/av/bta_av_int.h +++ b/bta/av/bta_av_int.h @@ -606,7 +606,7 @@ typedef struct tBTA_AV_RCB rcb[BTA_AV_NUM_RCB]; /* RCB control block */ tBTA_AV_LCB lcb[BTA_AV_NUM_LINKS+1]; /* link control block */ alarm_t *link_signalling_timer; - alarm_t *accept_signalling_timer; /* timer to monitor signalling when accepting */ + alarm_t *accept_signalling_timer[BTA_AV_NUM_STRS]; /* timer to monitor signalling when accepting */ UINT32 sdp_a2d_handle; /* SDP record handle for audio src */ #if (BTA_AV_SINK_INCLUDED == TRUE) UINT32 sdp_a2d_snk_handle; /* SDP record handle for audio snk */ diff --git a/bta/av/bta_av_main.c b/bta/av/bta_av_main.c index 4b802e05a..45102c961 100644 --- a/bta/av/bta_av_main.c +++ b/bta/av/bta_av_main.c @@ -256,8 +256,11 @@ static void bta_av_api_enable(tBTA_AV_DATA *p_data) * to alarm_free() the alarms below. */ bta_av_cb.link_signalling_timer = alarm_new("bta_av.link_signalling_timer"); - bta_av_cb.accept_signalling_timer = - alarm_new("bta_av.accept_signalling_timer"); + for (int j = 0; j < BTA_AV_NUM_STRS; j++) + { + bta_av_cb.accept_signalling_timer[j] = + alarm_new("bta_av.accept_signalling_timer"); + } /* store parameters */ bta_av_cb.p_cback = p_data->api_enable.p_cback; -- 2.11.0