aboutsummaryrefslogtreecommitdiff
path: root/bta
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2021-06-02 17:56:10 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-06-02 17:56:10 +0000
commit2490073edb07999b75d722f79ab79931837f627f (patch)
tree114256c1f3a2bca031178ad18f17d36d473a8e1e /bta
parent5964f71300fad0be23f3646533d8d5918a4f013c (diff)
parentd6870430f6197eaa0eed3da8fe4f7dd0d7d7fe44 (diff)
downloadbt-2490073edb07999b75d722f79ab79931837f627f.tar.gz
Merge "Allow for multiple link and accept signalling timers to allow for multiple simultaneous incoming A2DP connections" into sc-dev
Diffstat (limited to 'bta')
-rw-r--r--bta/av/bta_av_aact.cc11
-rw-r--r--bta/av/bta_av_act.cc41
-rw-r--r--bta/av/bta_av_api.cc6
-rw-r--r--bta/av/bta_av_int.h7
-rw-r--r--bta/av/bta_av_main.cc23
-rw-r--r--bta/include/bta_av_api.h2
6 files changed, 50 insertions, 40 deletions
diff --git a/bta/av/bta_av_aact.cc b/bta/av/bta_av_aact.cc
index 6e36602de..b0e0dcff8 100644
--- a/bta/av/bta_av_aact.cc
+++ b/bta/av/bta_av_aact.cc
@@ -860,6 +860,8 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
p_scb->num_disc_snks = 0;
p_scb->coll_mask = 0;
alarm_cancel(p_scb->avrc_ct_timer);
+ alarm_cancel(p_scb->link_signalling_timer);
+ alarm_cancel(p_scb->accept_signalling_timer);
/* TODO(eisenbach): RE-IMPLEMENT USING VSC OR HAL EXTENSION
vendor_get_interface()->send_command(
@@ -935,7 +937,7 @@ void bta_av_config_ind(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
/* Clear collision mask */
p_scb->coll_mask = 0;
- alarm_cancel(bta_av_cb.accept_signalling_timer);
+ alarm_cancel(p_scb->accept_signalling_timer);
/* if no codec parameters in configuration, fail */
if ((p_evt_cfg->num_codec == 0) ||
@@ -1001,7 +1003,8 @@ void bta_av_disconnect_req(tBTA_AV_SCB* p_scb,
APPL_TRACE_API("%s: conn_lcb: 0x%x peer_addr: %s", __func__,
bta_av_cb.conn_lcb, p_scb->PeerAddress().ToString().c_str());
- alarm_cancel(bta_av_cb.link_signalling_timer);
+ alarm_cancel(p_scb->link_signalling_timer);
+ alarm_cancel(p_scb->accept_signalling_timer);
alarm_cancel(p_scb->avrc_ct_timer);
// conn_lcb is the index bitmask of all used LCBs, and since LCB and SCB use
@@ -1091,7 +1094,7 @@ void bta_av_setconfig_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label,
p_data->ci_setconfig.err_code, p_data->ci_setconfig.category);
- alarm_cancel(bta_av_cb.link_signalling_timer);
+ alarm_cancel(p_scb->link_signalling_timer);
if (p_data->ci_setconfig.err_code == AVDT_SUCCESS) {
p_scb->wait = BTA_AV_WAIT_ACP_CAPS_ON;
@@ -1316,7 +1319,7 @@ void bta_av_do_close(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
if (p_scb->co_started) {
bta_av_str_stopped(p_scb, NULL);
}
- alarm_cancel(bta_av_cb.link_signalling_timer);
+ alarm_cancel(p_scb->link_signalling_timer);
/* close stream */
p_scb->started = false;
diff --git a/bta/av/bta_av_act.cc b/bta/av/bta_av_act.cc
index f6c7e2cec..dcbb18a7b 100644
--- a/bta/av/bta_av_act.cc
+++ b/bta/av/bta_av_act.cc
@@ -1305,6 +1305,12 @@ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
* expect BTA_AV_DEREG_COMP_EVT when deregister is complete */
for (xx = 0; xx < BTA_AV_NUM_STRS; xx++) {
if (p_cb->p_scb[xx] != NULL) {
+ // Free signalling timers
+ alarm_free(p_cb->p_scb[xx]->link_signalling_timer);
+ p_cb->p_scb[xx]->link_signalling_timer = NULL;
+ alarm_free(p_cb->p_scb[xx]->accept_signalling_timer);
+ p_cb->p_scb[xx]->accept_signalling_timer = NULL;
+
hdr.layer_specific = xx + 1;
bta_av_api_deregister((tBTA_AV_DATA*)&hdr);
disabling_in_progress = true;
@@ -1315,10 +1321,6 @@ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
// no needed to setup this disabling flag.
p_cb->disabling = disabling_in_progress;
- 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;
}
/*******************************************************************************
@@ -1331,8 +1333,10 @@ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
*
******************************************************************************/
void bta_av_api_disconnect(tBTA_AV_DATA* p_data) {
- AVDT_DisconnectReq(p_data->api_discnt.bd_addr, bta_av_conn_cback);
- alarm_cancel(bta_av_cb.link_signalling_timer);
+ tBTA_AV_SCB* p_scb =
+ bta_av_hndl_to_scb(p_data->api_discnt.hdr.layer_specific);
+ AVDT_DisconnectReq(p_scb->PeerAddress(), bta_av_conn_cback);
+ alarm_cancel(p_scb->link_signalling_timer);
}
/**
@@ -1450,21 +1454,30 @@ void bta_av_sig_chg(tBTA_AV_DATA* p_data) {
* The following function shall send the event and start the
* recurring timer
*/
- bta_av_signalling_timer(NULL);
+ if (!p_scb->link_signalling_timer) {
+ p_scb->link_signalling_timer = alarm_new("link_signalling_timer");
+ }
+ BT_HDR hdr;
+ hdr.layer_specific = p_scb->hndl;
+ bta_av_signalling_timer((tBTA_AV_DATA*)&hdr);
APPL_TRACE_DEBUG("%s: Re-start timer for AVDTP service", __func__);
bta_sys_conn_open(BTA_ID_AV, p_scb->app_id, p_scb->PeerAddress());
/* Possible collision : need to avoid outgoing processing while the
* timer is running */
p_scb->coll_mask = BTA_AV_COLL_INC_TMR;
+ if (!p_scb->accept_signalling_timer) {
+ p_scb->accept_signalling_timer = alarm_new("accept_signalling_timer");
+ }
alarm_set_on_mloop(
- p_cb->accept_signalling_timer, BTA_AV_ACCEPT_SIGNALLING_TIMEOUT_MS,
+ p_scb->accept_signalling_timer, BTA_AV_ACCEPT_SIGNALLING_TIMEOUT_MS,
bta_av_accept_signalling_timer_cback, UINT_TO_PTR(xx));
}
}
}
else if (event == BTA_AR_AVDT_CONN_EVT) {
- alarm_cancel(bta_av_cb.link_signalling_timer);
+ uint8_t scb_index = p_data->str_msg.scb_index;
+ alarm_cancel(p_cb->p_scb[scb_index]->link_signalling_timer);
}
else {
/* disconnected. */
@@ -1511,6 +1524,9 @@ void bta_av_sig_chg(tBTA_AV_DATA* p_data) {
*
******************************************************************************/
void bta_av_signalling_timer(UNUSED_ATTR tBTA_AV_DATA* p_data) {
+ tBTA_AV_HNDL hndl = p_data->hdr.layer_specific;
+ tBTA_AV_SCB* p_scb = bta_av_hndl_to_scb(hndl);
+
tBTA_AV_CB* p_cb = &bta_av_cb;
int xx;
uint8_t mask;
@@ -1527,9 +1543,10 @@ void bta_av_signalling_timer(UNUSED_ATTR tBTA_AV_DATA* p_data) {
if (mask & p_cb->conn_lcb) {
/* this entry is used. check if it is connected */
if (!p_lcb->conn_msk) {
- bta_sys_start_timer(p_cb->link_signalling_timer,
+ APPL_TRACE_DEBUG("%s hndl 0x%x", __func__, p_scb->hndl);
+ bta_sys_start_timer(p_scb->link_signalling_timer,
BTA_AV_SIGNALLING_TIMEOUT_MS,
- BTA_AV_SIGNALLING_TIMER_EVT, 0);
+ BTA_AV_SIGNALLING_TIMER_EVT, hndl);
tBTA_AV_PEND pend;
pend.bd_addr = p_lcb->addr;
tBTA_AV bta_av_data;
@@ -1574,7 +1591,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_mloop(p_cb->accept_signalling_timer,
+ alarm_set_on_mloop(p_scb->accept_signalling_timer,
BTA_AV_ACCEPT_SIGNALLING_TIMEOUT_MS,
bta_av_accept_signalling_timer_cback,
UINT_TO_PTR(inx));
diff --git a/bta/av/bta_av_api.cc b/bta/av/bta_av_api.cc
index 58d3cba2c..23362e4c3 100644
--- a/bta/av/bta_av_api.cc
+++ b/bta/av/bta_av_api.cc
@@ -193,14 +193,14 @@ void BTA_AvClose(tBTA_AV_HNDL handle) {
* Returns void
*
******************************************************************************/
-void BTA_AvDisconnect(const RawAddress& bd_addr) {
- LOG_INFO("%s: peer %s", __func__, bd_addr.ToString().c_str());
+void BTA_AvDisconnect(tBTA_AV_HNDL handle) {
+ LOG_INFO("%s: bta_handle=0x%x", __func__, handle);
tBTA_AV_API_DISCNT* p_buf =
(tBTA_AV_API_DISCNT*)osi_malloc(sizeof(tBTA_AV_API_DISCNT));
p_buf->hdr.event = BTA_AV_API_DISCONNECT_EVT;
- p_buf->bd_addr = bd_addr;
+ p_buf->hdr.layer_specific = handle;
bta_sys_sendmsg(p_buf);
}
diff --git a/bta/av/bta_av_int.h b/bta/av/bta_av_int.h
index 3be4458d8..c88eb95e9 100644
--- a/bta/av/bta_av_int.h
+++ b/bta/av/bta_av_int.h
@@ -272,7 +272,6 @@ typedef struct {
/* data type for BTA_AV_API_DISCONNECT_EVT */
typedef struct {
BT_HDR_RIGID hdr;
- RawAddress bd_addr;
} tBTA_AV_API_DISCNT;
/* data type for BTA_AV_API_PROTECT_REQ_EVT */
@@ -491,6 +490,9 @@ struct tBTA_AV_SCB final {
tAVDT_SEP_INFO sep_info[BTA_AV_NUM_SEPS]; /* stream discovery results */
AvdtpSepConfig cfg; /* local SEP configuration */
alarm_t* avrc_ct_timer; /* delay timer for AVRC CT */
+ alarm_t* link_signalling_timer;
+ alarm_t*
+ accept_signalling_timer; /* timer to monitor signalling when accepting */
uint16_t l2c_cid; /* L2CAP channel ID */
uint16_t stream_mtu; /* MTU of stream */
uint8_t media_type; /* Media type: AVDT_MEDIA_TYPE_* */
@@ -616,9 +618,6 @@ typedef struct {
tBTA_AV_CBACK* p_cback; /* application callback function */
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 */
uint32_t sdp_a2dp_handle; /* SDP record handle for audio src */
uint32_t sdp_a2dp_snk_handle; /* SDP record handle for audio snk */
tBTA_AV_FEAT features; /* features mask */
diff --git a/bta/av/bta_av_main.cc b/bta/av/bta_av_main.cc
index 9123d037d..887171853 100644
--- a/bta/av/bta_av_main.cc
+++ b/bta/av/bta_av_main.cc
@@ -160,14 +160,6 @@ static void bta_av_api_enable(tBTA_AV_DATA* p_data) {
bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE;
- /*
- * TODO: The "disable" event handling is missing - there we need
- * 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");
-
/* store parameters */
bta_av_cb.p_cback = p_data->api_enable.p_cback;
bta_av_cb.features = p_data->api_enable.features;
@@ -1402,14 +1394,6 @@ void bta_debug_av_dump(int fd) {
dprintf(fd, "\nBTA AV State:\n");
dprintf(fd, " State Machine State: %s\n", bta_av_st_code(bta_av_cb.state));
- dprintf(fd, " Link signalling timer: %s\n",
- alarm_is_scheduled(bta_av_cb.link_signalling_timer)
- ? "Scheduled"
- : "Not scheduled");
- dprintf(fd, " Accept signalling timer: %s\n",
- alarm_is_scheduled(bta_av_cb.accept_signalling_timer)
- ? "Scheduled"
- : "Not scheduled");
dprintf(fd, " SDP A2DP source handle: %d\n", bta_av_cb.sdp_a2dp_handle);
dprintf(fd, " SDP A2DP sink handle: %d\n", bta_av_cb.sdp_a2dp_snk_handle);
dprintf(fd, " Features: 0x%x\n", bta_av_cb.features);
@@ -1468,6 +1452,13 @@ void bta_debug_av_dump(int fd) {
p_scb->open_api.use_rc ? "true" : "false");
dprintf(fd, " Switch result: %d\n", p_scb->open_api.switch_res);
dprintf(fd, " Initiator UUID: 0x%x\n", p_scb->open_api.uuid);
+ dprintf(fd, " Link signalling timer: %s\n",
+ alarm_is_scheduled(p_scb->link_signalling_timer) ? "Scheduled"
+ : "Not scheduled");
+ dprintf(fd, " Accept signalling timer: %s\n",
+ alarm_is_scheduled(p_scb->accept_signalling_timer)
+ ? "Scheduled"
+ : "Not scheduled");
// TODO: Print p_scb->sep_info[], cfg, avrc_ct_timer, current_codec ?
dprintf(fd, " L2CAP Channel ID: %d\n", p_scb->l2c_cid);
dprintf(fd, " Stream MTU: %d\n", p_scb->stream_mtu);
diff --git a/bta/include/bta_av_api.h b/bta/include/bta_av_api.h
index 808a1a25e..4591bbaef 100644
--- a/bta/include/bta_av_api.h
+++ b/bta/include/bta_av_api.h
@@ -486,7 +486,7 @@ void BTA_AvClose(tBTA_AV_HNDL handle);
* Returns void
*
******************************************************************************/
-void BTA_AvDisconnect(const RawAddress& bd_addr);
+void BTA_AvDisconnect(tBTA_AV_HNDL handle);
/*******************************************************************************
*