diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2021-06-02 17:56:10 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-06-02 17:56:10 +0000 |
commit | 2490073edb07999b75d722f79ab79931837f627f (patch) | |
tree | 114256c1f3a2bca031178ad18f17d36d473a8e1e /bta | |
parent | 5964f71300fad0be23f3646533d8d5918a4f013c (diff) | |
parent | d6870430f6197eaa0eed3da8fe4f7dd0d7d7fe44 (diff) | |
download | bt-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.cc | 11 | ||||
-rw-r--r-- | bta/av/bta_av_act.cc | 41 | ||||
-rw-r--r-- | bta/av/bta_av_api.cc | 6 | ||||
-rw-r--r-- | bta/av/bta_av_int.h | 7 | ||||
-rw-r--r-- | bta/av/bta_av_main.cc | 23 | ||||
-rw-r--r-- | bta/include/bta_av_api.h | 2 |
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); /******************************************************************************* * |