Merge "audio : Add g711 omx component for encoding"
diff --git a/configs/msm8937/msm8937.mk b/configs/msm8937/msm8937.mk
index 7e5c90f..b7a7a39 100644
--- a/configs/msm8937/msm8937.mk
+++ b/configs/msm8937/msm8937.mk
@@ -46,7 +46,7 @@
 MM_AUDIO_ENABLED_SAFX := true
 TARGET_USES_QCOM_MM_AUDIO := true
 AUDIO_FEATURE_ENABLED_HW_ACCELERATED_EFFECTS := false
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
 AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
 AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true
 ##AUDIO_FEATURE_FLAGS
diff --git a/configs/msm8937/sound_trigger_mixer_paths.xml b/configs/msm8937/sound_trigger_mixer_paths.xml
index bbec875..a2ea69e 100644
--- a/configs/msm8937/sound_trigger_mixer_paths.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved.            -->
+<!--- Copyright (c) 2014, 2016, 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    -->
@@ -28,48 +28,70 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="TERT_MI2S_TX LSM Function" value="None" />
 
     <path name="listen-voice-wakeup-1">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM1 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM1 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM1 Mixer TERT_MI2S_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM2 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM2 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM2 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-3">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM3 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM3 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM3 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-4">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM4 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM4 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM4 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-5">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM5 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM5 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM5 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-6">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM6 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM6 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM6 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-7">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM7 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM7 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM7 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-8">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM8 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM8 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM8 Mixer TERT_MI2S_TX" value="1" />
     </path>
 
     <path name="listen-ape-handset-mic">
diff --git a/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml b/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml
index f2e4cb1..bd54837 100644
--- a/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved.            -->
+<!--- Copyright (c) 2014, 2016, 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    -->
@@ -28,14 +28,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="AIF1_CAP Mixer SLIM TX1" value="0"/>
     <ctl name="LOOPBACK Mode" value="DISABLE" />
@@ -46,51 +54,59 @@
     <path name="listen-voice-wakeup-1">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-handset-mic">
diff --git a/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml b/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml
index 15f0e06..e4dee50 100644
--- a/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2015, The Linux Foundation. All rights reserved.
+<!--- Copyright (c) 2015-2016, 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
@@ -29,14 +29,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="MADONOFF Switch" value="0" />
     <ctl name="MAD Input" value="DMIC1" />
@@ -44,42 +52,50 @@
 
     <path name="listen-voice-wakeup-1">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-cpe-handset-mic">
         <ctl name="MADONOFF Switch" value="1" />
         <ctl name="MAD Input" value="DMIC1" />
-	<ctl name="CPE AFE MAD Enable" value="1"/>
+        <ctl name="CPE AFE MAD Enable" value="1"/>
     </path>
 
     <path name="listen-ape-handset-mic">
diff --git a/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml b/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml
index 94d00c5..af630d0 100644
--- a/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml
@@ -29,14 +29,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="MADONOFF Switch" value="0" />
     <ctl name="MAD Input" value="DMIC1" />
@@ -52,36 +60,44 @@
 
     <path name="listen-voice-wakeup-1">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-cpe-handset-mic">
diff --git a/configs/msm8953/msm8953.mk b/configs/msm8953/msm8953.mk
index 2917f9d..3106942 100644
--- a/configs/msm8953/msm8953.mk
+++ b/configs/msm8953/msm8953.mk
@@ -46,7 +46,8 @@
 MM_AUDIO_ENABLED_SAFX := true
 TARGET_USES_QCOM_MM_AUDIO := true
 AUDIO_FEATURE_ENABLED_HW_ACCELERATED_EFFECTS := false
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+
 AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
 AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true
 
diff --git a/configs/msm8953/sound_trigger_mixer_paths.xml b/configs/msm8953/sound_trigger_mixer_paths.xml
index bbec875..a2ea69e 100644
--- a/configs/msm8953/sound_trigger_mixer_paths.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved.            -->
+<!--- Copyright (c) 2014, 2016, 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    -->
@@ -28,48 +28,70 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="TERT_MI2S_TX LSM Function" value="None" />
 
     <path name="listen-voice-wakeup-1">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM1 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM1 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM1 Mixer TERT_MI2S_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM2 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM2 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM2 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-3">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM3 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM3 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM3 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-4">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM4 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM4 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM4 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-5">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM5 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM5 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM5 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-6">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM6 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM6 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM6 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-7">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM7 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM7 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM7 Mixer TERT_MI2S_TX" value="1" />
     </path>
+
     <path name="listen-voice-wakeup-8">
         <ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
-        <ctl name="LSM8 MUX" value="TERT_MI2S_TX" />
+        <ctl name="LSM8 Port" value="TERT_MI2S_TX" />
+        <ctl name="LSM8 Mixer TERT_MI2S_TX" value="1" />
     </path>
 
     <path name="listen-ape-handset-mic">
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml
index f2e4cb1..bd54837 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved.            -->
+<!--- Copyright (c) 2014, 2016, 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    -->
@@ -28,14 +28,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="AIF1_CAP Mixer SLIM TX1" value="0"/>
     <ctl name="LOOPBACK Mode" value="DISABLE" />
@@ -46,51 +54,59 @@
     <path name="listen-voice-wakeup-1">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
         <ctl name="SLIM_0_TX Channels" value="One" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-handset-mic">
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml
index b64c4ca..e4dee50 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2015, The Linux Foundation. All rights reserved.
+<!--- Copyright (c) 2015-2016, 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
@@ -29,14 +29,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="MADONOFF Switch" value="0" />
     <ctl name="MAD Input" value="DMIC1" />
@@ -44,36 +52,44 @@
 
     <path name="listen-voice-wakeup-1">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-cpe-handset-mic">
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
index 94d00c5..af630d0 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
@@ -29,14 +29,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="MADONOFF Switch" value="0" />
     <ctl name="MAD Input" value="DMIC1" />
@@ -52,36 +60,44 @@
 
     <path name="listen-voice-wakeup-1">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-cpe-handset-mic">
diff --git a/configs/msm8996/mixer_paths_tasha.xml b/configs/msm8996/mixer_paths_tasha.xml
index 9f63413..64d6bfb 100644
--- a/configs/msm8996/mixer_paths_tasha.xml
+++ b/configs/msm8996/mixer_paths_tasha.xml
@@ -2278,6 +2278,9 @@
     <path name="capture-fm">
     </path>
 
+    <path name="aanc-path">
+    </path>
+
     <path name="aanc-handset-mic">
         <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
         <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
diff --git a/configs/msm8996/msm8996.mk b/configs/msm8996/msm8996.mk
index 306fa97..5b240e9 100644
--- a/configs/msm8996/msm8996.mk
+++ b/configs/msm8996/msm8996.mk
@@ -46,8 +46,8 @@
 MM_AUDIO_ENABLED_SAFX := true
 TARGET_USES_QCOM_MM_AUDIO := true
 AUDIO_FEATURE_ENABLED_HW_ACCELERATED_EFFECTS := false
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
-#DOLBY_DDP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+
 AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
 AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true
 AUDIO_FEATURE_ENABLED_GEF_SUPPORT := true
diff --git a/configs/msm8996/sound_trigger_mixer_paths.xml b/configs/msm8996/sound_trigger_mixer_paths.xml
index 0125371..f6c99d3 100644
--- a/configs/msm8996/sound_trigger_mixer_paths.xml
+++ b/configs/msm8996/sound_trigger_mixer_paths.xml
@@ -28,14 +28,22 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="MADONOFF Switch" value="0" />
     <ctl name="MAD Input" value="DMIC1" />
@@ -51,36 +59,44 @@
 
     <path name="listen-voice-wakeup-1">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-cpe-handset-mic">
diff --git a/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml b/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml
index 4f8557d..2ad8750 100644
--- a/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml
+++ b/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml
@@ -28,51 +28,67 @@
 
 <mixer>
     <!-- These are the initial mixer settings -->
-    <ctl name="LSM1 MUX" value="None" />
-    <ctl name="LSM2 MUX" value="None" />
-    <ctl name="LSM3 MUX" value="None" />
-    <ctl name="LSM4 MUX" value="None" />
-    <ctl name="LSM5 MUX" value="None" />
-    <ctl name="LSM6 MUX" value="None" />
-    <ctl name="LSM7 MUX" value="None" />
-    <ctl name="LSM8 MUX" value="None" />
+    <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+    <ctl name="LSM1 Port" value="None" />
+    <ctl name="LSM2 Port" value="None" />
+    <ctl name="LSM3 Port" value="None" />
+    <ctl name="LSM4 Port" value="None" />
+    <ctl name="LSM5 Port" value="None" />
+    <ctl name="LSM6 Port" value="None" />
+    <ctl name="LSM7 Port" value="None" />
+    <ctl name="LSM8 Port" value="None" />
     <ctl name="SLIMBUS_5_TX LSM Function" value="None" />
     <ctl name="MADONOFF Switch" value="0" />
     <ctl name="MAD Input" value="DMIC1" />
     <ctl name="CPE AFE MAD Enable" value="0"/>
 
     <path name="listen-voice-wakeup-1">
-        <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-voice-wakeup-2">
-        <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-3">
-        <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-4">
-        <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-5">
-        <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-6">
-        <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-7">
-        <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
     </path>
     <path name="listen-voice-wakeup-8">
-        <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
         <ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+        <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+        <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
     </path>
 
     <path name="listen-cpe-handset-mic">
