Bluetooth: TWSP : switch Microphone on disconnect
Switch Microphone path for earbuds if the previously selected earbud
gets disconnected
Change-Id: I87fb1297249c9c4a9758894cc8cdf84025b40be6
CRs-fixed: 2389520
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 e2d7ca5..125e889 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
@@ -38,7 +38,11 @@
#include "internal_include/bt_trace.h"
#include "bta_ag_int.h"
+
#if (TWS_AG_ENABLED == TRUE)
+//forward declarations
+void select_microphone_path(tBTA_AG_SCB *best_scb);
+
tTWSPLUS_DEVICE twsp_devices[MAX_TWSPLUS_DEVICES];
@@ -48,22 +52,45 @@
return g_latest_selected_eb_role;
}
+tBTA_AG_SCB* get_twsp_with_role(uint8_t role) {
+ int i;
+ for (i=0; i<MAX_TWSPLUS_DEVICES; i++) {
+ if (twsp_devices[i].p_scb != NULL &&
+ twsp_devices[i].role == role) {
+ return twsp_devices[i].p_scb;
+ }
+ }
+ return NULL;
+}
+
void reset_twsp_device(int eb_idx) {
if (eb_idx < PRIMARY_EB_IDX || eb_idx > SECONDARY_EB_IDX) {
APPL_TRACE_WARNING("%s: Invalid eb_idx: %d\n", __func__, eb_idx);
return;
}
- APPL_TRACE_WARNING("%s: eb idx: %d\n", __func__, eb_idx);
- 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].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;
- twsp_devices[eb_idx].qdsp_nr = TWSPLUS_INVALID_QDSP_VALUE;
- twsp_devices[eb_idx].qdsp_ec = TWSPLUS_INVALID_QDSP_VALUE;
- twsp_devices[eb_idx].ring_sent = false;
+ if (get_lat_selected_mic_eb_role() == twsp_devices[eb_idx].role) {
+ //Trigger Microphone Switch
+ uint8_t other_twsp_role =
+ (twsp_devices[eb_idx].role == TWSPLUS_EB_ROLE_LEFT) ?
+ TWSPLUS_EB_ROLE_RIGHT : TWSPLUS_EB_ROLE_LEFT;
+ tBTA_AG_SCB *peer_scb = get_twsp_with_role(other_twsp_role);
+ if (peer_scb != NULL) {
+ select_microphone_path(peer_scb);
+ } else {
+ APPL_TRACE_WARNING("%s: peer_scb is NULL, No mic switch", __func__);
+ }
+ }
+
+ 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].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;
+ twsp_devices[eb_idx].qdsp_nr = TWSPLUS_INVALID_QDSP_VALUE;
+ twsp_devices[eb_idx].qdsp_ec = TWSPLUS_INVALID_QDSP_VALUE;
+ twsp_devices[eb_idx].ring_sent = false;
}
void update_twsp_device(tBTA_AG_SCB* p_scb) {