From 414225228fbaa1a1c15a792d43dd549d8fead427 Mon Sep 17 00:00:00 2001 From: Ted Wang Date: Wed, 1 Dec 2021 23:28:44 +0800 Subject: [PATCH] Do not cleanup offload related flag in bta_av_conn_cback Do not cleanup offload related flag in bta_av_conn_cback to avoid missing sending out offload stop command when disconnect during streaming. Tag: #stability Bug: 207491735 Test: manual Change-Id: I6a54ce2285b1ef2a5a88457a369d830d1966f300 Merged-In: I6a54ce2285b1ef2a5a88457a369d830d1966f300 --- bta/av/bta_av_aact.cc | 38 +++++++++++++++++--------------------- bta/av/bta_av_int.h | 4 ++-- bta/av/bta_av_main.cc | 19 ++++--------------- 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/bta/av/bta_av_aact.cc b/bta/av/bta_av_aact.cc index 3a55d5726..0a0f6b535 100644 --- a/bta/av/bta_av_aact.cc +++ b/bta/av/bta_av_aact.cc @@ -1887,15 +1887,13 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { BTM_unblock_sniff_mode_for(p_scb->PeerAddress()); if (p_scb->co_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) { + if (bta_av_cb.offload_started_hndl == p_scb->hndl) { 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) { + bta_av_cb.offload_started_hndl = 0; + } else if (bta_av_cb.offload_start_pending_hndl == p_scb->hndl) { 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_cb.offload_start_pending_hndl = 0; } bta_av_stream_chg(p_scb, false); @@ -2517,15 +2515,13 @@ 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) { - 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) { + if (bta_av_cb.offload_started_hndl == p_scb->hndl) { 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) { + bta_av_cb.offload_started_hndl = 0; + } else if (bta_av_cb.offload_start_pending_hndl == p_scb->hndl) { 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_cb.offload_start_pending_hndl = 0; } bta_av_stream_chg(p_scb, false); @@ -3016,10 +3012,10 @@ 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; + if (bta_av_cb.offload_start_pending_hndl) { + APPL_TRACE_DEBUG("%s: VS_HCI_START_A2DP_MEDIA successful", __func__); + bta_av_cb.offload_started_hndl = bta_av_cb.offload_start_pending_hndl; + bta_av_cb.offload_start_pending_hndl = 0; } else { LOG_INFO("%s: No pending start command due to AVDTP suspend immediately", __func__); } @@ -3032,7 +3028,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, sub_opcode); if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) { - bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; + bta_av_cb.offload_start_pending_hndl = 0; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); } } @@ -3059,7 +3055,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)); - bta_av_cb.offload_start_pending_acl_hdl = offload_start->acl_hdl; + bta_av_cb.offload_start_pending_hndl = p_scb->hndl; BTM_VendorSpecificCommand(HCI_CONTROLLER_A2DP, p_param - param, param, offload_vendor_callback); } @@ -3092,8 +3088,8 @@ 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) { + } else if (bta_av_cb.offload_start_pending_hndl || + bta_av_cb.offload_started_hndl) { APPL_TRACE_WARNING("%s: offload already started, ignore request", __func__); return; } else { @@ -3165,7 +3161,7 @@ void bta_av_offload_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { status = BTA_AV_FAIL_STREAM; } - bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; + bta_av_cb.offload_start_pending_hndl = 0; 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 5eab1034b..ff8bb6a1a 100644 --- a/bta/av/bta_av_int.h +++ b/bta/av/bta_av_int.h @@ -635,8 +635,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; + uint16_t offload_start_pending_hndl; + uint16_t offload_started_hndl; } 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 e1d05089f..e7a6b235b 100644 --- a/bta/av/bta_av_main.cc +++ b/bta/av/bta_av_main.cc @@ -164,8 +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; + bta_av_cb.offload_start_pending_hndl = 0; + bta_av_cb.offload_started_hndl = 0; tBTA_AV_ENABLE enable; enable.features = bta_av_cb.features; @@ -338,16 +338,6 @@ 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); @@ -1420,9 +1410,8 @@ void bta_debug_av_dump(int fd) { 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); + bta_av_cb.offload_start_pending_hndl); + dprintf(fd, " Offload started handle: %d\n", bta_av_cb.offload_started_hndl); for (size_t i = 0; i < sizeof(bta_av_cb.lcb) / sizeof(bta_av_cb.lcb[0]); i++) { -- 2.11.0