diff --git a/configs/msmcobalt/audio_output_policy.conf b/configs/msmcobalt/audio_output_policy.conf
index e60c664..8213f92 100644
--- a/configs/msmcobalt/audio_output_policy.conf
+++ b/configs/msmcobalt/audio_output_policy.conf
@@ -34,18 +34,25 @@
   }
   direct_pcm_16 {
     flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
-    formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT
+    formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
     sampling_rates 44100|48000|96000|192000
     bit_width 16
     app_type 69936
   }
   direct_pcm_24 {
     flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
-    formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT
-    sampling_rates 44100|48000|96000|176400|192000|352800
+    formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
+    sampling_rates 44100|48000|96000|176400|192000|352800|384000
     bit_width 24
     app_type 69940
   }
+  direct_pcm_32 {
+    flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
+    formats AUDIO_FORMAT_PCM_32_BIT
+    sampling_rates 44100|48000|96000|176400|192000|352800|384000
+    bit_width 32
+    app_type 69942
+  }
   compress_passthrough_16 {
     flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING|AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH
     formats AUDIO_FORMAT_AC3|AUDIO_FORMAT_E_AC3|AUDIO_FORMAT_E_AC3_JOC|AUDIO_FORMAT_DTS|AUDIO_FORMAT_DTS_HD|AUDIO_FORMAT_DSD
diff --git a/configs/msmcobalt/audio_platform_info.xml b/configs/msmcobalt/audio_platform_info.xml
index 07839fd..a1bd9a1 100644
--- a/configs/msmcobalt/audio_platform_info.xml
+++ b/configs/msmcobalt/audio_platform_info.xml
@@ -67,6 +67,7 @@
         <param key="perf_lock_opts" value="4, 0x101, 0x704, 0x20F, 0x1E01"/>
         <param key="native_audio_mode" value="src"/>
         <param key="input_mic_max_count" value="4"/>
+        <param key="true_32_bit" value="true"/>
         <!-- In the below value string, the value indicates sidetone gain in dB -->
         <param key="usb_sidetone_gain" value="35"/>
     </config_params>
diff --git a/configs/msmcobalt/audio_policy.conf b/configs/msmcobalt/audio_policy.conf
index 70ab311..8fb5676 100644
--- a/configs/msmcobalt/audio_policy.conf
+++ b/configs/msmcobalt/audio_policy.conf
@@ -58,9 +58,9 @@
         flags AUDIO_OUTPUT_FLAG_DIRECT
       }
       direct_pcm {
-        sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000|64000|88200|96000|176400|192000|352800
+        sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000|64000|88200|96000|176400|192000|352800|384000
         channel_masks AUDIO_CHANNEL_OUT_MONO|AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_2POINT1|AUDIO_CHANNEL_OUT_QUAD|AUDIO_CHANNEL_OUT_PENTA|AUDIO_CHANNEL_OUT_5POINT1|AUDIO_CHANNEL_OUT_6POINT1|AUDIO_CHANNEL_OUT_7POINT1
-        formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT
+        formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
         devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_LINE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_PROXY|AUDIO_DEVICE_OUT_USB_DEVICE|AUDIO_DEVICE_OUT_BLUETOOTH_A2DP|AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES|AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER
         flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
       }
@@ -102,7 +102,7 @@
       }
       surround_sound {
         sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000
-        channel_masks AUDIO_CHANNEL_IN_5POINT1|AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_FRONT_BACK|AUDIO_CHANNEL_INDEX_MASK_3|AUDIO_CHANNEL_INDEX_MASK_4
+        channel_masks AUDIO_CHANNEL_IN_5POINT1|AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_FRONT_BACK|AUDIO_CHANNEL_INDEX_MASK_3|AUDIO_CHANNEL_INDEX_MASK_4|AUDIO_CHANNEL_INDEX_MASK_6
         formats AUDIO_FORMAT_PCM_16_BIT
         devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC
       }
diff --git a/configs/msmcobalt/audio_policy_configuration.xml b/configs/msmcobalt/audio_policy_configuration.xml
index 66b7d17..b6d2490 100644
--- a/configs/msmcobalt/audio_policy_configuration.xml
+++ b/configs/msmcobalt/audio_policy_configuration.xml
@@ -89,10 +89,13 @@
                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800"
+                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800"
+                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
+                             channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
+                  <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
                 </mixPort>
                 <mixPort name="compressed_offload" role="source"
@@ -176,7 +179,7 @@
                 <mixPort name="surround_sound" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1"/>
+                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6"/>
                 </mixPort>
                 <mixPort name="record_24" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
diff --git a/configs/msmcobalt/mixer_paths_tasha.xml b/configs/msmcobalt/mixer_paths_tasha.xml
index efd275d..23c0f06 100644
--- a/configs/msmcobalt/mixer_paths_tasha.xml
+++ b/configs/msmcobalt/mixer_paths_tasha.xml
@@ -2293,6 +2293,12 @@
     <path name="capture-fm">
     </path>
 
+    <path name="aanc-path">
+        <ctl name="ADC MUX10" value="DMIC" />
+        <ctl name="DMIC MUX10" value="DMIC4" />
+        <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
+    </path>
+
     <path name="aanc-handset-mic">
         <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
         <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
@@ -2309,9 +2315,6 @@
         <ctl name="ADC MUX7" value="DMIC" />
         <ctl name="DMIC MUX7" value="DMIC0" />
         <ctl name="IIR0 INP0 MUX" value="DEC6" />
-        <ctl name="ADC MUX10" value="DMIC" />
-        <ctl name="DMIC MUX10" value="DMIC4" />
-        <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
     </path>
 
     <!-- Dual MIC devices -->
diff --git a/configs/msmcobalt/mixer_paths_tavil.xml b/configs/msmcobalt/mixer_paths_tavil.xml
index 29212f9..555555d 100644
--- a/configs/msmcobalt/mixer_paths_tavil.xml
+++ b/configs/msmcobalt/mixer_paths_tavil.xml
@@ -2068,6 +2068,12 @@
     <path name="capture-fm">
     </path>
 
+    <path name="aanc-path">
+        <ctl name="ADC MUX10" value="DMIC" />
+        <ctl name="DMIC MUX10" value="DMIC4" />
+        <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
+    </path>
+
     <path name="aanc-handset-mic">
         <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
         <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
@@ -2084,9 +2090,6 @@
         <ctl name="ADC MUX7" value="DMIC" />
         <ctl name="DMIC MUX7" value="DMIC0" />
         <ctl name="IIR0 INP0 MUX" value="DEC6" />
-        <ctl name="ADC MUX10" value="DMIC" />
-        <ctl name="DMIC MUX10" value="DMIC4" />
-        <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
     </path>
 
     <!-- Dual MIC devices -->
diff --git a/configs/msmcobalt/msmcobalt.mk b/configs/msmcobalt/msmcobalt.mk
index 9aa0322..b7684ed 100644
--- a/configs/msmcobalt/msmcobalt.mk
+++ b/configs/msmcobalt/msmcobalt.mk
@@ -22,8 +22,7 @@
 AUDIO_FEATURE_ENABLED_HDMI_PASSTHROUGH := true
 #AUDIO_FEATURE_ENABLED_KEEP_ALIVE := true
 AUDIO_FEATURE_ENABLED_DISPLAY_PORT := true
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
-#DOLBY_DDP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
 AUDIO_FEATURE_ENABLED_HFP := true
 AUDIO_FEATURE_ENABLED_INCALL_MUSIC := false
 AUDIO_FEATURE_ENABLED_MULTI_VOICE_SESSIONS := true
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index e72cb76..28d0f75 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -645,6 +645,35 @@
     return ret;
 }
 
+static void reset_a2dp_enc_config_params()
+{
+    int ret =0;
+
+    struct mixer_ctl *ctl_enc_config, *ctrl_bit_format;
+    struct sbc_enc_cfg_t dummy_reset_config;
+
+    memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
+    ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
+                                           MIXER_ENC_CONFIG_BLOCK);
+    if (!ctl_enc_config) {
+        ALOGE(" ERROR  a2dp encoder format mixer control not identifed");
+    } else {
+        ret = mixer_ctl_set_array(ctl_enc_config, (void *)&dummy_reset_config,
+                                        sizeof(struct sbc_enc_cfg_t));
+         a2dp.bt_encoder_format = ENC_MEDIA_FMT_NONE;
+    }
+    ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
+                                            MIXER_ENC_BIT_FORMAT);
+    if (!ctrl_bit_format) {
+        ALOGE(" ERROR  bit format CONFIG data mixer control not identifed");
+    } else {
+        ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
+        if (ret != 0) {
+            ALOGE("%s: Failed to set bit format to encoder", __func__);
+        }
+    }
+}
+
 int audio_extn_a2dp_stop_playback()
 {
     int ret =0;
@@ -659,35 +688,13 @@
         a2dp.a2dp_total_active_session_request--;
 
     if ( a2dp.a2dp_started && !a2dp.a2dp_total_active_session_request) {
-        struct mixer_ctl *ctl_enc_config, *ctrl_bit_format;
-        struct sbc_enc_cfg_t dummy_reset_config;
-
         ALOGV("calling BT module stream stop");
         ret = a2dp.audio_stop_stream();
         if (ret < 0)
             ALOGE("stop stream to BT IPC lib failed");
         else
             ALOGV("stop steam to BT IPC lib successful");
-         memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
-        ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
-                                               MIXER_ENC_CONFIG_BLOCK);
-        if (!ctl_enc_config) {
-            ALOGE(" ERROR  a2dp encoder format mixer control not identifed");
-        } else {
-            ret = mixer_ctl_set_array(ctl_enc_config, (void *)&dummy_reset_config,
-                                            sizeof(struct sbc_enc_cfg_t));
-             a2dp.bt_encoder_format = ENC_MEDIA_FMT_NONE;
-        }
-        ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
-                                                MIXER_ENC_BIT_FORMAT);
-        if (!ctrl_bit_format) {
-            ALOGE(" ERROR  bit format CONFIG data mixer control not identifed");
-        } else {
-            ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
-            if (ret != 0) {
-                ALOGE("%s: Failed to set bit format to encoder", __func__);
-            }
-        }
+        reset_a2dp_enc_config_params();
     }
     if(!a2dp.a2dp_total_active_session_request)
        a2dp.a2dp_started = false;
