Merge "hal: Fix fragment size calculation for compress offload"
diff --git a/configs/atoll/audio_platform_info_intcodec.xml b/configs/atoll/audio_platform_info_intcodec.xml
index e72a83a..b479cfc 100644
--- a/configs/atoll/audio_platform_info_intcodec.xml
+++ b/configs/atoll/audio_platform_info_intcodec.xml
@@ -75,6 +75,7 @@
         <param key="spkr_1_tz_name" value="wsatz.13"/>
         <param key="spkr_2_tz_name" value="wsatz.14"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="multiple_mix_dsp"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="4"/>
@@ -105,6 +106,7 @@
     </acdb_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -112,6 +114,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/atoll/audio_platform_info_qrd.xml b/configs/atoll/audio_platform_info_qrd.xml
index f272aee..a47a3ac 100644
--- a/configs/atoll/audio_platform_info_qrd.xml
+++ b/configs/atoll/audio_platform_info_qrd.xml
@@ -73,6 +73,7 @@
         <param key="mono_speaker" value="left"/>
         <param key="spkr_2_tz_name" value="wsatz.13"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="multiple_mix_dsp"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="2"/>
@@ -103,6 +104,7 @@
     </acdb_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -110,6 +112,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/atoll/mixer_paths.xml b/configs/atoll/mixer_paths.xml
index d04fc1e..9d7487f 100644
--- a/configs/atoll/mixer_paths.xml
+++ b/configs/atoll/mixer_paths.xml
@@ -2763,6 +2763,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2852,6 +2856,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/atoll/mixer_paths_qrd.xml b/configs/atoll/mixer_paths_qrd.xml
index 7bd3a90..7ace581 100644
--- a/configs/atoll/mixer_paths_qrd.xml
+++ b/configs/atoll/mixer_paths_qrd.xml
@@ -3009,6 +3009,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
         <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
         <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -3075,6 +3079,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/atoll/mixer_paths_wcd937x.xml b/configs/atoll/mixer_paths_wcd937x.xml
index 44a5161..4195193 100644
--- a/configs/atoll/mixer_paths_wcd937x.xml
+++ b/configs/atoll/mixer_paths_wcd937x.xml
@@ -2764,6 +2764,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2853,6 +2857,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/kona/audio_platform_info_intcodec.xml b/configs/kona/audio_platform_info_intcodec.xml
index 4c0c9c3..d1c45b9 100644
--- a/configs/kona/audio_platform_info_intcodec.xml
+++ b/configs/kona/audio_platform_info_intcodec.xml
@@ -103,6 +103,7 @@
         <param key="spkr_1_tz_name" value="wsatz.13"/>
         <param key="spkr_2_tz_name" value="wsatz.14"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="multiple_mix_dsp"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="4"/>
@@ -140,6 +141,7 @@
     </acdb_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -147,6 +149,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+       <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/kona/audio_platform_info_qrd.xml b/configs/kona/audio_platform_info_qrd.xml
index bd5ebdc..a8f765a 100644
--- a/configs/kona/audio_platform_info_qrd.xml
+++ b/configs/kona/audio_platform_info_qrd.xml
@@ -100,6 +100,7 @@
         <param key="mono_speaker" value="right"/>
         <param key="spkr_2_tz_name" value="wsatz.14"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="multiple_mix_dsp"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="4"/>
@@ -151,6 +152,7 @@
     </module_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -158,6 +160,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/kona/mixer_paths.xml b/configs/kona/mixer_paths.xml
index 0178dfc..bbbe8e2 100644
--- a/configs/kona/mixer_paths.xml
+++ b/configs/kona/mixer_paths.xml
@@ -2497,6 +2497,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2586,6 +2590,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/kona/mixer_paths_cdp.xml b/configs/kona/mixer_paths_cdp.xml
index daac27a..8df2b66 100644
--- a/configs/kona/mixer_paths_cdp.xml
+++ b/configs/kona/mixer_paths_cdp.xml
@@ -2371,6 +2371,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2460,6 +2464,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/kona/mixer_paths_qrd.xml b/configs/kona/mixer_paths_qrd.xml
index a8a90b4..229c46d 100644
--- a/configs/kona/mixer_paths_qrd.xml
+++ b/configs/kona/mixer_paths_qrd.xml
@@ -2797,6 +2797,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
         <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
         <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -2864,6 +2868,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/kona/sound_trigger_mixer_paths.xml b/configs/kona/sound_trigger_mixer_paths.xml
index 8cb6622..385bed9 100644
--- a/configs/kona/sound_trigger_mixer_paths.xml
+++ b/configs/kona/sound_trigger_mixer_paths.xml
@@ -81,6 +81,7 @@
     <ctl name="EC Reference Channels" value="Zero"/>
     <ctl name="EC Reference Bit Format" value="0"/>
     <ctl name="EC Reference SampleRate" value="0"/>
+    <ctl name="ADC2_MIXER Switch" value="0" />
 
     <path name="listen-voice-wakeup-1">
         <ctl name="LSM1 Mixer VA_CDC_DMA_TX_0" value="1" />
diff --git a/configs/kona/sound_trigger_mixer_paths_qrd.xml b/configs/kona/sound_trigger_mixer_paths_qrd.xml
index a8180e4..9a51ec6 100644
--- a/configs/kona/sound_trigger_mixer_paths_qrd.xml
+++ b/configs/kona/sound_trigger_mixer_paths_qrd.xml
@@ -81,6 +81,7 @@
     <ctl name="EC Reference Channels" value="Zero"/>
     <ctl name="EC Reference Bit Format" value="0"/>
     <ctl name="EC Reference SampleRate" value="0"/>
+    <ctl name="ADC2_MIXER Switch" value="0" />
 
     <path name="listen-voice-wakeup-1">
         <ctl name="LSM1 Mixer VA_CDC_DMA_TX_0" value="1" />
diff --git a/configs/kona/sound_trigger_platform_info.xml b/configs/kona/sound_trigger_platform_info.xml
index 17a937c..479d7dc 100644
--- a/configs/kona/sound_trigger_platform_info.xml
+++ b/configs/kona/sound_trigger_platform_info.xml
@@ -269,14 +269,45 @@
             <!-- is FFECNS -->
             <param fluence_type="NONE" />
             <param execution_mode="ADSP" />
+            <!-- lpi_mode: "NON_LPI_BARGE_IN", "NON_LPI", "LPI" -->
+            <!-- NON_LPI_BARGE_IN: Default non-LPI mode type. lsm_usecase -->
+            <!-- must be present with this mode type to handle barge-in. -->
+            <!-- NON_LPI: If another lsm_usecase is present with this mode -->
+            <!-- type, it will be used for non-LPI non-barge-in usecases. -->
+            <!-- If not present, NON_LPI_BARGE_IN mode type will be used. -->
+            <!-- LPI: This mode type will be used for LPI usecases. -->
+            <param lpi_mode="NON_LPI_BARGE_IN" />
             <param app_type="3" /> <!-- app type used in ACDB -->
             <param in_channels="1"/> <!-- Module input channels -->
             <param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
             <param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
-            <param confidence_levels_ids="0x18000001, 0x0, 0x00012C07" />
-            <param operation_mode_ids="0x18000001, 0x0, 0x00012C02" />
-            <param polling_enable_ids="0x18000001, 0x0, 0x00012C1B" />
             <param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+            <param lab_dam_cfg_ids="0x00012C08, 0x0, 0x000102C4" />
+        </lsm_usecase>
+        <lsm_usecase>
+            <param capture_device="HANDSET" />
+            <!-- adm_cfg_profile should match with the one defined under adm_config -->
+            <!-- Set it to NONE if LSM directly connects to AFE -->
+            <param adm_cfg_profile="NONE" />
+            <!-- fluence_type: "FLUENCE_MIC", "FLUENCE_DMIC", "FLUENCE_TMIC"   -->
+            <!-- "FLUENCE_QMIC". Param value is valid when adm_cfg_profile -->
+            <!-- is FFECNS -->
+            <param fluence_type="NONE" />
+            <param execution_mode="ADSP" />
+            <!-- lpi_mode: "NON_LPI_BARGE_IN", "NON_LPI", "LPI" -->
+            <!-- NON_LPI_BARGE_IN: Default non-LPI mode type. lsm_usecase -->
+            <!-- must be present with this mode type to handle barge-in. -->
+            <!-- NON_LPI: If another lsm_usecase is present with this mode -->
+            <!-- type, it will be used for non-LPI non-barge-in usecases. -->
+            <!-- If not present, NON_LPI_BARGE_IN mode type will be used. -->
+            <!-- LPI: This mode type will be used for LPI usecases. -->
+            <param lpi_mode="LPI" />
+            <param app_type="3" /> <!-- app type used in ACDB -->
+            <param in_channels="1"/> <!-- Module input channels -->
+            <param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
+            <param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
+            <param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+            <param lab_dam_cfg_ids="0x00012C08, 0x0, 0x000102C4" />
         </lsm_usecase>
         <lsm_usecase>
             <param capture_device="HEADSET" />
@@ -287,10 +318,8 @@
             <param in_channels="1"/> <!-- Module input channels -->
             <param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
             <param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
-            <param confidence_levels_ids="0x18000001, 0x0, 0x00012C07" />
-            <param operation_mode_ids="0x18000001, 0x0, 0x00012C02" />
-            <param polling_enable_ids="0x18000001, 0x0, 0x00012C1B" />
             <param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+            <param lab_dam_cfg_ids="0x00012C08, 0x0, 0x000102C4" />
         </lsm_usecase>
 
         <!-- format: "ADPCM_packet" or "PCM_packet" !-->
diff --git a/configs/lito/audio_platform_info_qrd.xml b/configs/lito/audio_platform_info_qrd.xml
index ec51297..7bd014f 100644
--- a/configs/lito/audio_platform_info_qrd.xml
+++ b/configs/lito/audio_platform_info_qrd.xml
@@ -74,6 +74,7 @@
         <param key="mono_speaker" value="right"/>
         <param key="spkr_2_tz_name" value="wsatz.14"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="multiple_mix_dsp"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="4"/>
@@ -104,6 +105,7 @@
     </acdb_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -111,6 +113,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/lito/mixer_paths_cdp.xml b/configs/lito/mixer_paths_cdp.xml
index ab7a0aa..0b2b992 100644
--- a/configs/lito/mixer_paths_cdp.xml
+++ b/configs/lito/mixer_paths_cdp.xml
@@ -88,6 +88,22 @@
     <ctl name="DISPLAY_PORT Mixer MultiMedia14" value="0" />
     <ctl name="DISPLAY_PORT Mixer MultiMedia15" value="0" />
     <ctl name="DISPLAY_PORT Mixer MultiMedia16" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia1" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia2" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia3" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia4" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia5" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia6" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia7" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia8" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia9" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia10" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia11" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia12" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia13" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia14" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia15" value="0" />
+    <ctl name="DISPLAY_PORT1 Mixer MultiMedia16" value="0" />
     <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia1" value="0" />
     <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia2" value="0" />
     <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia3" value="0" />
@@ -153,6 +169,8 @@
     <!-- HFP end -->
     <!-- echo reference -->
     <ctl name="AUDIO_REF_EC_UL1 MUX" value="None" />
+    <ctl name="AUDIO_REF_EC_UL10 MUX" value="None" />
+    <ctl name="EC Reference Channels" value="Zero"/>
     <!-- usb headset -->
     <ctl name="AFE_PCM_RX Audio Mixer MultiMedia1" value="0" />
     <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="0" />
@@ -169,7 +187,7 @@
     <ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="0" />
     <!-- usb headset end -->
     <!-- fm -->
-    <ctl name="Tert MI2S LOOPBACK Volume" value="0" />
+    <ctl name="SLIMBUS_8 LOOPBACK Volume" value="0" />
     <ctl name="WSA_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="0" />
     <ctl name="WSA_CDC_DMA_RX_0_DL_HL Switch" value="0" />
     <ctl name="RX_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="0" />
@@ -237,6 +255,7 @@
     <ctl name="WSA_CDC_DMA_RX_0_Voice Mixer Voip" value="0" />
     <ctl name="RX_CDC_DMA_RX_0_Voice Mixer Voip" value="0" />
     <ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_3_Voip" value="0" />
+    <ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_4_Voip" value="0" />
     <ctl name="SLIM_7_RX_Voice Mixer Voip" value="0" />
     <ctl name="Voip_Tx Mixer SLIM_7_TX_Voip" value="0" />
     <ctl name="AFE_PCM_RX_Voice Mixer Voip" value="0" />
@@ -450,10 +469,17 @@
 
     <path name="echo-reference">
         <ctl name="AUDIO_REF_EC_UL1 MUX" value="WSA_CDC_DMA_RX_0" />
+        <ctl name="EC Reference Channels" value="Two"/>
+    </path>
+
+    <path name="echo-reference handset">
+        <ctl name="AUDIO_REF_EC_UL1 MUX" value="WSA_CDC_DMA_RX_0" />
+         <ctl name="EC Reference Channels" value="One"/>
     </path>
 
     <path name="echo-reference headphones">
         <ctl name="AUDIO_REF_EC_UL1 MUX" value="RX_CDC_DMA_RX_0" />
+        <ctl name="EC Reference Channels" value="Two"/>
     </path>
 
     <path name="echo-reference headset">
@@ -462,18 +488,31 @@
 
     <path name="echo-reference display-port">
         <ctl name="AUDIO_REF_EC_UL1 MUX" value="DISPLAY_PORT" />
+        <ctl name="EC Reference Channels" value="Two"/>
+    </path>
+
+    <path name="echo-reference display-port1">
+        <ctl name="AUDIO_REF_EC_UL1 MUX" value="DISPLAY_PORT1" />
     </path>
 
     <path name="echo-reference headphones-44.1">
         <ctl name="AUDIO_REF_EC_UL1 MUX" value="RX_CDC_DMA_RX_0" />
+        <ctl name="EC Reference Channels" value="Two"/>
     </path>
 
     <path name="echo-reference-voip">
         <ctl name="AUDIO_REF_EC_UL10 MUX" value="WSA_CDC_DMA_RX_0" />
+        <ctl name="EC Reference Channels" value="Two"/>
+    </path>
+
+    <path name="echo-reference-voip handset">
+        <ctl name="AUDIO_REF_EC_UL10 MUX" value="WSA_CDC_DMA_RX_0" />
+        <ctl name="EC Reference Channels" value="One"/>
     </path>
 
     <path name="echo-reference-voip headphones">
         <ctl name="AUDIO_REF_EC_UL10 MUX" value="RX_CDC_DMA_RX_0" />
+        <ctl name="EC Reference Channels" value="Two"/>
     </path>
 
     <path name="deep-buffer-playback">
@@ -484,15 +523,33 @@
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe">
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="deep-buffer-playback display-port">
         <ctl name="DISPLAY_PORT Mixer MultiMedia1" value="1" />
     </path>
 
+    <path name="deep-buffer-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia1" value="1" />
+    </path>
+
     <path name="deep-buffer-playback speaker-and-display-port">
         <path name="deep-buffer-playback display-port" />
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-display-port">
+        <path name="deep-buffer-playback display-port" />
+        <path name="deep-buffer-playback" />
+    </path>
+
+    <path name="deep-buffer-playback speaker-and-display-port1">
+        <path name="deep-buffer-playback display-port1" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="deep-buffer-playback bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="1" />
     </path>
@@ -523,6 +580,11 @@
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-usb-headphones">
+        <path name="deep-buffer-playback usb-headphones" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="deep-buffer-playback headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia1" value="1" />
     </path>
@@ -536,21 +598,41 @@
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-headphones">
+        <path name="deep-buffer-playback headphones" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="deep-buffer-playback speaker-and-bt-sco">
         <path name="deep-buffer-playback bt-sco" />
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-bt-sco">
+        <path name="deep-buffer-playback bt-sco" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="deep-buffer-playback speaker-and-bt-sco-wb">
         <path name="deep-buffer-playback bt-sco-wb" />
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-bt-sco-wb">
+        <path name="deep-buffer-playback bt-sco-wb" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="deep-buffer-playback speaker-and-bt-sco-swb">
         <path name="deep-buffer-playback bt-sco-swb" />
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-bt-sco-swb">
+        <path name="deep-buffer-playback bt-sco-swb" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="low-latency-playback">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia5" value="1" />
     </path>
@@ -559,10 +641,18 @@
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe">
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="low-latency-playback display-port">
         <ctl name="DISPLAY_PORT Mixer MultiMedia5" value="1" />
     </path>
 
+    <path name="low-latency-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia5" value="1" />
+    </path>
+
     <path name="low-latency-playback bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="1" />
     </path>
@@ -581,6 +671,16 @@
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe-and-display-port">
+        <path name="low-latency-playback display-port" />
+        <path name="low-latency-playback" />
+    </path>
+
+    <path name="low-latency-playback speaker-and-display-port1">
+        <path name="low-latency-playback display-port1" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="low-latency-playback afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="1" />
     </path>
@@ -598,6 +698,11 @@
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe-and-usb-headphones">
+        <path name="low-latency-playback usb-headphones" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="low-latency-playback headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia5" value="1" />
     </path>
@@ -610,6 +715,11 @@
         <path name="low-latency-playback headphones" />
         <path name="low-latency-playback" />
     </path>
+    <path name="low-latency-playback speaker-safe-and-headphones">
+        <path name="low-latency-playback headphones" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="low-latency-playback resume">
         <ctl name="MultiMedia5_RX QOS Vote" value="Enable" />
     </path>
@@ -619,16 +729,31 @@
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe-and-bt-sco">
+        <path name="low-latency-playback bt-sco" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="low-latency-playback speaker-and-bt-sco-wb">
         <path name="low-latency-playback bt-sco-wb" />
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe-and-bt-sco-wb">
+        <path name="low-latency-playback bt-sco-wb" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="low-latency-playback speaker-and-bt-sco-swb">
         <path name="low-latency-playback bt-sco-swb" />
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe-and-bt-sco-swb">
+        <path name="low-latency-playback bt-sco-swb" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="audio-ull-playback">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia8" value="1" />
     </path>
@@ -637,6 +762,10 @@
         <path name="audio-ull-playback" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe">
+        <path name="audio-ull-playback" />
+    </path>
+
     <path name="audio-ull-playback headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia8" value="1" />
     </path>
@@ -650,10 +779,19 @@
         <path name="audio-ull-playback headphones" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe-and-headphones">
+        <path name="audio-ull-playback" />
+        <path name="audio-ull-playback headphones" />
+    </path>
+
     <path name="audio-ull-playback display-port">
         <ctl name="DISPLAY_PORT Mixer MultiMedia8" value="1" />
     </path>
 
+    <path name="audio-ull-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia8" value="1" />
+    </path>
+
     <path name="audio-ull-playback bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia8" value="1" />
     </path>
@@ -672,6 +810,16 @@
         <path name="audio-ull-playback" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe-and-display-port">
+        <path name="audio-ull-playback display-port" />
+        <path name="audio-ull-playback" />
+    </path>
+
+    <path name="audio-ull-playback speaker-and-display-port1">
+        <path name="audio-ull-playback display-port1" />
+        <path name="audio-ull-playback" />
+    </path>
+
     <path name="audio-ull-playback afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia8" value="1" />
     </path>
@@ -689,20 +837,39 @@
         <path name="audio-ull-playback" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe-and-bt-sco">
+        <path name="audio-ull-playback bt-sco" />
+        <path name="audio-ull-playback" />
+    </path>
+
     <path name="audio-ull-playback speaker-and-bt-sco-wb">
         <path name="audio-ull-playback bt-sco-wb" />
         <path name="audio-ull-playback" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe-and-bt-sco-wb">
+        <path name="audio-ull-playback bt-sco-wb" />
+        <path name="audio-ull-playback" />
+    </path>
+
     <path name="audio-ull-playback speaker-and-bt-sco-swb">
         <path name="audio-ull-playback bt-sco-swb" />
         <path name="audio-ull-playback" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe-and-bt-sco-swb">
+        <path name="audio-ull-playback bt-sco-swb" />
+        <path name="audio-ull-playback" />
+    </path>
+
     <path name="multi-channel-playback display-port">
         <ctl name="DISPLAY_PORT Mixer MultiMedia2" value="1" />
     </path>
 
+    <path name="multi-channel-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia2" value="1" />
+    </path>
+
     <path name="multi-channel-playback afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
     </path>
@@ -715,14 +882,26 @@
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe">
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback display-port">
         <ctl name="DISPLAY_PORT Mixer MultiMedia4" value="1" />
     </path>
 
+    <path name="compress-offload-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia4" value="1" />
+    </path>
+
     <path name="silence-playback display-port">
         <ctl name="DISPLAY_PORT Mixer MultiMedia9" value="1" />
     </path>
 
+    <path name="silence-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia9" value="1" />
+    </path>
+
     <path name="compress-offload-playback bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="1" />
     </path>
@@ -741,6 +920,16 @@
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-display-port">
+        <path name="compress-offload-playback display-port" />
+        <path name="compress-offload-playback" />
+    </path>
+
+    <path name="compress-offload-playback speaker-and-display-port1">
+        <path name="compress-offload-playback display-port1" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="1" />
     </path>
