diff options
author | Ted Wang <tedwang@google.com> | 2021-10-20 11:57:07 +0800 |
---|---|---|
committer | Ted Wang <tedwang@google.com> | 2021-11-02 02:59:12 +0000 |
commit | ad4ee82aa6dbd021ff86f539a845eb3ab1653c59 (patch) | |
tree | bafeec5ec8c715c248add913f5f1b7d7dd78d259 | |
parent | 6938a22aed045a1dc0e1fdebeb02fa3e4ffb91bb (diff) | |
download | bt-ad4ee82aa6dbd021ff86f539a845eb3ab1653c59.tar.gz |
Move offload start related flags from BTA_AV_SCB to BTA_AV_CB
Ignore a2dp offload start request when offloading already in progress.
Tag: #stability
Bug: 203127797
Test: Force to start offload duplicated
Change-Id: I99858852866e71d60200a798dd31d61a20b2669c
-rw-r--r-- | bta/av/bta_av_aact.cc | 43 | ||||
-rw-r--r-- | bta/av/bta_av_int.h | 4 | ||||
-rw-r--r-- | bta/av/bta_av_main.cc | 17 |
3 files changed, 51 insertions, 13 deletions
diff --git a/bta/av/bta_av_aact.cc b/bta/av/bta_av_aact.cc index 585c55241..2ef03fd4c 100644 --- a/bta/av/bta_av_aact.cc +++ b/bta/av/bta_av_aact.cc @@ -852,7 +852,6 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { /* if de-registering shut everything down */ msg.hdr.layer_specific = p_scb->hndl; p_scb->started = false; - p_scb->offload_started = false; p_scb->use_rtp_header_marker_bit = false; p_scb->cong = false; p_scb->role = role; @@ -875,8 +874,6 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { } */ - p_scb->offload_start_pending = false; - if (p_scb->deregistering) { /* remove stream */ for (int i = 0; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) { @@ -1171,7 +1168,6 @@ void bta_av_str_opened(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { bta_av_conn_chg((tBTA_AV_DATA*)&msg); /* set the congestion flag, so AV would not send media packets by accident */ p_scb->cong = true; - p_scb->offload_start_pending = false; // Don't use AVDTP SUSPEND for restrict listed devices btif_storage_get_stored_remote_name(p_scb->PeerAddress(), remote_name); if (interop_match_name(INTEROP_DISABLE_AVDTP_SUSPEND, remote_name) || @@ -1895,9 +1891,15 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { BTM_unblock_role_switch_and_sniff_mode_for(p_scb->PeerAddress()); if (p_scb->co_started) { - if (p_scb->offload_started) { + uint16_t handle = get_btm_client_interface().lifecycle.BTM_GetHCIConnHandle( + p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); + if (bta_av_cb.offload_started_acl_hdl == handle) { + bta_av_vendor_offload_stop(); + bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; + } else if (bta_av_cb.offload_start_pending_acl_hdl == handle) { + APPL_TRACE_WARNING("%s: Stop pending offload start command", __func__); bta_av_vendor_offload_stop(); - p_scb->offload_started = false; + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } bta_av_stream_chg(p_scb, false); @@ -2519,9 +2521,15 @@ void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { /* in case that we received suspend_ind, we may need to call co_stop here */ if (p_scb->co_started) { - if (p_scb->offload_started) { + uint16_t handle = get_btm_client_interface().lifecycle.BTM_GetHCIConnHandle( + p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); + if (bta_av_cb.offload_started_acl_hdl == handle) { bta_av_vendor_offload_stop(); - p_scb->offload_started = false; + bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; + } else if (bta_av_cb.offload_start_pending_acl_hdl == handle) { + APPL_TRACE_WARNING("%s: Stop pending offload start command", __func__); + bta_av_vendor_offload_stop(); + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } bta_av_stream_chg(p_scb, false); @@ -3012,6 +3020,13 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: VS_HCI_STOP_A2DP_MEDIA successful", __func__); break; case VS_HCI_A2DP_OFFLOAD_START: + if (bta_av_cb.offload_start_pending_acl_hdl != HCI_INVALID_HANDLE) { + bta_av_cb.offload_started_acl_hdl = + bta_av_cb.offload_start_pending_acl_hdl; + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; + } else { + LOG_INFO("%s: No pending start command due to AVDTP suspend immediately", __func__); + } (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); break; default: @@ -3020,8 +3035,10 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { } else { APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, sub_opcode); - if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) + if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) { + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); + } } } @@ -3046,7 +3063,7 @@ void bta_av_vendor_offload_start(tBTA_AV_SCB* p_scb, UINT16_TO_STREAM(p_param, offload_start->mtu); ARRAY_TO_STREAM(p_param, offload_start->codec_info, (int8_t)sizeof(offload_start->codec_info)); - p_scb->offload_started = true; + bta_av_cb.offload_start_pending_acl_hdl = offload_start->acl_hdl; LOG_INFO( "codec: %#x, sample rate: %#x, bit depth: %#x, channel: %#x, bitrate: " "%#x, ACL: %#x, L2CAP: %#x, MTU: %#x", @@ -3086,6 +3103,10 @@ void bta_av_offload_req(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { /* Support offload if only one audio source stream is open. */ if (p_scb->started != true) { status = BTA_AV_FAIL_STREAM; + } else if (bta_av_cb.offload_start_pending_acl_hdl != HCI_INVALID_HANDLE || + bta_av_cb.offload_started_acl_hdl != HCI_INVALID_HANDLE) { + APPL_TRACE_WARNING("%s: offload already started, ignore request", __func__); + return; } else { bta_av_offload_codec_builder(p_scb, &offload_start); bta_av_vendor_offload_start(p_scb, &offload_start); @@ -3155,7 +3176,7 @@ void bta_av_offload_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { status = BTA_AV_FAIL_STREAM; } - p_scb->offload_start_pending = false; + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; tBTA_AV bta_av_data; bta_av_data.status = status; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &bta_av_data); diff --git a/bta/av/bta_av_int.h b/bta/av/bta_av_int.h index e97a24be6..9a65ec5a5 100644 --- a/bta/av/bta_av_int.h +++ b/bta/av/bta_av_int.h @@ -539,8 +539,6 @@ struct tBTA_AV_SCB final { uint8_t q_tag; /* identify the associated q_info union member */ bool no_rtp_header; /* true if add no RTP header */ uint16_t uuid_int; /*intended UUID of Initiator to connect to */ - bool offload_start_pending; - bool offload_started; /** * Called to setup the state when connected to a peer. @@ -639,6 +637,8 @@ typedef struct { uint8_t rc_acp_idx; /* (index + 1) to RCB */ uint8_t rs_idx; /* (index + 1) to SCB for the one waiting for RS on open */ bool sco_occupied; /* true if SCO is being used or call is in progress */ + uint16_t offload_start_pending_acl_hdl; + uint16_t offload_started_acl_hdl; } tBTA_AV_CB; // total attempts are half seconds diff --git a/bta/av/bta_av_main.cc b/bta/av/bta_av_main.cc index fbcb6cc45..a7f71f421 100644 --- a/bta/av/bta_av_main.cc +++ b/bta/av/bta_av_main.cc @@ -40,6 +40,7 @@ #include "osi/include/properties.h" #include "stack/include/acl_api.h" #include "stack/include/bt_hdr.h" +#include "stack/include/btm_api.h" #include "types/hci_role.h" #include "types/raw_address.h" @@ -163,6 +164,8 @@ static void bta_av_api_enable(tBTA_AV_DATA* p_data) { /* store parameters */ bta_av_cb.p_cback = p_data->api_enable.p_cback; bta_av_cb.features = p_data->api_enable.features; + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; + bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; tBTA_AV_ENABLE enable; enable.features = bta_av_cb.features; @@ -335,6 +338,16 @@ void bta_av_conn_cback(UNUSED_ATTR uint8_t handle, const RawAddress& bd_addr, evt = BTA_AV_SIG_CHG_EVT; if (event == AVDT_DISCONNECT_IND_EVT) { p_scb = bta_av_addr_to_scb(bd_addr); + if (p_scb) { + uint16_t handle = + BTM_GetHCIConnHandle(p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); + if (bta_av_cb.offload_started_acl_hdl == handle || + bta_av_cb.offload_start_pending_acl_hdl == handle) { + LOG_INFO("%s: Cleanup offload related flag", __func__); + bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; + bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; + } + } } else if (event == AVDT_CONNECT_IND_EVT) { APPL_TRACE_DEBUG("%s: CONN_IND is ACP:%d", __func__, p_data->hdr.err_param); @@ -1404,6 +1417,10 @@ void bta_debug_av_dump(int fd) { dprintf(fd, " Connected audio channels mask: 0x%x\n", bta_av_cb.conn_audio); dprintf(fd, " Registered audio channels mask: 0x%x\n", bta_av_cb.reg_audio); dprintf(fd, " Connected LCBs mask: 0x%x\n", bta_av_cb.conn_lcb); + dprintf(fd, " Offload start pending handle: %d\n", + bta_av_cb.offload_start_pending_acl_hdl); + dprintf(fd, " Offload started handle: %d\n", + bta_av_cb.offload_started_acl_hdl); for (size_t i = 0; i < sizeof(bta_av_cb.lcb) / sizeof(bta_av_cb.lcb[0]); i++) { |