aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Wang <tedwang@google.com>2021-11-05 02:30:55 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2021-11-05 02:30:55 +0000
commit73507f7efd34550bac1a839b994c7a26bc6cecb8 (patch)
tree3e8d2896375f7aad0fc01a7d02dd3f92acf2a169
parent1f23d43bf20b03f0dc4676db6399fad1b5b1b0c1 (diff)
parentad4ee82aa6dbd021ff86f539a845eb3ab1653c59 (diff)
downloadbt-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.cc43
-rw-r--r--bta/av/bta_av_int.h4
-rw-r--r--bta/av/bta_av_main.cc17
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++) {