Merge "hal: set different echo reference based on output device"
diff --git a/configs/msm8998/msm8998.mk b/configs/msm8998/msm8998.mk
index 5f4e6e1..f39a97b 100644
--- a/configs/msm8998/msm8998.mk
+++ b/configs/msm8998/msm8998.mk
@@ -64,6 +64,7 @@
 AUDIO_FEATURE_ENABLED_RAS := true
 AUDIO_FEATURE_ENABLED_DYNAMIC_LOG := true
 AUDIO_FEATURE_ENABLED_SND_MONITOR := true
+AUDIO_FEATURE_ENABLED_A2DP_DECODERS := true
 ##AUDIO_FEATURE_FLAGS
 
 #Audio Specific device overlays
diff --git a/configs/trinket/sound_trigger_mixer_paths_wcd9335.xml b/configs/trinket/sound_trigger_mixer_paths_wcd9335.xml
index eefbd59..750d302 100644
--- a/configs/trinket/sound_trigger_mixer_paths_wcd9335.xml
+++ b/configs/trinket/sound_trigger_mixer_paths_wcd9335.xml
@@ -1,30 +1,31 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2017, 2019, The Linux Foundation. All rights reserved.      -->
-<!---                                                                           -->
-<!--- Redistribution and use in source and binary forms, with or without        -->
-<!--- modification, are permitted provided that the following conditions are    -->
-<!--- met:                                                                      -->
-<!---     * Redistributions of source code must retain the above copyright      -->
-<!---       notice, this list of conditions and the following disclaimer.       -->
-<!---     * Redistributions in binary form must reproduce the above             -->
-<!---       copyright notice, this list of conditions and the following         -->
-<!---       disclaimer in the documentation and/or other materials provided     -->
-<!---       with the distribution.                                              -->
-<!---     * Neither the name of The Linux Foundation nor the names of its       -->
-<!---       contributors may be used to endorse or promote products derived     -->
-<!---       from this software without specific prior written permission.       -->
-<!---                                                                           -->
-<!--- THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED              -->
-<!--- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF      -->
-<!--- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT    -->
-<!--- ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS    -->
-<!--- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR    -->
-<!--- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF      -->
-<!--- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR           -->
-<!--- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,     -->
-<!--- 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.                             -->
+<!--- Copyright (c) 2015-2017, 2019, The Linux Foundation. All rights reserved.
+
+      Redistribution and use in source and binary forms, with or without
+      modification, are permitted provided that the following conditions are
+      met:
+          * Redistributions of source code must retain the above copyright
+            notice, this list of conditions and the following disclaimer.
+          * Redistributions in binary form must reproduce the above
+            copyright notice, this list of conditions and the following
+            disclaimer in the documentation and/or other materials provided
+            with the distribution.
+          * Neither the name of The Linux Foundation nor the names of its
+            contributors may be used to endorse or promote products derived
+            from this software without specific prior written permission.
+
+      THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+      WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+      MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+      ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+      BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+      BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+      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.
+-->
 
 <mixer>
     <!-- These are the initial mixer settings -->
@@ -56,6 +57,19 @@
     <ctl name="EC BUF MUX INP" value="ZERO" />
     <ctl name="ADC MUX1" value="DMIC" />
     <ctl name="DMIC MUX1" value="ZERO" />
+    <ctl name="ADC MUX5" value="AMIC" />
+    <ctl name="ADC MUX6" value="AMIC" />
+    <ctl name="ADC MUX7" value="AMIC" />
+    <ctl name="ADC MUX8" value="AMIC" />
+    <ctl name="DMIC MUX5" value="ZERO" />
+    <ctl name="DMIC MUX6" value="ZERO" />
+    <ctl name="DMIC MUX7" value="ZERO" />
+    <ctl name="DMIC MUX8" value="ZERO" />
+    <ctl name="IIR0 INP0 MUX" value="ZERO" />
+    <ctl name="AIF1_CAP Mixer SLIM TX5" value="0" />
+    <ctl name="AIF1_CAP Mixer SLIM TX6" value="0" />
+    <ctl name="AIF1_CAP Mixer SLIM TX7" value="0" />
+    <ctl name="AIF1_CAP Mixer SLIM TX8" value="0" />
 
     <path name="listen-voice-wakeup-1">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