@@ -724,6 +731,7 @@
          val = atoi(value);
          if (val & AUDIO_DEVICE_OUT_ALL_A2DP) {
              ALOGV("Received device dis- connect request");
+             reset_a2dp_enc_config_params();
              close_a2dp_output();
          }
          goto param_handled;
@@ -735,6 +743,7 @@
              if ((!strncmp(value,"true",sizeof(value)))) {
                 ALOGD("Setting a2dp to suspend state");
                 a2dp.a2dp_suspended = true;
+                reset_a2dp_enc_config_params();
                 if(a2dp.audio_suspend_stream)
                    a2dp.audio_suspend_stream();
             } else if (a2dp.a2dp_suspended == true) {
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 083b925..0f38b82 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -185,7 +185,7 @@
     return ret;
 }
 
-static void check_and_set_ext_disp_connection_status(const struct audio_device *adev,
+static void audio_extn_ext_disp_set_parameters(const struct audio_device *adev,
                                                      struct str_parms *parms)
 {
     char value[32] = {0};
@@ -204,13 +204,14 @@
             && (atoi(value) & AUDIO_DEVICE_OUT_AUX_DIGITAL)){
         //params = "disconnect=1024" for external display disconnection.
         update_ext_disp_sysfs_node(adev, 0);
+        ALOGV("invalidate cached edid");
+        platform_invalidate_hdmi_config(adev->platform);
     } else {
         // handle ext disp devices only
         return;
     }
 }
 
-
 #ifndef FM_POWER_OPT
 #define audio_extn_fm_set_parameters(adev, parms) (0)
 #else
@@ -772,7 +773,7 @@
    audio_extn_source_track_set_parameters(adev, parms);
    audio_extn_fbsp_set_parameters(parms);
    audio_extn_keep_alive_set_parameters(adev, parms);
-   check_and_set_ext_disp_connection_status(adev, parms);
+   audio_extn_ext_disp_set_parameters(adev, parms);
    if (adev->offload_effects_set_parameters != NULL)
        adev->offload_effects_set_parameters(parms);
 }
@@ -1144,3 +1145,52 @@
     }
 }
 #endif /* KPI_OPTIMIZE_ENABLED */
+
+static int audio_extn_set_multichannel_mask(struct audio_device *adev,
+                                            struct stream_in *in,
+                                            struct audio_config *config,
+                                            bool *channel_mask_updated)
+{
+    int ret = -EINVAL;
+    int channel_count = audio_channel_count_from_in_mask(in->channel_mask);
+    *channel_mask_updated = false;
+
+    int max_mic_count = platform_get_max_mic_count(adev->platform);
+    /* validate input params*/
+    if ((channel_count == 6) &&
+        (in->format == AUDIO_FORMAT_PCM_16_BIT)) {
+
+        switch (max_mic_count) {
+            case 4:
+                config->channel_mask = AUDIO_CHANNEL_INDEX_MASK_4;
+                break;
+            case 3:
+                config->channel_mask = AUDIO_CHANNEL_INDEX_MASK_3;
+                break;
+            case 2:
+                config->channel_mask = AUDIO_CHANNEL_IN_STEREO;
+                break;
+            default:
+                config->channel_mask = AUDIO_CHANNEL_IN_STEREO;
+                break;
+        }
+        ret = 0;
+        *channel_mask_updated = true;
+    }
+    return ret;
+}
+
+int audio_extn_check_and_set_multichannel_usecase(struct audio_device *adev,
+                                                  struct stream_in *in,
+                                                  struct audio_config *config,
+                                                  bool *update_params)
+{
+    bool ssr_supported = false;
+    ssr_supported = audio_extn_ssr_check_usecase(in);
+    if (ssr_supported) {
+        return audio_extn_ssr_set_usecase(in, config, update_params);
+    } else {
+        return audio_extn_set_multichannel_mask(adev, in, config,
+                                                update_params);
+    }
+}
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index cd9763e..07714f6 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -194,17 +194,21 @@
 #endif
 
 #ifndef SSR_ENABLED
-#define audio_extn_ssr_check_and_set_usecase(in)      (-1)
-#define audio_extn_ssr_init(in, num_out_chan)         (0)
-#define audio_extn_ssr_deinit()                       (0)
-#define audio_extn_ssr_update_enabled()               (0)
-#define audio_extn_ssr_get_enabled()                  (0)
-#define audio_extn_ssr_read(stream, buffer, bytes)    (0)
-#define audio_extn_ssr_set_parameters(adev, parms)    (0)
-#define audio_extn_ssr_get_parameters(adev, parms, reply) (0)
-#define audio_extn_ssr_get_stream()                   (0)
+#define audio_extn_ssr_check_usecase(in)                                  (0)
+#define audio_extn_ssr_set_usecase(in, config, channel_mask_updated)      (0)
+#define audio_extn_ssr_init(in, num_out_chan)                             (0)
+#define audio_extn_ssr_deinit()                                           (0)
+#define audio_extn_ssr_update_enabled()                                   (0)
+#define audio_extn_ssr_get_enabled()                                      (0)
+#define audio_extn_ssr_read(stream, buffer, bytes)                        (0)
+#define audio_extn_ssr_set_parameters(adev, parms)                        (0)
+#define audio_extn_ssr_get_parameters(adev, parms, reply)                 (0)
+#define audio_extn_ssr_get_stream()                                       (0)
 #else
-int audio_extn_ssr_check_and_set_usecase(struct stream_in *in);
+bool audio_extn_ssr_check_usecase(struct stream_in *in);
+int audio_extn_ssr_set_usecase(struct stream_in *in,
+                                         struct audio_config *config,
+                                         bool *channel_mask_updated);
 int32_t audio_extn_ssr_init(struct stream_in *in,
                             int num_out_chan);
 int32_t audio_extn_ssr_deinit();
@@ -219,6 +223,10 @@
                                    struct str_parms *reply);
 struct stream_in *audio_extn_ssr_get_stream();
 #endif
+int audio_extn_check_and_set_multichannel_usecase(struct audio_device *adev,
+                                                  struct stream_in *in,
+                                                  struct audio_config *config,
+                                                  bool *update_params);
 
 #ifndef HW_VARIANTS_ENABLED
 #define hw_info_init(snd_card_name)                      (0)
