Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c4a4032 authored by Ted Wang's avatar Ted Wang
Browse files

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
parent 13515a7c
Loading
Loading
Loading
Loading
+17 −21
Original line number Diff line number Diff line
@@ -1891,15 +1891,13 @@ 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) {
    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);
@@ -2521,15 +2519,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);

@@ -3020,10 +3016,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__);
        }
@@ -3036,7 +3032,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);
    }
  }
@@ -3063,7 +3059,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;
  LOG_INFO(
      "codec: %#x, sample rate: %#x, bit depth: %#x, channel: %#x, bitrate: "
      "%#x, ACL: %#x, L2CAP: %#x, MTU: %#x",
@@ -3103,8 +3099,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 {
@@ -3176,7 +3172,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);
+2 −2
Original line number Diff line number Diff line
@@ -637,8 +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;
  uint16_t offload_start_pending_hndl;
  uint16_t offload_started_hndl;
} tBTA_AV_CB;

// total attempts are half seconds
+4 −15
Original line number Diff line number Diff line
@@ -166,8 +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;
  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;
@@ -340,16 +340,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++) {