@@ -99,11 +113,59 @@
         <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
+    <path name="listen-voice-wakeup-1 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM1 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-2 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM2 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-3 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM3 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-4 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM4 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-5 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM5 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-6 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM6 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-7 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM7 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
+    <path name="listen-voice-wakeup-8 preproc">
+        <ctl name="SLIMBUS_0_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM8 Port" value="ADM_LSM_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_0_TX" value="1" />
+    </path>
+
     <path name="listen-cpe-handset-mic">
         <ctl name="MADONOFF Switch" value="1" />
         <ctl name="TX13 INP MUX" value="CPE_TX_PP" />
         <ctl name="AIF4_MAD Mixer SLIM TX13" value="1" />
-        <ctl name="MAD Input" value="DMIC2" />
+        <ctl name="MAD Input" value="DMIC0" />
         <ctl name="CPE AFE MAD Enable" value="1"/>
     </path>
 
@@ -111,14 +173,14 @@
         <ctl name="CLK MODE" value="INTERNAL" />
         <ctl name="EC BUF MUX INP" value="DEC1" />
         <ctl name="ADC MUX1" value="DMIC" />
-        <ctl name="DMIC MUX1" value="DMIC2" />
+        <ctl name="DMIC MUX1" value="DMIC0" />
     </path>
 
     <!-- path name used for low bandwidth FTRT codec interface -->
     <path name="listen-cpe-handset-mic low-speed-intf">
         <ctl name="MADONOFF Switch" value="1" />
         <ctl name="AIF4_MAD Mixer SLIM TX12" value="1" />
-        <ctl name="MAD Input" value="DMIC2" />
+        <ctl name="MAD Input" value="DMIC0" />
         <ctl name="CPE AFE MAD Enable" value="1"/>
     </path>
 
@@ -126,7 +188,70 @@
         <ctl name="MAD_BROADCAST Switch" value="1" />
         <ctl name="TX13 INP MUX" value="MAD_BRDCST" />
         <ctl name="AIF4_MAD Mixer SLIM TX13" value="1" />
-        <ctl name="MAD Input" value="DMIC2" />
+        <ctl name="MAD Input" value="DMIC0" />
     </path>
 