diff --git a/hal/audio_extn/dolby.c b/hal/audio_extn/dolby.c
index f07c66a..b958bf6 100644
--- a/hal/audio_extn/dolby.c
+++ b/hal/audio_extn/dolby.c
@@ -484,9 +484,7 @@
 };
 
 int audio_extn_dap_hal_init(int snd_card) {
-    char c_dmid[128] = {0};
-    void *handle = NULL;
-    int i_dmid, ret = -EINVAL;
+    int ret = -EINVAL;
     dap_hal_device_be_id_map_t device_be_id_map;
 
     ALOGV("%s: opening DAP HAL lib\n", __func__);
@@ -532,9 +530,7 @@
 void audio_extn_dolby_ds2_set_endpoint(struct audio_device *adev) {
     struct listnode *node;
     struct audio_usecase *usecase;
-    struct mixer_ctl *ctl;
-    const char *mixer_ctl_name = "DS1 DAP Endpoint";
-    int endpoint = 0, ret;
+    int endpoint = 0;
     bool send = false;
 
     list_for_each(node, &adev->usecase_list) {
@@ -587,7 +583,7 @@
     return 0;
 }
 
-int audio_extn_dolby_set_dap_bypass(struct audio_device *adev, int state) {
+int audio_extn_dolby_set_dap_bypass(struct audio_device *adev __unused, int state) {
 
     ALOGV("%s: state %d", __func__, state);
     if (ds2extnmod.dap_hal_set_hw_info) {
@@ -599,12 +595,12 @@
     return 0;
 }
 
-void audio_extn_dolby_set_license(struct audio_device *adev)
+void audio_extn_dolby_set_license(struct audio_device *adev __unused)
 {
     int i_key=0;
     char c_key[128] = {0};
     char c_dmid[128] = {0};
-    int i_dmid, ret = -EINVAL;
+    int i_dmid;
     struct dolby_param_license dolby_license;
 
 #ifdef DOLBY_ACDB_LICENSE
@@ -631,7 +627,7 @@
 void audio_extn_ds2_set_parameters(struct audio_device *adev,
                                    struct str_parms *parms)
 {
-    int val, ret;
+    int ret;
     char value[32]={0};
 
     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SND_CARD_STATUS, value,
diff --git a/hal/audio_extn/ssr.c b/hal/audio_extn/ssr.c
index f55f3ce..51a6a26 100644
--- a/hal/audio_extn/ssr.c
+++ b/hal/audio_extn/ssr.c
@@ -331,33 +331,55 @@
     return false;
 }
 
-int audio_extn_ssr_check_and_set_usecase(struct stream_in *in)
-{
-    int ret = -1;
+bool  audio_extn_ssr_check_usecase(struct stream_in *in) {
+    int ret = false;
     int channel_count = audio_channel_count_from_in_mask(in->channel_mask);
     audio_devices_t devices = in->device;
     audio_source_t source = in->source;
 
-    /* validate input params
-     * only stereo and 5:1 channel config is supported
-     * only AUDIO_DEVICE_IN_BUILTIN_MIC, AUDIO_DEVICE_IN_BACK_MIC supports 3 mics */
-    if (audio_extn_ssr_get_enabled() &&
-           ((channel_count == 2) || (channel_count == 6)) &&
-           ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source)) &&
-           ((AUDIO_DEVICE_IN_BUILTIN_MIC == devices) || (AUDIO_DEVICE_IN_BACK_MIC == devices)) &&
-           (in->format == AUDIO_FORMAT_PCM_16_BIT)) {
-
-        ALOGD("%s: Found SSR use case starting SSR lib with channel_count :%d",
+    if ((audio_extn_ssr_get_enabled()) &&
+            ((channel_count == 2) || (channel_count == 6)) &&
+            ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source)) &&
+            ((AUDIO_DEVICE_IN_BUILTIN_MIC == devices) || (AUDIO_DEVICE_IN_BACK_MIC == devices)) &&
+            (in->format == AUDIO_FORMAT_PCM_16_BIT)) {
+        ALOGD("%s: SSR enabled with channel_count :%d",
                       __func__, channel_count);
+        ret = true;
+    }
+    return ret;
+}
 
-        if (!audio_extn_ssr_init(in, channel_count)) {
-            ALOGD("%s: Created SSR session succesfully", __func__);
+int audio_extn_ssr_set_usecase(struct stream_in *in,
+                               struct audio_config *config,
+                               bool *update_params)
+{
+    int ret = -EINVAL;
+    int channel_count = audio_channel_count_from_in_mask(in->channel_mask);
+    audio_channel_representation_t representation =
+                  audio_channel_mask_get_representation(in->channel_mask);
+    *update_params = false;
+
+    if (audio_extn_ssr_check_usecase(in)) {
+
+        if (representation == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
+            /* update params in case channel representation index.
+             * on returning error, flinger will retry with supported representation passed
+             */
+            ALOGD("%s: SSR supports only channel representation position, channel_mask(%#x)"
+                              ,__func__, config->channel_mask);
+            config->channel_mask = AUDIO_CHANNEL_IN_5POINT1;
             ret = 0;
+            *update_params = true;
         } else {
-            ALOGE("%s: Unable to start SSR record session", __func__);
+            if (!audio_extn_ssr_init(in, channel_count)) {
+                ALOGD("%s: Created SSR session succesfully", __func__);
+                ret = 0;
+            } else {
+                ALOGE("%s: Unable to start SSR record session", __func__);
+            }
         }
-   }
-   return ret;
+    }
+    return ret;
 }
 
 static void pcm_buffer_queue_push(struct pcm_buffer_queue **queue,
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 3816748..3a12adf 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1206,6 +1206,19 @@
     return NULL;
 }
 
+struct stream_in *get_next_active_input(const struct audio_device *adev)
+{
+    struct audio_usecase *usecase;
+    struct listnode *node;
+
+    list_for_each_reverse(node, &adev->usecase_list) {
+        usecase = node_to_item(node, struct audio_usecase, list);
+        if (usecase->type == PCM_CAPTURE)
+            return usecase->stream.in;
+    }
+    return NULL;
+}
+
 /*
  * is a true native playback active
  */
@@ -1424,6 +1437,10 @@
         if (voice_is_call_state_active(adev) ||
             voice_extn_compress_voip_is_started(adev))
             voice_set_sidetone(adev, usecase->out_snd_device, false);
+
+        /* Disable aanc only if voice call exists */
+        if (voice_is_call_state_active(adev))
+            voice_check_and_update_aanc_path(adev, usecase->out_snd_device, false);
     }
 
     /* Disable current sound devices */
@@ -1494,6 +1511,10 @@
     enable_audio_route(adev, usecase);
 
     if (usecase->type == VOICE_CALL || usecase->type == VOIP_CALL) {
+        /* Enable aanc only if voice call exists */
+        if (voice_is_call_state_active(adev))
+            voice_check_and_update_aanc_path(adev, out_snd_device, true);
+
         /* Enable sidetone only if other voice/voip call already exists */
         if (voice_is_call_state_active(adev) ||
             voice_extn_compress_voip_is_started(adev))
@@ -1519,7 +1540,7 @@
     struct audio_usecase *uc_info;
     struct audio_device *adev = in->dev;
 
-    adev->active_input = NULL;
+    adev->active_input = get_next_active_input(adev);
 
     ALOGV("%s: enter: usecase(%d: %s)", __func__,
           in->usecase, use_case_table[in->usecase]);
@@ -1666,7 +1687,7 @@
     audio_extn_perf_lock_release(&adev->perf_lock_handle);
     stop_input_stream(in);
 error_config:
-    adev->active_input = NULL;
+    adev->active_input = get_next_active_input(adev);
     /*
      * sleep 50ms to allow sufficient time for kernel
      * drivers to recover incases like SSR.
@@ -2452,7 +2473,15 @@
                 (val == AUDIO_DEVICE_NONE)) {
                 val = AUDIO_DEVICE_OUT_SPEAKER;
         }
-
+        /* To avoid a2dp to sco overlapping force route BT usecases
+         * to speaker based on Phone state
+         */
+        if ((val & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) &&
+            ((adev->mode == AUDIO_MODE_RINGTONE) ||
+            (adev->mode == AUDIO_MODE_IN_CALL))) {
+            ALOGD("Forcing a2dp routing to speaker for ring/call mode");
+            val = AUDIO_DEVICE_OUT_SPEAKER;
+        }
         /*
          * select_devices() call below switches all the usecases on the same
          * backend to the new device. Refer to check_usecases_codec_backend() in
@@ -4251,10 +4280,13 @@
     ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, value, sizeof(value));
     if (ret >= 0) {
         val = atoi(value);
-        if (val & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
-            ALOGV("invalidate cached edid");
-            platform_invalidate_hdmi_config(adev->platform);
-        } else if ((val & AUDIO_DEVICE_OUT_USB_DEVICE) ||
+        /*
+         * The HDMI / Displayport disconnect handling has been moved to
+         * audio extension to ensure that its parameters are not
+         * invalidated prior to updating sysfs of the disconnect event
+         * Invalidate will be handled by audio_extn_ext_disp_set_parameters()
+         */
+        if ((val & AUDIO_DEVICE_OUT_USB_DEVICE) ||
                    !(val ^ AUDIO_DEVICE_IN_USB_DEVICE)) {
             ret = str_parms_get_str(parms, "card", value, sizeof(value));
             if (ret >= 0) {
@@ -4440,6 +4472,7 @@
     int ret = 0, buffer_size, frame_size;
     int channel_count = audio_channel_count_from_in_mask(config->channel_mask);
     bool is_low_latency = false;
+    bool channel_mask_updated = false;
 
     *stream_in = NULL;
     if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0) {
@@ -4534,7 +4567,14 @@
         in->config.channels = channel_count;
         in->config.rate = config->sample_rate;
         in->sample_rate = config->sample_rate;
-    } else if (!audio_extn_ssr_check_and_set_usecase(in)) {
+    } else if (!audio_extn_check_and_set_multichannel_usecase(adev,
+                in, config, &channel_mask_updated)) {
+        if (channel_mask_updated == true) {
+            ALOGD("%s: return error to retry with updated channel mask (%#x)",
+                   __func__, config->channel_mask);
+            ret = -EINVAL;
+            goto err_open;
+        }
         ALOGD("%s: created surround sound session succesfully",__func__);
     } else if (audio_extn_compr_cap_enabled() &&
             audio_extn_compr_cap_format_supported(config->format) &&
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index a5cc804..a42f984 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -780,8 +780,8 @@
 static int msm_device_to_be_id_external_codec [][NO_COLS] = {
        {AUDIO_DEVICE_OUT_EARPIECE                       ,       2},
        {AUDIO_DEVICE_OUT_SPEAKER                        ,       2},
-       {AUDIO_DEVICE_OUT_WIRED_HEADSET                  ,       2},
-       {AUDIO_DEVICE_OUT_WIRED_HEADPHONE                ,       2},
+       {AUDIO_DEVICE_OUT_WIRED_HEADSET                  ,       41},
+       {AUDIO_DEVICE_OUT_WIRED_HEADPHONE                ,       41},
        {AUDIO_DEVICE_OUT_BLUETOOTH_SCO                  ,       11},
        {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET          ,       11},
        {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT           ,       11},
@@ -2924,6 +2924,7 @@
         *num_devices = 2;
         new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
         new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
+        status = true;
     }
 
     ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
@@ -5622,6 +5623,14 @@
     return 0;
 }
 
+void platform_update_aanc_path(struct audio_device *adev __unused,
+                               snd_device_t out_snd_device __unused,
+                               bool enable __unused,
+                               char *str __unused)
+{
+   return;
+}
+
 bool platform_check_codec_dsd_support(void *platform __unused)
 {
     return false;
@@ -5671,3 +5680,8 @@
 {
     return -ENOSYS;
 }
+
+int platform_get_max_mic_count(void *platform) {
+    struct platform_data *my_data = (struct platform_data *)platform;
+    return my_data->max_mic_count;
+}
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index b5a4f11..e025772 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1315,6 +1315,14 @@
     return 0;
 }
 
+void platform_update_aanc_path(struct audio_device *adev __unused,
+                               snd_device_t out_snd_device __unused,
+                               bool enable __unused,
+                               char *str __unused)
+{
+    return;
+}
+
 bool platform_check_codec_dsd_support(void *platform __unused)
 {
     return false;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index fa67342..e947f91 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -795,8 +795,8 @@
 static int msm_device_to_be_id [][NO_COLS] = {
        {AUDIO_DEVICE_OUT_EARPIECE                       ,       2},
        {AUDIO_DEVICE_OUT_SPEAKER                        ,       2},
-       {AUDIO_DEVICE_OUT_WIRED_HEADSET                  ,       2},
-       {AUDIO_DEVICE_OUT_WIRED_HEADPHONE                ,       2},
+       {AUDIO_DEVICE_OUT_WIRED_HEADSET                  ,       41},
+       {AUDIO_DEVICE_OUT_WIRED_HEADPHONE                ,       41},
        {AUDIO_DEVICE_OUT_BLUETOOTH_SCO                  ,       11},
        {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET          ,       11},
        {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT           ,       11},
@@ -2742,9 +2742,9 @@
         *num_devices = 2;
         new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
         new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
+        status = true;
     }
 
-
     ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
         snd_device, *num_devices, *new_snd_devices);
 
@@ -4697,10 +4697,31 @@
                  ALOGD("%s:becf: afe: true napb active set rate to 44.1 khz",
                        __func__);
             }
-        } else if ((OUTPUT_SAMPLING_RATE_44100 == sample_rate) &&
-                   (na_mode != NATIVE_AUDIO_MODE_MULTIPLE_44_1)) {
-                 sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
-                 ALOGD("%s:becf: afe: napb not active - set (48k) default rate",
+        } else if (na_mode != NATIVE_AUDIO_MODE_MULTIPLE_44_1) {
+            /*
+             * Map native sampling rates to upper limit range
+             * if multiple of native sampling rates are not supported.
+             * This check also indicates that this is not tavil codec
+             * And 32bit/384kHz is only supported on tavil
+             * Hence reset 32b/384kHz to 24b/192kHz.
+             */
+            switch (sample_rate) {
+                case 44100:
+                    sample_rate = 48000;
+                    break;
+                case 88200:
+                    sample_rate = 96000;
+                    break;
+                case 176400:
+                case 352800:
+                case 384000:
+                    sample_rate = 192000;
+                    break;
+            }
+            if (bit_width > 24)
+                bit_width = 24;
+
+            ALOGD("%s:becf: afe: napb not active - set non fractional rate",
                        __func__);
         }
     } else if ((usecase->devices & AUDIO_DEVICE_OUT_SPEAKER) ||
@@ -4751,23 +4772,6 @@
             channels_updated = true;
     }
 
-    /*
-     * Map native sampling rates to upper limit range
-     * if multiple of native sampling rates are not supported.
-     */
-    if (NATIVE_AUDIO_MODE_MULTIPLE_44_1 != na_mode) {
-        switch (sample_rate) {
-            case 88200:
-                sample_rate = 96000;
-                break;
-            case 176400:
-                sample_rate = 192000;
-                break;
-            case 352800:
-                sample_rate = 192000;
-                break;
-        }
-    }
 
     ALOGI("%s:becf: afe: Codec selected backend: %d updated bit width: %d and sample rate: %d",
           __func__, backend_idx , bit_width, sample_rate);
@@ -5627,10 +5631,14 @@
 {
     int ret;
     if (out_snd_device == SND_DEVICE_OUT_USB_HEADSET) {
+        if (property_get_bool("audio.debug.usb.disable_sidetone", 0)) {
+            ALOGI("Debug: Disable sidetone");
+        } else {
             ret = audio_extn_usb_enable_sidetone(out_snd_device, enable);
             if (ret)
                 ALOGI("%s: usb device %d does not support device sidetone\n",
                   __func__, out_snd_device);
+        }
     } else {
         ALOGV("%s: sidetone out device(%d) mixer cmd = %s\n",
               __func__, out_snd_device, str);
@@ -5643,6 +5651,22 @@
     return 0;
 }
 
+void platform_update_aanc_path(struct audio_device *adev,
+                               snd_device_t out_snd_device,
+                               bool enable,
+                               char *str)
+{
+    ALOGD("%s: aanc out device(%d) mixer cmd = %s, enable = %d\n",
+          __func__, out_snd_device, str, enable);
+
+    if (enable)
+        audio_route_apply_and_update_path(adev->audio_route, str);
+    else
+        audio_route_reset_and_update_path(adev->audio_route, str);
+
+    return;
+}
+
 static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
         int acdb_device_type, int app_type, int topology_id,
         int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
@@ -5792,3 +5816,8 @@
 ERROR_RETURN:
     return ret;
 }
+
+int platform_get_max_mic_count(void *platform) {
+    struct platform_data *my_data = (struct platform_data *)platform;
+    return my_data->max_mic_count;
+}
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 7dcd1b6..61f42de 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -157,12 +157,17 @@
                           snd_device_t out_snd_device,
                           bool enable,
                           char * str);
+void platform_update_aanc_path(struct audio_device *adev,
+                              snd_device_t out_snd_device,
+                              bool enable,
+                              char * str);
 bool platform_supports_true_32bit();
 bool platform_check_if_backend_has_to_be_disabled(snd_device_t new_snd_device, snd_device_t cuurent_snd_device);
 bool platform_check_codec_dsd_support(void *platform);
 bool platform_check_codec_asrc_support(void *platform);
 int platform_get_backend_index(snd_device_t snd_device);
 int platform_get_ext_disp_type(void *platform);
+void platform_invalidate_hdmi_config(void *platform);
 
 int platform_send_audio_cal(void* platform, int acdb_dev_id, int acdb_device_type,
     int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
@@ -181,4 +186,5 @@
     void* data, int* length);
 
 unsigned char* platform_get_license(void* platform, int* size);
+int platform_get_max_mic_count(void *platform);
 #endif // AUDIO_PLATFORM_API_H
diff --git a/hal/voice.c b/hal/voice.c
index b84c7b7..ca3098b 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -95,6 +95,39 @@
     return;
 }
 
+static bool voice_is_aanc_device(snd_device_t out_device,
+                                 char *mixer_path)
+{
+    bool is_aanc_dev;
+
+    switch (out_device) {
+        case SND_DEVICE_OUT_ANC_HANDSET:
+            is_aanc_dev = true;
+            strlcpy(mixer_path, "aanc-path", MIXER_PATH_MAX_LENGTH);
+            break;
+        default:
+            is_aanc_dev = false;
+            break;
+    }
+
+    return is_aanc_dev;
+}
+
+void voice_check_and_update_aanc_path(struct audio_device *adev,
+                                      snd_device_t out_snd_device,
+                                      bool enable)
+{
+    char mixer_path[MIXER_PATH_MAX_LENGTH];
+
+    ALOGV("%s: %s, out_snd_device: %d\n",
+          __func__, (enable ? "enable" : "disable"), out_snd_device);
+
+    if (voice_is_aanc_device(out_snd_device, mixer_path))
+        platform_update_aanc_path(adev, out_snd_device, enable, mixer_path);
+
+    return;
+}
+
 int voice_stop_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
 {
     int ret = 0;
@@ -125,6 +158,10 @@
     if (!voice_is_call_state_active(adev))
         voice_set_sidetone(adev, uc_info->out_snd_device, false);
 
+    /* Disable aanc only when no calls are active */
+    if (!voice_is_call_state_active(adev))
+        voice_check_and_update_aanc_path(adev, uc_info->out_snd_device, false);
+
     ret = platform_stop_voice_call(adev->platform, session->vsid);
 
     /* 1. Close the PCM devices */
@@ -229,6 +266,10 @@
     pcm_start(session->pcm_tx);
     pcm_start(session->pcm_rx);
 
+    /* Enable aanc only when no calls are active */
+    if (!voice_is_call_state_active(adev))
+        voice_check_and_update_aanc_path(adev, uc_info->out_snd_device, true);
+
     /* Enable sidetone only when no calls are already active */
     if (!voice_is_call_state_active(adev))
         voice_set_sidetone(adev, uc_info->out_snd_device, true);
diff --git a/hal/voice.h b/hal/voice.h
index efe48d8..3ae42a8 100644
--- a/hal/voice.h
+++ b/hal/voice.h
@@ -97,5 +97,8 @@
 void voice_set_sidetone(struct audio_device *adev,
                        snd_device_t out_snd_device,
                        bool enable);
+void voice_check_and_update_aanc_path(struct audio_device *adev,
+                                      snd_device_t out_snd_device,
+                                      bool enable);
 bool voice_is_call_state_active(struct audio_device *adev);
 #endif //VOICE_H
diff --git a/policy_hal/Android.mk b/policy_hal/Android.mk
index 854eaee..f9913c4 100644
--- a/policy_hal/Android.mk
+++ b/policy_hal/Android.mk
@@ -1,3 +1,16 @@
+# This file was modified by Dolby Laboratories, Inc. The portions of the
+# code that are surrounded by "DOLBY..." are copyrighted and
+# licensed separately, as follows:
+#
+# (C)  2016 Dolby Laboratories, Inc.
+# All rights reserved.
+#
+# This program is protected under international and U.S. Copyright laws as
+# an unpublished work. This program is confidential and proprietary to the
+# copyright owners. Reproduction or disclosure, in whole or in part, or the
+# production of derivative works therefrom without the express permission of
+# the copyright owners is prohibited.
+#
 ifneq ($(USE_LEGACY_AUDIO_POLICY), 1)
 ifeq ($(USE_CUSTOM_AUDIO_POLICY), 1)
 LOCAL_PATH := $(call my-dir)
@@ -64,6 +77,11 @@
 ifeq ($(strip $(AUDIO_FEATURE_ENABLED_FM_POWER_OPT)),true)
 LOCAL_CFLAGS += -DFM_POWER_OPT
 endif
+# DOLBY_START
+ifeq ($(strip $(DOLBY_ENABLE)),true)
+LOCAL_CFLAGS += $(dolby_cflags)
+endif
+# DOLBY_END
 
 ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
 LOCAL_CFLAGS += -DUSE_XML_AUDIO_POLICY_CONF
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index d06929c..8bfea9a 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -2231,40 +2231,6 @@
     ALOGD("USE_XML_AUDIO_POLICY_CONF is FALSE");
 #endif
 
-    //TODO: Check the new logic to parse policy conf and update the below code
-    //      Need this when SSR encoding is enabled
-    char ssr_enabled[PROPERTY_VALUE_MAX] = {0};
-    bool prop_ssr_enabled = false;
-
-    if (property_get("ro.qc.sdk.audio.ssr", ssr_enabled, NULL)) {
-        prop_ssr_enabled = atoi(ssr_enabled) || !strncmp("true", ssr_enabled, 4);
-    }
-
-    for (size_t i = 0; i < mHwModules.size(); i++) {
-        ALOGV("Hw module %zu", i);
-        for (size_t j = 0; j < mHwModules[i]->mInputProfiles.size(); j++) {
-            const sp<IOProfile> inProfile = mHwModules[i]->mInputProfiles[j];
-            AudioProfileVector profiles = inProfile->getAudioProfiles();
-            for (size_t k = 0; k < profiles.size(); k++){
-                ChannelsVector channels = profiles[k]->getChannels();
-                for (size_t x = 0; x < channels.size(); x++) {
-                    audio_channel_mask_t channelMask = channels[x];
-                    ALOGV("Channel Mask %x size %zu", channelMask,
-                         channels.size());
-                    if (AUDIO_CHANNEL_IN_5POINT1 == channelMask) {
-                        if (!prop_ssr_enabled) {
-                            ALOGI("removing AUDIO_CHANNEL_IN_5POINT1 from"
-                                " input profile as SSR(surround sound record)"
-                                " is not supported on this chipset variant");
-                            channels.removeItemsAt(x, 1);
-                            ALOGV("Channel Mask size now %zu",
-                                channels.size());
-                        }
-                    }
-                }
-            }
-        }
-    }
 #ifdef RECORD_PLAY_CONCURRENCY
     mIsInputRequestOnProgress = false;
 #endif
diff --git a/post_proc/volume_listener.c b/post_proc/volume_listener.c
index e1dd026..7b60248 100644
--- a/post_proc/volume_listener.c
+++ b/post_proc/volume_listener.c
@@ -697,24 +697,31 @@
     struct listnode *node = NULL;
     vol_listener_context_t *context = NULL;
     vol_listener_context_t *recv_contex = (vol_listener_context_t *)handle;
-    int status = -1;
+    int status = -EINVAL;
     bool recompute_flag = false;
     int active_stream_count = 0;
+    uint32_t session_id;
+    uint32_t stream_type;
+    effect_uuid_t uuid;
+
     ALOGV("%s context %p", __func__, handle);
-    if (recv_contex == NULL || recv_contex->desc == NULL) {
-        ALOGE("%s: Got invalid handle while release, DO NOTHING ", __func__);
+
+    if (recv_contex == NULL) {
         return status;
     }
-
     pthread_mutex_lock(&vol_listner_init_lock);
+    session_id = recv_contex->session_id;
+    stream_type = recv_contex->stream_type;
+    uuid = recv_contex->desc->uuid;
 
     // check if the handle/context provided is valid
     list_for_each(node, &vol_effect_list) {
         context = node_to_item(node, struct vol_listener_context_s, effect_list_node);
-        if ((memcmp(&(context->desc->uuid), &(recv_contex->desc->uuid), sizeof(effect_uuid_t)) == 0)
-            && (context->session_id == recv_contex->session_id)
-            && (context->stream_type == recv_contex->stream_type)) {
+        if ((memcmp(&(context->desc->uuid), &uuid, sizeof(effect_uuid_t)) == 0)
+            && (context->session_id == session_id)
+            && (context->stream_type == stream_type)) {
             ALOGV("--- Found something to remove ---");
+            list_remove(node);
             PRINT_STREAM_TYPE(context->stream_type);
             if (context->dev_id == AUDIO_DEVICE_OUT_SPEAKER) {
                 recompute_flag = true;
@@ -730,6 +737,8 @@
 
     if (status != 0) {
         ALOGE("something wrong ... <<<--- Found NOTHING to remove ... ???? --->>>>>");
+        pthread_mutex_unlock(&vol_listner_init_lock);
+        return status;
     }
 
     // if there are no active streams, reset cal and volume level
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
index 8426945..f334719 100644
--- a/qahw_api/test/qahw_playback_test.c
+++ b/qahw_api/test/qahw_playback_test.c
@@ -18,188 +18,471 @@
 
 /* Test app to play audio at the HAL layer */
 
+#include <getopt.h>
+#include <pthread.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
 #include "qahw_api.h"
 #include "qahw_defs.h"
+
 #define nullptr NULL
-#define WAV 1
-#define MP3 2
+FILE * log_file = NULL;
+const char *log_filename = NULL;
+float vol_level = 0.01;
+
+enum {
+    FILE_WAV = 1,
+    FILE_MP3,
+    FILE_AAC,
+    FILE_AAC_ADTS
+};
+
+typedef enum {
+    AAC_LC = 1,
+    AAC_HE_V1,
+    AAC_HE_V2
+} aac_format_type_t;
+
+static pthread_mutex_t write_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t write_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t drain_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t drain_cond = PTHREAD_COND_INITIALIZER;
+
+
+int async_callback(qahw_stream_callback_event_t event, void *param,
+                  void *cookie)
+{
+    switch (event) {
+    case QAHW_STREAM_CBK_EVENT_WRITE_READY:
+        fprintf(log_file, "QAHW_STREAM_CBK_EVENT_DRAIN_READY\n");
+        pthread_mutex_lock(&write_lock);
+        pthread_cond_signal(&write_cond);
+        pthread_mutex_unlock(&write_lock);
+        break;
+    case QAHW_STREAM_CBK_EVENT_DRAIN_READY:
+        fprintf(log_file, "QAHW_STREAM_CBK_EVENT_DRAIN_READY\n");
+        pthread_mutex_lock(&drain_lock);
+        pthread_cond_signal(&drain_cond);
+        pthread_mutex_unlock(&drain_lock);
+    default:
+        break;
+    }
+    return 0;
+}
+
+
+int write_to_hal(qahw_stream_handle_t* out_handle, char *data,
+              size_t bytes)
+{
+    ssize_t ret;
+    pthread_mutex_lock(&write_lock);
+    qahw_out_buffer_t out_buf;
+
+    memset(&out_buf,0, sizeof(qahw_out_buffer_t));
+    out_buf.buffer = data;
+    out_buf.bytes = bytes;
+
+    ret = qahw_out_write(out_handle, &out_buf);
+    if (ret < 0 || ret == bytes) {
+        fprintf(log_file, "Writing data to hal failed or full write %ld, %ld\n",
+            ret, bytes);
+    } else if (ret != bytes) {
+        fprintf(log_file, "ret %ld, bytes %ld\n", ret, bytes);
+        fprintf(log_file, "Waiting for event write ready\n");
+        pthread_cond_wait(&write_cond, &write_lock);
+        fprintf(log_file, "out of wait for event write ready\n");
+    }
+
+    pthread_mutex_unlock(&write_lock);
+    return ret;
+}
 
 
 /* Play audio from a WAV file.
+ *
+ * Parameters:
+ *  out_stream: A pointer to the output audio stream.
+ *  in_file: A pointer to a SNDFILE object.
+ *  config: A pointer to struct that contains audio configuration data.
+ *
+ * Returns: An int which has a non-negative number on success.
+ */
 
- Parameters:
-   out_stream: A pointer to the output audio stream.
-   in_file: A pointer to a SNDFILE object.
-   config: A pointer to struct that contains audio configuration data.
+int play_file(qahw_stream_handle_t* out_handle, FILE* in_file,
+              bool is_offload) {
+    int rc = 0;
+    int offset = 0;
+    size_t bytes_wanted = 0;
+    size_t write_length = 0;
+    size_t bytes_remaining = 0;
+    size_t bytes_written = 0;
+    size_t bytes_read = 0;
+    char  *data = NULL;
+    qahw_out_buffer_t out_buf;
+    bool exit = false;
 
- Returns: An int which has a non-negative number on success.
-*/
+    if (is_offload) {
+        fprintf(log_file, "Set callback for offload stream\n");
+        qahw_out_set_callback(out_handle, async_callback, NULL);
+    }
 
-int play_file(qahw_stream_handle_t* out_handle, FILE* in_file) {
+    rc = qahw_out_set_volume(out_handle, vol_level, vol_level);
+    if (rc < 0)
+        fprintf(log_file, "unable to set volume");
 
-  int rc = 0;
-  size_t frames_read = 1;
-  size_t bytes_wanted ;
-  char  *data = NULL;
-  qahw_out_buffer_t out_buf;
+    bytes_wanted = qahw_out_get_buffer_size(out_handle);
+    data = (char *) malloc (bytes_wanted);
+    if (data == NULL) {
+        fprintf(log_file, "calloc failed!!\n");
+        return -ENOMEM;
+    }
 
-  bytes_wanted = qahw_out_get_buffer_size(out_handle);
-  data = (char *) malloc (bytes_wanted);
-  if (data == NULL) {
-      printf("calloc failed!!\n");
-      return -ENOMEM;
-  }
+    while (!exit) {
+        if (!bytes_remaining) {
+            bytes_read = fread(data, 1, bytes_wanted, in_file);
+            fprintf(log_file, "fread from file %ld\n", bytes_read);
+            if (bytes_read <= 0) {
+                if (feof(in_file)) {
+                    fprintf(log_file, "End of file");
+                    if (is_offload) {
+                        pthread_mutex_lock(&drain_lock);
+                        if (is_offload) {
+                            qahw_out_drain(out_handle, QAHW_DRAIN_ALL);
+                            pthread_cond_wait(&drain_cond, &drain_lock);
+                            fprintf(log_file, "Out of compress drain\n");
+                        }
+                        pthread_mutex_unlock(&drain_lock);
+                    }
+                } else {
+                    fprintf(log_file, "Error in fread --%d\n", ferror(in_file));
+                    fprintf(stderr, "Error in fread --%d\n", ferror(in_file));
+                }
+                exit = true;
+                continue;
+            }
+            bytes_remaining = write_length = bytes_read;
+        }
 
-  while(frames_read != 0) {
-      frames_read = fread(data, bytes_wanted , 1, in_file);
-      if (frames_read < 1) {
-          if (feof(in_file))
-              break;
-          else
-              printf("Error in fread --%d\n",ferror(in_file));
-      }
-      memset(&out_buf,0, sizeof(qahw_out_buffer_t));
-      out_buf.buffer = data;
-      out_buf.bytes = frames_read * bytes_wanted;
-      rc = qahw_out_write(out_handle, &out_buf);
-      if (rc < 0) {
-          printf("Writing data to hal failed %d \n",rc);
-          break;
-      }
-  }
-  return rc;
+        offset = write_length - bytes_remaining;
+        fprintf(log_file, "bytes_remaining %ld, offset %d, write length %ld\n",
+                bytes_remaining, offset, write_length);
+        bytes_written = write_to_hal(out_handle, data+offset, bytes_remaining);
+        bytes_remaining -= bytes_written;
+        fprintf(log_file, "bytes_written %ld, bytes_remaining %ld\n",
+                bytes_written, bytes_remaining);
+    }
+
+    return rc;
 }
 
-// Prints usage information if input arguments are missing.
-void Usage() {
-    fprintf(stderr, "Usage:hal_play [device] [filename] [filetype]\n"
-            "device: hex value representing the audio device (see "
-            "system/media/audio/include/system/audio.h)\n"
-            "filename must be passed as an argument.\n"
-            "filetype (1:WAV 2:MP3) \n");
+bool is_valid_aac_format_type(aac_format_type_t format_type)
+{
+    bool valid_format_type = false;
+
+    switch (format_type) {
+    case AAC_LC:
+    case AAC_HE_V1:
+    case AAC_HE_V2:
+        valid_format_type = true;
+        break;
+    default:
+        break;
+    }
+    return valid_format_type;
+}
+
+/*
+ * Obtain aac format (refer audio.h) for format type entered.
+ */
+
+audio_format_t get_aac_format(int filetype, aac_format_type_t format_type)
+{
+    audio_format_t aac_format = AUDIO_FORMAT_AAC_ADTS_LC; /* default aac frmt*/
+
+    if (filetype == FILE_AAC_ADTS) {
+        switch (format_type) {
+        case AAC_LC:
+            aac_format = AUDIO_FORMAT_AAC_ADTS_LC;
+            break;
+        case AAC_HE_V1:
+            aac_format = AUDIO_FORMAT_AAC_ADTS_HE_V1;
+            break;
+        case AAC_HE_V2:
+            aac_format = AUDIO_FORMAT_AAC_ADTS_HE_V2;
+            break;
+        default:
+            break;
+        }
+    } else if (filetype == FILE_AAC) {
+        switch (format_type) {
+        case AAC_LC:
+            aac_format = AUDIO_FORMAT_AAC_LC;
+            break;
+        case AAC_HE_V1:
+            aac_format = AUDIO_FORMAT_AAC_HE_V1;
+            break;
+        case AAC_HE_V2:
+            aac_format = AUDIO_FORMAT_AAC_HE_V2;
+            break;
+        default:
+            break;
+        }
+    } else {
+        fprintf(log_file, "Invalid filetype provided %d\n", filetype);
+        fprintf(stderr, "Invalid filetype provided %d\n", filetype);
+    }
+
+    fprintf(log_file, "aac format %d\n", aac_format);
+    return aac_format;
+}
+
+void usage() {
+    printf(" \n Command \n");
+    printf(" \n hal_play_test <file path>    - path of file to be played\n");
+    printf(" \n Options\n");
+    printf(" -r  --sample-rate <sampling rate>         - Required for Non-WAV streams\n");
+    printf("                                             For AAC-HE pls specify half the sample rate\n\n");
+    printf(" -c  --channel count <channels>            - Required for Non-WAV streams\n\n");
+    printf(" -v  --volume <float volume level>         - Volume level float value between 0.0 - 1.0.\n");
+    printf(" -d  --device <decimal value>              - see system/media/audio/include/system/audio.h for device values\n");
+    printf("                                             Optional Argument and Default value is 2, i.e Speaker\n\n");
+    printf(" -t  --file-type <file type>               - 1:WAV 2:MP3 3:AAC 4:AAC_ADTS\n");
+    printf("                                             Required for non WAV formats\n\n");
+    printf(" -a  --aac-type <aac type>                 - Required for AAC streams\n");
+    printf("                                             1: LC 2: HE_V1 3: HE_V2\n\n");
+    printf(" -l  --log-file <FILEPATH>                 - File path for debug msg, to print\n");
+    printf("                                             on console use stdout or 1 \n\n");
+    printf(" \n Examples \n");
+    printf(" hal_play_test /etc/Anukoledenadu.wav     -> plays Wav stream with default params\n\n");
+    printf(" hal_play_test /etc/MateRani.mp3 -t 2 -d 2 -v 0.01 -r 44100 -c 2 \n");
+    printf("                                          -> plays MP3 stream(-t = 2) on speaker device(-d = 2)\n");
+    printf("                                          -> 2 channels and 44100 sample rate\n\n");
+    printf(" hal_play_test /etc/AACLC-71-48000Hz-384000bps.aac  -t 4 -d 2 -v 0.05 -r 48000 -c 2 -a 1 \n");
+    printf("                                          -> plays AAC-ADTS stream(-t = 4) on speaker device(-d = 2)\n");
+    printf("                                          -> AAC format type is LC(-a = 1)\n");
+    printf("                                          -> 2 channels and 48000 sample rate\n\n");
+    printf(" hal_play_test /etc/AACHE-adts-stereo-32000KHz-128000Kbps.aac  -t 4 -d 2 -v 0.05 -r 16000 -c 2 -a 3 \n");
+    printf("                                          -> plays AAC-ADTS stream(-t = 4) on speaker device(-d = 2)\n");
+    printf("                                          -> AAC format type is HE V2(-a = 3)\n");
+    printf("                                          -> 2 channels and 16000 sample rate\n");
+    printf("                                          -> note that the sample rate is half the actual sample rate\n\n");
 }
 
 int main(int argc, char* argv[]) {
-    if (argc < 4) {
-        Usage();
-        return -1;
-  }
-  // Process command line arguments.
-  FILE *filestream = NULL;
-  char header[44] = {0};
-  int sample_rate = 0;
-  int channels = 0;
-  const int audio_device_base = 16;
-  char* filename = nullptr;
-  int filetype;
-  qahw_module_handle_t *qahw_mod_handle;
-  const  char *mod_name = "audio.primary";
 
-  uint32_t desired_output_device = strtol(
-      argv[1], nullptr /* look at full string*/, audio_device_base);
+    FILE *file_stream = NULL;
+    char header[44] = {0};
+    char* filename = nullptr;
+    qahw_module_handle_t *qahw_mod_handle;
+    const char *mod_name = "audio.primary";
+    qahw_stream_handle_t* out_handle = nullptr;
+    int rc = 0;
 
-  filename = argv[2];
-  filetype = atoi (argv[3]);
+    /*
+     * Default values
+     */
+    int filetype = FILE_WAV;
+    int sample_rate = 44100;
+    int channels = 2;
+    const int audio_device_base = 0x2;/* spkr device*/
+    aac_format_type_t format_type = AAC_LC;
+    log_file = stdout;
+    audio_devices_t output_device = AUDIO_DEVICE_OUT_SPEAKER;
 
-  printf("Starting audio hal tests.\n");
-  int rc = 0;
+    struct option long_options[] = {
+        /* These options set a flag. */
+        {"device",        required_argument,    0, 'd'},
+        {"sample-rate",   required_argument,    0, 'r'},
+        {"channels",      required_argument,    0, 'c'},
+        {"volume",        required_argument,    0, 'v'},
+        {"log-file",      required_argument,    0, 'l'},
+        {"file-type",     required_argument,    0, 't'},
+        {"aac-type",      required_argument,    0, 'a'},
+        {"help",          no_argument,          0, 'h'},
+        {0, 0, 0, 0}
+    };
 
-  qahw_mod_handle = qahw_load_module(mod_name);
+    int opt = 0;
+    int option_index = 0;
+    while ((opt = getopt_long(argc,
+                              argv,
+                              "-r:c:d:v:l::t:a:h",
+                              long_options,
+                              &option_index)) != -1) {
+            switch (opt) {
+            case 'r':
+                sample_rate = atoi(optarg);
+                break;
+            case 'c':;
+                channels = atoi(optarg);
+                break;
+            case 'd':
+                output_device = atoi(optarg);
+                break;
+            case 'v':
+                vol_level = atof(optarg);
+                break;
+            case 'l':
+                /*
+                 * Fix Me: unable to log to a given file.
+                 */
+                log_filename = optarg;
+                if((log_file = fopen(log_filename,"wb"))== NULL) {
+                    fprintf(stderr, "Cannot open log file %s\n", log_filename);
+                    /*
+                     * continue to log to std out.
+                     */
+                    log_file = stdout;
+                }
 
- // Set to a high number so it doesn't interfere with existing stream handles
-  audio_io_handle_t handle = 0x999;
-  audio_devices_t output_device =
-      (audio_devices_t)desired_output_device;
-  audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
-  audio_config_t config;
+                break;
+            case 't':
+                filetype = atoi(optarg);
+                break;
+            case 'a':
+                format_type = atoi(optarg);
+                break;
+            case 'h':
+                usage();
+                return 0;
+                break;
+         }
+    }
 
-  memset(&config, 0, sizeof(audio_config_t));
+    filename = argv[1];
+    if((file_stream = fopen(filename, "r"))== NULL) {
+        fprintf(stderr, "Cannot Open Audio File %s\n", filename);
+        goto EXIT;
+    }
 
-  if (filename) {
-      printf("filename-----%s\n",filename);
-      filestream = fopen (filename,"r");
-      if (filestream == NULL) {
-          printf("failed to open\n");
-          exit(0);
-      }
-  }
+    /*
+     * Set to a high number so it doesn't interfere with existing stream handles
+     */
 
-  switch (filetype) {
-      case WAV:
-          //Read the wave header
-          rc = fread (header, 44 , 1, filestream);
-          if (rc != 1) {
-              printf("Error .Fread failed\n");
-              exit(0);
-          }
-          if (strncmp (header,"RIFF",4) && strncmp (header+8, "WAVE",4)) {
-              printf("Not a wave format\n");
-              exit (1);
-          }
-          memcpy (&channels, &header[22], 2);
-          memcpy (&sample_rate, &header[24], 4);
-          config.channel_mask = audio_channel_out_mask_from_count(channels);
-          config.offload_info.channel_mask = config.channel_mask;
-          config.offload_info.sample_rate = sample_rate;
-          config.offload_info.format = AUDIO_FORMAT_PCM_16_BIT;
-          break;
-     case MP3:
-          printf("Enter Number of channels:");
-          scanf ("%d",&channels);
-          config.channel_mask = audio_channel_out_mask_from_count(channels);
-          printf("\nEnter Sample Rate:");
-          scanf ("%d",&sample_rate);
-          config.offload_info.channel_mask = config.channel_mask;
-          config.offload_info.sample_rate = sample_rate;
-          config.offload_info.format = AUDIO_FORMAT_MP3;
-          break;
-     default:
-          printf("Does not support given filetype\n");
-          Usage();
-          exit (0);
-  }
-  config.offload_info.version = AUDIO_OFFLOAD_INFO_VERSION_CURRENT;
-  config.offload_info.size = sizeof(audio_offload_info_t);
+    audio_io_handle_t handle = 0x999;
+    audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
 
-  printf("Now playing to output_device=%d sample_rate=%d \n",output_device,
-          config.offload_info.sample_rate);
-  const char* stream_name = "output_stream";
+    fprintf(stdout, "Playing:%s\n", filename);
+    fprintf(stdout, "File Type:%d\n", filetype);
+    fprintf(stdout, "Sample Rate:%d\n", sample_rate);
+    fprintf(stdout, "Channels:%d\n", channels);
+    fprintf(stdout, "Log file:%s\n", log_filename);
+    fprintf(stdout, "Volume level:%f\n", vol_level);
+    fprintf(stdout, "Output Device:%d\n", output_device);
+    fprintf(stdout, "Format Type:%d\n", format_type);
 
-  // Open audio output stream.
-  qahw_stream_handle_t* out_handle = nullptr;
-  printf("calling open_out_put_stream:\n");
-  rc = qahw_open_output_stream(qahw_mod_handle, handle, output_device,
-                                        flags, &config, &out_handle,
-                                        stream_name);
-  printf("open output stream is sucess:%d  out_handhle %p\n",rc,out_handle);
-  if (rc) {
-    printf("could not open output stream %d \n",rc);
-    return -1;
-  }
+    fprintf(stdout, "Starting audio hal tests.\n");
 
-  play_file(out_handle, filestream);
+    qahw_mod_handle = qahw_load_module(mod_name);
 
-  // Close output stream and device.
-  rc = qahw_out_standby(out_handle);
-  if (rc) {
-      printf("out standby failed %d \n",rc);
-  }
+    audio_config_t config;
+    memset(&config, 0, sizeof(audio_config_t));
 
-  rc = qahw_close_output_stream(out_handle);
-  if (rc) {
-      printf("could not close output stream %d \n",rc);
-  }
+    switch (filetype) {
+    case FILE_WAV:
+        /*
+         * Read the wave header
+         */
+        rc = fread (header, 44 , 1, file_stream);
+        if (rc != 1) {
+           fprintf(stdout, "Error .Fread failed\n");
+           exit(0);
+        }
+        if (strncmp (header, "RIFF", 4) && strncmp (header+8, "WAVE", 4)) {
+           fprintf(stdout, "Not a wave format\n");
+           exit (1);
+        }
+        memcpy (&channels, &header[22], 2);
+        memcpy (&sample_rate, &header[24], 4);
+        config.channel_mask = audio_channel_out_mask_from_count(channels);
+        config.offload_info.channel_mask = config.channel_mask;
+        config.offload_info.sample_rate = sample_rate;
+        config.offload_info.format = AUDIO_FORMAT_PCM_16_BIT;
+        break;
 
-  rc = qahw_unload_module(qahw_mod_handle);
-  if (rc) {
-      printf("could not unload hal  %d \n",rc);
-      return -1;
-  }
+    case FILE_MP3:
+        config.channel_mask = audio_channel_out_mask_from_count(channels);
+        config.offload_info.channel_mask = config.channel_mask;
+        config.sample_rate = sample_rate;
+        config.offload_info.sample_rate = sample_rate;
+        config.offload_info.format = AUDIO_FORMAT_MP3;
+        flags |= AUDIO_OUTPUT_FLAG_NON_BLOCKING;
+        break;
 
-  printf("Done with hal tests \n");
-  return 0;
+    case FILE_AAC:
+    case FILE_AAC_ADTS:
+        config.channel_mask = audio_channel_out_mask_from_count(channels);
+        config.offload_info.channel_mask = config.channel_mask;
+        config.sample_rate = sample_rate;
+        config.offload_info.sample_rate = sample_rate;
+        if (!is_valid_aac_format_type(format_type)) {
+            fprintf(log_file, "Invalid format type for AAC %d\n", format_type);
+            goto EXIT;
+        }
+        config.offload_info.format = get_aac_format(filetype, format_type);
+        flags |= AUDIO_OUTPUT_FLAG_NON_BLOCKING;
+        break;
+
+
+    default:
+       fprintf(stderr, "Does not support given filetype\n");
+       usage();
+       return 0;
+    }
+    config.offload_info.version = AUDIO_OFFLOAD_INFO_VERSION_CURRENT;
+    config.offload_info.size = sizeof(audio_offload_info_t);
+
+    fprintf(log_file, "Now playing to output_device=%d sample_rate=%d \n"
+        , output_device, config.offload_info.sample_rate);
+    const char* stream_name = "output_stream";
+
+    fprintf(log_file, "calling open_out_put_stream:\n");
+    rc = qahw_open_output_stream(qahw_mod_handle,
+                                 handle,
+                                 output_device,
+                                 flags,
+                                 &config,
+                                 &out_handle,
+                                 stream_name);
+    fprintf(log_file, "open output stream is sucess:%d  out_handhle %p\n"
+        , rc, out_handle);
+    if (rc) {
+        fprintf(stdout, "could not open output stream %d \n", rc);
+        goto EXIT;
+    }
+
+    play_file(out_handle,
+              file_stream,
+             (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD));
+
+EXIT:
+
+    if (out_handle != nullptr) {
+        rc = qahw_out_standby(out_handle);
+        if (rc) {
+            fprintf(stdout, "out standby failed %d \n", rc);
+        }
+
+        rc = qahw_close_output_stream(out_handle);
+        if (rc) {
+            fprintf(stdout, "could not close output stream %d \n", rc);
+        }
+
+        rc = qahw_unload_module(qahw_mod_handle);
+        if (rc) {
+            fprintf(stdout, "could not unload hal  %d \n", rc);
+            return -1;
+        }
+    }
+
+    if ((log_file != stdout) && (log_file != nullptr))
+        fclose(log_file);
+
+    if (file_stream != nullptr)
+        fclose(file_stream);
+
+    fprintf(stdout, "\nBYE BYE\n");
+    return 0;
 }