Merge "configs: kalama: add more echo combinations for VOIP usecase"
diff --git a/configs/crow/mixer_paths_crow_idp_wcd9395_wcd_dmic.xml b/configs/crow/mixer_paths_crow_idp_wcd9395_wcd_dmic.xml
old mode 100644
new mode 100755
index de9e43c..5a4d18d
--- a/configs/crow/mixer_paths_crow_idp_wcd9395_wcd_dmic.xml
+++ b/configs/crow/mixer_paths_crow_idp_wcd9395_wcd_dmic.xml
@@ -834,9 +834,9 @@
         <ctl name="VA DEC1 MUX" value="SWR_MIC" />
         <ctl name="VA SMIC MUX0" value="SWR_MIC3" />
         <ctl name="VA SMIC MUX1" value="SWR_MIC0" />
-        <ctl name="DMIC0 ChMap" value="SWRM_TX1_CH2" />
+        <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH4" />
         <ctl name="DMIC3 ChMap" value="SWRM_TX1_CH1" />
-        <ctl name="DMIC0_MIXER Switch" value="1" />
+        <ctl name="DMIC1_MIXER Switch" value="1" />
         <ctl name="DMIC3_MIXER Switch" value="1" />
     </path>
 
@@ -851,10 +851,10 @@
        <ctl name="VA SMIC MUX1" value="SWR_MIC8" />
        <ctl name="VA SMIC MUX0" value="SWR_MIC10" />
        <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH2" />
-       <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH1" />
+       <ctl name="DMIC1 ChMap" value="SWRM_TX3_CH1" />
        <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH3" />
        <ctl name="DMIC0_MIXER Switch" value="1" />
-       <ctl name="DMIC2_MIXER Switch" value="1" />
+       <ctl name="DMIC1_MIXER Switch" value="1" />
        <ctl name="DMIC3_MIXER Switch" value="1" />
     </path>
 
@@ -871,14 +871,14 @@
         <ctl name="VA SMIC MUX2" value="SWR_MIC7" />
         <ctl name="VA SMIC MUX3" value="SWR_MIC9" />
         <ctl name="VA SMIC MUX0" value="SWR_MIC11" />
-        <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH1" />
-        <ctl name="DMIC4 ChMap" value="SWRM_TX2_CH4" />
+        <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH4" />
         <ctl name="DMIC1 ChMap" value="SWRM_TX3_CH2" />
         <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH4" />
-        <ctl name="DMIC2_MIXER Switch" value="1" />
-        <ctl name="DMIC4_MIXER Switch" value="1" />
+        <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH1" />
+        <ctl name="DMIC0_MIXER Switch" value="1" />
         <ctl name="DMIC1_MIXER Switch" value="1" />
         <ctl name="DMIC3_MIXER Switch" value="1" />
+        <ctl name="DMIC2_MIXER Switch" value="1" />
     </path>
 
     <path name="va-mic">
@@ -902,9 +902,9 @@
         <ctl name="VA DEC1 MUX" value="SWR_MIC" />
         <ctl name="VA SMIC MUX0" value="SWR_MIC3" />
         <ctl name="VA SMIC MUX1" value="SWR_MIC0" />
-        <ctl name="DMIC0 ChMap" value="SWRM_TX1_CH2" />
+        <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH4" />
         <ctl name="DMIC3 ChMap" value="SWRM_TX1_CH1" />
-        <ctl name="DMIC0_MIXER Switch" value="1" />
+        <ctl name="DMIC1_MIXER Switch" value="1" />
         <ctl name="DMIC3_MIXER Switch" value="1" />
     </path>
 
@@ -924,10 +924,10 @@
         <ctl name="VA SMIC MUX2" value="SWR_MIC5" />
         <ctl name="DMIC2 ChMap" value="SWRM_TX2_CH1" />
         <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH2" />
-        <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH1" />
+        <ctl name="DMIC4 ChMap" value="SWRM_TX3_CH1" />
         <ctl name="DMIC2_MIXER Switch" value="1" />
         <ctl name="DMIC0_MIXER Switch" value="1" />
-        <ctl name="DMIC3_MIXER Switch" value="1" />
+        <ctl name="DMIC4_MIXER Switch" value="1" />
     </path>
 
     <path name="va-mic-qmic-lpi">
@@ -1000,9 +1000,9 @@
        <ctl name="TX DEC1 MUX" value="SWR_MIC" />
        <ctl name="TX SMIC MUX0" value="SWR_MIC3" />
        <ctl name="TX SMIC MUX1" value="SWR_MIC0" />
-       <ctl name="DMIC0 ChMap" value="SWRM_TX1_CH2" />
+       <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH4" />
        <ctl name="DMIC3 ChMap" value="SWRM_TX1_CH1" />