@@ -758,6 +947,11 @@
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback usb-headphones" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia4" value="1" />
     </path>
@@ -779,21 +973,41 @@
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-headphones">
+        <path name="compress-offload-playback headphones" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback speaker-and-bt-sco">
         <path name="compress-offload-playback bt-sco" />
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback bt-sco" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback speaker-and-bt-sco-wb">
         <path name="compress-offload-playback bt-sco-wb" />
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback bt-sco-wb" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback speaker-and-bt-sco-swb">
         <path name="compress-offload-playback bt-sco-swb" />
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback bt-sco-swb" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="compress-offload-playback2">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia7" value="1" />
     </path>
@@ -802,6 +1016,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia7" value="1" />
     </path>
 
+    <path name="compress-offload-playback2 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia7" value="1" />
+    </path>
+
     <path name="compress-offload-playback2 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia7" value="1" />
     </path>
@@ -820,6 +1038,16 @@
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-display-port">
+        <path name="compress-offload-playback2 display-port" />
+        <path name="compress-offload-playback2" />
+    </path>
+
+    <path name="compress-offload-playback2 speaker-and-display-port1">
+        <path name="compress-offload-playback2 display-port1" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback2 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia7" value="1" />
     </path>
@@ -837,6 +1065,11 @@
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback2 usb-headphones" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback2 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia7" value="1" />
     </path>
@@ -859,21 +1092,41 @@
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-headphones">
+        <path name="compress-offload-playback2 headphones" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback2 speaker-and-bt-sco">
         <path name="compress-offload-playback2 bt-sco" />
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback2 bt-sco" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback2 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback2 bt-sco-wb" />
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback2 bt-sco-wb" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback2 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback2 bt-sco-swb" />
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback2 bt-sco-swb" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback3">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
@@ -882,6 +1135,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia10" value="1" />
     </path>
 
+    <path name="compress-offload-playback3 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia10" value="1" />
+    </path>
+
     <path name="compress-offload-playback3 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="1" />
     </path>
@@ -900,6 +1157,16 @@
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-display-port">
+        <path name="compress-offload-playback3 display-port" />
+        <path name="compress-offload-playback3" />
+    </path>
+
+    <path name="compress-offload-playback3 speaker-and-display-port1">
+        <path name="compress-offload-playback3 display-port1" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback3 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia10" value="1" />
     </path>
@@ -917,6 +1184,11 @@
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback3 usb-headphones" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback3 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
@@ -938,21 +1210,41 @@
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-headphones">
+        <path name="compress-offload-playback3 headphones" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback3 speaker-and-bt-sco">
         <path name="compress-offload-playback3 bt-sco" />
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback3 bt-sco" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback3 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback3 bt-sco-wb" />
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback3 bt-sco-wb" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback3 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback3 bt-sco-swb" />
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback3 bt-sco-swb" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback4">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia11" value="1" />
     </path>
@@ -961,6 +1253,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia11" value="1" />
     </path>
 
+    <path name="compress-offload-playback4 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia11" value="1" />
+    </path>
+
     <path name="compress-offload-playback4 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia11" value="1" />
     </path>
@@ -979,6 +1275,15 @@
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-display-port">
+        <path name="compress-offload-playback4 display-port" />
+        <path name="compress-offload-playback4" />
+    </path>
+
+    <path name="compress-offload-playback4 speaker-and-display-port1">
+        <path name="compress-offload-playback4 display-port1" />
+        <path name="compress-offload-playback4" />
+    </path>
 
     <path name="compress-offload-playback4 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia11" value="1" />
@@ -997,6 +1302,11 @@
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback4 usb-headphones" />
+        <path name="compress-offload-playback4" />
+    </path>
+
     <path name="compress-offload-playback4 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia11" value="1" />
     </path>
@@ -1018,21 +1328,41 @@
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-headphones">
+        <path name="compress-offload-playback4 headphones" />
+        <path name="compress-offload-playback4" />
+    </path>
+
     <path name="compress-offload-playback4 speaker-and-bt-sco">
         <path name="compress-offload-playback4 bt-sco" />
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback4 bt-sco" />
+        <path name="compress-offload-playback4" />
+    </path>
+
     <path name="compress-offload-playback4 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback4 bt-sco-wb" />
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback4 bt-sco-wb" />
+        <path name="compress-offload-playback4" />
+    </path>
+
     <path name="compress-offload-playback4 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback4 bt-sco-swb" />
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback4 bt-sco-swb" />
+        <path name="compress-offload-playback4" />
+    </path>
+
     <path name="compress-offload-playback5">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia12" value="1" />
     </path>
@@ -1041,6 +1371,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia12" value="1" />
     </path>
 
+    <path name="compress-offload-playback5 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia12" value="1" />
+    </path>
+
     <path name="compress-offload-playback5 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia12" value="1" />
     </path>
@@ -1059,6 +1393,16 @@
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-display-port">
+        <path name="compress-offload-playback5 display-port" />
+        <path name="compress-offload-playback5" />
+    </path>
+
+    <path name="compress-offload-playback5 speaker-and-display-port1">
+        <path name="compress-offload-playback5 display-port1" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback5 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia12" value="1" />
     </path>
@@ -1076,6 +1420,11 @@
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback5 usb-headphones" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback5 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia12" value="1" />
     </path>
@@ -1097,21 +1446,41 @@
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-headphones">
+        <path name="compress-offload-playback5 headphones" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback5 speaker-and-bt-sco">
         <path name="compress-offload-playback5 bt-sco" />
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback5 bt-sco" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback5 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback5 bt-sco-wb" />
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback5 bt-sco-wb" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback5 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback5 bt-sco-swb" />
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback5 bt-sco-swb" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback6">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia13" value="1" />
     </path>
@@ -1120,6 +1489,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia13" value="1" />
     </path>
 
+    <path name="compress-offload-playback6 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia13" value="1" />
+    </path>
+
     <path name="compress-offload-playback6 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia13" value="1" />
     </path>
@@ -1138,6 +1511,16 @@
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-display-port">
+        <path name="compress-offload-playback6 display-port" />
+        <path name="compress-offload-playback6" />
+    </path>
+
+    <path name="compress-offload-playback6 speaker-and-display-port1">
+        <path name="compress-offload-playback6 display-port1" />
+        <path name="compress-offload-playback6" />
+    </path>
+
     <path name="compress-offload-playback6 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia13" value="1" />
     </path>
@@ -1155,6 +1538,11 @@
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback6 usb-headphones" />
+        <path name="compress-offload-playback6" />
+    </path>
+
     <path name="compress-offload-playback6 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia13" value="1" />
     </path>
@@ -1176,21 +1564,42 @@
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-headphones">
+        <path name="compress-offload-playback6 headphones" />
+        <path name="compress-offload-playback6" />
+    </path>
+
     <path name="compress-offload-playback6 speaker-and-bt-sco">
         <path name="compress-offload-playback6 bt-sco" />
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback6 bt-sco" />
+        <path name="compress-offload-playback6" />
+    </path>
+
     <path name="compress-offload-playback6 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback6 bt-sco-wb" />
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback6 bt-sco-wb" />
+        <path name="compress-offload-playback6" />
+    </path>
+
     <path name="compress-offload-playback6 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback6 bt-sco-swb" />
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback6 bt-sco-swb" />
+        <path name="compress-offload-playback6" />
+    </path>
+
+
     <path name="compress-offload-playback7">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia14" value="1" />
     </path>
@@ -1199,6 +1608,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia14" value="1" />
     </path>
 
+    <path name="compress-offload-playback7 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia14" value="1" />
+    </path>
+
     <path name="compress-offload-playback7 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia14" value="1" />
     </path>
@@ -1217,6 +1630,16 @@
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-display-port">
+        <path name="compress-offload-playback7 display-port" />
+        <path name="compress-offload-playback7" />
+    </path>
+
+    <path name="compress-offload-playback7 speaker-and-display-port1">
+        <path name="compress-offload-playback7 display-port1" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback7 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia14" value="1" />
     </path>
@@ -1234,6 +1657,11 @@
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback7 usb-headphones" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback7 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia14" value="1" />
     </path>
@@ -1255,21 +1683,41 @@
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-headphones">
+        <path name="compress-offload-playback7 headphones" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback7 speaker-and-bt-sco">
         <path name="compress-offload-playback7 bt-sco" />
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback7 bt-sco" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback7 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback7 bt-sco-wb" />
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback7 bt-sco-wb" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback7 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback7 bt-sco-swb" />
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback7 bt-sco-swb" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback8">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia15" value="1" />
     </path>
@@ -1278,6 +1726,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia15" value="1" />
     </path>
 
+    <path name="compress-offload-playback8 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia15" value="1" />
+    </path>
+
     <path name="compress-offload-playback8 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia15" value="1" />
     </path>
@@ -1296,6 +1748,16 @@
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-display-port">
+        <path name="compress-offload-playback8 display-port" />
+        <path name="compress-offload-playback8" />
+    </path>
+
+    <path name="compress-offload-playback8 speaker-and-display-port1">
+        <path name="compress-offload-playback8 display-port1" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback8 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia15" value="1" />
     </path>
@@ -1313,6 +1775,11 @@
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback8 usb-headphones" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback8 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia15" value="1" />
     </path>
@@ -1334,21 +1801,41 @@
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-headphones">
+        <path name="compress-offload-playback8 headphones" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback8 speaker-and-bt-sco">
         <path name="compress-offload-playback8 bt-sco" />
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback8 bt-sco" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback8 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback8 bt-sco-wb" />
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback8 bt-sco-wb" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback8 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback8 bt-sco-swb" />
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback8 bt-sco-swb" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback9">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
@@ -1357,6 +1844,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia16" value="1" />
     </path>
 
+    <path name="compress-offload-playback9 display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia16" value="1" />
+    </path>
+
     <path name="compress-offload-playback9 bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="1" />
     </path>
@@ -1375,6 +1866,16 @@
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-display-port">
+        <path name="compress-offload-playback9 display-port" />
+	<path name="compress-offload-playback9" />
+    </path>
+
+    <path name="compress-offload-playback9 speaker-and-display-port1">
+        <path name="compress-offload-playback9 display-port1" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="compress-offload-playback9 afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia16" value="1" />
     </path>
@@ -1392,6 +1893,11 @@
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-usb-headphones">
+        <path name="compress-offload-playback9 usb-headphones" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="compress-offload-playback9 headphones">
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
@@ -1413,21 +1919,41 @@
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-headphones">
+        <path name="compress-offload-playback9 headphones" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="compress-offload-playback9 speaker-and-bt-sco">
         <path name="compress-offload-playback9 bt-sco" />
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-bt-sco">
+        <path name="compress-offload-playback9 bt-sco" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="compress-offload-playback9 speaker-and-bt-sco-wb">
         <path name="compress-offload-playback9 bt-sco-wb" />
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-bt-sco-wb">
+        <path name="compress-offload-playback9 bt-sco-wb" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="compress-offload-playback9 speaker-and-bt-sco-swb">
         <path name="compress-offload-playback9 bt-sco-swb" />
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-bt-sco-swb">
+        <path name="compress-offload-playback9 bt-sco-swb" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="audio-record">
         <ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="1" />
     </path>
@@ -1461,6 +1987,10 @@
         <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
     </path>
 
+    <path name="audio-record-compress headset-mic">
+        <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+    </path>
+
     <path name="audio-record-compress bt-sco">
         <ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
     </path>
@@ -1541,13 +2071,13 @@
     </path>
 
     <path name="play-fm">
-        <ctl name="Tert MI2S LOOPBACK Volume" value="1" />
+        <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
         <ctl name="WSA_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="1" />
         <ctl name="WSA_CDC_DMA_RX_0_DL_HL Switch" value="1" />
     </path>
 
     <path name="play-fm headphones">
-        <ctl name="Tert MI2S LOOPBACK Volume" value="1" />
+        <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
         <ctl name="RX_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="1" />
         <ctl name="RX_CDC_DMA_RX_0_DL_HL Switch" value="1" />
     </path>
@@ -1755,6 +2285,10 @@
         <ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_3_Voip" value="1" />
     </path>
 
+    <path name="compress-voip-call headset">
+        <ctl name="RX_CDC_DMA_RX_0_Voice Mixer Voip" value="1" />
+        <ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_4_Voip" value="1" />
+    </path>
 
     <path name="compress-voip-call bt-sco">
         <ctl name="SLIM_7_RX_Voice Mixer Voip" value="1" />
@@ -1834,11 +2368,21 @@
         <ctl name="VoiceMMode1_Tx Mixer USB_AUDIO_TX_MMode1" value="1" />
     </path>
 
+    <path name="voicemmode1-call display-port1-and-usb-headset-mic">
+        <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode1" value="1" />
+        <ctl name="VoiceMMode1_Tx Mixer USB_AUDIO_TX_MMode1" value="1" />
+    </path>
+
     <path name="voicemmode1-call display-port">
         <ctl name="DISPLAY_PORT_RX_Voice Mixer VoiceMMode1" value="1" />
         <ctl name="VoiceMMode1_Tx Mixer TX_CDC_DMA_TX_3_MMode1" value="1" />
     </path>
 
+    <path name="voicemmode1-call display-port1">
+        <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode1" value="1" />
+        <ctl name="VoiceMMode1_Tx Mixer TX_CDC_DMA_TX_3_MMode1" value="1" />
+    </path>
+
     <path name="voicemmode2-call">
         <ctl name="WSA_CDC_DMA_RX_0_Voice Mixer VoiceMMode2" value="1" />
         <ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
@@ -1888,6 +2432,16 @@
         <ctl name="VoiceMMode2_Tx Mixer USB_AUDIO_TX_MMode2" value="1" />
     </path>
 
+    <path name="voicemmode2-call display-port1-and-usb-headset-mic">
+        <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode2" value="1" />
+        <ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
+    </path>
+
+    <path name="voicemmode2-call display-port1">
+        <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode2" value="1" />
+        <ctl name="VoiceMMode2_Tx Mixer USB_AUDIO_TX_MMode2" value="1" />
+   </path>
+
     <path name="voicemmode2-call display-port">
         <ctl name="DISPLAY_PORT_RX_Voice Mixer VoiceMMode2" value="1" />
         <ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
@@ -1902,6 +2456,10 @@
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
+    <path name="audio-playback-voip headset">
+        <path name="audio-playback-voip headphones" />
+    </path>
+
     <path name="audio-playback-voip bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="1" />
     </path>
@@ -1935,11 +2493,25 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia10" value="1" />
     </path>
 
+    <path name="audio-playback-voip display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia10" value="1" />
+    </path>
+
     <path name="audio-playback-voip speaker-and-display-port">
         <path name="audio-playback-voip display-port" />
         <path name="audio-playback-voip" />
     </path>
 
+    <path name="audio-playback-voip speaker-safe-and-display-port">
+        <path name="audio-playback-voip display-port" />
+	<path name="audio-playback-voip" />
+    </path>
+
+    <path name="audio-playback-voip speaker-and-display-port1">
+        <path name="audio-playback-voip display-port1" />
+        <path name="audio-playback-voip" />
+    </path>
+
     <!-- VoIP Tx settings -->
     <path name="audio-record-voip">
         <ctl name="MultiMedia10 Mixer TX_CDC_DMA_TX_3" value="1" />
@@ -2104,6 +2676,10 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-safe">
+        <path name="speaker-mono" />
+    </path>
+
    <path name="sidetone-iir">
         <ctl name="IIR0 Enable Band1" value="1" />
         <ctl name="IIR0 Enable Band2" value="1" />
@@ -2219,6 +2795,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2308,19 +2888,43 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-safe-and-headphones">
+        <path name="headphones" />
+        <path name="speaker-safe" />
+    </path>
+
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-and-line">
         <path name="speaker-and-headphones" />
     </path>
 
+    <path name="speaker-safe-and-line">
+        <path name="speaker-safe-and-headphones" />
+    </path>
+
     <path name="speaker-and-headphones-liquid">
         <path name="headphones" />
         <path name="speaker" />
     </path>
 
+    <path name="speaker-safe-and-headphones-liquid">
+        <path name="headphones" />
+        <path name="speaker-safe" />
+    </path>
+
     <path name="speaker-and-line-liquid">
         <path name="speaker-and-headphones-liquid" />
     </path>
 
+    <path name="speaker-safe-and-headphones-liquid">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="usb-headphones">
     </path>
 
@@ -2333,16 +2937,34 @@
     <path name="display-port">
     </path>
 
+    <path name="display-port1">
+    </path>
+
     <path name="speaker-and-usb-headphones">
         <path name="speaker" />
         <path name="usb-headphones" />
     </path>
 
+    <path name="speaker-safe-and-usb-headphones">
+        <path name="speaker-safe" />
+        <path name="usb-headphones" />
+    </path>
+
     <path name="speaker-and-display-port">
         <path name="speaker" />
         <path name="display-port" />
     </path>
 
+    <path name="speaker-safe-and-display-port">
+        <path name="speaker-safe" />
+        <path name="display-port" />
+    </path>
+
+    <path name="speaker-and-display-port1">
+        <path name="speaker" />
+        <path name="display-port1" />
+    </path>
+
     <path name="voice-rec-mic">
         <path name="handset-mic" />
     </path>
@@ -2524,11 +3146,21 @@
         <path name="tty-headphones" />
     </path>
 
+    <path name="voice-tty-full-headset">
+        <ctl name="TTY Mode" value="FULL" />
+        <path name="tty-headphones" />
+    </path>
+
     <path name="voice-tty-vco-headphones">
         <ctl name="TTY Mode" value="VCO" />
         <path name="tty-headphones" />
     </path>
 
+    <path name="voice-tty-vco-headset">
+        <ctl name="TTY Mode" value="VCO" />
+        <path name="tty-headphones" />
+    </path>
+
     <path name="voice-tty-hco-handset">
         <ctl name="TTY Mode" value="HCO" />
         <path name="handset" />
@@ -2617,6 +3249,11 @@
         <path name="bt-a2dp" />
     </path>
 
+    <path name="speaker-safe-and-bt-a2dp">
+        <path name="speaker-safe" />
+        <path name="bt-a2dp" />
+    </path>
+
     <path name="deep-buffer-playback bt-a2dp">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="1" />
     </path>
@@ -2670,61 +3307,121 @@
         <path name="deep-buffer-playback" />
     </path>
 
+    <path name="deep-buffer-playback speaker-safe-and-bt-a2dp">
+        <path name="deep-buffer-playback bt-a2dp" />
+        <path name="deep-buffer-playback" />
+    </path>
+
     <path name="compress-offload-playback speaker-and-bt-a2dp">
         <path name="compress-offload-playback bt-a2dp" />
         <path name="compress-offload-playback" />
     </path>
 
+    <path name="compress-offload-playback speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback bt-a2dp" />
+        <path name="compress-offload-playback" />
+    </path>
+
     <path name="low-latency-playback speaker-and-bt-a2dp">
         <path name="low-latency-playback bt-a2dp" />
         <path name="low-latency-playback" />
     </path>
 
+    <path name="low-latency-playback speaker-safe-and-bt-a2dp">
+        <path name="low-latency-playback bt-a2dp" />
+        <path name="low-latency-playback" />
+    </path>
+
     <path name="compress-offload-playback2 speaker-and-bt-a2dp">
         <path name="compress-offload-playback2 bt-a2dp" />
         <path name="compress-offload-playback2" />
     </path>
 
+    <path name="compress-offload-playback2 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback2 bt-a2dp" />
+        <path name="compress-offload-playback2" />
+    </path>
+
     <path name="compress-offload-playback3 speaker-and-bt-a2dp">
         <path name="compress-offload-playback3 bt-a2dp" />
         <path name="compress-offload-playback3" />
     </path>
 
+    <path name="compress-offload-playback3 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback3 bt-a2dp" />
+        <path name="compress-offload-playback3" />
+    </path>
+
     <path name="compress-offload-playback4 speaker-and-bt-a2dp">
         <path name="compress-offload-playback4 bt-a2dp" />
         <path name="compress-offload-playback4" />
     </path>
 
+    <path name="compress-offload-playback4 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback4 bt-a2dp" />
+        <path name="compress-offload-playback4" />
+    </path>
+
     <path name="compress-offload-playback5 speaker-and-bt-a2dp">
         <path name="compress-offload-playback5 bt-a2dp" />
         <path name="compress-offload-playback5" />
     </path>
 
+    <path name="compress-offload-playback5 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback5 bt-a2dp" />
+        <path name="compress-offload-playback5" />
+    </path>
+
     <path name="compress-offload-playback6 speaker-and-bt-a2dp">
         <path name="compress-offload-playback6 bt-a2dp" />
         <path name="compress-offload-playback6" />
     </path>
 
+    <path name="compress-offload-playback6 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback6 bt-a2dp" />
+        <path name="compress-offload-playback6" />
+    </path>
+
     <path name="compress-offload-playback7 speaker-and-bt-a2dp">
         <path name="compress-offload-playback7 bt-a2dp" />
         <path name="compress-offload-playback7" />
     </path>
 
