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

Commit 01893d90 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 am:...

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

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

Change-Id: I9f89a921e649ce521a6a143ff51f32031b6f4d4d
parents 97c082ca 567d679c
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();