OSDN Git Service

Do not cleanup offload related flag in bta_av_conn_cback
[android-x86/system-bt.git] / bta / av / bta_av_aact.cc
index b0e0dcf..0a0f6b5 100644 (file)
@@ -82,8 +82,6 @@ constexpr char kBtmLogTag[] = "A2DP";
 /* ACL quota we are letting FW use for A2DP Offload Tx. */
 #define BTA_AV_A2DP_OFFLOAD_XMIT_QUOTA 4
 
-#define BTIF_A2DP_MAX_BITPOOL_MQ 35
-
 static void bta_av_offload_codec_builder(tBTA_AV_SCB* p_scb,
                                          tBT_A2DP_OFFLOAD* p_a2dp_offload);
 
@@ -134,7 +132,7 @@ static const uint16_t bta_av_stream_evt_ok[] = {
     BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_CONN_EVT */
     BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_DISCONN_EVT */
     BTA_AV_AVDT_DELAY_RPT_EVT, /* AVDT_DELAY_REPORT_EVT */
-    0                          /* AVDT_DELAY_REPORT_CFM_EVT */
+    BTA_AV_AVDT_DELAY_RPT_CFM_EVT, /* AVDT_DELAY_REPORT_CFM_EVT */
 };
 
 static const uint16_t bta_av_stream_evt_fail[] = {
@@ -159,7 +157,7 @@ static const uint16_t bta_av_stream_evt_fail[] = {
     BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_CONN_EVT */
     BTA_AV_AVDT_RPT_CONN_EVT, /* AVDT_REPORT_DISCONN_EVT */
     BTA_AV_AVDT_DELAY_RPT_EVT, /* AVDT_DELAY_REPORT_EVT */
-    0                          /* AVDT_DELAY_REPORT_CFM_EVT */
+    BTA_AV_AVDT_DELAY_RPT_CFM_EVT, /* AVDT_DELAY_REPORT_CFM_EVT */
 };
 
 /***********************************************
@@ -851,7 +849,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;
@@ -874,8 +871,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++) {
@@ -1170,7 +1165,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) ||
@@ -1821,6 +1815,7 @@ void bta_av_do_start(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
       (cur_role == HCI_ROLE_CENTRAL)) {
     BTM_block_role_switch_for(p_scb->PeerAddress());
   }
+  BTM_block_sniff_mode_for(p_scb->PeerAddress());
 
   if (p_scb->started) {
     p_scb->role |= BTA_AV_ROLE_START_INT;
@@ -1889,11 +1884,16 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 
   bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
   BTM_unblock_role_switch_for(p_scb->PeerAddress());
+  BTM_unblock_sniff_mode_for(p_scb->PeerAddress());
 
   if (p_scb->co_started) {
-    if (p_scb->offload_started) {
+    if (bta_av_cb.offload_started_hndl == p_scb->hndl) {
       bta_av_vendor_offload_stop();
-      p_scb->offload_started = false;
+      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_hndl = 0;
     }
 
     bta_av_stream_chg(p_scb, false);
@@ -2383,6 +2383,7 @@ void bta_av_start_failed(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
   }
 
   BTM_unblock_role_switch_for(p_scb->PeerAddress());
+  BTM_unblock_sniff_mode_for(p_scb->PeerAddress());
   p_scb->sco_suspend = false;
 }
 
@@ -2405,6 +2406,7 @@ void bta_av_str_closed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
       p_scb->open_status, p_scb->chnl, p_scb->co_started);
 
   BTM_unblock_role_switch_for(p_scb->PeerAddress());
+  BTM_unblock_sniff_mode_for(p_scb->PeerAddress());
   if (bta_av_cb.audio_open_cnt <= 1) {
     BTM_default_unblock_role_switch();
   }
@@ -2509,12 +2511,17 @@ void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 
   bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
   BTM_unblock_role_switch_for(p_scb->PeerAddress());
+  BTM_unblock_sniff_mode_for(p_scb->PeerAddress());
 
   /* 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) {
+    if (bta_av_cb.offload_started_hndl == p_scb->hndl) {
+      bta_av_vendor_offload_stop();
+      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();
-      p_scb->offload_started = false;
+      bta_av_cb.offload_start_pending_hndl = 0;
     }
     bta_av_stream_chg(p_scb, false);
 
@@ -3005,6 +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_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__);
+        }
         (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value);
         break;
       default:
@@ -3013,8 +3027,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_hndl = 0;
       (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value);
+    }
   }
 }
 
@@ -3039,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));
-  p_scb->offload_started = true;
+  bta_av_cb.offload_start_pending_hndl = p_scb->hndl;
   BTM_VendorSpecificCommand(HCI_CONTROLLER_A2DP, p_param - param,
                             param, offload_vendor_callback);
 }
@@ -3072,6 +3088,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_hndl ||
+             bta_av_cb.offload_started_hndl) {
+    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);
@@ -3141,7 +3161,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_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);
@@ -3159,7 +3179,7 @@ static void bta_av_offload_codec_builder(tBTA_AV_SCB* p_scb,
     case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
       codec_type = BTA_AV_CODEC_TYPE_SBC;
       if (A2DP_GetMaxBitpoolSbc(p_scb->cfg.codec_info) <=
-          BTIF_A2DP_MAX_BITPOOL_MQ) {
+          A2DP_SBC_BITPOOL_MIDDLE_QUALITY) {
         APPL_TRACE_WARNING("%s: Restricting streaming MTU size for MQ Bitpool",
                            __func__);
         mtu = MAX_2MBPS_AVDTP_MTU;