-</mixer>
+    <path name="listen-ape-handset-mic-preproc">
+        <ctl name="AIF1_CAP Mixer SLIM TX7" value="1"/>
+        <ctl name="SLIM_1_TX Channels" value="One" />
+        <ctl name="SLIM TX7 MUX" value="DEC7" />
+        <ctl name="ADC MUX7" value="DMIC" />
+        <ctl name="DMIC MUX7" value="DMIC0" />
+        <ctl name="IIR0 INP0 MUX" value="DEC7" />
+    </path>
+
+    <path name="listen-ape-handset-dmic">
+        <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+        <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+        <ctl name="SLIM TX7 MUX" value="DEC7" />
+        <ctl name="ADC MUX7" value="DMIC" />
+        <ctl name="DMIC MUX7" value="DMIC0" />
+        <ctl name="SLIM TX8 MUX" value="DEC8" />
+        <ctl name="ADC MUX8" value="DMIC" />
+        <ctl name="DMIC MUX8" value="DMIC3" />
+        <ctl name="SLIM_1_TX Channels" value="Two" />
+   </path>
+
+    <path name="listen-ape-handset-qmic">
+        <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+        <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+        <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+        <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+        <ctl name="SLIM_0_TX Channels" value="Four" />
+        <ctl name="SLIM TX5 MUX" value="DEC5" />
+        <ctl name="ADC MUX5" value="DMIC" />
+        <ctl name="DMIC MUX5" value="DMIC0" />
+        <ctl name="SLIM TX6 MUX" value="DEC6" />
+        <ctl name="ADC MUX6" value="DMIC" />
+        <ctl name="DMIC MUX6" value="DMIC2" />
+        <ctl name="SLIM TX7 MUX" value="DEC7" />
+        <ctl name="ADC MUX7" value="DMIC" />
+        <ctl name="DMIC MUX7" value="DMIC1" />
+        <ctl name="SLIM TX8 MUX" value="DEC8" />
+        <ctl name="ADC MUX8" value="DMIC" />
+        <ctl name="DMIC MUX8" value="DMIC3" />
+    </path>
+
+    <path name="listen-ape-handset-tmic">
+        <ctl name="AIF1_CAP Mixer SLIM TX5" value="1"/>
+        <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+        <ctl name="AIF1_CAP Mixer SLIM TX7" value="1"/>
+        <ctl name="SLIM_1_TX Channels" value="Three" />
+        <ctl name="SLIM TX5 MUX" value="DEC5" />
+        <ctl name="ADC MUX5" value="DMIC" />
+        <ctl name="DMIC MUX5" value="DMIC0" />
+        <ctl name="SLIM TX6 MUX" value="DEC6" />
+        <ctl name="ADC MUX6" value="DMIC" />
+        <ctl name="DMIC MUX6" value="DMIC2" />
+        <ctl name="SLIM TX7 MUX" value="DEC7" />
+        <ctl name="ADC MUX7" value="DMIC" />
+        <ctl name="DMIC MUX7" value="DMIC4" />
+    </path>
+
+    <path name="echo-reference">
+        <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+        <ctl name="EC Reference Channels" value="Two"/>
+        <ctl name="EC Reference Bit Format" value="S16_LE"/>
+        <ctl name="EC Reference SampleRate" value="48000"/>
+    </path>
+</mixer>
\ No newline at end of file
diff --git a/configs/trinket/sound_trigger_platform_info.xml b/configs/trinket/sound_trigger_platform_info.xml
index 4096a5b..ced9a4f 100644
--- a/configs/trinket/sound_trigger_platform_info.xml
+++ b/configs/trinket/sound_trigger_platform_info.xml
@@ -46,14 +46,14 @@
         <!-- Below backend params must match with port used in mixer path file -->
         <!-- param used to configure backend sample rate, format and channels -->
         <!-- uncomment TX_CDC_DMA_TX_3 values for internal codec and comment SLIM_1_TX values -->
-        <param backend_port_name="SLIM_1_TX" />
+        <param backend_port_name="SLIM_0_TX" />
         <!-- param backend_port_name="TX_CDC_DMA_TX_3" /-->
         <!-- Param used to match and obtain device backend index -->
-        <param backend_dai_name="SLIMBUS_1_TX" />
+        <param backend_dai_name="SLIMBUS_0_TX" />
         <!-- param backend_dai_name="TX_CDC_DMA_TX_3" /-->
         <!-- Param used to indicate if SVA has dedicated SLIM ports -->
         <!-- Set to false for platforms with internal codec -->
-        <param dedicated_sva_path="true" />
+        <param dedicated_sva_path="false" />
     </common_config>
     <acdb_ids>
         <!--For internal codec please enable below device-->
@@ -92,7 +92,6 @@
         <param fluence_type="FLUENCE_TMIC" />
         <!-- wdsp_fluence_type: fluence disabled: "NONE" -->
         <!-- fluence enabled: "FLUENCE_DMIC", "FLUENCE_TMIC", "FLUENCE_QMIC" -->
-        <param wdsp_fluence_type="NONE" />
         <arm_ss_usecase>
             <!-- Options are "KEYWORD_DETECTION", "USER_VERIFICATION", "CUSTOM_DETECTION"  -->
             <param sm_detection_type= "KEYWORD_DETECTION" />
@@ -110,51 +109,8 @@
             <param bit_wdith="16"/>
             <param channel_count="1"/>
         </arm_ss_usecase>