+    <path name="compress-offload-playback7 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback7 bt-a2dp" />
+        <path name="compress-offload-playback7" />
+    </path>
+
     <path name="compress-offload-playback8 speaker-and-bt-a2dp">
         <path name="compress-offload-playback8 bt-a2dp" />
         <path name="compress-offload-playback8" />
     </path>
 
+    <path name="compress-offload-playback8 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback8 bt-a2dp" />
+        <path name="compress-offload-playback8" />
+    </path>
+
     <path name="compress-offload-playback9 speaker-and-bt-a2dp">
         <path name="compress-offload-playback9 bt-a2dp" />
         <path name="compress-offload-playback9" />
     </path>
 
+    <path name="compress-offload-playback9 speaker-safe-and-bt-a2dp">
+        <path name="compress-offload-playback9 bt-a2dp" />
+        <path name="compress-offload-playback9" />
+    </path>
+
     <path name="audio-ull-playback speaker-and-bt-a2dp">
         <path name="audio-ull-playback bt-a2dp" />
         <path name="audio-ull-playback" />
     </path>
 
+    <path name="audio-ull-playback speaker-safe-and-bt-a2dp">
+        <path name="audio-ull-playback bt-a2dp" />
+        <path name="audio-ull-playback" />
+    </path>
+
     <path name="mmap-playback">
         <ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
@@ -2733,11 +3430,20 @@
         <ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
 
+    <path name="mmap-playback headset">
+        <path name="mmap-playback headphones" />
+    </path>
+
     <path name="mmap-playback speaker-and-headphones">
         <path name="mmap-playback" />
         <path name="mmap-playback headphones" />
     </path>
 
+    <path name="mmap-playback speaker-safe-and-headphones">
+        <path name="mmap-playback" />
+        <path name="mmap-playback headphones" />
+    </path>
+
     <path name="mmap-playback bt-sco">
         <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="1" />
     </path>
@@ -2767,6 +3473,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia16" value="1" />
     </path>
 
+    <path name="mmap-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia16" value="1" />
+    </path>
+
     <path name="mmap-playback hdmi">
         <ctl name="HDMI Mixer MultiMedia16" value="1" />
     </path>
@@ -2781,11 +3491,26 @@
         <path name="mmap-playback" />
     </path>
 
+    <path name="mmap-playback speaker-safe-and-display-port">
+        <path name="mmap-playback display-port" />
+        <path name="mmap-playback" />
+    </path>
+
+    <path name="mmap-playback speaker-and-display-port1">
+        <path name="mmap-playback display-port1" />
+        <path name="mmap-playback" />
+    </path>
+
     <path name="mmap-playback speaker-and-usb-headphones">
         <path name="mmap-playback usb-headphones" />
         <path name="mmap-playback" />
     </path>
 
+    <path name="mmap-playback speaker-safe-and-usb-headphones">
+        <path name="mmap-playback usb-headphones" />
+        <path name="mmap-playback" />
+    </path>
+
     <path name="mmap-record">
       <ctl name="MultiMedia16 Mixer TX_CDC_DMA_TX_3" value="1" />
     </path>
@@ -2819,6 +3544,10 @@
         <ctl name="DISPLAY_PORT Mixer MultiMedia2" value="1" />
     </path>
 
+    <path name="hifi-playback display-port1">
+        <ctl name="DISPLAY_PORT1 Mixer MultiMedia2" value="1" />
+    </path>
+
     <path name="hifi-playback afe-proxy">
         <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
     </path>
@@ -2863,6 +3592,10 @@
         <path name="incall_music_uplink" />
     </path>
 
+    <path name="incall_music_uplink display-port1">
+        <path name="incall_music_uplink" />
+    </path>
+
     <path name="incall_music_uplink bt-sco">
         <path name="incall_music_uplink" />
     </path>
@@ -2879,6 +3612,14 @@
         <path name="incall_music_uplink" />
     </path>
 
+    <path name="incall_music_uplink speaker-safe-and-display-port">
+        <path name="incall_music_uplink" />
+    </path>
+
+    <path name="incall_music_uplink speaker-and-display-port1">
+        <path name="incall_music_uplink" />
+    </path>
+
     <path name="incall_music_uplink afe-proxy">
         <path name="incall_music_uplink" />
     </path>
@@ -2895,6 +3636,10 @@
         <path name="incall_music_uplink" />
     </path>
 
+    <path name="incall_music_uplink speaker-safe-and-usb-headphones">
+        <path name="incall_music_uplink" />
+    </path>
+
     <path name="incall_music_uplink headphones">
         <path name="incall_music_uplink" />
     </path>
@@ -2907,10 +3652,18 @@
         <path name="incall_music_uplink" />
     </path>
 
+    <path name="incall_music_uplink speaker-safe-and-headphones">
+        <path name="incall_music_uplink" />
+    </path>
+
     <path name="incall_music_uplink speaker-and-bt-sco">
         <path name="incall_music_uplink" />
     </path>
 
+    <path name="incall_music_uplink speaker-safe-and-bt-sco">
+        <path name="incall_music_uplink" />
+    </path>
+
     <path name="incall_music_uplink voice-tty-hco-handset">
         <path name="incall_music_uplink" />
     </path>
@@ -2919,6 +3672,10 @@
         <path name="incall_music_uplink" />
     </path>
 
+    <path name="incall_music_uplink speaker-safe-and-bt-a2dp">
+        <path name="incall_music_uplink" />
+    </path>
+
     <path name="incall_music_uplink bt-a2dp">
         <path name="incall_music_uplink" />
     </path>
diff --git a/configs/lito/mixer_paths_qrd.xml b/configs/lito/mixer_paths_qrd.xml
index 4bf2ff2..a7149ca 100644
--- a/configs/lito/mixer_paths_qrd.xml
+++ b/configs/lito/mixer_paths_qrd.xml
@@ -3024,6 +3024,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
         <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
         <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -3091,6 +3095,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/msm8998/msm8998.mk b/configs/msm8998/msm8998.mk
index eba94f0..18b2bf6 100644
--- a/configs/msm8998/msm8998.mk
+++ b/configs/msm8998/msm8998.mk
@@ -272,7 +272,7 @@
 vendor.audio.feature.compr_cap.enable=false \
 vendor.audio.feature.compress_in.enable=false \
 vendor.audio.feature.compress_meta_data.enable=true \
-vendor.audio.feature.compr_voip.enable=false \
+vendor.audio.feature.compr_voip.enable=true \
 vendor.audio.feature.concurrent_capture.enable=false \
 vendor.audio.feature.custom_stereo.enable=true \
 vendor.audio.feature.display_port.enable=true \
diff --git a/configs/msmnile_au/audio_platform_info.xml b/configs/msmnile_au/audio_platform_info.xml
index 4fdf786..f39a804 100644
--- a/configs/msmnile_au/audio_platform_info.xml
+++ b/configs/msmnile_au/audio_platform_info.xml
@@ -49,6 +49,7 @@
         <device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" acdb_id="95"/>
         <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" acdb_id="95"/>
         <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP" acdb_id="95"/>
+        <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" acdb_id="131"/>
         <device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="20"/>
         <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="38"/>
         <device name="SND_DEVICE_IN_HANDSET_DMIC" acdb_id="80"/>
@@ -74,6 +75,10 @@
             <device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
             <device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
         </ns>
+        <mmsecns>
+            <!-- multi-mic surround ECNS zone control -->
+            <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" topology_id="0x1FFF0002" module_id="0x10F3B" instance_id="0x8000" param_id="0x109F0"/>
+        </mmsecns>
     </module_ids>
 
     <bit_width_configs>
@@ -174,6 +179,8 @@
         <device name="SND_DEVICE_IN_SPEAKER_DMIC" interface="TERT_TDM_TX_0"/>
         <device name="SND_DEVICE_IN_QUAD_MIC" interface="TERT_TDM_TX_0"/>
         <device name="SND_DEVICE_IN_HANDSET_QMIC" interface="TERT_TDM_TX_0"/>
+        <!-- multi-mic surround ECNS mixer path definition -->
+        <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" backend="bt-sco-mmsecns" interface="TERT_TDM_TX_0"/>
     </backend_names>
     <!-- below values are for ref purpose to OEM, doesn't contain actual hardware info on MTP -->
     <microphone_characteristics>
diff --git a/configs/msmnile_au/mixer_paths_adp.xml b/configs/msmnile_au/mixer_paths_adp.xml
index 566f1e9..6d1e667 100644
--- a/configs/msmnile_au/mixer_paths_adp.xml
+++ b/configs/msmnile_au/mixer_paths_adp.xml
@@ -1600,12 +1600,6 @@
         <path name="incall-rec-uplink-and-downlink-compress" />
     </path>
 
-    <path name="hfp-sco">
-        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
-        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
-        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
-    </path>
-
     <path name="icc-call">
         <ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
         <ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1624,11 +1618,26 @@
     <path name="hfp-sco headphones">
     </path>
 
+    <path name="hfp-sco-wb headphones">
+        <path name="hfp-sco headphones" />
+    </path>
+
     <path name="hfp-sco headset">
         <path name="hfp-sco headphones" />
     </path>
 
+    <path name="hfp-sco">
+        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+    </path>
+
     <path name="hfp-sco bt-sco">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+        <path name="hfp-sco" />
+    </path>
+
+    <path name="hfp-sco bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
         <path name="hfp-sco" />
     </path>
 
@@ -1638,11 +1647,13 @@
     </path>
 
     <path name="hfp-sco-wb bt-sco-wb">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
         <path name="hfp-sco-wb" />
     </path>
 
-    <path name="hfp-sco-wb headphones">
-        <path name="hfp-sco headphones" />
+    <path name="hfp-sco-wb bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+        <path name="hfp-sco-wb" />
     </path>
 
 
@@ -2145,6 +2156,10 @@
         <path name="speaker-mic" />
     </path>
 
+    <path name="voice-speaker-mic-hfp-mmsecns">
+        <path name="speaker-mic" />
+    </path>
+
     <path name="voice-headphones">
         <path name="headphones" />
     </path>
diff --git a/configs/msmnile_au/mixer_paths_custom.xml b/configs/msmnile_au/mixer_paths_custom.xml
index 2136c79..28a0224 100644
--- a/configs/msmnile_au/mixer_paths_custom.xml
+++ b/configs/msmnile_au/mixer_paths_custom.xml
@@ -1588,12 +1588,6 @@
         <path name="incall-rec-uplink-and-downlink-compress" />
     </path>
 
-    <path name="hfp-sco">
-        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
-        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
-        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
-    </path>
-
     <path name="icc-call">
         <ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
         <ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1612,11 +1606,26 @@
     <path name="hfp-sco headphones">
     </path>
 
+    <path name="hfp-sco-wb headphones">
+        <path name="hfp-sco headphones" />
+    </path>
+
     <path name="hfp-sco headset">
         <path name="hfp-sco headphones" />
     </path>
 
+    <path name="hfp-sco">
+        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+    </path>
+
     <path name="hfp-sco bt-sco">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+        <path name="hfp-sco" />
+    </path>
+
+    <path name="hfp-sco bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
         <path name="hfp-sco" />
     </path>
 
@@ -1626,11 +1635,13 @@
     </path>
 
     <path name="hfp-sco-wb bt-sco-wb">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
         <path name="hfp-sco-wb" />
     </path>
 
-    <path name="hfp-sco-wb headphones">
-        <path name="hfp-sco headphones" />
+    <path name="hfp-sco-wb bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+        <path name="hfp-sco-wb" />
     </path>
 
 
@@ -2133,6 +2144,10 @@
         <path name="speaker-mic" />
     </path>
 
+    <path name="voice-speaker-mic-hfp-mmsecns">
+        <path name="speaker-mic" />
+    </path>
+
     <path name="voice-headphones">
         <path name="headphones" />
     </path>
diff --git a/configs/msmsteppe/audio_platform_info_intcodec.xml b/configs/msmsteppe/audio_platform_info_intcodec.xml
index 6273fb8..94ea850 100644
--- a/configs/msmsteppe/audio_platform_info_intcodec.xml
+++ b/configs/msmsteppe/audio_platform_info_intcodec.xml
@@ -73,6 +73,7 @@
         <param key="spkr_1_tz_name" value="wsatz.13"/>
         <param key="spkr_2_tz_name" value="wsatz.14"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="true"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="4"/>
@@ -108,6 +109,7 @@
     </acdb_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -115,6 +117,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/msmsteppe/audio_platform_info_qrd.xml b/configs/msmsteppe/audio_platform_info_qrd.xml
index c49fcb5..1070291 100644
--- a/configs/msmsteppe/audio_platform_info_qrd.xml
+++ b/configs/msmsteppe/audio_platform_info_qrd.xml
@@ -72,6 +72,7 @@
         <param key="mono_speaker" value="right"/>
         <param key="spkr_1_tz_name" value="wsatz.11"/>
         <param key="true_32_bit" value="true"/>
+        <param key="hifi_filter" value="false"/>
         <param key="native_audio_mode" value="true"/>
         <param key="hfp_pcm_dev_id" value="39"/>
         <param key="input_mic_max_count" value="2"/>
@@ -103,6 +104,7 @@
     </acdb_ids>
     <backend_names>
         <device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
         <device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -110,6 +112,7 @@
         <device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+        <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
         <device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
diff --git a/configs/msmsteppe/mixer_paths_idp.xml b/configs/msmsteppe/mixer_paths_idp.xml
index 0ae0e65..143b0b7 100644
--- a/configs/msmsteppe/mixer_paths_idp.xml
+++ b/configs/msmsteppe/mixer_paths_idp.xml
@@ -2565,6 +2565,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2639,6 +2643,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/msmsteppe/mixer_paths_qrd.xml b/configs/msmsteppe/mixer_paths_qrd.xml
index 2cd498d..32e8e4b 100644
--- a/configs/msmsteppe/mixer_paths_qrd.xml
+++ b/configs/msmsteppe/mixer_paths_qrd.xml
@@ -2586,6 +2586,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
     </path>
 
@@ -2652,6 +2656,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/msmsteppe/mixer_paths_wcd9375.xml b/configs/msmsteppe/mixer_paths_wcd9375.xml
index 9a1288f..89f6191 100644
--- a/configs/msmsteppe/mixer_paths_wcd9375.xml
+++ b/configs/msmsteppe/mixer_paths_wcd9375.xml
@@ -2578,6 +2578,10 @@
         <path name="headphones" />
     </path>
 
+    <path name="headphones-hifi-filter">
+        <path name="headphones" />
+    </path>
+
     <path name="hph-highquality-mode">
         <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
         <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -2656,6 +2660,11 @@
         <path name="speaker" />
     </path>
 
+    <path name="speaker-and-headphones-hifi-filter">
+        <path name="headphones" />
+        <path name="speaker-safe" />
+    </path>
+
     <path name="speaker-safe-and-headphones">
         <path name="headphones" />
         <path name="speaker-safe" />
diff --git a/configs/msmsteppe_au/audio_platform_info.xml b/configs/msmsteppe_au/audio_platform_info.xml
index 4fdf786..f39a804 100644
--- a/configs/msmsteppe_au/audio_platform_info.xml
+++ b/configs/msmsteppe_au/audio_platform_info.xml
@@ -49,6 +49,7 @@
         <device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" acdb_id="95"/>
         <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" acdb_id="95"/>
         <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP" acdb_id="95"/>
+        <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" acdb_id="131"/>
         <device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="20"/>
         <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="38"/>
         <device name="SND_DEVICE_IN_HANDSET_DMIC" acdb_id="80"/>
@@ -74,6 +75,10 @@
             <device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
             <device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
         </ns>
+        <mmsecns>
+            <!-- multi-mic surround ECNS zone control -->
+            <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" topology_id="0x1FFF0002" module_id="0x10F3B" instance_id="0x8000" param_id="0x109F0"/>
+        </mmsecns>
     </module_ids>
 
     <bit_width_configs>
@@ -174,6 +179,8 @@
         <device name="SND_DEVICE_IN_SPEAKER_DMIC" interface="TERT_TDM_TX_0"/>
         <device name="SND_DEVICE_IN_QUAD_MIC" interface="TERT_TDM_TX_0"/>
         <device name="SND_DEVICE_IN_HANDSET_QMIC" interface="TERT_TDM_TX_0"/>
+        <!-- multi-mic surround ECNS mixer path definition -->
+        <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" backend="bt-sco-mmsecns" interface="TERT_TDM_TX_0"/>
     </backend_names>
     <!-- below values are for ref purpose to OEM, doesn't contain actual hardware info on MTP -->
     <microphone_characteristics>
diff --git a/configs/msmsteppe_au/mixer_paths_adp.xml b/configs/msmsteppe_au/mixer_paths_adp.xml
index 7622dd8..71eb87e 100644
--- a/configs/msmsteppe_au/mixer_paths_adp.xml
+++ b/configs/msmsteppe_au/mixer_paths_adp.xml
@@ -1371,12 +1371,6 @@
         <path name="incall-rec-uplink-and-downlink-compress" />
     </path>
 
-    <path name="hfp-sco">
-        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
-        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
-        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
-    </path>
-
     <path name="icc-call">
         <ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
         <ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1395,7 +1389,22 @@
     <path name="hfp-sco headphones">
     </path>
 
+    <path name="hfp-sco-wb headphones">
+        <path name="hfp-sco headphones" />
+    </path>
+
+    <path name="hfp-sco">
+        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+    </path>
+
     <path name="hfp-sco bt-sco">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+        <path name="hfp-sco" />
+    </path>
+
+    <path name="hfp-sco bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
         <path name="hfp-sco" />
     </path>
 
@@ -1405,11 +1414,13 @@
     </path>
 
     <path name="hfp-sco-wb bt-sco-wb">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
         <path name="hfp-sco-wb" />
     </path>
 
-    <path name="hfp-sco-wb headphones">
-        <path name="hfp-sco headphones" />
+    <path name="hfp-sco-wb bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+        <path name="hfp-sco-wb" />
     </path>
 
     <path name="hfp-sco-downlink">
@@ -1870,6 +1881,10 @@
         <path name="speaker-mic" />
     </path>
 
+    <path name="voice-speaker-mic-hfp-mmsecns">
+        <path name="speaker-mic" />
+    </path>
+
     <path name="voice-headphones">
         <path name="headphones" />
     </path>
diff --git a/configs/msmsteppe_au/mixer_paths_custom.xml b/configs/msmsteppe_au/mixer_paths_custom.xml
index dd0da54..fdfb282 100644
--- a/configs/msmsteppe_au/mixer_paths_custom.xml
+++ b/configs/msmsteppe_au/mixer_paths_custom.xml
@@ -1360,12 +1360,6 @@
         <path name="incall-rec-uplink-and-downlink-compress" />
     </path>
 
-    <path name="hfp-sco">
-        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
-        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
-        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
-    </path>
-
     <path name="icc-call">
         <ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
         <ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1384,7 +1378,22 @@
     <path name="hfp-sco headphones">
     </path>
 
+    <path name="hfp-sco-wb headphones">
+        <path name="hfp-sco headphones" />
+    </path>
+
+    <path name="hfp-sco">
+        <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+        <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+    </path>
+
     <path name="hfp-sco bt-sco">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+        <path name="hfp-sco" />
+    </path>
+
+    <path name="hfp-sco bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
         <path name="hfp-sco" />
     </path>
 
@@ -1394,11 +1403,13 @@
     </path>
 
     <path name="hfp-sco-wb bt-sco-wb">
+        <ctl name="TERT_TDM_TX_0 Channels" value="One" />
         <path name="hfp-sco-wb" />
     </path>
 
-    <path name="hfp-sco-wb headphones">
-        <path name="hfp-sco headphones" />
+    <path name="hfp-sco-wb bt-sco-mmsecns">
+        <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+        <path name="hfp-sco-wb" />
     </path>
 
     <path name="hfp-sco-downlink">
@@ -1859,6 +1870,10 @@
         <path name="speaker-mic" />
     </path>
 
+    <path name="voice-speaker-mic-hfp-mmsecns">
+        <path name="speaker-mic" />
+    </path>
+
     <path name="voice-headphones">
         <path name="headphones" />
     </path>
diff --git a/configure.ac b/configure.ac
index 572e07d..89326c0 100755
--- a/configure.ac
+++ b/configure.ac
@@ -141,6 +141,7 @@
 AM_CONDITIONAL([RUN_KEEP_ALIVE_IN_ARM_FFV], [test x$AUDIO_FEATURE_ENABLED_KEEP_ALIVE_ARM_FFV = xtrue])
 AM_CONDITIONAL([INSTANCE_ID], [test x$AUDIO_FEATURE_ENABLED_INSTANCE_ID = xtrue])
 AM_CONDITIONAL([LL_AS_PRIMARY_OUTPUT], [test x$AUDIO_USE_LL_AS_PRIMARY_OUTPUT = xtrue])
