Merge "Bluetooth: TWSP: Retry SCO connection to peer earbud only If it is INEAR" into bt.lnx.5.0
diff --git a/system_bt_ext/bta/include/bta_ag_twsp_dev.h b/system_bt_ext/bta/include/bta_ag_twsp_dev.h
index 592038c..c1e2b23 100644
--- a/system_bt_ext/bta/include/bta_ag_twsp_dev.h
+++ b/system_bt_ext/bta/include/bta_ag_twsp_dev.h
@@ -64,10 +64,11 @@
#define TWSPLUS_QDSP_ECHO_CANCELLATION 1
enum {
- TWSPLUS_EB_STATE_OFF,
+ TWSPLUS_EB_STATE_UNKNOWN,
TWSPLUS_EB_STATE_INCASE,
TWSPLUS_EB_STATE_OUT_OF_EAR,
TWSPLUS_EB_STATE_INEAR,
+ TWSPLUS_EB_STATE_OFF
};
enum {
@@ -100,6 +101,7 @@
bool twsp_get_right_eb_addr(RawAddress& eb_addr);
bool twsp_get_left_eb_addr(RawAddress& eb_addr);
uint8_t get_twsp_role(tBTA_AG_SCB *p_scb);
+uint8_t get_twsp_state(tBTA_AG_SCB *p_scb);
tBTA_AG_SCB* twsp_get_best_mic_scb ();
int twsp_get_idx_by_scb(tBTA_AG_SCB* p_scb);
diff --git a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc
index 125e889..fde7388 100644
--- a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc
+++ b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc
@@ -84,7 +84,7 @@
twsp_devices[eb_idx].p_scb = NULL;
twsp_devices[eb_idx].battery_charge = TWSPLUS_MIN_BATTERY_CHARGE;
- twsp_devices[eb_idx].state = TWSPLUS_EB_STATE_OFF;
+ twsp_devices[eb_idx].state = TWSPLUS_EB_STATE_UNKNOWN;
twsp_devices[eb_idx].role = TWSPLUS_EB_ROLE_INVALID;
twsp_devices[eb_idx].mic_path_delay = TWSPLUS_INVALID_MICPATH_DELAY;
twsp_devices[eb_idx].mic_quality = TWSPLUS_MIN_MIC_QUALITY;
@@ -99,7 +99,7 @@
APPL_TRACE_WARNING("%s: idx: %d, p_scb: %x", __func__, i, p_scb);
twsp_devices[i].p_scb = p_scb;
twsp_devices[i].battery_charge = TWSPLUS_MIN_BATTERY_CHARGE;
- twsp_devices[i].state = TWSPLUS_EB_STATE_OFF;
+ twsp_devices[i].state = TWSPLUS_EB_STATE_UNKNOWN;
int other_idx = (i == PRIMARY_EB_IDX) ? SECONDARY_EB_IDX : PRIMARY_EB_IDX;
if (twsp_devices[other_idx].p_scb != NULL &&
@@ -387,7 +387,7 @@
return false;
}
- if (state < TWSPLUS_EB_STATE_OFF || state > TWSPLUS_EB_STATE_INEAR) {
+ if (state < TWSPLUS_EB_STATE_UNKNOWN || state > TWSPLUS_EB_STATE_INEAR) {
APPL_TRACE_WARNING("%s: Invalid state: %d\n", __func__, state);
return false;
}
@@ -459,6 +459,20 @@
return role;
}
+uint8_t get_twsp_state(tBTA_AG_SCB *p_scb) {
+ APPL_TRACE_DEBUG("%s: p_scb : %d\n", __func__, p_scb);
+ uint8_t state = TWSPLUS_EB_STATE_UNKNOWN;
+ for (int i=0; i<=SECONDARY_EB_IDX; i++) {
+ if (p_scb == twsp_devices[i].p_scb)
+ {
+ state = twsp_devices[i].state;
+ break;
+ }
+ }
+ APPL_TRACE_DEBUG("%s: returns : %d", __func__, state);
+ return state;
+}
+
bool twsp_is_ring_sent(tBTA_AG_SCB *p_scb) {
int sel_idx = -1;
bool ret = false;
diff --git a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc
index 5f6af9b..614c80d 100644
--- a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc
+++ b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc
@@ -315,7 +315,8 @@
bta_ag_create_sco(p_scb, false);
p_sco->state = BTA_AG_SCO_LISTEN_ST;
other_scb = get_other_twsp_scb((p_scb->peer_addr));
- if (other_scb && twsp_sco_active(other_scb) == false) {
+ if (other_scb && twsp_sco_active(other_scb) == false &&
+ get_twsp_state(other_scb) == TWSPLUS_EB_STATE_INEAR) {
//Atleast try bringing up the other EB eSCO
APPL_TRACE_WARNING("Calling SCO open for other EB");
dispatch_event_primary_peer_device(p_scb, BTA_AG_SCO_OPEN_E);