-        <gcs_usecase>
-            <param uid="0x1" />
-            <param acdb_devices="DEVICE_HANDSET_MIC_CPE, DEVICE_HANDSET_TMIC_CPE, DEVICE_HEADSET_MIC_CPE" />
-            <!-- module_id, instance_id, param_id -->
-            <param load_sound_model_ids="0x00012C0D, 0x2, 0x00012C14" />
-            <param confidence_levels_ids="0x00012C0D, 0x2, 0x00012C28" />
-            <param detection_event_ids="0x00012C0D, 0x2, 0x00012C29" />
-            <param read_cmd_ids="0x00020013, 0x2, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x2, 0x00020016" />
-            <param custom_config_ids="0x00012C0D, 0x2, 0x00012C20" />
-        </gcs_usecase>
-        <gcs_usecase>
-            <param uid="0x2" />
-            <param acdb_devices="DEVICE_HANDSET_MIC_CPE, DEVICE_HANDSET_TMIC_CPE, DEVICE_HEADSET_MIC_CPE" />
-            <param load_sound_model_ids="0x00012C0D, 0x3, 0x00012C14" />
-            <param confidence_levels_ids="0x00012C0D, 0x3, 0x00012C28" />
-            <param detection_event_ids="0x00012C0D, 0x3, 0x00012C29" />
-            <param read_cmd_ids="0x00020013, 0x3, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x3, 0x00020016" />
-            <param custom_config_ids="0x00012C0D, 0x3, 0x00012C20" />
-        </gcs_usecase>
-        <gcs_usecase>
-            <param uid="0x7" />
-            <param acdb_devices="DEVICE_HANDSET_DMIC_CPE" />
-            <param load_sound_model_ids="0x00012C0D, 0x7, 0x00012C14" />
-            <param confidence_levels_ids="0x00012C0D, 0x7, 0x00012C28" />
-            <param detection_event_ids="0x00012C0D, 0x7, 0x00012B05" />
-            <param read_cmd_ids="0x00020013, 0x7, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x7, 0x00020016" />
-            <param custom_config_ids="0x00012C0D, 0x7, 0x00012C20" />
-            <param det_event_type_ids="0x00012C0D, 0x7, 0x00012C2A" />
-        </gcs_usecase>
-        <gcs_usecase>
-            <param uid="0x8" />
-            <param acdb_devices="DEVICE_HANDSET_DMIC_CPE" />
-            <param load_sound_model_ids="0x00012C0D, 0x8, 0x00012C14" />
-            <param confidence_levels_ids="0x00012C0D, 0x8, 0x00012C28" />
-            <param detection_event_ids="0x00012C0D, 0x8, 0x00012B05" />
-            <param read_cmd_ids="0x00020013, 0x8, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x8, 0x00020016" />
-            <param custom_config_ids="0x00012C0D, 0x8, 0x00012C20" />
-            <param det_event_type_ids="0x00012C0D, 0x8, 0x00012C2A" />
-        </gcs_usecase>
         <!-- Module and param ids with which the algorithm is integrated
-            in non-graphite firmware (note these must come after gcs params)
+            in non-graphite firmware
             Extends flexibility to have different ids based on execution type.
             valid execution_type values: "WDSP" "ADSP" -->
         <lsm_usecase>
@@ -171,6 +127,7 @@
 
         <lsm_usecase>
             <param execution_mode="WDSP" />
+            <param app_type="2" /> <!-- app type used in ACDB -->
             <param load_sound_model_ids="0x00012C0D, 0x00012C14" />
             <param unload_sound_model_ids="0x00012C0D, 0x00012C15" />
             <param confidence_levels_ids="0x00012C0D, 0x00012C07" />
@@ -209,20 +166,8 @@
         <!-- wdsp_fluence_type: fluence disabled: "NONE" -->
         <!-- fluence enabled: "FLUENCE_DMIC", "FLUENCE_TMIC", "FLUENCE_QMIC" -->
         <param wdsp_fluence_type="NONE" />