+AM_CONDITIONAL([QAHW_V1], [test x$AUDIO_FEATURE_ENABLED_QAHW_1_0 = xtrue])
 
 AC_CONFIG_FILES([ \
         Makefile \
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 9057016..2d31509 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -5677,6 +5677,7 @@
         auto_hal_init_config.fp_disable_snd_device = disable_snd_device;
         auto_hal_init_config.fp_adev_get_active_input = adev_get_active_input;
         auto_hal_init_config.fp_platform_set_echo_reference = platform_set_echo_reference;
+        auto_hal_init_config.fp_platform_get_eccarstate = platform_get_eccarstate;
         return auto_hal_init(adev, auto_hal_init_config);
     }
     else
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index d282f45..c0e8cf4 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -696,6 +696,7 @@
                                                         struct audio_usecase *);
 typedef int (*fp_audio_extn_auto_hal_stop_hfp_downlink_t)(struct audio_device *,
                                                         struct audio_usecase *);
+typedef bool (*fp_platform_get_eccarstate_t)(void *);
 
 typedef struct hfp_init_config {
     fp_platform_set_mic_mute_t                   fp_platform_set_mic_mute;
@@ -1360,6 +1361,7 @@
     fp_disable_snd_device_t                      fp_disable_snd_device;
     fp_adev_get_active_input_t                   fp_adev_get_active_input;
     fp_platform_set_echo_reference_t             fp_platform_set_echo_reference;
+    fp_platform_get_eccarstate_t                 fp_platform_get_eccarstate;
 } auto_hal_init_config_t;
 // END: AUTO_HAL FEATURE ==================================================
 
diff --git a/hal/audio_extn/auto_hal.c b/hal/audio_extn/auto_hal.c
index b09a9d0..41b3762 100644
--- a/hal/audio_extn/auto_hal.c
+++ b/hal/audio_extn/auto_hal.c
@@ -59,6 +59,7 @@
 static fp_disable_snd_device_t                      fp_disable_snd_device;
 static fp_adev_get_active_input_t                   fp_adev_get_active_input;
 static fp_platform_set_echo_reference_t             fp_platform_set_echo_reference;
+static fp_platform_get_eccarstate_t                 fp_platform_get_eccarstate;
 
 /* Auto hal module struct */
 static struct auto_hal_module *auto_hal = NULL;
@@ -827,7 +828,11 @@
         switch (usecase->id) {
         case USECASE_AUDIO_HFP_SCO:
         case USECASE_AUDIO_HFP_SCO_WB:
-            snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
+            if (fp_platform_get_eccarstate((void *) adev->platform)) {
+                snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS;
+            } else {
+                snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
+            }
             if (adev->enable_hfp)
                 fp_platform_set_echo_reference(adev, true, out_device);
             break;
@@ -971,6 +976,7 @@
     fp_disable_snd_device = init_config.fp_disable_snd_device;
     fp_adev_get_active_input = init_config.fp_adev_get_active_input;
     fp_platform_set_echo_reference = init_config.fp_platform_set_echo_reference;
+    fp_platform_get_eccarstate = init_config.fp_platform_get_eccarstate;
 
     return ret;
 }
diff --git a/hal/audio_extn/ext_hw_plugin.c b/hal/audio_extn/ext_hw_plugin.c
index 6e784cb..92f3f30 100644
--- a/hal/audio_extn/ext_hw_plugin.c
+++ b/hal/audio_extn/ext_hw_plugin.c
@@ -286,9 +286,12 @@
             }
         }
 
-        if ((usecase->type == PCM_CAPTURE) &&
-            (usecase->id ==  USECASE_AUDIO_RECORD) &&
-            (usecase->in_snd_device == SND_DEVICE_IN_SPEAKER_QMIC_AEC)) {
+        if (((usecase->type == PCM_CAPTURE) &&
+            (usecase->id == USECASE_AUDIO_RECORD) &&
+            (usecase->in_snd_device == SND_DEVICE_IN_SPEAKER_QMIC_AEC)) ||
+            ((usecase->type == PCM_HFP_CALL) &&
+            ((usecase->id == USECASE_AUDIO_HFP_SCO) || (usecase->id == USECASE_AUDIO_HFP_SCO_WB)) &&
+            (usecase->in_snd_device == SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS))) {
             audio_hal_plugin_codec_enable_t codec_enable_ec = {0,};
             codec_enable_ec.snd_dev = usecase->in_snd_device;
             // TODO - below should be related with in_snd_dev
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index 62eb9e6..e646bc1 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -83,6 +83,7 @@
     struct pcm *hfp_sco_tx;
     struct pcm *hfp_pcm_rx;
     struct pcm *hfp_pcm_tx;
+    struct pcm *hfp_ext_ec_tx;
     bool is_hfp_running;
     float hfp_volume;
     int32_t hfp_pcm_dev_id;
@@ -96,6 +97,7 @@
     .hfp_sco_tx = NULL,
     .hfp_pcm_rx = NULL,
     .hfp_pcm_tx = NULL,
+    .hfp_ext_ec_tx = NULL,
     .is_hfp_running = 0,
     .hfp_volume = 0,
     .hfp_pcm_dev_id = HFP_ASM_RX_TX,
@@ -288,6 +290,7 @@
     int32_t ret = 0;
     struct audio_usecase *uc_info;
     int32_t pcm_dev_rx_id, pcm_dev_tx_id, pcm_dev_asm_rx_id, pcm_dev_asm_tx_id;
+    int32_t pcm_ext_ec_ref_id;
 
     ALOGD("%s: enter", __func__);
 
@@ -396,6 +399,27 @@
         goto exit;
     }
 
+#ifdef PLATFORM_AUTO
+    /* echo reference path for single-mic/multi-mic surround ECNS hfp calls */
+    pcm_ext_ec_ref_id = HFP_EXT_EC_REF_TX;
+    ALOGD("%s: Opening PCM capture device card_id(%d) device_id(%d)",
+            __func__, adev->snd_card, pcm_ext_ec_ref_id);
+    hfpmod.hfp_ext_ec_tx = pcm_open(adev->snd_card,
+                                    pcm_ext_ec_ref_id,
+                                    PCM_IN, &pcm_config_hfp);
+    if (hfpmod.hfp_ext_ec_tx && !pcm_is_ready(hfpmod.hfp_ext_ec_tx)) {
+        ALOGE("%s: %s", __func__, pcm_get_error(hfpmod.hfp_ext_ec_tx));
+        ret = -EIO;
+        goto exit;
+    }
+
+    if (pcm_start(hfpmod.hfp_ext_ec_tx) < 0) {
+        ALOGE("%s: pcm start for hfp ext ec tx failed", __func__);
+        ret = -EINVAL;
+        goto exit;
+    }
+#endif
+
     hfpmod.is_hfp_running = true;
     hfp_set_volume(adev, hfpmod.hfp_volume);
 
@@ -438,6 +462,14 @@
         hfpmod.hfp_pcm_tx = NULL;
     }
 
+#ifdef PLATFORM_AUTO
+    /* echo reference path for single-mic/multi-mic surround ECNS hfp calls */
+    if (hfpmod.hfp_ext_ec_tx) {
+        pcm_close(hfpmod.hfp_ext_ec_tx);
+        hfpmod.hfp_ext_ec_tx = NULL;
+    }
+#endif
+
     uc_info = fp_get_usecase_from_list(adev, hfpmod.ucid);
     if (uc_info == NULL) {
         ALOGE("%s: Could not find the usecase (%d) in the list",
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 0807fb2..0df1981 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1128,7 +1128,9 @@
                 in->ec_opened = true;
             }
         }
-    } else if (usecase->type == TRANSCODE_LOOPBACK_TX) {
+    } else if ((usecase->type == TRANSCODE_LOOPBACK_TX) || ((usecase->type == PCM_HFP_CALL) &&
+        ((usecase->id == USECASE_AUDIO_HFP_SCO) || (usecase->id == USECASE_AUDIO_HFP_SCO_WB)) &&
+        (usecase->in_snd_device == SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS))) {
         snd_device = usecase->in_snd_device;
     } else {
         snd_device = usecase->out_snd_device;
@@ -8401,21 +8403,6 @@
                 adev->allow_afe_proxy_usage = true;
             }
         }
-        if (audio_is_a2dp_out_device(device)) {
-           struct audio_usecase *usecase;
-           struct listnode *node;
-           list_for_each(node, &adev->usecase_list) {
-               usecase = node_to_item(node, struct audio_usecase, list);
-               if (PCM_PLAYBACK == usecase->type && usecase->stream.out &&
-                  (usecase->stream.out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
-                   usecase->stream.out->a2dp_compress_mute) {
-                   struct stream_out *out = usecase->stream.out;
-                   ALOGD("Unmuting the stream when Bt-A2dp disconnected and stream is mute");
-                   out->a2dp_compress_mute = false;
-                   out_set_compr_volume(&out->stream, out->volume_l, out->volume_r);
-               }
-           }
-        }
     }
 
     audio_extn_hfp_set_parameters(adev, parms);
