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

Commit 0d9adb89 authored by Benson Li's avatar Benson Li Committed by Jack He
Browse files

HFP: Reset BTA SCO control block when bta_ag_create_sco failed

* When trying to connect SCO to non-active and active device back to
  back, the first connection to non-active device must fail gracefully
* Otherwise, BTA SCO state machine may stuck in a irrecoverable state
* Schedule to send AUDIO_CONNECTING state before starting SCO connection
  to avoid race condition between connecting state and connection
  failure

Bug: 111101075
Test: Manual test, make a call and switch path A->speaker->B on phone UI
Change-Id: I9bfa389e04863944d88f2bca49d27f1247fa072b
(cherry picked from commit 67366799)
parent 9797c3f3
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -370,6 +370,12 @@ static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
  if (!bta_ag_sco_is_active_device(p_scb->peer_addr)) {
    LOG(WARNING) << __func__ << ": device " << p_scb->peer_addr
                 << " is not active, active_device=" << active_device_addr;
    if (bta_ag_cb.sco.p_curr_scb != nullptr &&
        bta_ag_cb.sco.p_curr_scb->in_use && p_scb == bta_ag_cb.sco.p_curr_scb) {
      do_in_bta_thread(
          FROM_HERE, base::Bind(&bta_ag_sm_execute, p_scb, BTA_AG_SCO_CLOSE_EVT,
                                tBTA_AG_DATA::kEmpty));
    }
    return;
  }
  /* Make sure this SCO handle is not already in use */
+1 −3
Original line number Diff line number Diff line
@@ -783,14 +783,12 @@ bt_status_t HeadsetInterface::ConnectAudio(RawAddress* bd_addr) {
    LOG(ERROR) << ": SLC not connected for " << *bd_addr;
    return BT_STATUS_NOT_READY;
  }
  BTA_AgAudioOpen(btif_hf_cb[idx].handle);
  // Inform the application that the audio connection has been initiated
  // successfully
  do_in_jni_thread(base::Bind(&Callbacks::AudioStateCallback,
                              // Manual pointer management for now
                              base::Unretained(bt_hf_callbacks),
                              BTHF_AUDIO_STATE_CONNECTING,
                              &btif_hf_cb[idx].connected_bda));
  BTA_AgAudioOpen(btif_hf_cb[idx].handle);
  return BT_STATUS_SUCCESS;
}