OSDN Git Service

HFP: Reset BTA SCO control block when bta_ag_create_sco failed
authorBenson Li <bensonli@google.com>
Wed, 4 Jul 2018 12:41:58 +0000 (20:41 +0800)
committerJack He <siyuanh@google.com>
Fri, 13 Jul 2018 00:51:34 +0000 (17:51 -0700)
* 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

bta/ag/bta_ag_sco.cc
btif/src/btif_hf.cc

index 148919d..1ff4c7e 100644 (file)
@@ -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 */
index 80cf4d4..038af2e 100644 (file)
@@ -773,14 +773,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;
 }