@@ -9595,10 +9582,10 @@
 
     if (restore) {
         // restore A2DP device for active usecases and unmute if required
-        if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
-            (uc_info->out_snd_device != SND_DEVICE_OUT_BT_A2DP)) {
+        if (out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
             ALOGD("%s: restoring A2dp and unmuting stream", __func__);
-            select_devices(adev, uc_info->id);
+            if (uc_info->out_snd_device != SND_DEVICE_OUT_BT_A2DP)
+                select_devices(adev, uc_info->id);
             pthread_mutex_lock(&out->compr_mute_lock);
             if ((out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
                 (out->a2dp_compress_mute) && (uc_info->out_snd_device == SND_DEVICE_OUT_BT_A2DP)) {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 7420d07..6685b74 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -149,6 +149,7 @@
 #define AUDIO_PARAMETER_KEY_VOLUME_BOOST  "volume_boost"
 #define AUDIO_PARAMETER_KEY_AUD_CALDATA   "cal_data"
 #define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_EC_CAR_STATE  "ec_car_state"
 
 #define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
 
@@ -302,6 +303,7 @@
     bool hifi_audio;
     bool is_i2s_ext_modem;
     bool is_acdb_initialized;
+    bool ec_car_state;
     /* Vbat monitor related flags */
     bool is_vbat_speaker;
     bool is_bcl_speaker;
@@ -656,6 +658,7 @@
     [SND_DEVICE_IN_VOICE_SPEAKER_TMIC] = "voice-speaker-tmic",
     [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
     [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = "voice-speaker-mic-hfp",
+    [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = "voice-speaker-mic-hfp-mmsecns",
     [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
     [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
     [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
@@ -906,6 +909,7 @@
     [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
     [SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB] = 171,
     [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11,
+    [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = 131,
     [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
     [SND_DEVICE_IN_SPDIF] = 143,
     [SND_DEVICE_IN_HDMI_MIC] = 143,
@@ -1142,6 +1146,7 @@
     {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
     {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB)},
     {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP)},
+    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS)},
     {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
     {TO_NAME_INDEX(SND_DEVICE_IN_SPDIF)},
     {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
@@ -1893,6 +1898,9 @@
         else if (out_device & AUDIO_DEVICE_OUT_USB_HEADSET)
             strlcat(ec_ref_mixer_path, " usb-headphones",
                     MIXER_PATH_MAX_LENGTH);
+        else if (out_device & AUDIO_DEVICE_OUT_BUS)
+            strlcpy(ec_ref_mixer_path, "multi-mic-echo-reference",
+                    MIXER_PATH_MAX_LENGTH);
 
         if (audio_route_apply_and_update_path(adev->audio_route,
                                               ec_ref_mixer_path) == 0)
@@ -2184,6 +2192,7 @@
     backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
     backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
     backend_tag_table[SND_DEVICE_OUT_VOICE_HEARING_AID] = strdup("hearing-aid");
+    backend_tag_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = strdup("bt-sco-mmsecns");
 
     hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
     hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -2341,6 +2350,7 @@
     hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_SB] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_TMIC] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
@@ -3103,6 +3113,7 @@
     my_data->spkr_ch_map = NULL;
     my_data->use_sprk_default_sample_rate = true;
     my_data->fluence_in_voice_comm = false;
+    my_data->ec_car_state = false;
     platform_reset_edid_info(my_data);
 
     //set max volume step for voice call
@@ -7280,6 +7291,21 @@
     return ret;
 }
 
+bool platform_get_eccarstate(void *platform)
+{
+    struct platform_data *my_data = (struct platform_data *)platform;
+    return my_data->ec_car_state;
+}
+
+static int platform_set_eccarstate(struct platform_data *my_data, bool state)
+{
+    int ret = 0;
+    ALOGD("Setting EC Car state: %d", state);
+    my_data->ec_car_state = state;
+
+    return ret;
+}
+
 static int update_external_device_status(struct platform_data *my_data,
                                  char* event_name, bool status)
 {
@@ -7713,6 +7739,18 @@
         }
     }
 
+    err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+                            value, len);
+    if (err >= 0) {
+        bool state = false;
+        if (!strncmp("true", value, sizeof("true"))) {
+            state = true;
+            ALOGD("%s: Value of EC CAR STATE set to true!", __func__);
+        }
+        str_parms_del(parms, AUDIO_PARAMETER_KEY_EC_CAR_STATE);
+        platform_set_eccarstate(my_data, state);
+    }
+
     err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
                             value, len);
     if (err >= 0) {
@@ -8081,6 +8119,13 @@
         str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
     }
 
+    ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+                            value, sizeof(value));
+    if (ret >= 0) {
+        str_parms_add_str(reply, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+                          my_data->ec_car_state? "true" : "false");
+    }
+
     ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_DP_FOR_VOICE_USECASE,
                             value, sizeof(value));
 
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index f9d4198..1777ec3 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -231,6 +231,7 @@
     SND_DEVICE_IN_VOICE_SPEAKER_MIC,
     SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB,
     SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP,
+    SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS,
     SND_DEVICE_IN_VOICE_HEADSET_MIC,
     SND_DEVICE_IN_SPDIF,
     SND_DEVICE_IN_HDMI_MIC,
@@ -643,6 +644,7 @@
 #elif PLATFORM_AUTO
 #define HFP_SCO_RX 29
 #define HFP_ASM_RX_TX 36
+#define HFP_EXT_EC_REF_TX 1
 #elif defined (PLATFORM_MSMFALCON) || defined (PLATFORM_MSM8937)
 #define HFP_SCO_RX 17
 #define HFP_ASM_RX_TX 18
diff --git a/hal/platform_api.h b/hal/platform_api.h
index bb8c558..2ffead8 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -374,6 +374,7 @@
                                     size_t *mic_count);
 
 int platform_get_license_by_product(void *platform, const char* product_name, int *product_id, char* product_license);
+bool platform_get_eccarstate(void *platform);
 int platform_get_haptics_pcm_device_id();
 int platform_set_qtime(void *platform, int audio_pcm_device_id,
                        int haptic_pcm_device_id);
diff --git a/post_proc/effect_api.c b/post_proc/effect_api.c
index 4101647..a07de20 100644
--- a/post_proc/effect_api.c
+++ b/post_proc/effect_api.c
@@ -515,11 +515,11 @@
         eq->per_band_cfg[i].freq_millihertz = band_freq_list[i] * 1000;
         eq->per_band_cfg[i].gain_millibels = band_gain_list[i] * 100;
         eq->per_band_cfg[i].quality_factor = Q8_UNITY;
-    }
-
 #ifdef DTS_EAGLE
         update_effects_node(PCM_DEV_ID, EFFECT_TYPE_EQ, EFFECT_SET_PARAM, EFFECT_NO_OP, EFFECT_NO_OP, i, band_gain_list[i] * 100);
 #endif
+    }
+
 }
 
 static int eq_send_params(eff_mode_t mode, void *ctl, struct eq_params *eq,
diff --git a/post_proc/equalizer.c b/post_proc/equalizer.c
index ed16f12..a2e69b0 100644
--- a/post_proc/equalizer.c
+++ b/post_proc/equalizer.c
@@ -517,6 +517,8 @@
     set_config(context, &context->config);
 
     eq_ctxt->hw_acc_fd = -1;
+    for (int i = 0; i < NUM_EQ_BANDS; i++)
+        eq_ctxt->band_levels[i] = 0;
     memset(&(eq_ctxt->offload_eq), 0, sizeof(struct eq_params));
     offload_eq_set_preset(&(eq_ctxt->offload_eq), INVALID_PRESET);
     enable_gcov();
diff --git a/qahw/Makefile.am b/qahw/Makefile.am
index b78c9b7..fccf003 100644
--- a/qahw/Makefile.am
+++ b/qahw/Makefile.am
@@ -17,6 +17,10 @@
 AM_CFLAGS += -DSVA_AUDIO_CONC
 endif
 
+if QAHW_V1
+AM_CFLAGS += -DQAHW_V1
+endif
+
 libqahwwrapper_la_CFLAGS  = $(AM_CFLAGS)
 libqahwwrapper_la_CFLAGS += -include stddef.h
 libqahwwrapper_la_CFLAGS += -Dstrlcpy=g_strlcpy $(GLIB_CFLAGS) -include glib.h
diff --git a/qahw/configure.ac b/qahw/configure.ac
index 5bd3a22..94ca645 100644
--- a/qahw/configure.ac
+++ b/qahw/configure.ac
@@ -30,6 +30,7 @@
 PKG_PROG_PKG_CONFIG
 
 AM_CONDITIONAL([SVA_AUDIO_CONCURRENCY],[test x$BOARD_SUPPORTS_SVA_AUDIO_CONCURRENCY = xtrue])
+AM_CONDITIONAL([QAHW_V1], [test x$AUDIO_FEATURE_ENABLED_QAHW_1_0 = xtrue])
 AC_ARG_WITH([glib],
       AC_HELP_STRING([--with-glib],
          [enable glib, Build against glib. Use this when building for HLOS systems which use glib]))
diff --git a/qahw/inc/qahw.h b/qahw/inc/qahw.h
index 5020c8f..dd920e2 100644
--- a/qahw/inc/qahw.h
+++ b/qahw/inc/qahw.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2011 The Android Open Source Project *
@@ -45,6 +45,9 @@
 /* First generation of audio devices had version hardcoded to 0. all devices with
  * versions < 1.0 will be considered of first generation API.
  */
+#if QAHW_V1
+#define QAHW_MODULE_API_VERSION_1_0 QAHW_MAKE_API_VERSION(1, 0)
+#endif
 #define QAHW_MODULE_API_VERSION_0_0 QAHW_MAKE_API_VERSION(0, 0)
 
 /* Minimal QTI audio HAL version supported by the audio framework */
diff --git a/qahw/inc/qahw_defs.h b/qahw/inc/qahw_defs.h
index 7d136d2..b0eb332 100644
--- a/qahw/inc/qahw_defs.h
+++ b/qahw/inc/qahw_defs.h
@@ -18,6 +18,7 @@
 
 #include <sys/cdefs.h>
 #include <stdint.h>
+#include <system/audio.h>
 
 #ifndef QTI_AUDIO_HAL_DEFS_H
 #define QTI_AUDIO_HAL_DEFS_H
@@ -171,6 +172,9 @@
 #define QAHW_INPUT_FLAG_TIMESTAMP 0x80000000
 #define QAHW_INPUT_FLAG_COMPRESS  0x40000000
 #define QAHW_INPUT_FLAG_PASSTHROUGH 0x20000000
+#define QAHW_OUTPUT_FLAG_INCALL_MUSIC 0x80000000
+#define QAHW_AUDIO_FLAG_HPCM_TX 0x00020000
+#define QAHW_AUDIO_FLAG_HPCM_RX 0x00040000
 
 /* Query fm volume */
 #define QAHW_PARAMETER_KEY_FM_VOLUME "fm_volume"
@@ -267,6 +271,14 @@
     uint32_t reserved[64]; /*reserved for future */
 } qahw_in_buffer_t;
 
+typedef struct {
+    void *buffer;    /* write buffer pointer */
+    size_t size;          /* size of buffer */
+    size_t offset;         /* offset in buffer from where valid byte starts */
+    int64_t *timestamp;    /* timestmap */
+    qahw_meta_data_flags_t flags; /* meta data flags */
+} qahw_buffer_t;
+
 #define MAX_SECTORS 8
 
 struct qahw_source_tracking_param {
@@ -391,6 +403,42 @@
     char license[QAHW_LICENCE_STR_MAX_LENGTH + 1];
 } qahw_license_params_t;
 
+typedef struct qahw_dtmf_gen_params {
+   bool enable;
+   uint16_t low_freq;
+   uint16_t high_freq;
+   uint16_t gain;
+} qahw_dtmf_gen_params_t;
+
+enum {
+    QAHW_TTY_MODE_OFF,
+    QAHW_TTY_MODE_FULL,
+    QAHW_TTY_MODE_VCO,
+    QAHW_TTY_MODE_HCO,
+    QAHW_TTY_MODE_MAX,
+};
+
+typedef struct qahw_tty_params {
+   uint32_t mode;
+} qahw_tty_params_t;
+
+typedef enum {
+    QAHW_HPCM_TAP_POINT_RX = 1,
+    QAHW_HPCM_TAP_POINT_TX = 2,
+    QAHW_HPCM_TAP_POINT_RX_TX = 3,
+} qahw_hpcm_tap_point;
+
+typedef enum {
+    QAHW_HPCM_DIRECTION_OUT,
+    QAHW_HPCM_DIRECTION_IN,
+    QAHW_HPCM_DIRECTION_OUT_IN,
+} qahw_hpcm_direction;
+
+typedef struct qahw_hpcm_params {
+   qahw_hpcm_tap_point tap_point;
+   qahw_hpcm_direction direction;
+} qahw_hpcm_params_t;
+
 typedef union {
     struct qahw_source_tracking_param st_params;
     struct qahw_sound_focus_param sf_params;
@@ -406,6 +454,9 @@
     struct qahw_mix_matrix_params mix_matrix_params;
     struct qahw_license_params license_params;
     struct qahw_out_presentation_position_param pos_param;
+    struct qahw_dtmf_gen_params dtmf_gen_params;
+    struct qahw_tty_params tty_mode_params;
+    struct qahw_hpcm_params hpcm_params;
 } qahw_param_payload;
 
 typedef enum {
@@ -426,6 +477,9 @@
     QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
     QAHW_PARAM_LICENSE_PARAMS,
     QAHW_PARAM_OUT_PRESENTATION_POSITION,
+    QAHW_PARAM_DTMF_GEN,
+    QAHW_PARAM_TTY_MODE,
+    QAHW_PARAM_HPCM,
 } qahw_param_id;
 
 typedef union {
@@ -436,6 +490,94 @@
     QAHW_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
 } qahw_loopback_param_id;
 
+/** stream direction enumeration */
+typedef enum {
+    QAHW_STREAM_INPUT,
+    QAHW_STREAM_OUTPUT,
+    QAHW_STREAM_INPUT_OUTPUT,
+} qahw_stream_direction;
+
+/** stream types */
+typedef enum {
+    QAHW_STREAM_TYPE_INVALID,
+    QAHW_AUDIO_PLAYBACK_LOW_LATENCY,      /**< low latency, higher power*/
+    QAHW_AUDIO_PLAYBACK_DEEP_BUFFER,          /**< low power, higher latency*/
+    QAHW_AUDIO_PLAYBACK_COMPRESSED,           /**< compresssed audio*/
+    QAHW_AUDIO_PLAYBACK_VOIP,                 /**< pcm voip audio*/
+    QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC,     /**< pcm voip audio*/
+
+    QAHW_AUDIO_CAPTURE_LOW_LATENCY,           /**< low latency, higher power*/
+    QAHW_AUDIO_CAPTURE_DEEP_BUFFER,           /**< low power, higher latency*/
+    QAHW_AUDIO_CAPTURE_COMPRESSED,            /**< compresssed audio*/
+    QAHW_AUDIO_CAPTURE_RAW,                   /**< pcm no post processing*/
+    QAHW_AUDIO_CAPTURE_VOIP,                  /**< pcm voip audio*/
+    QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION,      /**< voice activation*/
+    QAHW_AUDIO_CAPTURE_VOICE_CALL_RX,         /**< incall record, downlink */
+    QAHW_AUDIO_CAPTURE_VOICE_CALL_TX,         /**< incall record, uplink */
+    QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX,      /**< incall record, uplink & Downlink */
+
+    QAHW_VOICE_CALL,                          /**< voice call */
+
+    QAHW_AUDIO_TRANSCODE,                     /**< audio transcode */
+    QAHW_AUDIO_HOST_PCM_TX,
+    QAHW_AUDIO_HOST_PCM_RX,
+    QAHW_AUDIO_HOST_PCM_TX_RX,
+    QAHW_AUDIO_STREAM_TYPE_MAX,
+} qahw_audio_stream_type;
+
+typedef uint32_t qahw_device_t;
+
+/**< Key value pair to identify the topology of a usecase from default  */
+struct qahw_modifier_kv  {
+    uint32_t key;
+    uint32_t value;
+};
+
+struct qahw_shared_attributes{
+     audio_config_t config;
+};
+struct qahw_voice_attributes{
+     audio_config_t config;
+     const char *vsid;
+};
+
+struct qahw_audio_attributes{
+    audio_config_t config;
+};
+
+typedef union {
+    struct qahw_shared_attributes shared;
+    struct qahw_voice_attributes voice;
+    struct qahw_audio_attributes audio;
+} qahw_stream_attributes_config;
+
+struct qahw_stream_attributes {
+     qahw_audio_stream_type type;
+     qahw_stream_direction direction;
+     qahw_stream_attributes_config attr;
+};
+
+typedef enum {
+    QAHW_CHANNEL_L = 0, /*left channel*/
+    QAHW_CHANNEL_R = 1, /*right channel*/
+    QAHW_CHANNELS_MAX = 2, /*max number of supported streams*/
+} qahw_channel_map;
+
+struct qahw_channel_vol {
+    qahw_channel_map channel;
+    float vol;
+};
+
+struct qahw_volume_data {
+    uint32_t num_of_channels;
+    struct qahw_channel_vol *vol_pair;
+};
+
+struct qahw_mute_data {
+    bool enable;
+    qahw_stream_direction direction;
+};
+
 __END_DECLS
 
 #endif  // QTI_AUDIO_HAL_DEFS_H
diff --git a/qahw/src/qahw.c b/qahw/src/qahw.c
index ceec657..2ae6906 100644
--- a/qahw/src/qahw.c
+++ b/qahw/src/qahw.c
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016-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
@@ -45,8 +45,13 @@
 
 /*
  * The current HAL API version.
+ * version 1.0 has support for voice only in new stream based APIS
  */
+#ifdef QAHW_MODULE_API_VERSION_1_0
+#define QAHW_MODULE_API_VERSION_CURRENT QAHW_MODULE_API_VERSION_1_0
+#else
 #define QAHW_MODULE_API_VERSION_CURRENT QAHW_MODULE_API_VERSION_0_0
+#endif
 
 
 typedef uint64_t (*qahwi_out_write_v2_t)(audio_stream_out_t *out, const void* buffer,
diff --git a/qahw_api/Makefile.am b/qahw_api/Makefile.am
index 38506b8..e4cbdb5 100644
--- a/qahw_api/Makefile.am
+++ b/qahw_api/Makefile.am
@@ -22,8 +22,13 @@
 libqahw_la_CPPFLAGS += -std=c++11 -DHAVE_PTHREADS -DHAVE_ANDROID_OS
 libqahw_la_CPPFLAGS += -DDEBUG_REFS_CALLSTACK_ENABLED=0
 libqahw_la_CPPFLAGS += -DNDEBUG
-libqahw_la_LDFLAGS   = -ltinyalsa -lhardware -lexpat -lcutils -llog -ldl -shared -avoid-version -lpthread -lutils
+libqahw_la_CPPFLAGS += $(GLIB_CFLAGS) -include glib.h
+libqahw_la_LDFLAGS   = -ltinyalsa -lhardware -lexpat -lcutils -llog -ldl -shared -avoid-version -lpthread -lutils $(GLIB_LIBS)
 if QTI_AUDIO_SERVER_ENABLED
 AM_CPPFLAGS += -DQTI_AUDIO_SERVER_ENABLED
 libqahw_la_LDFLAGS +=  -lqtiaudioserver -lbinder
 endif
+if QAHW_V1
+AM_CPPFLAGS += -DQAHW_V1
+endif
+
diff --git a/qahw_api/inc/qahw_api.h b/qahw_api/inc/qahw_api.h
index b37757d..80d9c64 100644
--- a/qahw_api/inc/qahw_api.h
+++ b/qahw_api/inc/qahw_api.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2011 The Android Open Source Project *
@@ -485,6 +485,75 @@
 
 void qahw_register_qas_death_notify_cb(audio_error_callback cb, void* context);
 
+/* updated new stream APIs to support voice and Audio use cases */
+
+int qahw_stream_open(qahw_module_handle_t *hw_module,
+                     struct qahw_stream_attributes attr,
+                     uint32_t num_of_devices,
+                     qahw_device_t *devices,
+                     uint32_t no_of_modifiers,
+                     struct qahw_modifier_kv *modifiers,
+                     qahw_stream_callback_t cb,
+                     void *cookie,
+                     qahw_stream_handle_t **stream_handle);
+
+int qahw_stream_close(qahw_stream_handle_t *stream_handle);
+
+int qahw_stream_start(qahw_stream_handle_t *stream_handle);
+
+int qahw_stream_stop(qahw_stream_handle_t *stream_handle);
+
+int qahw_stream_set_device(qahw_stream_handle_t *stream_handle,
+                           uint32_t num_of_dev,
+                           qahw_device_t *devices);
+
+int qahw_stream_get_device(qahw_stream_handle_t *stream_handle,
+                           uint32_t *num_of_dev,
+                           qahw_device_t **devices);
+
+int qahw_stream_set_volume(qahw_stream_handle_t *stream_handle,
+                           struct qahw_volume_data vol_data);
+
+int qahw_stream_get_volume(qahw_stream_handle_t *stream_handle,
+                           struct qahw_volume_data **vol_data);
+
+int qahw_stream_set_mute(qahw_stream_handle_t *stream_handle,
+                         struct qahw_mute_data mute_data);
+
+int qahw_stream_get_mute(qahw_stream_handle_t *stream_handle,
+                         struct qahw_mute_data *mute_data);
+
+ssize_t qahw_stream_read(qahw_stream_handle_t *stream_handle,
+                         qahw_buffer_t *in_buf);
+
+ssize_t qahw_stream_write(qahw_stream_handle_t *stream_handle,
+                          qahw_buffer_t *out_buf);
+
+int32_t qahw_stream_pause(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_standby(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_resume(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_flush(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_drain(qahw_stream_handle_t *stream_handle,
+                          qahw_drain_type_t type);
+
+int32_t qahw_stream_get_buffer_size(const qahw_stream_handle_t *stream_handle,
+                                    size_t *in_buffer, size_t *out_buffer);
+
+int32_t qahw_stream_set_buffer_size(const qahw_stream_handle_t *stream_handle,
+                                    size_t in_buffer, size_t out_buffer);
+
+int32_t qahw_stream_set_parameters(qahw_stream_handle_t *stream_handle,
+                                   uint32_t param_id,
+                                   qahw_param_payload *param_payload);
+
+int32_t qahw_stream_get_parameters(qahw_stream_handle_t *stream_handle,
+                                   uint32_t param_id,
+                                   qahw_param_payload *param_payload);
+
 __END_DECLS
 
 #endif  // QTI_AUDIO_QAHW_API_H
diff --git a/qahw_api/inc/qahw_defs.h b/qahw_api/inc/qahw_defs.h
index 7bd5118..f979013 100644
--- a/qahw_api/inc/qahw_defs.h
+++ b/qahw_api/inc/qahw_defs.h
@@ -18,6 +18,7 @@
 
 #include <sys/cdefs.h>
 #include <stdint.h>
+#include <system/audio.h>
 
 #ifndef QTI_AUDIO_HAL_DEFS_H
 #define QTI_AUDIO_HAL_DEFS_H
@@ -171,6 +172,9 @@
 #define QAHW_INPUT_FLAG_TIMESTAMP 0x80000000
 #define QAHW_INPUT_FLAG_COMPRESS  0x40000000
 #define QAHW_INPUT_FLAG_PASSTHROUGH 0x20000000
+#define QAHW_OUTPUT_FLAG_INCALL_MUSIC 0x80000000
+#define QAHW_AUDIO_FLAG_HPCM_TX 0x00020000
+#define QAHW_AUDIO_FLAG_HPCM_RX 0x00040000
 
 /* Query fm volume */
 #define QAHW_PARAMETER_KEY_FM_VOLUME "fm_volume"
@@ -245,6 +249,14 @@
     uint32_t reserved[64]; /*reserved for future */
 } qahw_in_buffer_t;
 
+typedef struct {
+    void *buffer;    /* write buffer pointer */
+    size_t size;          /* size of buffer */
+    size_t offset;         /* offset in buffer from where valid byte starts */
+    int64_t *timestamp;    /* timestmap */
+    qahw_meta_data_flags_t flags; /* meta data flags */
+} qahw_buffer_t;
+
 #define MAX_SECTORS 8
 
 struct qahw_source_tracking_param {
@@ -370,6 +382,42 @@
     char license[QAHW_LICENCE_STR_MAX_LENGTH + 1];
 } qahw_license_params_t;
 
+typedef struct qahw_dtmf_gen_params {
+   bool enable;
+   uint16_t low_freq;
+   uint16_t high_freq;
+   uint16_t gain;
+} qahw_dtmf_gen_params_t;
+
+enum {
+    QAHW_TTY_MODE_OFF,
+    QAHW_TTY_MODE_FULL,
+    QAHW_TTY_MODE_VCO,
+    QAHW_TTY_MODE_HCO,
+    QAHW_TTY_MODE_MAX,
+};
+
+typedef struct qahw_tty_params {
+   uint32_t mode;
+} qahw_tty_params_t;
+
+typedef enum {
+    QAHW_HPCM_TAP_POINT_RX = 1,
+    QAHW_HPCM_TAP_POINT_TX = 2,
+    QAHW_HPCM_TAP_POINT_RX_TX = 3,
+} qahw_hpcm_tap_point;
+
+typedef enum {
+    QAHW_HPCM_DIRECTION_OUT,
+    QAHW_HPCM_DIRECTION_IN,
+    QAHW_HPCM_DIRECTION_OUT_IN,
+} qahw_hpcm_direction;
+
+typedef struct qahw_hpcm_params {
+   qahw_hpcm_tap_point tap_point;
+   qahw_hpcm_direction direction;
+} qahw_hpcm_params_t;
+
 typedef union {
     struct qahw_source_tracking_param st_params;
     struct qahw_sound_focus_param sf_params;
@@ -385,6 +433,9 @@
     struct qahw_mix_matrix_params mix_matrix_params;
     struct qahw_license_params license_params;
     struct qahw_out_presentation_position_param pos_param;
+    struct qahw_dtmf_gen_params dtmf_gen_params;
+    struct qahw_tty_params tty_mode_params;
+    struct qahw_hpcm_params hpcm_params;
 } qahw_param_payload;
 
 typedef enum {
@@ -405,6 +456,9 @@
     QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
     QAHW_PARAM_LICENSE_PARAMS,
     QAHW_PARAM_OUT_PRESENTATION_POSITION,
+    QAHW_PARAM_DTMF_GEN,
+    QAHW_PARAM_TTY_MODE,
+    QAHW_PARAM_HPCM,
 } qahw_param_id;
 
 
@@ -416,6 +470,94 @@
     QAHW_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
 } qahw_loopback_param_id;
 
+/** stream direction enumeration */
+typedef enum {
+    QAHW_STREAM_INPUT,
+    QAHW_STREAM_OUTPUT,
+    QAHW_STREAM_INPUT_OUTPUT,
+} qahw_stream_direction;
+
+/** stream types */
+typedef enum {
+    QAHW_STREAM_TYPE_INVALID,
+    QAHW_AUDIO_PLAYBACK_LOW_LATENCY,      /**< low latency, higher power*/
+    QAHW_AUDIO_PLAYBACK_DEEP_BUFFER,          /**< low power, higher latency*/
+    QAHW_AUDIO_PLAYBACK_COMPRESSED,           /**< compresssed audio*/
+    QAHW_AUDIO_PLAYBACK_VOIP,                 /**< pcm voip audio*/
+    QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC,     /**< pcm voip audio*/
+
+    QAHW_AUDIO_CAPTURE_LOW_LATENCY,           /**< low latency, higher power*/
+    QAHW_AUDIO_CAPTURE_DEEP_BUFFER,           /**< low power, higher latency*/
+    QAHW_AUDIO_CAPTURE_COMPRESSED,            /**< compresssed audio*/
+    QAHW_AUDIO_CAPTURE_RAW,                   /**< pcm no post processing*/
+    QAHW_AUDIO_CAPTURE_VOIP,                  /**< pcm voip audio*/
+    QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION,      /**< voice activation*/
+    QAHW_AUDIO_CAPTURE_VOICE_CALL_RX,         /**< incall record, downlink */
+    QAHW_AUDIO_CAPTURE_VOICE_CALL_TX,         /**< incall record, uplink */
+    QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX,      /**< incall record, uplink & Downlink */
+
+    QAHW_VOICE_CALL,                          /**< voice call */
+
+    QAHW_AUDIO_TRANSCODE,                     /**< audio transcode */
+    QAHW_AUDIO_HOST_PCM_TX,
+    QAHW_AUDIO_HOST_PCM_RX,
+    QAHW_AUDIO_HOST_PCM_TX_RX,
+    QAHW_AUDIO_STREAM_TYPE_MAX,
+} qahw_audio_stream_type;
+
+typedef uint32_t qahw_device_t;
+
+/**< Key value pair to identify the topology of a usecase from default  */
+struct qahw_modifier_kv  {
+    uint32_t key;
+    uint32_t value;
+};
+
+struct qahw_shared_attributes{
+     audio_config_t config;
+};
+struct qahw_voice_attributes{
+     audio_config_t config;
+     const char *vsid;
+};
+
+struct qahw_audio_attributes{
+    audio_config_t config;
+};
+
+typedef union {
+    struct qahw_shared_attributes shared;
+    struct qahw_voice_attributes voice;
+    struct qahw_audio_attributes audio;
+} qahw_stream_attributes_config;
+
+struct qahw_stream_attributes {
+     qahw_audio_stream_type type;
+     qahw_stream_direction direction;
+     qahw_stream_attributes_config attr;
+};
+
+typedef enum {
+    QAHW_CHANNEL_L = 0, /*left channel*/
+    QAHW_CHANNEL_R = 1, /*right channel*/
+    QAHW_CHANNELS_MAX = 2, /*max number of supported streams*/
+} qahw_channel_map;
+
+struct qahw_channel_vol {
+    qahw_channel_map channel;
+    float vol;
+};
+
+struct qahw_volume_data {
+    uint32_t num_of_channels;
+    struct qahw_channel_vol *vol_pair;
+};
+
+struct qahw_mute_data {
+    bool enable;
+    qahw_stream_direction direction;
+};
+
 __END_DECLS
 
 #endif  // QTI_AUDIO_HAL_DEFS_H
diff --git a/qahw_api/src/qahw_api.cpp b/qahw_api/src/qahw_api.cpp
index 0810ede..07d2678 100644
--- a/qahw_api/src/qahw_api.cpp
+++ b/qahw_api/src/qahw_api.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016-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
@@ -37,11 +37,99 @@
 #include <stdlib.h>
 #include <cutils/list.h>
 #include <assert.h>
+#include <string.h>
 
 #include <hardware/audio.h>
 #include <cutils/properties.h>
 #include "qahw_api.h"
 #include "qahw.h"
+#include <errno.h>
+
+#ifndef ANDROID
+#define strlcpy g_strlcpy
+#define strlcat g_strlcat
+#endif
+
+#if QAHW_V1
+#define QAHW_DEV_ROUTE_LENGTH 15
+#define QAHW_KV_PAIR_LENGTH 255
+#define QAHW_NUM_OF_ROUTINGS 4
+#define QAHW_NUM_OF_SESSIONS 4
+#define QAHW_NAMES_PER_SESSION 2
+#define QAHW_SESSION_NAME_MAX_LEN 255
+#define QAHW_MAX_INT_STRING 12
+#define QAHW_NUM_OF_MUTE_TYPES 4
+
+#define MAX_NUM_DEVICES 10
+
+typedef struct {
+    qahw_stream_handle_t *out_stream;
+    qahw_stream_handle_t *in_stream;
+    qahw_module_handle_t *hw_module;
+    uint32_t num_of_devices;
+    audio_devices_t devices[MAX_NUM_DEVICES];
+    qahw_stream_direction dir;
+    qahw_audio_stream_type type;
+    struct qahw_volume_data vol;
+    struct qahw_mute_data out_mute;
+    struct qahw_mute_data in_mute;
+} qahw_api_stream_t;
+
+/* Array to store sound devices */
+static const char * const stream_name_map[QAHW_AUDIO_STREAM_TYPE_MAX] = {
+    [QAHW_STREAM_TYPE_INVALID] = "",
+    [QAHW_AUDIO_PLAYBACK_LOW_LATENCY]= "playback-low-latency",
+    [QAHW_AUDIO_PLAYBACK_DEEP_BUFFER]= "playback-deep-buffer",
+    [QAHW_AUDIO_PLAYBACK_COMPRESSED]= "playback-compressed",
+    [QAHW_AUDIO_PLAYBACK_VOIP]= "playback-voip",
+    [QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC]= "playback-in-call-music",
+    [QAHW_AUDIO_CAPTURE_LOW_LATENCY]= "capture-low-latency",
+    [QAHW_AUDIO_CAPTURE_DEEP_BUFFER]= "capture-deep-buffer",
+    [QAHW_AUDIO_CAPTURE_COMPRESSED]= "capture-compressed",
+    [QAHW_AUDIO_CAPTURE_RAW]= "capture-raw",
+    [QAHW_AUDIO_CAPTURE_VOIP]= "capture-voip",
+    [QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION]= "capture-voice-activation",
+    [QAHW_AUDIO_CAPTURE_VOICE_CALL_RX]= "capture-voice-rx",
+    [QAHW_AUDIO_CAPTURE_VOICE_CALL_TX]= "capture-voice-tx",
+    [QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX]= "capture-voice-rx-tx",
+    [QAHW_VOICE_CALL]= "voice-call",
+    [QAHW_AUDIO_TRANSCODE]= "audio-transcode",
+    [QAHW_AUDIO_HOST_PCM_TX]= "host-pcm-tx",
+    [QAHW_AUDIO_HOST_PCM_RX]= "host-pcm-rx",
+    [QAHW_AUDIO_HOST_PCM_TX_RX]= "host-pcm-tx-rx",
+};
+
+static const char * const tty_mode_map[QAHW_TTY_MODE_MAX] = {
+    [QAHW_TTY_MODE_OFF] = "tty_mode=tty_off",
+    [QAHW_TTY_MODE_FULL] = "tty_mode=tty_full",
+    [QAHW_TTY_MODE_VCO] = "tty_mode=tty_vco",
+    [QAHW_TTY_MODE_HCO] = "tty_mode=tty_hco",
+};
+
+typedef struct {
+    char sess_id[QAHW_NAMES_PER_SESSION][QAHW_SESSION_NAME_MAX_LEN + 1];
+    char sess_id_call_state[QAHW_KV_PAIR_LENGTH];
+} session_info_t;
+
+static session_info_t session_info[QAHW_NUM_OF_SESSIONS] = {
+    {{"default mmodevoice1", "11C05000"}, "vsid=297816064;call_state=2"},
+    {{"default mmodevoice2", "11DC5000"}, "vsid=299651072;call_state=2"},
+    {{"default modem voice", "10C01000"}, "vsid=281022464;call_state=2"},
+    {{"default volte voice", "10C02000"}, "vsid=281026560;call_state=2"}
+};
+
+typedef struct {
+    struct qahw_mute_data mute;
+    char mute_state[QAHW_KV_PAIR_LENGTH];
+} qahw_mute_info_t;
+
+static qahw_mute_info_t mute_info[QAHW_NUM_OF_MUTE_TYPES] = {
+    {{1, QAHW_STREAM_INPUT}, "device_mute=true;direction=tx" },
+    {{0, QAHW_STREAM_INPUT}, "device_mute=false;direction=tx" },
+    {{1, QAHW_STREAM_OUTPUT}, "device_mute=true;direction=rx" },
+    {{0, QAHW_STREAM_OUTPUT}, "device_mute=false;direction=rx" },
+};
+#endif
 
 #if QTI_AUDIO_SERVER_ENABLED
 #include <mm-audio/qti-audio-server/qti_audio_server.h>
@@ -1580,8 +1668,10 @@
 
 int qahw_init_check(const qahw_module_handle_t *hw_module)
 {
-    ALOGV("%d:%s",__LINE__, __func__);
-    return qahw_init_check_l(hw_module);
+    ALOGV("%d:%s start",__LINE__, __func__);
+    int rc = qahw_init_check_l(hw_module);
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
 }
 
 int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume)
@@ -1814,7 +1904,1104 @@
 
 qahw_module_handle_t *qahw_load_module(const char *hw_module_id)
 {
-    ALOGV("%d:%s",__LINE__, __func__);
-    return qahw_load_module_l(hw_module_id);
+    ALOGV("%d:%s start",__LINE__, __func__);
+    qahw_module_handle_t *module = qahw_load_module_l(hw_module_id);
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return module;
 }
+
+#if QAHW_V1
+char * qahw_get_session_id(const char* vsid)
+{
+    int i = 0;
+    int j = 0;
+    char *ret = "vsid=281022464;call_state=2";
+
+    for(i = 0; i < QAHW_NUM_OF_SESSIONS; i++) {
+        for(j = 0; j < QAHW_NAMES_PER_SESSION; j++) {
+            if(!strcmp(vsid,session_info[i].sess_id[j])) {
+                ret = session_info[i].sess_id_call_state;
+                ALOGV("%s: vsid %s\n", __func__, vsid);
+                break;
+            }
+        }
+    }
+    ALOGV("%s: sess_id_call_state %s\n", __func__, ret);
+    return ret;
+}
+
+int qahw_add_flags_source(struct qahw_stream_attributes attr,
+                          int *flags, audio_source_t *source) {
+    int rc = 0;
+    /*default source */
+    if (source && flags) {
+        *source = AUDIO_SOURCE_MIC;
+        /*default flag*/
+        *flags = 0;
+    } else
+        return -EINVAL;
+
+    switch (attr.type) {
+    case QAHW_AUDIO_PLAYBACK_LOW_LATENCY:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_PLAYBACK_DEEP_BUFFER:
+        *flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
+        break;
+    case QAHW_AUDIO_PLAYBACK_COMPRESSED:
+        *flags = AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
+        break;
+    case QAHW_AUDIO_PLAYBACK_VOIP:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC:
+        *flags = QAHW_OUTPUT_FLAG_INCALL_MUSIC;
+        break;
+    case QAHW_AUDIO_CAPTURE_LOW_LATENCY:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_CAPTURE_DEEP_BUFFER:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_CAPTURE_COMPRESSED:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_CAPTURE_RAW:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_CAPTURE_VOIP:
+        break;
+    case QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_CAPTURE_VOICE_CALL_RX:
+        *source = AUDIO_SOURCE_VOICE_DOWNLINK;
+        break;
+    case QAHW_AUDIO_CAPTURE_VOICE_CALL_TX:
+        *source = AUDIO_SOURCE_VOICE_UPLINK;
+        break;
+    case QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX:
+        /*unsupported */
+        break;
+    case QAHW_VOICE_CALL:
+        *flags = AUDIO_OUTPUT_FLAG_PRIMARY;
+        break;
+    case QAHW_AUDIO_TRANSCODE:
+        /*TODO*/
+        break;
+    case QAHW_AUDIO_HOST_PCM_TX:
+        *flags = QAHW_AUDIO_FLAG_HPCM_TX;
+        break;
+    case QAHW_AUDIO_HOST_PCM_RX:
+        *flags = QAHW_AUDIO_FLAG_HPCM_RX;
+        break;
+    case QAHW_AUDIO_HOST_PCM_TX_RX:
+        /*TODO*/
+        break;
+    default:
+        rc = -EINVAL;
+        break;
+    }
+
+    return rc;
+}
+
+int qahw_stream_open(qahw_module_handle_t *hw_module,
+                     struct qahw_stream_attributes attr,
+                     uint32_t num_of_devices,
+                     qahw_device_t *devices,
+                     uint32_t no_of_modifiers,
+                     struct qahw_modifier_kv *modifiers,
+                     qahw_stream_callback_t cb,
+                     void *cookie,
+                     qahw_stream_handle_t **stream_handle) {
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    audio_io_handle_t handle = 0x999;
+    int rc = -EINVAL;
+    const char *address = stream_name_map[attr.type];
+    const char *session_id;
+    int flags = 0;
+    audio_source_t source = AUDIO_SOURCE_MIC;
+    qahw_api_stream_t *stream;
+    struct qahw_channel_vol *vols;
+
+    /* validate number of devices */
+    if (num_of_devices > MAX_NUM_DEVICES)
+    {
+        ALOGE("%s: invalid number of devices for stream", __func__);
+        return rc;
+    }
+    /* validate direction for voice stream */
+    if (attr.type == QAHW_VOICE_CALL &&
+        attr.direction != QAHW_STREAM_INPUT_OUTPUT) {
+        ALOGE("%s: invalid direction for a voice stream", __func__);
+        return rc;
+    }
+    /* add flag*/
+    rc = qahw_add_flags_source(attr, &flags, &source);
+
+    if (rc) {
+        ALOGE("%s: invalid type %d", __func__, attr.type);
+        return rc;
+    }
+
+    stream = (qahw_api_stream_t *)calloc(1, sizeof(qahw_api_stream_t));
+    if (!stream) {
+        ALOGE("%s: stream allocation failed ", __func__);
+        return -ENOMEM;
+    }
+    vols = (struct qahw_channel_vol *)
+            calloc(1, sizeof(struct qahw_channel_vol)*QAHW_CHANNELS_MAX);
+    if (!vols) {
+        ALOGE("%s: vol allocation failed ", __func__);
+        return -ENOMEM;
+    }
+
+    memset(stream, 0, sizeof(qahw_api_stream_t));
+    memset(vols, 0, sizeof(struct qahw_channel_vol)*QAHW_CHANNELS_MAX);
+    stream->dir = attr.direction;
+    stream->hw_module = hw_module;
+    stream->num_of_devices = num_of_devices;
+    memset(&stream->devices[0], 0, sizeof(stream->devices));
+    memcpy(&stream->devices[0], devices, num_of_devices);
+    stream->type = attr.type;
+    stream->vol.vol_pair = vols;
+    /* if voice call stream, num_of_channels set to 1 */
+    if (attr.type == QAHW_VOICE_CALL)
+        stream->vol.num_of_channels = 1;
+    else
+        stream->vol.num_of_channels = QAHW_CHANNELS_MAX;
+
+    switch (attr.direction) {
+    case QAHW_STREAM_INPUT_OUTPUT:
+        /*for now only support one stream to one device*/
+        if (num_of_devices != 2 && attr.type != QAHW_VOICE_CALL) {
+            ALOGE("%s: invalid num of streams %d for dir %d",
+                  __func__, num_of_devices, attr.direction);
+            return rc;
+        }
+        rc = qahw_open_output_stream(hw_module, handle, devices[0],
+                                     (audio_output_flags_t)flags,
+                                     &(attr.attr.shared.config),
+                                     &stream->out_stream,
+                                     address);
+        /*set cb function */
+        if (rc)
+            rc = qahw_out_set_callback(stream->out_stream, cb, cookie);
+        if (rc)
+            ALOGE("%s: setting callback failed %d \n", __func__, rc);
+
+        if (attr.type != QAHW_VOICE_CALL) {
+            rc = qahw_open_input_stream(hw_module, handle, devices[1],
+                                        &(attr.attr.shared.config),
+                                        &stream->in_stream,
+                                        (audio_input_flags_t)flags,
+                                        address,
+                                        source);
+        }
+        break;
+    case QAHW_STREAM_OUTPUT:
+        if (num_of_devices != 1) {
+            ALOGE("%s: invalid num of streams %d for dir %d",
+                  __func__, num_of_devices, attr.direction);
+            return rc;
+        }
+        rc = qahw_open_output_stream(hw_module, handle, devices[0],
+                                     (audio_output_flags_t)flags,
+                                     &(attr.attr.shared.config),
+                                     &stream->out_stream,
+                                     address);
+        /*set cb function */
+        if (rc)
+            rc = qahw_out_set_callback(stream->out_stream, cb, cookie);
+        if (rc)
+            ALOGE("%s: setting callback failed %d \n", __func__, rc);
+        break;
+    case QAHW_STREAM_INPUT:
+        if (num_of_devices != 1) {
+            ALOGE("%s: invalid num of streams %d for dir %d",
+                  __func__, num_of_devices, attr.direction);
+            return rc;
+        }
+        rc = qahw_open_input_stream(hw_module, handle, devices[0],
+                                    &(attr.attr.shared.config),
+                                    &stream->in_stream,
+                                    (audio_input_flags_t)flags,
+                                    address,
+                                    source);
+        break;
+    default:
+        ALOGE("%s: invalid stream direction %d ", __func__, attr.direction);
+        return rc;
+    }
+    /*set the stream type as the handle add to list*/
+    *stream_handle = (qahw_stream_handle_t *)stream;
+
+    /*if voice call set vsid and call state/mode*/
+    if (attr.type == QAHW_VOICE_CALL) {
+        session_id = qahw_get_session_id(attr.attr.voice.vsid);
+
+        rc = qahw_set_parameters(hw_module, session_id);
+        if (rc) {
+            ALOGE("%s: setting vsid failed %d \n", __func__, rc);
+        }
+    }
+
+    if(no_of_modifiers){
+        ALOGE("%s: modifiers not currently supported\n", __func__);
+    }
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_close(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_stream_direction dir;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            ALOGV("%s: closing output stream\n", __func__);
+            rc = qahw_close_output_stream(stream->out_stream);
+            break;
+        case QAHW_STREAM_INPUT:
+            ALOGV("%s: closing input stream\n", __func__);
+            rc = qahw_close_input_stream(stream->in_stream);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            rc = qahw_close_output_stream(stream->out_stream);
+            if (rc)
+                ALOGE("%s: closing output stream failed\n", __func__);
+            /*if not voice call close input stream*/
+            if (stream->type != QAHW_VOICE_CALL) {
+                rc = qahw_close_input_stream(stream->in_stream);
+                if (rc)
+                    ALOGE("%s: closing output stream failed\n", __func__);
+            }
+            break;
+        default:
+            ALOGE("%s: invalid dir close failed\n", __func__);
+        }
+    } else
+        ALOGE("%s: null stream handle\n", __func__);
+
+    free(stream->vol.vol_pair);
+    free(stream);
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_start(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_audio_stream_type type;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if (!stream) {
+        ALOGE("%d:%s invalid stream handle", __LINE__, __func__);
+        return rc;
+    }
+    /*set call state and call mode for voice */
+    if (stream->type == QAHW_VOICE_CALL) {
+        rc = qahw_set_mode(stream->hw_module, AUDIO_MODE_IN_CALL);
+    }
+
+    qahw_stream_set_device(stream, stream->num_of_devices, stream->devices);
+    memset(&devices[0], 0, sizeof(devices));
+    memcpy(&devices[0], &stream->devices[0], stream->num_of_devices);
+    qahw_stream_set_device(stream, stream->num_of_devices, &devices[0]);
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_stop(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_audio_stream_type type;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    /*reset call state and call mode for voice */
+    if (stream->type == QAHW_VOICE_CALL) {
+        rc = qahw_set_parameters(stream->hw_module, "call_state=1");
+        rc = qahw_set_mode(stream->hw_module, AUDIO_MODE_NORMAL);
+    }
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_set_device(qahw_stream_handle_t *stream_handle,
+                    uint32_t num_of_devices,
+                    qahw_device_t *devices) {
+    int rc = -EINVAL;
+    char dev_s[QAHW_MAX_INT_STRING];
+    char device_route[QAHW_MAX_INT_STRING];
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    bool is_voice = false;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    strlcpy(device_route, "routing=", QAHW_MAX_INT_STRING);
+
+    if (stream && num_of_devices && devices) {
+        if (stream->type == QAHW_VOICE_CALL)
+            is_voice = true;
+
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (num_of_devices != 1 || !devices) {
+                ALOGE("%s: invalid device params\n", __func__);
+                return rc;
+            }
+
+            snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[0]);
+            strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+            rc = qahw_out_set_parameters(stream->out_stream,
+                                         device_route);
+            break;
+        case QAHW_STREAM_INPUT:
+            if (num_of_devices != 1 || !devices) {
+                ALOGE("%s: invalid device params\n", __func__);
+                return rc;
+            }
+
+            snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[0]);
+            strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+            rc = qahw_in_set_parameters(stream->in_stream,
+                                        device_route);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (!devices) {
+                ALOGE("%s: invalid device params\n", __func__);
+                return rc;
+            }
+            snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[0]);
+            strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+            rc = qahw_out_set_parameters(stream->out_stream,
+                                         device_route);
+            if (rc)
+                ALOGE("%s: failed to set out device\n", __func__);
+            /*if not voice set input stream*/
+            if (!is_voice) {
+                strlcpy(device_route, "routing=", QAHW_MAX_INT_STRING);
+                snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[1]);
+                strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+                rc = qahw_in_set_parameters(stream->in_stream,
+                                            device_route);
+                if (rc)
+                    ALOGE("%s: failed to set in device\n", __func__);
+            }
+            break;
+        default:
+            ALOGE("%s: invalid dir close failed\n", __func__);
+        }
+    }
+
+    if (!rc)
+    {
+        stream->num_of_devices = num_of_devices;
+        memset(&stream->devices[0], 0, sizeof(stream->devices));
+        memcpy(&stream->devices[0], devices, num_of_devices);
+    }
+
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_get_device(qahw_stream_handle_t *stream_handle, uint32_t *num_of_dev,
+                    qahw_device_t **devices) {
+    int rc = 0;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if (stream && num_of_dev && devices) {
+        *num_of_dev = stream->num_of_devices;
+        *devices = stream->devices;
+    } else {
+        ALOGE("%s: invalid params\n", __func__);
+        rc = -EINVAL;
+    }
+
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_set_volume(qahw_stream_handle_t *stream_handle,
+                           struct qahw_volume_data vol_data) {
+    int rc = -EINVAL;
+    qahw_audio_stream_type type;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    float left;
+    float right;
+    bool l_found = false;
+    bool r_found = false;
+    int i;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if(stream) {
+        /*currently max 2 channels is supported */
+        if ( vol_data.num_of_channels > QAHW_CHANNELS_MAX) {
+           return -ENOTSUP;
+        }
+
+        /*set voice call vol*/
+        if (stream->type == QAHW_VOICE_CALL &&
+            (vol_data.vol_pair && (vol_data.num_of_channels == 1))) {
+            ALOGV("%s: calling voice set volume with vol value %f\n",
+                  __func__, vol_data.vol_pair[0].vol);
+            rc = qahw_set_voice_volume(stream->hw_module,
+                                       vol_data.vol_pair[0].vol);
+            /* Voice Stream picks up only single channel */
+            stream->vol.num_of_channels = vol_data.num_of_channels;
+            stream->vol.vol_pair[0] = vol_data.vol_pair[0];
+        } /*currently HAL requires 2 channels only */
+        else if (vol_data.num_of_channels == QAHW_CHANNELS_MAX &&
+                   vol_data.vol_pair) {
+            for(i=0; i < vol_data.num_of_channels; i++) {
+                if(vol_data.vol_pair[i].channel == QAHW_CHANNEL_L) {
+                    left = vol_data.vol_pair[i].vol;
+                    l_found = true;
+                }
+                if(vol_data.vol_pair[i].channel == QAHW_CHANNEL_R) {
+                    right = vol_data.vol_pair[i].vol;
+                    r_found = true;
+                }
+            }
+            if(l_found && r_found) {
+                rc = qahw_out_set_volume(stream->out_stream,
+                                         left, right);
+                /* Cache volume if applied successfully */
+                if (!rc) {
+                    for(i=0; i < vol_data.num_of_channels; i++) {
+                        stream->vol.vol_pair[i] = vol_data.vol_pair[i];
+                    }
+                }
+            } else
+                ALOGE("%s: setting vol requires left and right channel vol\n",
+                      __func__);
+        } else {
+            ALOGE("%s: invalid input \n", __func__);
+        }
+    } else
+        ALOGE("%s: null stream handle\n", __func__);
+
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_get_volume(qahw_stream_handle_t *stream_handle,
+                           struct qahw_volume_data **vol_data) {
+    int rc = 0;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if (stream)
+        *vol_data = &stream->vol;
+    else
+        rc = -EINVAL;
+
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+char *qahw_get_device_mute_info(struct qahw_mute_data mute) {
+    int i = 0;
+    char *ret = NULL;
+
+    for (i=0; i < QAHW_NUM_OF_MUTE_TYPES; i++) {
+        if ((mute.enable == mute_info[i].mute.enable) &&
+            (mute.direction == mute_info[i].mute.direction)) {
+            ret = mute_info[i].mute_state;
+            break;
+        }
+    }
+    ALOGV("%s mute_state %s \n", __func__, ret == NULL ? "null" : ret);
+
+    return ret;
+}
+
+int qahw_stream_set_mute(qahw_stream_handle_t *stream_handle,
+                         struct qahw_mute_data mute_data) {
+    int rc = -EINVAL;
+    qahw_module_handle_t *hw_module;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    char *mute_param;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if(stream) {
+        mute_param = qahw_get_device_mute_info(mute_data);
+
+        if (mute_param == NULL)
+            return rc;
+
+        rc = qahw_set_parameters(stream->hw_module, mute_param);
+
+        if(!rc){
+            switch(mute_data.direction) {
+                case QAHW_STREAM_INPUT_OUTPUT:
+                    stream->out_mute.enable = mute_data.enable;
+                    stream->in_mute.enable = mute_data.enable;
+                    break;
+                case QAHW_STREAM_OUTPUT:
+                    stream->out_mute.enable = mute_data.enable;
+                    break;
+                case QAHW_STREAM_INPUT:
+                    stream->in_mute.enable = mute_data.enable;
+                    break;
+                default:
+                    ALOGE("%s: invalid dir mute failed\n", __func__);
+                    break;
+            }
+        }
+    }
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_get_mute(qahw_stream_handle_t *stream_handle,
+                         struct qahw_mute_data *mute_data) {
+    int rc = 0;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+    ALOGV("%d:%s start",__LINE__, __func__);
+    if(stream && mute_data){
+            switch(mute_data->direction) {
+                case QAHW_STREAM_OUTPUT:
+                    mute_data->enable = stream->out_mute.enable;
+                    break;
+                case QAHW_STREAM_INPUT:
+                    mute_data->enable = stream->in_mute.enable;
+                    break;
+                default:
+                    ALOGE("%s: invalid mute dir get failed\n", __func__);
+                    rc = -EINVAL;
+                    break;
+            }
+    }
+
+    ALOGV("%d:%s end",__LINE__, __func__);
+    return rc;
+}
+
+ssize_t qahw_stream_read(qahw_stream_handle_t *stream_handle,
+                         qahw_buffer_t *in_buf) {
+    ssize_t rc = 0;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    qahw_in_buffer_t buff;
+
+    if(in_buf) {
+        buff.buffer = in_buf->buffer;
+        buff.bytes = in_buf->size;
+        buff.offset = in_buf->offset;
+        buff.timestamp = in_buf->timestamp;
+    }
+
+    if (stream && stream->in_stream) {
+        rc = qahw_in_read(stream->in_stream, &buff);
+    } else {
+        ALOGE("%d:%s input stream invalid, read failed", __LINE__, __func__);
+        rc = -ENODEV;
+    }
+    return rc;
+}
+
+ssize_t qahw_stream_write(qahw_stream_handle_t *stream_handle,
+                   qahw_buffer_t *out_buf) {
+    ssize_t rc = 0;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    qahw_out_buffer_t buff;
+
+    if(out_buf) {
+        buff.buffer = out_buf->buffer;
+        buff.bytes = out_buf->size;
+        buff.offset = out_buf->offset;
+        buff.timestamp = out_buf->timestamp;
+        buff.flags = out_buf->flags;
+    }
+
+    if (stream && stream->out_stream) {
+        rc = qahw_out_write(stream->out_stream, &buff);
+    } else {
+        ALOGE("%d:%s out stream invalid, write failed", __LINE__, __func__);
+        rc = -ENODEV;
+    }
+    return rc;
+}
+
+int qahw_stream_standby(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_standby(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot put in standby"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT:
+            if (stream->in_stream)
+                rc = qahw_in_standby(stream->in_stream);
+            else
+                ALOGE("%d:%s in stream invalid, cannot put in standby"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (stream->in_stream)
+                rc = qahw_in_standby(stream->in_stream);
+            else
+                ALOGE("%d:%s in stream invalid, cannot put in standby"
+                      , __LINE__, __func__);
+            if (stream->out_stream)
+                rc = qahw_out_standby(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot put in standby"
+                      , __LINE__, __func__);
+            break;
+        }
+    } else
+        ALOGE("%d:%s invalid stream handle, standby failed"
+              , __LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_pause(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_pause(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot put in pause"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT:
+                ALOGE("%d:%s cannot pause input stream"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_pause(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot put in pause"
+                      , __LINE__, __func__);
+            break;
+        }
+    } else
+        ALOGE("%d:%s invalid stream handle, pause failed"
+              , __LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_resume(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_resume(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot put in resume"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT:
+                ALOGE("%d:%s cannot resume input stream"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_resume(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot put in resume"
+                      , __LINE__, __func__);
+            break;
+        }
+    } else
+        ALOGE("%d:%s invalid stream handle, resume failed"
+              , __LINE__, __func__);
+    return rc;
+}
+
+int qahw_stream_flush(qahw_stream_handle_t *stream_handle) {
+    int rc = -EINVAL;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_flush(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot flush"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT:
+                ALOGE("%d:%s cannot flush input stream"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_flush(stream->out_stream);
+            else
+                ALOGE("%d:%s out stream invalid, cannot flush"
+                      , __LINE__, __func__);
+            break;
+        }
+    } else
+        ALOGE("%d:%s invalid stream handle, flush failed"
+              , __LINE__, __func__);
+    return rc;
+}
+
+int32_t qahw_stream_drain(qahw_stream_handle_t *stream_handle,
+                          qahw_drain_type_t type) {
+    int rc = -EINVAL;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_drain(stream->out_stream, type);
+            else
+                ALOGE("%d:%s out stream invalid, cannot drain"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT:
+                ALOGE("%d:%s cannot drain input stream"
+                      , __LINE__, __func__);
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (stream->out_stream)
+                rc = qahw_out_drain(stream->out_stream, type);
+            else
+                ALOGE("%d:%s out stream invalid, cannot drain"
+                      , __LINE__, __func__);
+            break;
+        }
+    } else
+        ALOGE("%d:%s invalid stream handle, drain failed"
+              , __LINE__, __func__);
+    return rc;
+}
+
+int32_t qahw_stream_get_buffer_size(const qahw_stream_handle_t *stream_handle,
+                                   size_t *in_buffer, size_t *out_buffer) {
+    int32_t rc = 0;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+    if (stream) {
+        switch (stream->dir) {
+        case QAHW_STREAM_OUTPUT:
+            if (stream->out_stream)
+                *out_buffer = qahw_out_get_buffer_size(stream->out_stream);
+            else {
+                ALOGE("%d:%s out stream invalid, cannot get size"
+                      , __LINE__, __func__);
+                rc = -EINVAL;
+            }
+            break;
+        case QAHW_STREAM_INPUT:
+            if (stream->in_stream)
+                *in_buffer = qahw_in_get_buffer_size(stream->in_stream);
+            else {
+                ALOGE("%d:%s in stream invalid, cannot get size"
+                      , __LINE__, __func__);
+                rc = -EINVAL;
+            }
+            break;
+        case QAHW_STREAM_INPUT_OUTPUT:
+            if (stream->out_stream)
+                *out_buffer = qahw_out_get_buffer_size(stream->out_stream);
+            else {
+                ALOGE("%d:%s out stream invalid, cannot get size"
+                      , __LINE__, __func__);
+                rc = -EINVAL;
+            }
+            if (stream->in_stream)
+                *in_buffer = qahw_in_get_buffer_size(stream->in_stream);
+            else {
+                ALOGE("%d:%s in stream invalid, cannot get size"
+                      , __LINE__, __func__);
+                rc = -EINVAL;
+            }
+            break;
+        default:
+            ALOGE("%d:%s invalid stream direction, cannot get size", __LINE__, __func__);
+            rc = -EINVAL;
+            break;
+        }
+    } else {
+        ALOGE("%d:%s invalid stream handle, get size failed failed"
+              , __LINE__, __func__);
+        rc = -EINVAL;
+    }
+    ALOGV("%d:%s inSz %d outSz %d ret 0x%8x", __LINE__, __func__, *in_buffer, *out_buffer, rc);
+    return rc;
+}
+
+int32_t qahw_stream_set_buffer_size(const qahw_stream_handle_t *stream_handle,
+                                   size_t in_buffer, size_t out_buffer){
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_set_dtmf_gen_params(qahw_api_stream_t *stream,
+                                      struct qahw_dtmf_gen_params *dtmf_params){
+    int32_t rc = -EINVAL;
+    char kv[QAHW_KV_PAIR_LENGTH];
+
+    if(stream->type == QAHW_VOICE_CALL) {
+        if(dtmf_params->enable) {
+            snprintf(kv, QAHW_KV_PAIR_LENGTH,
+                     "dtmf_low_freq=%d;dtmf_high_freq=%d;dtmf_tone_gain=%d",
+                     dtmf_params->low_freq,
+                     dtmf_params->high_freq,
+                     dtmf_params->gain);
+           ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+        } else
+            snprintf(kv, QAHW_KV_PAIR_LENGTH, "dtmf_tone_off");
+        rc = qahw_out_set_parameters(stream->out_stream,kv);
+    } else
+        ALOGE("%d:%s cannot set dtmf on non voice stream", __LINE__, __func__);
+    return rc;
+}
+
+int32_t qahw_stream_set_tty_mode_params(qahw_api_stream_t *stream,
+                                       struct qahw_tty_params *tty_params){
+    int32_t rc = -EINVAL;
+
+    if(stream->type == QAHW_VOICE_CALL) {
+        if(tty_params->mode >= QAHW_TTY_MODE_MAX) {
+            ALOGE("%d:%s invalid tty mode", __LINE__, __func__);
+            return rc;
+        }
+
+        ALOGV("%d:%s kv set is %s", __LINE__, __func__,
+              tty_mode_map[tty_params->mode]);
+        /*currently tty is set on the dev */
+        rc = qahw_set_parameters(stream->hw_module,
+                                 tty_mode_map[tty_params->mode]);
+    } else
+        ALOGE("%d:%s cannot set tty mode on non voice stream", __LINE__,
+              __func__);
+    return rc;
+}
+
+int32_t qahw_stream_set_hpcm_params(qahw_api_stream_t *stream,
+                                    struct qahw_hpcm_params *hpcm_params){
+    int32_t rc = -EINVAL;
+    char kv[QAHW_KV_PAIR_LENGTH];
+    int32_t tp;
+
+    if(stream->type == QAHW_VOICE_CALL) {
+        /*if rx and tx call both mixer commands */
+        if(hpcm_params->tap_point == QAHW_HPCM_TAP_POINT_RX_TX) {
+            snprintf(kv, QAHW_KV_PAIR_LENGTH,
+                     "hpcm_tp=%d;hpcm_dir=%d",
+                     QAHW_HPCM_TAP_POINT_RX,
+                     hpcm_params->direction);
+            ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+            rc = qahw_out_set_parameters(stream->out_stream, kv);
+            if(rc) {
+                ALOGE("%d:%s failed to set hpcm on RX Path", __LINE__,
+                __func__);
+            }
+            snprintf(kv, QAHW_KV_PAIR_LENGTH,
+                     "hpcm_tp=%d;hpcm_dir=%d",
+                     QAHW_HPCM_TAP_POINT_TX,
+                     hpcm_params->direction);
+            ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+            rc = qahw_out_set_parameters(stream->out_stream, kv);
+            if(rc) {
+                ALOGE("%d:%s failed to set hpcm on TX Path", __LINE__,
+                __func__);
+            }
+        } else {
+            snprintf(kv, QAHW_KV_PAIR_LENGTH,
+                     "hpcm_tp=%d;hpcm_dir=%d",
+                     hpcm_params->tap_point,
+                     hpcm_params->direction);
+            ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+            rc = qahw_out_set_parameters(stream->out_stream, kv);
+            if(rc) {
+                ALOGE("%d:%s failed to set hpcm params", __LINE__,
+                __func__);
+            }
+        }
+    } else
+        ALOGE("%d:%s cannot set hpcm params on non voice stream",
+              __LINE__, __func__);
+    return rc;
+}
+
+int32_t qahw_stream_set_parameters(qahw_stream_handle_t *stream_handle,
+                                   uint32_t param_id,
+                                   qahw_param_payload *param_payload) {
+    int32_t rc = -EINVAL;
+    qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+    if(stream && param_payload) {
+        switch(param_id){
+            case QAHW_PARAM_DTMF_GEN:
+                rc = qahw_stream_set_dtmf_gen_params(stream,
+                                               &param_payload->dtmf_gen_params);
+                break;
+            case QAHW_PARAM_TTY_MODE:
+                rc = qahw_stream_set_tty_mode_params(stream,
+                                               &param_payload->tty_mode_params);
+                break;
+            case QAHW_PARAM_HPCM:
+                rc = qahw_stream_set_hpcm_params(stream,
+                                                 &param_payload->hpcm_params);
+                break;
+            default:
+            ALOGE("%d:%s unsupported param id %d"
+                  ,__LINE__, __func__, param_id);
+            break;
+        }
+    } else
+        ALOGE("%d:%s invalid stream handle, cannot set param"
+              , __LINE__, __func__);
+    return rc;
+}
+
+int32_t qahw_stream_get_parameters(qahw_stream_handle_t *stream_handle,
+                                   uint32_t param_id,
+                                   qahw_param_payload *param_payload) {
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+#else
+int qahw_stream_open(qahw_module_handle_t *hw_module,
+                     struct qahw_stream_attributes attr,
+                     uint32_t num_of_devices,
+                     qahw_device_t *devices,
+                     uint32_t no_of_modifiers,
+                     struct qahw_modifier_kv *modifiers,
+                     qahw_stream_callback_t cb,
+                     void *cookie,
+                     qahw_stream_handle_t **stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_close(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_start(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_stop(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_set_device(qahw_stream_handle_t *stream_handle,
+                           uint32_t num_of_dev,
+                    qahw_device_t *devices){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_get_device(qahw_stream_handle_t *stream_handle,
+                           uint32_t *num_of_dev,
+                           qahw_device_t **devices){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_set_volume(qahw_stream_handle_t *stream_handle,
+                           struct qahw_volume_data vol_data){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_get_volume(qahw_stream_handle_t *stream_handle,
+                           struct qahw_volume_data **vol_data){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_set_mute(qahw_stream_handle_t *stream_handle,
+                         struct qahw_mute_data mute_data){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int qahw_stream_get_mute(qahw_stream_handle_t *stream_handle,
+                         struct qahw_mute_data *mute_data){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+ssize_t qahw_stream_read(qahw_stream_handle_t *stream_handle,
+                         qahw_buffer_t *in_buf){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+ssize_t qahw_stream_write(qahw_stream_handle_t *stream_handle,
+                          qahw_buffer_t *out_buf){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_pause(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_standby(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_resume(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_flush(qahw_stream_handle_t *stream_handle){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_drain(qahw_stream_handle_t *stream_handle,
+                          qahw_drain_type_t type){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_get_buffer_size(const qahw_stream_handle_t *stream_handle,
+                                    size_t *in_buffer, size_t *out_buffer){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_set_buffer_size(const qahw_stream_handle_t *stream_handle,
+                                    size_t in_buffer, size_t out_buffer){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_set_parameters(qahw_stream_handle_t *stream_handle,
+                              uint32_t param_id,
+                              qahw_param_payload *param_payload){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+
+int32_t qahw_stream_get_parameters(qahw_stream_handle_t *stream_handle,
+                              uint32_t param_id,
+                              qahw_param_payload *param_payload){
+    ALOGE("%s is an unsupported api", __func__);
+    return -ENOTSUP;
+}
+#endif
+
 #endif
diff --git a/qahw_api/test/Makefile.am b/qahw_api/test/Makefile.am
index 40cc24a..97e7438 100644
--- a/qahw_api/test/Makefile.am
+++ b/qahw_api/test/Makefile.am
@@ -41,3 +41,27 @@
 trans_loopback_test_CFLAGS  = $(AM_CFLAGS) -Wno-sign-compare -Werror
 trans_loopback_test_CFLAGS  += $(trans_loopback_test_INCLUDES)
 trans_loopback_test_LDADD = -llog  -lutils ../libqahw.la -lcutils -lm
+
+if QAHW_V1
+bin_PROGRAMS += hal_voice_test
+
+VOICE_CFLAGS = -Wno-sign-compare -Werror
+VOICE_CFLAGS += -D__unused=__attribute__\(\(__unused__\)\)
+VOICE_INCLUDES = -I $(top_srcdir)/qahw_api/inc
+VOICE_INCLUDES += -I $(top_srcdir)/qahw/inc
+
+hal_voice_test_SOURCES = qahw_voice_test.c
+
+hal_voice_test_LDADD = -lutils ../libqahw.la
+AM_CFLAGS = -I $(PKG_CONFIG_SYSROOT_DIR)/usr/include/mm-audio/qahw/inc
+
+if QAP
+AM_CFLAGS += -DQAP
+AM_CFLAGS += -I ${WORKSPACE}/audio/mm-audio/qap_wrapper/inc/
+hal_voice_test_SOURCES += qap_wrapper_extn.c
+hal_voice_test_LDADD += -lqap_wrapper
+endif
+
+hal_voice_test_CFLAGS = $(VOICE_CFLAGS) $(VOICE_INCLUDES)
+hal_voice_test_CFLAGS += $(AM_CFLAGS) -DLINUX_ENABLED
+endif
diff --git a/qahw_api/test/qahw_voice_test.c b/qahw_api/test/qahw_voice_test.c
new file mode 100644
index 0000000..96da2c6
--- /dev/null
+++ b/qahw_api/test/qahw_voice_test.c
@@ -0,0 +1,675 @@
+/*
+* Copyright (c) 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.
+*/
+
+/* Test app for voice call */
+
+#include "qahw_voice_test.h"
+
+#define ID_RIFF 0x46464952
+#define ID_WAVE 0x45564157
+#define ID_FMT  0x20746d66
+#define ID_DATA 0x61746164
+
+#define FORMAT_PCM 1
+#define WAV_HEADER_LENGTH_MAX 128
+#define FORMAT_DESCRIPTOR_SIZE 12
+#define SUBCHUNK1_SIZE(x) ((8) + (x))
+#define SUBCHUNK2_SIZE 8
+
+voice_stream_config stream_params;
+volatile bool stop = false;
+void *context = NULL;
+
+struct wav_header {
+    uint32_t riff_id;
+    uint32_t riff_sz;
+    uint32_t riff_fmt;
+    uint32_t fmt_id;
+    uint32_t fmt_sz;
+    uint16_t audio_format;
+    uint16_t num_channels;
+    uint32_t sample_rate;
+    uint32_t byte_rate;       /* sample_rate * num_channels * bps / 8 */
+    uint16_t block_align;     /* num_channels * bps / 8 */
+    uint16_t bits_per_sample;
+    uint32_t data_id;
+    uint32_t data_sz;
+};
+
+static void init_stream(void) {
+    stream_params.vsid = "11C05000";
+    stream_params.qahw_mod_handle = NULL;
+    stream_params.call_length = -1; /*infinite*/
+    stream_params.multi_call = 1;
+    stream_params.output_device[0] = AUDIO_DEVICE_OUT_WIRED_HEADSET;
+    stream_params.output_device[1] = AUDIO_DEVICE_IN_BUILTIN_MIC;
+    stream_params.in_call_rec = false;
+    stream_params.in_call_playback = false;
+    stream_params.hpcm = false;
+    stream_params.hpcm_tp = 2;
+    stream_params.tp_dir = 0;
+    stream_params.rec_file = "/data/default_rec.wav";
+    stream_params.playback_file = NULL;
+    stream_params.vol = .75;
+    stream_params.mute = false;
+    stream_params.mute_dir = 0;
+    stream_params.tty_mode = 0;
+    stream_params.dtmf_gen_enable = 0;
+    stream_params.dtmf_freq_low = 697;
+    stream_params.dtmf_freq_high =  1209;
+    stream_params.dtmf_gain = 100;
+}
+
+void usage() {
+    printf(" \n Command \n");
+    printf(" \n hal_voice_test <options>   - starts voice call\n");
+    printf(" \n Options\n");
+    printf(" -i  --vsid <vsid>                   - vsid to use sim1<297816064> sim2<29965107>.\n");
+    printf(" -d  --device <decimal value>        - see system/media/audio/include/system/audio.h for device values\n");
+    printf(" -l  --length <call length>          - call length in sec.\n");
+    printf(" -m  --multi_call <number of calls>  - number of calls to make.\n");
+    printf(" -r  --in_call_rec <filename to record to> -t  - tp_dir <0 = DL, 1 = UL, 2 = BOTH >\n");
+    printf(" -p  --in_call_playback <filename to play from>  play audio to voice call\n");
+    printf(" -v  --vol <val>               - volume.\n");
+    printf(" -u  --mute <dir>              - <dir 0= tx, 1 = rx> .\n");
+    printf(" -c  --dtmf_gen                                     .\n");
+    printf(" -y  --tty_mode                - <MODE_OFF = 0, MODE_FULL = 1, MODE_VCO  = 2, MODE_HCO = 3\n");
+}
+
+void stop_signal_handler(int signal __unused) {
+    stop = true;
+}
+
+static void qti_audio_server_death_notify_cb(void *ctxt __unused) {
+    fprintf(stderr, "qas died\n");
+    stop = true;
+}
+
+void *rec_start(void *thread_param) {
+    uint32_t rc = 0;
+    voice_stream_config *params = (voice_stream_config *)thread_param;
+    qahw_module_handle_t *qahw_mod_handle = params->qahw_mod_handle;
+    qahw_stream_handle_t *in_handle = NULL;
+    uint32_t num_dev = 1;
+    audio_devices_t in_device[1] = { AUDIO_DEVICE_IN_BUILTIN_MIC };
+    struct qahw_stream_attributes attr;
+    qahw_buffer_t in_buf;
+    int data_sz = 0;
+    ssize_t bytes_read = -1;
+
+    fprintf(stderr, "%s starting rec thread\n", __func__);
+    if (qahw_mod_handle == NULL) {
+        fprintf(stderr, " qahw_load_module failed\n");
+        pthread_exit(0);
+    }
+    if(params->in_call_rec) {
+        fprintf(stderr, " setting in call record params\n");
+        switch (params->tp_dir) {
+        case 0:
+            attr.type = QAHW_AUDIO_CAPTURE_VOICE_CALL_RX;
+            break;
+        case 1:
+            attr.type = QAHW_AUDIO_CAPTURE_VOICE_CALL_TX;
+            break;
+        default:
+            fprintf(stderr, " invalid tp direction");
+            pthread_exit(0);
+            break;
+        }
+            attr.attr.audio.config.sample_rate = 48000;
+    }
+    if(params->hpcm) {
+        fprintf(stderr, "setting host pcm params\n");
+        switch(params->hpcm_tp) {
+            case QAHW_HPCM_TAP_POINT_RX:
+                attr.type = QAHW_AUDIO_HOST_PCM_RX;
+                break;
+            case QAHW_HPCM_TAP_POINT_TX:
+                attr.type = QAHW_AUDIO_HOST_PCM_TX;
+                break;
+            default:
+                fprintf(stderr, "unsupported tp %d\n", params->hpcm_tp);
+                pthread_exit(0);
+                break;
+        }
+        attr.attr.audio.config.sample_rate = 8000;
+    }
+    attr.direction = QAHW_STREAM_INPUT;
+    attr.attr.audio.config.format = AUDIO_FORMAT_PCM_16_BIT;
+
+    rc = qahw_stream_open(qahw_mod_handle,
+                          attr,
+                          num_dev,
+                          in_device,
+                          0,
+                          NULL,
+                          NULL,
+                          NULL,
+                          &(in_handle));
+    if (rc) {
+        fprintf(stderr, " open input device failed!\n");
+        pthread_exit(0);
+    }
+
+    /* Get buffer size to get upper bound on data to read from the HAL */
+    size_t buffer_size;
+    rc = qahw_stream_get_buffer_size(in_handle, &buffer_size, NULL);
+    char *buffer = (char *)calloc(1, buffer_size);
+    size_t written_size;
+    int bps = 16;
+
+    if (buffer == NULL) {
+        fprintf(stderr, "calloc failed!!, handle(%d)\n", in_handle);
+        pthread_exit(0);
+    }
+    if (params->rec_file == NULL) {
+        fprintf(stderr, "no record stream provided\n", in_handle);
+        pthread_exit(0);
+        return NULL;
+    }
+    FILE *fd = fopen(params->rec_file, "w");
+    if (fd == NULL) {
+        fprintf(stderr, "File open failed \n");
+        free(buffer);
+        pthread_exit(0);
+    }
+    struct wav_header hdr;
+    hdr.riff_id = ID_RIFF;
+    hdr.riff_sz = 0;
+    hdr.riff_fmt = ID_WAVE;
+    hdr.fmt_id = ID_FMT;
+    hdr.fmt_sz = 16;
+    hdr.audio_format = FORMAT_PCM;
+    hdr.num_channels = 1;
+    hdr.sample_rate = attr.attr.audio.config.sample_rate;
+    hdr.byte_rate = hdr.sample_rate * hdr.num_channels * (bps / 8);
+    hdr.block_align = hdr.num_channels * (bps / 8);
+    hdr.bits_per_sample = bps;
+    hdr.data_id = ID_DATA;
+    hdr.data_sz = 0;
+    fwrite(&hdr, 1, sizeof(hdr), fd);
+
+    memset(&in_buf, 0, sizeof(qahw_buffer_t));
+    fprintf(stderr, "file %s opened for write", params->rec_file);
+    while (true && !stop) {
+        in_buf.buffer = buffer;
+        in_buf.size = buffer_size;
+
+        bytes_read = qahw_stream_read(in_handle, &in_buf);
+
+        written_size = fwrite(in_buf.buffer, 1, buffer_size, fd);
+        if (written_size < buffer_size) {
+            fprintf(stderr, "Error in fwrite\n");
+            break;
+        }
+        data_sz += buffer_size;
+    }
+    fprintf(stderr, "rec ended\n");
+    /* update lengths in header */
+    hdr.data_sz = data_sz;
+    hdr.riff_sz = data_sz + 44 - 8;
+    fseek(fd, 0, SEEK_SET);
+    fwrite(&hdr, 1, sizeof(hdr), fd);
+    free(buffer);
+    fclose(fd);
+    fd = NULL;
+    fprintf(stderr, " closing input, handle(%d)", in_handle);
+
+    /* Close input stream and device. */
+    rc = qahw_stream_standby(in_handle);
+    if (rc) {
+        fprintf(stderr, "out standby failed %d, handle(%d)\n", rc, in_handle);
+    }
+
+    rc = qahw_stream_close(in_handle);
+    if (rc) {
+        fprintf(stderr, "could not close input stream %d, handle(%d)\n", rc, in_handle);
+    }
+
+    /* Print instructions to access the file.
+     * Caution: Below ADL log shouldnt be altered without notifying automation APT since it used for
+     * automation testing
+     */
+    fprintf(stderr, "\n\n ADL: The audio recording has been saved to %s. Please use adb pull to get "
+            "the file and play it using audacity. The audio data has the "
+            "following characteristics:\n Sample rate: %i\n Format: %d\n "
+            "Num channels: %i\n\n",
+            params->rec_file, attr.attr.audio.config.sample_rate, attr.attr.audio.config.format, 1);
+    pthread_exit(0);
+
+    return NULL;
+}
+
+int get_wav_header_length(FILE *file_stream) {
+    int subchunk_size = 0;
+    int wav_header_len = 0;
+
+    fseek(file_stream, 16, SEEK_SET);
+    if (fread(&subchunk_size, 4, 1, file_stream) != 1) {
+        fprintf(stderr, "Unable to read subchunk:\n");
+        exit(1);
+    }
+    if (subchunk_size < 16) {
+        fprintf(stderr, "This is not a valid wav file \n");
+    } else {
+        wav_header_len = FORMAT_DESCRIPTOR_SIZE + SUBCHUNK1_SIZE(subchunk_size) + SUBCHUNK2_SIZE;
+    }
+    return wav_header_len;
+}
+
+void *playback_start(void *thread_param) {
+    uint32_t rc = 0;
+    voice_stream_config *params = (voice_stream_config *)thread_param;
+    qahw_module_handle_t *qahw_mod_handle = params->qahw_mod_handle;
+    qahw_stream_handle_t *out_handle = NULL;
+    uint32_t num_dev = 1;
+    audio_devices_t out_device[1] = { AUDIO_DEVICE_OUT_WIRED_HEADSET };
+    struct qahw_stream_attributes attr;
+    size_t bytes_wanted = 0;
+    size_t write_length = 0;
+    size_t bytes_remaining = 0;
+    ssize_t bytes_written = 0;
+    FILE *fp = NULL;
+    size_t bytes_read = 0;
+    qahw_buffer_t out_buf;
+    char  *data_ptr = NULL;
+    bool exit = false;
+    bool read_complete_file = true;
+    int wav_header_len;
+    char header[WAV_HEADER_LENGTH_MAX] = { 0 };
+
+    if (qahw_mod_handle == NULL) {
+        fprintf(stderr, " qahw_load_module failed");
+        pthread_exit(0);
+    }
+
+    attr.direction = QAHW_STREAM_OUTPUT;
+    if(params->in_call_playback) {
+        attr.type = QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC;
+        attr.attr.audio.config.sample_rate = 48000;
+        attr.attr.audio.config.format = AUDIO_FORMAT_PCM_16_BIT;
+    }
+    if(params->hpcm) {
+        switch(params->hpcm_tp) {
+            case QAHW_HPCM_TAP_POINT_RX:
+                attr.type = QAHW_AUDIO_HOST_PCM_RX;
+                break;
+            case QAHW_HPCM_TAP_POINT_TX:
+                attr.type = QAHW_AUDIO_HOST_PCM_TX;
+                break;
+            default:
+                fprintf(stderr, "unsupported tp %d\n", params->hpcm_tp);
+                pthread_exit(0);
+                break;
+        }
+        attr.attr.audio.config.sample_rate = 8000;
+        attr.attr.audio.config.format = AUDIO_FORMAT_PCM_16_BIT;
+    }
+
+
+    if (params->playback_file != NULL)
+        fp = fopen(params->playback_file, "r");
+    if (fp == NULL) {
+        fprintf(stderr, "failed to open file %s\n", params->playback_file);
+        pthread_exit(0);
+    }
+    /*
+    * Read the wave header
+    */
+    if ((wav_header_len = get_wav_header_length(fp)) <= 0) {
+        fprintf(stderr, "wav header length is invalid:%d\n", wav_header_len);
+        pthread_exit(0);
+    }
+    fseek(fp, 0, SEEK_SET);
+    rc = fread(header, wav_header_len, 1, fp);
+    if (rc != 1) {
+        fprintf(stderr, "Error fread failed\n");
+        pthread_exit(0);
+    }
+    if (strncmp(header, "RIFF", 4) && strncmp(header + 8, "WAVE", 4)) {;
+        fprintf(stderr, "Not a wave format\n");
+        pthread_exit(0);
+    }
+    //memcpy (&stream_info->channels, &header[22], 2);
+    memcpy(&attr.attr.audio.config.offload_info.sample_rate, &header[24], 4);
+    memcpy(&attr.attr.audio.config.offload_info.bit_width, &header[34], 2);
+    if (attr.attr.audio.config.offload_info.bit_width == 32)
+        attr.attr.audio.config.offload_info.format = AUDIO_FORMAT_PCM_32_BIT;
+    else if (attr.attr.audio.config.offload_info.bit_width == 24)
+        attr.attr.audio.config.offload_info.format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
+    else
+        attr.attr.audio.config.offload_info.format = AUDIO_FORMAT_PCM_16_BIT;
+
+    attr.attr.audio.config.sample_rate = attr.attr.audio.config.offload_info.sample_rate;
+    attr.attr.audio.config.format = attr.attr.audio.config.offload_info.format;
+
+    rc = qahw_stream_open(qahw_mod_handle,
+                          attr,
+                          num_dev,
+                          out_device,
+                          0,
+                          NULL,
+                          NULL,
+                          NULL,
+                          &(out_handle));
+
+    if (rc) {
+        fprintf(stderr, " open output device failed!\n");
+        pthread_exit(0);
+    }
+    rc = qahw_stream_get_buffer_size(out_handle ,NULL, &bytes_wanted);
+    data_ptr = (char *)malloc(bytes_wanted);
+    if (data_ptr == NULL) {
+        fprintf(stderr, "failed to allocate data buffer\n");
+        pthread_exit(0);
+    }
+
+    while (!exit && !stop) {
+        if (!bytes_remaining) {
+            bytes_read = fread(data_ptr, 1, bytes_wanted, fp);
+            fprintf(stderr, "read bytes %zd\n", bytes_read);
+            bytes_remaining = write_length = bytes_read;
+        }
+
+        bytes_written = bytes_remaining;
+        memset(&out_buf, 0, sizeof(qahw_buffer_t));
+        out_buf.buffer = data_ptr;
+        out_buf.size = bytes_remaining;
+        bytes_written = qahw_stream_write(out_handle, &out_buf);
+        if (bytes_written <= 0) {
+            fprintf(stderr, "write end %d", bytes_written);
+            exit = true;
+            continue;
+        }
+        bytes_remaining -= bytes_written;
+    }
+
+    fclose(fp);
+    if (data_ptr)
+        free(data_ptr);
+
+    qahw_stream_close(out_handle);
+
+    return NULL;
+}
+
+int main(int argc, char *argv[]) {
+
+    uint32_t rc = 0;
+    int opt = 0;
+    int option_index = 0;
+    qahw_stream_direction dir;
+    int call_count = 0;
+    int call_lenght = 0;
+    pthread_t tid_rec;
+    pthread_t tid_pb;
+
+    init_stream();
+
+    struct option long_options[] = {
+        /* These options set a flag. */
+        { "vsid",     required_argument,    0, 'i' },
+        { "device",     required_argument,    0, 'd' },
+        { "call_length",     required_argument,    0, 'l' },
+        { "help",          no_argument,          0, 'h' },
+        { "in_call_playback",  required_argument,  0, 'p' },
+        { "in_call_rec",  required_argument,  0, 'r' },
+        { "host_pcm",  no_argument,  0, 'b' },
+        { "tp_dir",  required_argument,  0, 't' },
+        { "file",  required_argument,  0, 'f' },
+        { "hpcm_tp",  required_argument,  0, 'a' },
+        { "vol",  required_argument,  0, 'v' },
+        { "mute",  required_argument,  0, 'u' },
+        { "tty_mode",  required_argument,  0, 'y' },
+        { "dtmf_gen", no_argument,  0, 'c' },
+        { 0, 0, 0, 0 }
+    };
+
+    while ((opt = getopt_long(argc,
+                              argv,
+                              "-v:d:l:m:p:r:t:f:a:b:h:i:u:y:c:",
+                              long_options,
+                              &option_index)) != -1) {
+
+        fprintf(stderr, "for argument %c, value is %s\n", opt, optarg);
+
+        switch (opt) {
+        case 'i':
+            stream_params.vsid = optarg;
+            break;
+        case 'd':
+            stream_params.output_device[0] = atoll(optarg);
+            break;
+        case 'l':
+            stream_params.call_length = atoll(optarg);
+            break;
+        case 'm':
+            stream_params.multi_call = atoll(optarg);
+            break;
+        case 'p':
+            stream_params.in_call_playback = true;
+            stream_params.playback_file = optarg;
+            break;
+        case 'r':
+            stream_params.in_call_rec = true;
+            stream_params.rec_file = optarg;
+            break;
+        case 'b':
+            stream_params.hpcm = true;
+            break;
+        case 'f':
+            stream_params.playback_file = optarg;
+            break;
+        case 't':
+            stream_params.tp_dir = atoll(optarg);
+            break;
+        case 'a':
+            stream_params.hpcm_tp = atoll(optarg);
+            break;
+        case 'v':
+            stream_params.vol = atof(optarg);
+            break;
+        case 'u':
+            stream_params.mute_dir = atoll(optarg);
+            stream_params.mute = true;
+            break;
+        case 'y':
+            stream_params.tty_mode = atoll(optarg);
+            break;
+        case 'c':
+            stream_params.dtmf_gen_enable = true;
+            break;
+        case 'h':
+        default:
+            usage();
+            return 0;
+        }
+    }
+
+    /* Register the SIGINT to close the App properly */
+    if (signal(SIGINT, stop_signal_handler) == SIG_ERR)
+        fprintf(stderr, "Failed to register SIGINT:%d\n", errno);
+
+    /* Register the SIGTERM to close the App properly */
+    if (signal(SIGTERM, stop_signal_handler) == SIG_ERR)
+        fprintf(stderr, "Failed to register SIGTERM:%d\n", errno);
+
+    qahw_register_qas_death_notify_cb((audio_error_callback)qti_audio_server_death_notify_cb, context);
+
+    fprintf(stderr, "starting voice call\n");
+    if ((stream_params.qahw_mod_handle = qahw_load_module(QAHW_MODULE_ID_PRIMARY)) == NULL) {
+        fprintf(stderr, "failure in Loading primary HAL\n");
+        goto exit;
+    }
+
+    struct qahw_stream_attributes attr;
+
+    attr.type = QAHW_VOICE_CALL;
+    attr.direction = QAHW_STREAM_INPUT_OUTPUT;
+    attr.attr.voice.vsid = stream_params.vsid;
+    stream_params.out_voice_handle = NULL;
+
+    fprintf(stderr, "vsid is %s device is %d \n", attr.attr.voice.vsid, stream_params.output_device[0]);
+    rc = qahw_stream_open(stream_params.qahw_mod_handle,
+                          attr,
+                          1,
+                          stream_params.output_device,
+                          0,
+                          NULL,
+                          NULL,
+                          NULL,
+                          &(stream_params.out_voice_handle));
+    if (rc) {
+        fprintf(stderr, "Could not open output stream.\n");
+        goto unload;
+    }
+    /*set tty mode if needed*/
+    if(stream_params.tty_mode) {
+        qahw_param_payload tty;
+        tty.tty_mode_params.mode = stream_params.tty_mode;
+        rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+                                        QAHW_PARAM_TTY_MODE, &tty);
+    }
+    while (stream_params.multi_call) {
+        call_count++;
+        rc = qahw_stream_start(stream_params.out_voice_handle);
+
+        if (rc) {
+            fprintf(stderr, "Could not start voice stream.\n");
+            goto close_stream;
+        }
+        fprintf(stderr, "started voice call %d\n", call_count);
+        /*set volume */
+        struct qahw_volume_data vol;
+        struct qahw_channel_vol vol_pair;
+
+        vol_pair.channel = QAHW_CHANNEL_L;
+        vol_pair.vol = stream_params.vol;
+        vol.num_of_channels = 1;
+        vol.vol_pair = &vol_pair;
+
+        rc = qahw_stream_set_volume(stream_params.out_voice_handle, vol);
+        if(rc){
+            fprintf(stderr, "set vol failed rc %d!\n", rc);
+        }
+        call_lenght = stream_params.call_length;
+        if (stream_params.in_call_rec) {
+            fprintf(stderr, "\n Create %s in call record thread \n");
+            rc = pthread_create(&tid_rec, NULL, rec_start, (void *)&stream_params);
+            if (rc) {
+                fprintf(stderr, "in call rec thread creation failed %d\n");
+            }
+        }
+        if (stream_params.in_call_playback) {
+            fprintf(stderr, "\n Create %s incall playback thread \n");
+            rc = pthread_create(&tid_pb, NULL, playback_start, (void *)&stream_params);
+            if (rc) {
+                fprintf(stderr, "in call playback thread creation failed %d\n");
+            }
+        }
+        if(stream_params.mute) {
+           struct qahw_mute_data mute;
+           mute.enable = true;
+           mute.direction = stream_params.mute_dir;
+           rc = qahw_stream_set_mute(stream_params.out_voice_handle, mute);
+        }
+        if(stream_params.dtmf_gen_enable) {
+            qahw_param_payload dtmf;
+            dtmf.dtmf_gen_params.low_freq = stream_params.dtmf_freq_low;
+            dtmf.dtmf_gen_params.high_freq = stream_params.dtmf_freq_high;
+            dtmf.dtmf_gen_params.gain = stream_params.dtmf_gain;
+            dtmf.dtmf_gen_params.enable = true;
+            rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+                                            QAHW_PARAM_DTMF_GEN, &dtmf);
+            /*let play for 50 ms*/
+            usleep(50000000);
+            dtmf.dtmf_gen_params.enable = false;
+            rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+                                            QAHW_PARAM_DTMF_GEN, &dtmf);
+
+        }
+        /*setup hpcm if needed*/
+        if(stream_params.hpcm) {
+            fprintf(stderr, "calling hpcm set param.\n");
+            qahw_param_payload hpcm;
+            hpcm.hpcm_params.tap_point = stream_params.hpcm_tp;
+            hpcm.hpcm_params.direction = stream_params.tp_dir;
+            rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+                                        QAHW_PARAM_HPCM, &hpcm);
+
+            switch(stream_params.tp_dir) {
+                case QAHW_HPCM_DIRECTION_OUT:
+                    fprintf(stderr, "\n Create %s hpcm playback thread \n");
+                    rc = pthread_create(&tid_pb, NULL, playback_start,
+                                        (void *)&stream_params);
+                    break;
+                case QAHW_HPCM_DIRECTION_IN:
+                    fprintf(stderr, "\n Create %s hpcm record thread \n");
+                    rc = pthread_create(&tid_rec, NULL, rec_start,
+                                        (void *)&stream_params);
+                    break;
+                case QAHW_HPCM_DIRECTION_OUT_IN:
+                    fprintf(stderr, "\n Create %s hpcm record thread \n");
+                    rc = pthread_create(&tid_rec, NULL, rec_start,
+                                        (void *)&stream_params);
+                    fprintf(stderr, "\n Create %s hpcm playback thread \n");
+                    rc = pthread_create(&tid_pb, NULL, playback_start,
+                                        (void *)&stream_params);
+                    break;
+                default:
+                    fprintf(stderr, "\n invalid HPCM direction  \n");
+                    break;
+            }
+        }
+        while (call_lenght) {
+            usleep(1000000);
+            call_lenght--;
+        }
+        stop = true;
+        fprintf(stderr, "stoping call %d\n", call_count);
+        rc = qahw_stream_stop(stream_params.out_voice_handle);
+        stream_params.multi_call--;
+        /*let session stop*/
+        usleep(100000);
+    }
+
+ close_stream:
+    fprintf(stderr, "closing voice stream\n");
+    rc = qahw_stream_close(stream_params.out_voice_handle);
+
+ unload:
+    fprintf(stderr, "unloading hal\n");
+    if (qahw_unload_module(stream_params.qahw_mod_handle) < 0) {
+        fprintf(stderr, "failure in Un Loading primary HAL\n");
+        return -1;
+    }
+    fprintf(stderr, "voice test ended\n");
+ exit:
+    return 0;
+}
diff --git a/qahw_api/test/qahw_voice_test.h b/qahw_api/test/qahw_voice_test.h
new file mode 100644
index 0000000..bb14094
--- /dev/null
+++ b/qahw_api/test/qahw_voice_test.h
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 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.
+*/
+
+/* Test app for voice call */
+
+#ifndef QAHW_VOICE_TEST_H
+#define QAHW_VOICE_TEST_H
+
+#include <getopt.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <signal.h>
+#include <cutils/str_parms.h>
+#include <tinyalsa/asoundlib.h>
+#include "qahw_api.h"
+#include "qahw_defs.h"
+
+#define MAX_VOICE_TEST_DEVICES 2
+
+typedef struct {
+    qahw_module_handle_t *qahw_mod_handle;
+    qahw_stream_handle_t *out_voice_handle;
+    char* vsid;
+    audio_devices_t output_device[MAX_VOICE_TEST_DEVICES];
+    uint32_t call_length; /*sec*/
+    int multi_call; /*number of calls to make */
+    qahw_module_handle_t *out_handle;
+    bool in_call_rec;
+    bool in_call_playback;
+    bool hpcm;
+    int hpcm_tp;
+    int tp_dir;
+    char* rec_file;
+    char* playback_file;
+    float vol;
+    bool mute;
+    int mute_dir;
+    int tty_mode;
+    int dtmf_gen_enable;
+    int dtmf_freq_low;
+    int dtmf_freq_high;
+    int dtmf_gain;
+}voice_stream_config;
+
+#endif /* QAHW_VOICE_TEST_H */