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

Commit aea80870 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Disable sniff in link policy before a2dp streaming" am: ded7b79e

Original change: https://android-review.googlesource.com/c/platform/system/bt/+/1788388

Change-Id: I1cbfa74c907490dfb3c7359099e83b8a9068a5f7
parents 17dee1c3 ded7b79e
Loading
Loading
Loading
Loading
+21 −20
Original line number Diff line number Diff line
@@ -1811,16 +1811,6 @@ void bta_av_do_start(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
    return;
  }

  /* disallow role switch during streaming, only if we are the central role
   * i.e. allow role switch, if we are peripheral.
   * It would not hurt us, if the peer device wants us to be central */
  tHCI_ROLE cur_role;
  if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
      (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;
    if (p_scb->wait != 0) {
@@ -1852,6 +1842,18 @@ void bta_av_do_start(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {

  p_scb->role |= BTA_AV_ROLE_START_INT;
  bta_sys_busy(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
  /* disallow role switch during streaming, only if we are the central role
   * i.e. allow role switch, if we are peripheral.
   * It would not hurt us, if the peer device wants us to be central
   * disable sniff mode unconditionally during streaming */
  tHCI_ROLE cur_role;
  if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
      (cur_role == HCI_ROLE_CENTRAL)) {
    BTM_block_role_switch_and_sniff_mode_for(p_scb->PeerAddress());
  } else {
    BTM_block_sniff_mode_for(p_scb->PeerAddress());
  }

  uint16_t result = AVDT_StartReq(&p_scb->avdt_handle, 1);
  if (result != AVDT_SUCCESS) {
    LOG_ERROR("%s: AVDT_StartReq failed for peer %s result:%d", __func__,
@@ -1887,8 +1889,7 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
      bta_av_cb.audio_open_cnt, p_data, start);

  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());
  BTM_unblock_role_switch_and_sniff_mode_for(p_scb->PeerAddress());

  if (p_scb->co_started) {
    if (p_scb->offload_started) {
@@ -2316,10 +2317,13 @@ void bta_av_start_ok(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
      /* If souce is the central role, disable role switch during streaming.
       * Otherwise allow role switch, if source is peripheral.
       * Because it would not hurt source, if the peer device wants source to be
       * central */
       * central.
       * disable sniff mode unconditionally during streaming */
      if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
          (cur_role == HCI_ROLE_CENTRAL)) {
        BTM_block_role_switch_for(p_scb->PeerAddress());
        BTM_block_role_switch_and_sniff_mode_for(p_scb->PeerAddress());
      } else {
        BTM_block_sniff_mode_for(p_scb->PeerAddress());
      }
    }

@@ -2382,8 +2386,7 @@ void bta_av_start_failed(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
    notify_start_failed(p_scb);
  }

  BTM_unblock_role_switch_for(p_scb->PeerAddress());
  BTM_unblock_sniff_mode_for(p_scb->PeerAddress());
  BTM_unblock_role_switch_and_sniff_mode_for(p_scb->PeerAddress());
  p_scb->sco_suspend = false;
}

@@ -2405,8 +2408,7 @@ void bta_av_str_closed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
      __func__, p_scb->PeerAddress().ToString().c_str(), p_scb->hndl,
      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());
  BTM_unblock_role_switch_and_sniff_mode_for(p_scb->PeerAddress());
  if (bta_av_cb.audio_open_cnt <= 1) {
    BTM_default_unblock_role_switch();
  }
@@ -2510,8 +2512,7 @@ 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());
  BTM_unblock_role_switch_and_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) {
+10 −0
Original line number Diff line number Diff line
@@ -722,6 +722,16 @@ void BTM_block_role_switch_for(const RawAddress& peer_addr) {
  btm_toggle_policy_off_for(peer_addr, HCI_ENABLE_CENTRAL_PERIPHERAL_SWITCH);
}

void BTM_unblock_role_switch_and_sniff_mode_for(const RawAddress& peer_addr) {
  btm_toggle_policy_on_for(
      peer_addr, HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_CENTRAL_PERIPHERAL_SWITCH);
}

void BTM_block_role_switch_and_sniff_mode_for(const RawAddress& peer_addr) {
  btm_toggle_policy_off_for(
      peer_addr, HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_CENTRAL_PERIPHERAL_SWITCH);
}

void StackAclBtmAcl::btm_set_default_link_policy(tLINK_POLICY settings) {
  check_link_policy(&settings);
  btm_cb.acl_cb_.btm_def_link_policy = settings;
+2 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ void BTM_unblock_sniff_mode_for(const RawAddress& peer_addr);
void BTM_block_sniff_mode_for(const RawAddress& peer_addr);
void BTM_unblock_role_switch_for(const RawAddress& peer_addr);
void BTM_block_role_switch_for(const RawAddress& peer_addr);
void BTM_unblock_role_switch_and_sniff_mode_for(const RawAddress& peer_addr);
void BTM_block_role_switch_and_sniff_mode_for(const RawAddress& peer_addr);

void BTM_default_unblock_role_switch();
void BTM_default_block_role_switch();