OSDN Git Service

Do not cleanup offload related flag in bta_av_conn_cback
authorTed Wang <tedwang@google.com>
Wed, 1 Dec 2021 15:28:44 +0000 (23:28 +0800)
committerTed Wang <tedwang@google.com>
Tue, 14 Dec 2021 03:10:09 +0000 (03:10 +0000)
Do not cleanup offload related flag in bta_av_conn_cback to avoid
missing sending out offload stop command when disconnect during
streaming.

Bug: 207491735
Test: manual
Change-Id: I6a54ce2285b1ef2a5a88457a369d830d1966f300
Merged-In: I6a54ce2285b1ef2a5a88457a369d830d1966f300

bta/av/bta_av_aact.cc
bta/av/bta_av_int.h
bta/av/bta_av_main.cc

index 3a55d57..230261a 100644 (file)
@@ -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,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;
+        LOG_INFO("%s, bta_av_cb.offload_start_pending_hndl=%d", __func__,
+                bta_av_cb.offload_start_pending_hndl);
+        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 +3031,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 +3058,8 @@ 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;
+  //bta_av_cb.offload_start_pending_hndl = offload_start->hndl;
   BTM_VendorSpecificCommand(HCI_CONTROLLER_A2DP, p_param - param,
                             param, offload_vendor_callback);
 }
@@ -3092,8 +3092,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 +3165,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);
index 5eab103..ff8bb6a 100644 (file)
@@ -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
index e1d0508..e3b500d 100644 (file)
@@ -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,9 @@ 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);
+          bta_av_cb.offload_start_pending_hndl);
   dprintf(fd, "  Offload started handle: %d\n",
-          bta_av_cb.offload_started_acl_hdl);
+          bta_av_cb.offload_started_hndl);
 
   for (size_t i = 0; i < sizeof(bta_av_cb.lcb) / sizeof(bta_av_cb.lcb[0]);
        i++) {