-        <gcs_usecase>
-            <param uid="0x5" />
-            <param acdb_devices="DEVICE_HANDSET_MIC_CPE, DEVICE_HANDSET_TMIC_CPE, DEVICE_HEADSET_MIC_CPE" />
-            <!-- module_id, instance_id, param_id -->
-            <param load_sound_model_ids="0x00012C2E, 0x6, 0x00012C14" />
-            <param confidence_levels_ids="0x00012C2E, 0x6, 0x00012C28" />
-            <param detection_event_ids="0x00012C2E, 0x6, 0x00012B05" />
-            <param read_cmd_ids="0x00020013, 0x6, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x6, 0x00020016" />
-            <param custom_config_ids="0x00012C2E, 0x6, 0x00012C2D" />
-            <param det_event_type_ids="0x00012C2E, 0x6, 0x00012C2C" />
-        </gcs_usecase>
         <!-- Module and param ids with which the algorithm is integrated
-            in non-graphite firmware (note these must come after gcs params)
+            in non-graphite firmware
             Extends flexibility to have different ids based on execution type.
             valid execution_type values: only "ADSP" -->
         <lsm_usecase>
@@ -265,29 +210,8 @@
         <param fluence_type="FLUENCE_DMIC" />
         <!-- wdsp_fluence_type: fluence disabled: "NONE" -->
         <!-- fluence enabled: "FLUENCE_DMIC", "FLUENCE_TMIC", "FLUENCE_QMIC" -->
-        <param wdsp_fluence_type="NONE" />
-        <gcs_usecase>
-            <param uid="0x3" />
-            <param acdb_devices="DEVICE_HANDSET_MIC_CPE, DEVICE_HANDSET_TMIC_CPE" />
-            <param load_sound_model_ids="0x18000001, 0x4, 0x00012C14" />
-            <param confidence_levels_ids="0x18000001, 0x4, 0x00012C28" />
-            <param detection_event_ids="0x18000001, 0x4, 0x00012C29" />
-            <param read_cmd_ids="0x00020013, 0x4, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x4, 0x00020016" />
-            <param custom_config_ids="0x18000001, 0x4, 0x00012C20" />
-        </gcs_usecase>
-        <gcs_usecase>
-            <param uid="0x4" />
-            <param acdb_devices="DEVICE_HANDSET_DMIC_CPE" />
-            <param load_sound_model_ids="0x18000001, 0x5, 0x00012C14" />
-            <param confidence_levels_ids="0x18000001, 0x5, 0x00012C28" />
-            <param detection_event_ids="0x18000001, 0x5, 0x00012C29" />
-            <param read_cmd_ids="0x00020013, 0x5, 0x00020015" />
-            <param read_rsp_ids="0x00020013, 0x5, 0x00020016" />
-            <param custom_config_ids="0x18000001, 0x5, 0x00012C20" />
-        </gcs_usecase>
         <!-- Module and param ids with which the algorithm is integrated
-            in non-graphite firmware (note these must come after gcs params)
+            in non-graphite firmware
             Extends flexibility to have different ids based on execution type.
             valid execution_type values: "WDSP" "ADSP" -->
         <lsm_usecase>
@@ -304,6 +228,7 @@
 
         <lsm_usecase>
             <param execution_mode="WDSP" />
+            <param app_type="3" /> <!-- app type used in ACDB -->
             <param load_sound_model_ids="0x18000001, 0x00012C14" />
             <param unload_sound_model_ids="0x18000001, 0x00012C15" />
             <param confidence_levels_ids="0x18000001, 0x00012C07" />
diff --git a/hal/Android.mk b/hal/Android.mk
index a05da26..cfe4a07 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -474,6 +474,10 @@
     LOCAL_STATIC_LIBRARIES += libprofile_rt
 endif
 
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_A2DP_DECODERS)), true)
+    LOCAL_CFLAGS += -DAPTX_DECODER_ENABLED
+endif
+
 LOCAL_MODULE := audio.primary.$(TARGET_BOARD_PLATFORM)
 
 LOCAL_MODULE_RELATIVE_PATH := hw
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index f83ea6a..4b4abbe 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -1295,7 +1295,6 @@
             else {
                a2dp.is_tws_mono_mode_on = true;
                ALOGD("Update tws for mono_mode_on: %d",a2dp.is_tws_mono_mode_on);
-               audio_a2dp_update_tws_channel_mode();
             }
             break;
     }
