diff options
author | Ted Wang <tedwang@google.com> | 2021-11-05 02:30:55 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-11-05 02:30:55 +0000 |
commit | 73507f7efd34550bac1a839b994c7a26bc6cecb8 (patch) | |
tree | 3e8d2896375f7aad0fc01a7d02dd3f92acf2a169 | |
parent | 1f23d43bf20b03f0dc4676db6399fad1b5b1b0c1 (diff) | |
parent | ad4ee82aa6dbd021ff86f539a845eb3ab1653c59 (diff) | |
download | bt-73507f7efd34550bac1a839b994c7a26bc6cecb8.tar.gz |
Merge "Move offload start related flags from BTA_AV_SCB to BTA_AV_CB"
-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 83f802ca8..257770cf9 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" @@ -165,6 +166,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; @@ -337,6 +340,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); @@ -1406,6 +1419,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++) { |