-       <ctl name="DMIC0_MIXER Switch" value="1" />
+       <ctl name="DMIC1_MIXER Switch" value="1" />
        <ctl name="DMIC3_MIXER Switch" value="1" />
        <ctl name="TX_DEC0 Volume" value="102" />
        <ctl name="TX_DEC1 Volume" value="102" />
@@ -1015,9 +1015,9 @@
        <ctl name="TX DEC1 MUX" value="SWR_MIC" />
        <ctl name="TX SMIC MUX0" value="SWR_MIC3" />
        <ctl name="TX SMIC MUX1" value="SWR_MIC0" />
-       <ctl name="DMIC0 ChMap" value="SWRM_TX1_CH2" />
+       <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH4" />
        <ctl name="DMIC3 ChMap" value="SWRM_TX1_CH1" />
-       <ctl name="DMIC0_MIXER Switch" value="1" />
+       <ctl name="DMIC1_MIXER Switch" value="1" />
        <ctl name="DMIC3_MIXER Switch" value="1" />
        <ctl name="TX_DEC0 Volume" value="102" />
        <ctl name="TX_DEC1 Volume" value="102" />
@@ -1098,10 +1098,10 @@
         <ctl name="TX_DEC1 MODE" value="ADC_LOW_PWR" />
         <ctl name="TX SMIC MUX0" value="SWR_MIC4" />
         <ctl name="TX SMIC MUX1" value="SWR_MIC8" />
-        <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH1" />
+        <ctl name="DMIC1 ChMap" value="SWRM_TX2_CH1" />
         <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH1" />
-        <ctl name="TX_DMIC0_MIXER Switch" value="1" />
-        <ctl name="TX_DMIC4_MIXER Switch" value="1" />
+        <ctl name="TX_DMIC1_MIXER Switch" value="1" />
+        <ctl name="TX_DMIC3_MIXER Switch" value="1" />
     </path>
 
     <path name="dmic-broadside">
@@ -1126,10 +1126,10 @@
        <ctl name="VA SMIC MUX1" value="SWR_MIC8" />
        <ctl name="VA SMIC MUX0" value="SWR_MIC10" />
        <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH2" />
-       <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH1" />
+       <ctl name="DMIC1 ChMap" value="SWRM_TX3_CH1" />
        <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH3" />
        <ctl name="DMIC0_MIXER Switch" value="1" />
-       <ctl name="DMIC2_MIXER Switch" value="1" />
+       <ctl name="DMIC1_MIXER Switch" value="1" />
        <ctl name="DMIC3_MIXER Switch" value="1" />
     </path>
 
@@ -1144,10 +1144,10 @@
        <ctl name="VA SMIC MUX1" value="SWR_MIC8" />
        <ctl name="VA SMIC MUX0" value="SWR_MIC10" />
        <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH2" />
-       <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH1" />
+       <ctl name="DMIC1 ChMap" value="SWRM_TX3_CH1" />
        <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH3" />
        <ctl name="DMIC0_MIXER Switch" value="1" />
-       <ctl name="DMIC2_MIXER Switch" value="1" />
+       <ctl name="DMIC1_MIXER Switch" value="1" />
        <ctl name="DMIC3_MIXER Switch" value="1" />
     </path>
 
@@ -1170,14 +1170,14 @@
        <ctl name="TX SMIC MUX2" value="SWR_MIC7" />
        <ctl name="TX SMIC MUX3" value="SWR_MIC9" />
        <ctl name="TX SMIC MUX0" value="SWR_MIC11" />
-       <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH1" />
-       <ctl name="DMIC4 ChMap" value="SWRM_TX2_CH4" />
-       <ctl name="DMIC1 ChMap" value="SWRM_TX3_CH2" />
-       <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH4" />
-       <ctl name="DMIC2_MIXER Switch" value="1" />
-       <ctl name="DMIC4_MIXER Switch" value="1" />
+       <ctl name="DMIC0 ChMap" value="SWRM_TX2_CH2" />
+       <ctl name="DMIC1 ChMap" value="SWRM_TX3_CH1" />
+       <ctl name="DMIC3 ChMap" value="SWRM_TX3_CH3" />
+       <ctl name="DMIC2 ChMap" value="SWRM_TX3_CH4" />
+       <ctl name="DMIC0_MIXER Switch" value="1" />
        <ctl name="DMIC1_MIXER Switch" value="1" />
        <ctl name="DMIC3_MIXER Switch" value="1" />