@@ -1876,6 +1875,7 @@
     if (a2dp.a2dp_started) {
         a2dp.a2dp_total_active_session_request++;
         a2dp_check_and_set_scrambler();
+        audio_a2dp_update_tws_channel_mode();
         a2dp_set_backend_cfg();
         if (a2dp.abr_config.is_abr_enabled)
             start_abr();
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 20d760c..38d0b6f 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -62,6 +62,16 @@
 #include <log_utils.h>
 #endif
 
+#ifndef APTX_DECODER_ENABLED
+#define audio_extn_aptx_dec_set_license(adev) (0)
+#define audio_extn_set_aptx_dec_bt_addr(adev, parms) (0)
+#define audio_extn_parse_aptx_dec_bt_addr(value) (0)
+#else
+static void audio_extn_aptx_dec_set_license(struct audio_device *adev);
+static void audio_extn_set_aptx_dec_bt_addr(struct audio_device *adev, struct str_parms *parms);
+static void audio_extn_parse_aptx_dec_bt_addr(char *value);
+#endif
+
 #define MAX_SLEEP_RETRY 100
 #define WIFI_INIT_WAIT_SLEEP 50
 #define MAX_NUM_CHANNELS 8
@@ -1538,7 +1548,6 @@
 static void audio_extn_aptx_dec_set_license(struct audio_device *adev)
 {
     int ret, key = 0;
-    char value[128] = {0};
     struct mixer_ctl *ctl;
     const char *mixer_ctl_name = "APTX Dec License";
 
@@ -1556,7 +1565,7 @@
         ALOGE("%s: cannot set license, error:%d",__func__, ret);
 }
 
-static void audio_extn_set_aptx_dec_bt_addr(struct audio_device *adev, struct str_parms *parms)
+static void audio_extn_set_aptx_dec_bt_addr(struct audio_device *adev __unused, struct str_parms *parms)
 {
     int ret = 0;
     char value[256];
@@ -1575,6 +1584,7 @@
     aextnmod.addr.nap = aptx_cfg->bt_addr.nap;
     aextnmod.addr.uap = aptx_cfg->bt_addr.uap;
     aextnmod.addr.lap = aptx_cfg->bt_addr.lap;
+    return 0;
 }
 
 static void audio_extn_parse_aptx_dec_bt_addr(char *value)
@@ -1602,11 +1612,7 @@
 
 void audio_extn_send_aptx_dec_bt_addr_to_dsp(struct stream_out *out)
 {
-    char mixer_ctl_name[128];
-    struct mixer_ctl *ctl;
-    uint32_t addr[3];
-
-    ALOGV("%s", __func__);
+    ALOGD("%s", __func__);
     out->compr_config.codec->options.aptx_dec.nap = aextnmod.addr.nap;
     out->compr_config.codec->options.aptx_dec.uap = aextnmod.addr.uap;
     out->compr_config.codec->options.aptx_dec.lap = aextnmod.addr.lap;
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 3458a79..1e4b8ba 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2013 The Android Open Source Project
@@ -975,16 +975,10 @@
 #endif
 
 #ifndef APTX_DECODER_ENABLED
-#define audio_extn_aptx_dec_set_license(adev); (0)
-#define audio_extn_set_aptx_dec_bt_addr(adev, parms); (0)
-#define audio_extn_send_aptx_dec_bt_addr_to_dsp(out); (0)
-#define audio_extn_parse_aptx_dec_bt_addr(value); (0)
-#define audio_extn_set_aptx_dec_params(payload); (0)
+#define audio_extn_send_aptx_dec_bt_addr_to_dsp(out) (0)
+#define audio_extn_set_aptx_dec_params(payload) (0)
 #else
-static void audio_extn_aptx_dec_set_license(struct audio_device *adev);
-static void audio_extn_set_aptx_dec_bt_addr(struct audio_device *adev, struct str_parms *parms);
 void audio_extn_send_aptx_dec_bt_addr_to_dsp(struct stream_out *out);
-static void audio_extn_parse_aptx_dec_bt_addr(char *value);
 int audio_extn_set_aptx_dec_params(struct aptx_dec_param *payload);
 #endif
 int audio_extn_out_set_param_data(struct stream_out *out,
diff --git a/hal/audio_extn/ffv.c b/hal/audio_extn/ffv.c
index 2e99c40..fac40c5 100644
--- a/hal/audio_extn/ffv.c
+++ b/hal/audio_extn/ffv.c
@@ -905,7 +905,6 @@
             str_parms_del(parms, AUDIO_PARAMETER_FFV_EC_REF_DEVICE);
         } else if (str_parms_get_int(parms, AUDIO_PARAMETER_DEVICE_CONNECT, &val) >= 0) {
             ret = 1;
-            str_parms_del(parms, AUDIO_PARAMETER_DEVICE_CONNECT);
         }
         if (ret == 1) {
             if (val & AUDIO_DEVICE_OUT_SPEAKER) {
@@ -921,7 +920,6 @@
 
         ret = str_parms_get_int(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, &val);
         if (ret >= 0) {
-            str_parms_del(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT);
             if (val & AUDIO_DEVICE_OUT_LINE) {
                 ALOGD("%s: capture ec ref from speaker", __func__);
                 ffvmod.ec_ref_dev = AUDIO_DEVICE_OUT_SPEAKER;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 5ef444e..b0f7efd 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3848,9 +3848,17 @@
           use_case_table[out->usecase],
           status == CARD_STATUS_OFFLINE ? "offline" : "online");
 
-    if (status == CARD_STATUS_OFFLINE)
+    if (status == CARD_STATUS_OFFLINE) {
         out_on_error(stream);
-
+        if (voice_is_call_state_active(adev) &&
+            out == adev->primary_output) {
+            ALOGD("%s: SSR/PDR occurred, end all calls", __func__);
+            pthread_mutex_lock(&adev->lock);
+            voice_stop_call(adev);
+            adev->mode = AUDIO_MODE_NORMAL;
+            pthread_mutex_unlock(&adev->lock);
+        }
+    }
     return;
 }
 
diff --git a/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c b/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c
index 97b7617..967a7e3 100644
--- a/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c
+++ b/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c
@@ -278,12 +278,6 @@
         status = -1;
         goto exit;
     }
-    ptr = (char *)malloc(strlen(input) + 1);
-    if (ptr == NULL) {
-        DEBUG_PRINT("Low memory\n");
-        status = -1;
-        goto exit;
-    }
     /* Check for negative input */
     if (*input == '-') {
         DEBUG_PRINT("Negative Number is not allowed\n");
@@ -322,8 +316,6 @@
             break;
     }
 exit:
-    if (ptr != NULL)
-        free(ptr);
     if (status != 0)
         exit(0);
     return value;
diff --git a/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c b/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c
index 8c89e61..d1b4837 100644
--- a/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c
+++ b/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c
@@ -291,12 +291,6 @@
         status = -1;
         goto exit;
     }
-    ptr = (char *)malloc(strlen(input) + 1);
-    if (ptr == NULL) {
-        DEBUG_PRINT("Low memory\n");
-        status = -1;
-        goto exit;
-    }
     /* Check for negative input */
     if (*input == '-') {
         DEBUG_PRINT("Negative Number is not allowed\n");
@@ -335,8 +329,6 @@
             break;
     }
 exit:
-    if (ptr != NULL)
-        free(ptr);
     if (status != 0)
         exit(0);
     return value;
diff --git a/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c b/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c
index d5ec4c7..f35af33 100644
--- a/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c
+++ b/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c
@@ -290,12 +290,6 @@
         status = -1;
         goto exit;
     }
-    ptr = (char *)malloc(strlen(input) + 1);
-    if (ptr == NULL) {
-        DEBUG_PRINT("Low memory\n");
-        status = -1;
-        goto exit;
-    }
     /* Check for negative input */
     if (*input == '-') {
         DEBUG_PRINT("Negative Number is not allowed\n");
@@ -334,8 +328,6 @@
             break;
     }
 exit:
-    if (ptr != NULL)
-        free(ptr);
     if (status != 0)
         exit(0);
     return value;