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

Commit ded7b79e authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Disable sniff in link policy before a2dp streaming"

parents 4c041c72 92f42100
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();