+       <ctl name="DMIC2_MIXER Switch" value="1" />
        <ctl name="TX_DEC0 Volume" value="102" />
        <ctl name="TX_DEC1 Volume" value="102" />
        <ctl name="TX_DEC2 Volume" value="102" />
@@ -1209,9 +1209,9 @@
         <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
         <ctl name="TX DMIC MUX2" value="DMIC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
-        <ctl name="TX DMIC MUX3" value="DMIC2" />
+        <ctl name="TX DMIC MUX3" value="DMIC1" />
         <ctl name="TX_AIF1_CAP Mixer DEC4" value="1" />
-        <ctl name="TX DMIC MUX4" value="DMIC2" />
+        <ctl name="TX DMIC MUX4" value="DMIC1" />
     </path>
 
     <path name="handset-dual-dmic-quad-dec-reverse">
diff --git a/configs/crow/mixer_paths_crow_qrd.xml b/configs/crow/mixer_paths_crow_qrd.xml
index 28520e2..587416c 100644
--- a/configs/crow/mixer_paths_crow_qrd.xml
+++ b/configs/crow/mixer_paths_crow_qrd.xml
@@ -288,9 +288,9 @@
 
     <path name="amic3">
         <ctl name="TX DEC2 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX2" value="SWR_MIC5" />
+        <ctl name="TX SMIC MUX2" value="SWR_MIC6" />
         <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
-        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH3" />
         <ctl name="ADC2 MUX" value="INP3" />
         <ctl name="ADC2_MIXER Switch" value="1" />
     </path>
@@ -479,11 +479,11 @@
     </path>
 
     <path name="speaker-mic">
-        <path name="amic3" />
+        <path name="amic1" />
     </path>
 
     <path name="speaker-mic-liquid">
-        <path name="amic3" />
+        <path name="amic1" />
     </path>
 
     <path name="speaker-mic-sbc">
@@ -559,7 +559,6 @@
         <ctl name="WSA RX0 MUX" value="AIF1_PB" />
         <ctl name="WSA_RX0 INP0" value="RX0" />
         <ctl name="WSA_COMP1 Switch" value="1" />
-        <ctl name="Idle Detect" value="1" />
         <ctl name="SpkrLeft COMP Switch" value="1" />
         <ctl name="SpkrLeft VISENSE Switch" value="1" />
         <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
diff --git a/device/src/Bluetooth.cpp b/device/src/Bluetooth.cpp
index cb67a90..f002ef4 100644
--- a/device/src/Bluetooth.cpp
+++ b/device/src/Bluetooth.cpp
@@ -1227,6 +1227,7 @@
         if ((fbDev->deviceStartStopCount > 0) &&
             (--fbDev->deviceStartStopCount == 0)) {
             fbDev->isConfigured = false;
+            fbDev->isAbrEnabled = false;
         }
         if (fbDev->deviceCount > 0)
             fbDev->deviceCount--;
@@ -1241,6 +1242,7 @@
         if ((fbDev->deviceStartStopCount > 0) &&
             (--fbDev->deviceStartStopCount == 0)) {
             fbDev->isConfigured = false;
+            fbDev->isAbrEnabled = false;
         }
         if (fbDev->deviceCount > 0)
             fbDev->deviceCount--;
diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp
index 91d1061..133e387 100644
--- a/resource_manager/src/ResourceManager.cpp
+++ b/resource_manager/src/ResourceManager.cpp
@@ -9057,8 +9057,10 @@
                                param_bt_a2dp.dev_id = PAL_DEVICE_OUT_BLUETOOTH_A2DP;
                                param_bt_a2dp.a2dp_suspended = true;
                                PAL_DBG(LOG_TAG, "Applying cached a2dp_suspended true param");
+                               mResourceManagerMutex.unlock();
                                status = dev->setDeviceParameter(PAL_PARAM_ID_BT_A2DP_SUSPENDED,
                                                                 &param_bt_a2dp);
+                               mResourceManagerMutex.lock();
                            } else {
                                a2dp_suspended = false;
                            }
diff --git a/stream/src/Stream.cpp b/stream/src/Stream.cpp
index 355d35e..02ea578 100644
--- a/stream/src/Stream.cpp
+++ b/stream/src/Stream.cpp
@@ -866,6 +866,16 @@
 
     a2dpSuspend = false;
 
