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

Commit 5c56cbdd authored by Ted Wang's avatar Ted Wang Committed by Gerrit Code Review
Browse files

Merge "Move offload start related flags from BTA_AV_SCB to BTA_AV_CB"

parents 4a97636f 2e1d7673
Loading
Loading
Loading
Loading
+32 −11
Original line number Diff line number Diff line
@@ -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();
      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);

@@ -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,10 +3035,12 @@ 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);
    }
  }
}

void bta_av_vendor_offload_start(tBTA_AV_SCB* p_scb,
                                 tBT_A2DP_OFFLOAD* offload_start) {
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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
+17 −0
Original line number Diff line number Diff line
@@ -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++) {