+    /* Check for BT device connected state */
+    for (int32_t i = 0; i < mDevices.size(); i++) {
+        pal_device_id_t dev_id = (pal_device_id_t)mDevices[i]->getSndDeviceId();
+        if (rm->isBtDevice(dev_id) && !(rm->isDeviceAvailable(dev_id))) {
+            PAL_ERR(LOG_TAG, "BT device %d not connected", dev_id);
+            status = -ENODEV;
+            goto exit;
+        }
+    }
+
     /* SCO device is not ready */
     if (rm->isDeviceAvailable(mDevices, PAL_DEVICE_OUT_BLUETOOTH_SCO) &&
         !rm->isDeviceReady(PAL_DEVICE_OUT_BLUETOOTH_SCO)) {
@@ -1373,6 +1383,7 @@
     int32_t connectCount = 0, disconnectCount = 0;
     bool isNewDeviceA2dp = false;
     bool isCurDeviceA2dp = false;
+    bool isCurDeviceSco = false;
     bool isCurrentDeviceProxyOut = false;
     bool isCurrentDeviceDpOut = false;
     bool matchFound = false;
@@ -1425,6 +1436,11 @@
             curBtDevId = curDevId;
         }
 
+        if (curDevId == PAL_DEVICE_OUT_BLUETOOTH_SCO) {
+            isCurDeviceSco = true;
+            curBtDevId = curDevId;
+        }
+
         if (curDevId == PAL_DEVICE_OUT_PROXY)
             isCurrentDeviceProxyOut = true;
 
@@ -1497,11 +1513,19 @@
          * But the audioflinger continues to write data until standby time
          * (3sec). As BT is turned off, the write gets blocked.
          * Avoid this by routing audio to speaker until standby.
+         *
+         * If a stream is active on SCO and playback has ended, APM will send
+         * routing=0. Stream will be closed in PAL after standby time. If SCO
+         * device gets disconnected, this stream will not receive new routing
+         * and stream will remain with SCO for the time being. If SCO device
+         * gets connected again with different config in the meantime and
+         * capture stream tries to start ABR path, it will lead to error due to
+         * config mismatch. Added OUT_SCO device handling to resolve this.
          */
         // This assumes that PAL_DEVICE_NONE comes as single device
         if ((newDevices[i].id == PAL_DEVICE_NONE) &&
-            (((isCurDeviceA2dp == true) && (!rm->isDeviceReady(curBtDevId))) ||
-             (isCurrentDeviceProxyOut) || (isCurrentDeviceDpOut))) {
+            ((isCurrentDeviceProxyOut) || (isCurrentDeviceDpOut) ||
+             ((isCurDeviceA2dp || isCurDeviceSco) && (!rm->isDeviceReady(curBtDevId))))) {
             newDevices[i].id = PAL_DEVICE_OUT_SPEAKER;
 
             if (rm->getDeviceConfig(&newDevices[i], mStreamAttr)) {
@@ -1756,7 +1780,9 @@
         /* Add device associated with current stream to streamDevDisconnect/StreamDevConnect list */
         for (int j = 0; j < disconnectCount; j++) {
             // check to make sure device direction is the same
-            if (rm->matchDevDir(mDevices[curDeviceSlots[j]]->getSndDeviceId(), newDeviceId)) {
+            // for shared BE, new device on the slot may change in compareSharedBEStreamDevAttr()
+            if (rm->matchDevDir(mDevices[curDeviceSlots[j]]->getSndDeviceId(), newDeviceId) &&
+                newDeviceId == newDevices[newDeviceSlots[i]].id) {
                 streamDevDisconnect.push_back({streamHandle, mDevices[curDeviceSlots[j]]->getSndDeviceId()});
                 // if something disconnected incoming device and current dev diff so push on a switchwe need to add the deivce
                 matchFound = true;
diff --git a/stream/src/StreamCompress.cpp b/stream/src/StreamCompress.cpp
index a0d4a1c..9fe128e 100644
--- a/stream/src/StreamCompress.cpp
+++ b/stream/src/StreamCompress.cpp
@@ -1,6 +1,5 @@
 /*
  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -26,6 +25,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
  */
 
 #define LOG_TAG "PAL: StreamCompress"
@@ -187,7 +190,9 @@
              }
         }
 
+        rm->lockGraph();
         status = session->open(this);
+        rm->unlockGraph();
         if (0 != status) {
            PAL_ERR(LOG_TAG,"session open failed with status %d", status);
            goto exit;
diff --git a/stream/src/StreamPCM.cpp b/stream/src/StreamPCM.cpp
index deff268..e001253 100644
--- a/stream/src/StreamPCM.cpp
+++ b/stream/src/StreamPCM.cpp
@@ -1,6 +1,5 @@
 /*
  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -26,6 +25,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
  */
 
 #define LOG_TAG "PAL: StreamPCM"
@@ -226,7 +229,9 @@
             }
         }
 
+        rm->lockGraph();
         status = session->open(this);
+        rm->unlockGraph();
         if (0 != status) {
             PAL_ERR(LOG_TAG, "session open failed with status %d", status);
             goto exit;