Merge "audio: configs: Support compress record and SVA usecase"
diff --git a/configs/sdm670/mixer_paths_skuw.xml b/configs/sdm670/mixer_paths_skuw.xml
index 2b3c8bb..bced57c 100644
--- a/configs/sdm670/mixer_paths_skuw.xml
+++ b/configs/sdm670/mixer_paths_skuw.xml
@@ -2624,4 +2624,25 @@
     <path name="mmap-record usb-headset-mic">
        <ctl name="MultiMedia16 Mixer USB_AUDIO_TX" value="1" />
     </path>
+
+    <path name="hifi-playback display-port">
+        <ctl name="DISPLAY_PORT Mixer MultiMedia2" value="1" />
+    </path>
+
+    <path name="hifi-playback afe-proxy">
+        <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
+    </path>
+
+    <path name="hifi-playback usb-headset">
+        <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia2" value="1" />
+    </path>
+
+    <path name="hifi-playback usb-headphones">
+        <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia2" value="1" />
+    </path>
+
+    <path name="hifi-record usb-headset-mic">
+        <ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
+    </path>
+
 </mixer>
diff --git a/configs/sdm845/mixer_paths_i2s.xml b/configs/sdm845/mixer_paths_i2s.xml
index 10d5ec5..75d984f 100644
--- a/configs/sdm845/mixer_paths_i2s.xml
+++ b/configs/sdm845/mixer_paths_i2s.xml
@@ -144,11 +144,11 @@
     </path>
 
     <path name="adc2">
+        <ctl name="AIF1_CAP Mixer SLIM TX6" value="1"/>
         <ctl name="MI2S_TX Channels" value="One" />
-        <ctl name="AIF1_CAP Mixer SLIM TX8" value="1"/>
-        <ctl name="SLIM TX8 MUX" value="DEC8" />
-        <ctl name="ADC MUX8" value="AMIC" />
-        <ctl name="AMIC MUX8" value="ADC2" />
+        <ctl name="SLIM TX6 MUX" value="DEC6" />
+        <ctl name="ADC MUX6" value="AMIC" />
+        <ctl name="AMIC MUX6" value="ADC2" />
     </path>
 
     <path name="dmic1">
@@ -159,14 +159,15 @@
     </path>
 
     <path name="speaker">
-        <ctl name="SLIM RX3 MUX" value="AIF1_PB" />
-        <ctl name="SLIM RX4 MUX" value="AIF1_PB" />
-        <ctl name="QUAT_MI2S_RX Channels" value="Two" />
-        <ctl name="RX1 MIX1 INP1" value="RX3" />
-        <ctl name="RX2 MIX1 INP1" value="RX4" />
-        <ctl name="CLASS_H_DSM MUX" value="DSM_HPHL_RX1" />
-        <ctl name="HPHL DAC Switch" value="1" />
-        <ctl name="COMP1 Switch" value="1" />
+        <ctl name="I2S RX0 MUX" value="AIF1_PB" />
+        <ctl name="MI2S_RX Channels" value="One" />
+        <ctl name="CDC_IF RX0 MUX" value="I2S RX0" />
+        <ctl name="RX INT8_1 MIX1 INP0" value="RX0" />
+        <ctl name="COMP8 Switch" value="1" />
+        <ctl name="SpkrRight COMP Switch" value="1" />
+        <ctl name="SpkrRight BOOST Switch" value="1" />
+        <ctl name="SpkrRight VISENSE Switch" value="1" />
+        <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
     </path>
 
    <path name="sidetone-iir">
@@ -210,11 +211,13 @@
     </path>
 
     <path name="headphones">
-        <ctl name="SLIM RX2 MUX" value="AIF1_PB" />
-        <ctl name="SLIM RX3 MUX" value="AIF1_PB" />
+        <ctl name="I2S RX0 MUX" value="AIF1_PB" />
+        <ctl name="I2S RX1 MUX" value="AIF1_PB" />
+        <ctl name="CDC_IF RX0 MUX" value="I2S RX0" />
+        <ctl name="CDC_IF RX1 MUX" value="I2S RX1" />
         <ctl name="MI2S_RX Channels" value="Two" />
-        <ctl name="RX INT1_1 MIX1 INP0" value="RX2" />
-        <ctl name="RX INT2_1 MIX1 INP0" value="RX3" />
+        <ctl name="RX INT1_2 MUX" value="RX0" />
+        <ctl name="RX INT2_2 MUX" value="RX1" />
         <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
         <ctl name="RX INT2 DEM MUX" value="CLSH_DSM_OUT" />
         <ctl name="COMP1 Switch" value="1" />
diff --git a/configure.ac b/configure.ac
index 805d00c..78519fc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -73,6 +73,10 @@
          AC_SUBST([TARGET_PLATFORM], ["msm8974"])
          TARGET_CFLAGS="-DPLATFORM_MSM8998"
 fi
+if (test x$TARGET_SUPPORT = xsdxpoorwills); then
+         AC_SUBST([TARGET_PLATFORM], ["msm8974"])
+         TARGET_CFLAGS="-DPLATFORM_SDX24"
+fi
 AC_SUBST([TARGET_CFLAGS])
 
 AM_CONDITIONAL([QTI_AUDIO_SERVER_ENABLED],[test x$BOARD_SUPPORTS_QTI_AUDIO_SERVER = xtrue])
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 9422704..0f82a38 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3421,7 +3421,6 @@
     struct stream_out *out = (struct stream_out *)stream;
 
     lock_output_stream(out);
-
     // always send CMD_ERROR for offload streams, this
     // is needed e.g. when SSR happens within compress_open
     // since the stream is active, offload_callback_thread is also active.
@@ -3429,18 +3428,9 @@
         stop_compressed_output_l(out);
         send_offload_cmd_l(out, OFFLOAD_CMD_ERROR);
     }
-
-    // for compress streams , if the stream is not in standby
-    // it will be triggered eventually from AF.
-    bool do_standby = !out->standby &&
-                      !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD);
-
     pthread_mutex_unlock(&out->lock);
 
-    if (do_standby)
-        return out_standby(&out->stream.common);
-
-    return 0;
+    return out_standby(&out->stream.common);
 }
 
 /*
diff --git a/hal/msm8974/hw_info.c b/hal/msm8974/hw_info.c
index bddaf97..bdc41a5 100644
--- a/hal/msm8974/hw_info.c
+++ b/hal/msm8974/hw_info.c
@@ -558,7 +558,7 @@
     } else if (strstr(snd_card_name, "sdm660") || strstr(snd_card_name, "sdm670")) {
         ALOGV("Bear - variant soundcard");
         update_hardware_info_bear(hw_info, snd_card_name);
-    } else if (strncmp(snd_card_name, "sdx", sizeof("sdx"))) {
+    } else if (strstr(snd_card_name, "sdx")) {
         ALOGV("SDX - variant soundcard");
         update_hardware_info_sdx(hw_info, snd_card_name);
     } else {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index a86c200..39f1af7 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -63,7 +63,7 @@
 #define PLATFORM_INFO_XML_PATH "/etc/audio_platform_info.xml"
 #define MIXER_XML_PATH_AUXPCM "/etc/mixer_paths_auxpcm.xml"
 #define MIXER_XML_PATH_I2S "/etc/mixer_paths_i2s.xml"
-#define PLATFORM_INFO_XML_PATH_I2S "/etc/audio_platform_info_i2s.xml"
+#define PLATFORM_INFO_XML_PATH_I2S "/etc/audio_platform_info_extcodec.xml"
 #else
 #define MIXER_XML_BASE_STRING "/vendor/etc/mixer_paths"
 #define MIXER_XML_DEFAULT_PATH "/vendor/etc/mixer_paths.xml"
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index c2fb810..6efeebe 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -368,11 +368,11 @@
 #define PLAYBACK_OFFLOAD_DEVICE 9
 
 // Direct_PCM
-#if defined (PLATFORM_MSM8994) || defined (PLATFORM_MSM8996) || defined (PLATFORM_APQ8084) || defined (PLATFORM_MSM8998) || defined (PLATFORM_SDM845) || defined (PLATFORM_SDM670) ||defined (PLATFORM_QCS605)
+#if defined (PLATFORM_MSM8994) || defined (PLATFORM_MSM8996) || defined (PLATFORM_APQ8084) || defined (PLATFORM_MSM8998) || defined (PLATFORM_SDM845) || defined (PLATFORM_SDM670) ||defined (PLATFORM_QCS605) ||defined (PLATFORM_SDX24)
 #define PLAYBACK_OFFLOAD_DEVICE2 17
 #endif
 
-#if defined (PLATFORM_APQ8084) || defined (PLATFORM_MSM8996) || defined (PLATFORM_MSM8998) || defined (PLATFORM_SDM845) || defined (PLATFORM_SDM670) || defined(PLATFORM_QCS605)
+#if defined (PLATFORM_APQ8084) || defined (PLATFORM_MSM8996) || defined (PLATFORM_MSM8998) || defined (PLATFORM_SDM845) || defined (PLATFORM_SDM670) || defined(PLATFORM_QCS605) || defined (PLATFORM_SDX24)
 #define PLAYBACK_OFFLOAD_DEVICE3 18
 #define PLAYBACK_OFFLOAD_DEVICE4 34
 #define PLAYBACK_OFFLOAD_DEVICE5 35
diff --git a/mm-audio/aenc-aac/qdsp6/Android.mk b/mm-audio/aenc-aac/qdsp6/Android.mk
index b427233..00d7106 100644
--- a/mm-audio/aenc-aac/qdsp6/Android.mk
+++ b/mm-audio/aenc-aac/qdsp6/Android.mk
@@ -63,6 +63,7 @@
 LOCAL_PRELINK_MODULE    := false
 LOCAL_SHARED_LIBRARIES  := libmm-omxcore
 LOCAL_SHARED_LIBRARIES  += libOmxAacEnc
+LOCAL_VENDOR_MODULE     := true
 LOCAL_SRC_FILES         := test/omx_aac_enc_test.c
 
 include $(BUILD_EXECUTABLE)
diff --git a/mm-audio/aenc-amrnb/qdsp6/Android.mk b/mm-audio/aenc-amrnb/qdsp6/Android.mk
index 3fa619e..ee6b439 100644
--- a/mm-audio/aenc-amrnb/qdsp6/Android.mk
+++ b/mm-audio/aenc-amrnb/qdsp6/Android.mk
@@ -63,6 +63,7 @@
 LOCAL_PRELINK_MODULE    := false
 LOCAL_SHARED_LIBRARIES  := libmm-omxcore
 LOCAL_SHARED_LIBRARIES  += libOmxAmrEnc
+LOCAL_VENDOR_MODULE     := true
 LOCAL_SRC_FILES         := test/omx_amr_enc_test.c
 
 include $(BUILD_EXECUTABLE)
diff --git a/mm-audio/aenc-evrc/qdsp6/Android.mk b/mm-audio/aenc-evrc/qdsp6/Android.mk
index 03965cb..14a2b70 100644
--- a/mm-audio/aenc-evrc/qdsp6/Android.mk
+++ b/mm-audio/aenc-evrc/qdsp6/Android.mk
@@ -62,6 +62,7 @@
 LOCAL_PRELINK_MODULE    := false
 LOCAL_SHARED_LIBRARIES  := libmm-omxcore
 LOCAL_SHARED_LIBRARIES  += libOmxEvrcEnc
+LOCAL_VENDOR_MODULE     := true
 LOCAL_SRC_FILES         := test/omx_evrc_enc_test.c
 
 include $(BUILD_EXECUTABLE)
diff --git a/mm-audio/aenc-g711/qdsp6/Android.mk b/mm-audio/aenc-g711/qdsp6/Android.mk
index 6b2b453..d2dc9d1 100644
--- a/mm-audio/aenc-g711/qdsp6/Android.mk
+++ b/mm-audio/aenc-g711/qdsp6/Android.mk
@@ -66,6 +66,7 @@
 LOCAL_PRELINK_MODULE    := false
 LOCAL_SHARED_LIBRARIES  := libmm-omxcore
 LOCAL_SHARED_LIBRARIES  += libOmxG711Enc
+LOCAL_VENDOR_MODULE     := true
 LOCAL_SRC_FILES         := test/omx_g711_enc_test.c
 
 include $(BUILD_EXECUTABLE)
diff --git a/mm-audio/aenc-qcelp13/qdsp6/Android.mk b/mm-audio/aenc-qcelp13/qdsp6/Android.mk
index f4b904a..b88c348 100644
--- a/mm-audio/aenc-qcelp13/qdsp6/Android.mk
+++ b/mm-audio/aenc-qcelp13/qdsp6/Android.mk
@@ -65,6 +65,7 @@
 LOCAL_PRELINK_MODULE    := false
 LOCAL_SHARED_LIBRARIES  := libmm-omxcore
 LOCAL_SHARED_LIBRARIES  += libOmxQcelp13Enc
+LOCAL_VENDOR_MODULE     := true
 LOCAL_SRC_FILES         := test/omx_qcelp13_enc_test.c
 
 include $(BUILD_EXECUTABLE)
diff --git a/qahw/inc/qahw.h b/qahw/inc/qahw.h
index b7088ed..e91fd00 100644
--- a/qahw/inc/qahw.h
+++ b/qahw/inc/qahw.h
@@ -27,8 +27,10 @@
 #include <cutils/bitops.h>
 #include <system/audio.h>
 #include "qahw_defs.h"
+#include "qahw_effect_api.h"
 
 __BEGIN_DECLS
+
 /*
  * Helper macros for module implementors.
  *
@@ -473,6 +475,41 @@
 /* Set audio port configuration */
 int qahw_set_audio_port_config_l(qahw_module_handle_t *hw_module,
                      const struct audio_port_config *config);
+
+/* Audio effects API */
+qahw_effect_lib_handle_t qahw_effect_load_library_l(const char *lib_path);
+
+int32_t qahw_effect_unload_library_l(qahw_effect_lib_handle_t handle);
+
+int32_t qahw_effect_create_l(qahw_effect_lib_handle_t handle,
+                           const qahw_effect_uuid_t *uuid,
+                           int32_t io_handle,
+                           qahw_effect_handle_t *effect_handle);
+
+int32_t qahw_effect_release_l(qahw_effect_lib_handle_t handle,
+                            qahw_effect_handle_t effect_handle);
+
+int32_t qahw_effect_get_descriptor_l(qahw_effect_lib_handle_t handle,
+                                   const qahw_effect_uuid_t *uuid,
+                                   qahw_effect_descriptor_t *effect_desc);
+
+int32_t qahw_effect_get_version_l();
+
+int32_t qahw_effect_process_l(qahw_effect_handle_t self,
+                            qahw_audio_buffer_t *in_buffer,
+                            qahw_audio_buffer_t *out_buffer);
+
+int32_t qahw_effect_command_l(qahw_effect_handle_t self,
+                            uint32_t cmd_code,
+                            uint32_t cmd_size,
+                            void *cmd_data,
+                            uint32_t *reply_size,
+                            void *reply_data);
+
+int32_t qahw_effect_process_reverse_l(qahw_effect_handle_t self,
+                                    qahw_audio_buffer_t *in_buffer,
+                                    qahw_audio_buffer_t *out_buffer);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/qahw/src/qahw_effect.c b/qahw/src/qahw_effect.c
index 2eff79f..9bee2a1 100644
--- a/qahw/src/qahw_effect.c
+++ b/qahw/src/qahw_effect.c
@@ -39,7 +39,6 @@
 #include <stdlib.h>
 
 #include "qahw.h"
-#include "qahw_effect_api.h"
 
 // The current effect API version.
 #define QAHW_EFFECT_API_VERSION_CURRENT QAHW_EFFECT_API_VERSION_0_0
@@ -97,7 +96,7 @@
 }
 
 
-qahw_effect_lib_handle_t qahw_effect_load_library(const char *lib_path) {
+qahw_effect_lib_handle_t qahw_effect_load_library_l(const char *lib_path) {
     audio_effect_library_t *desc;
     qahw_effect_lib_t      *qahw_effect_lib;
     void                   *handle;
@@ -175,7 +174,7 @@
 }
 
 
-int32_t qahw_effect_unload_library(qahw_effect_lib_handle_t handle) {
+int32_t qahw_effect_unload_library_l(qahw_effect_lib_handle_t handle) {
     qahw_effect_lib_t *qahw_effect_lib;
 
     pthread_mutex_lock(&effect_libraries_lock);
@@ -214,7 +213,7 @@
 }
 
 
-int32_t qahw_effect_create(qahw_effect_lib_handle_t handle,
+int32_t qahw_effect_create_l(qahw_effect_lib_handle_t handle,
                            const qahw_effect_uuid_t *uuid,
                            int32_t io_handle,
                            qahw_effect_handle_t *effect_handle) {
@@ -230,7 +229,7 @@
 }
 
 
-int32_t qahw_effect_release(qahw_effect_lib_handle_t handle,
+int32_t qahw_effect_release_l(qahw_effect_lib_handle_t handle,
                             qahw_effect_handle_t effect_handle) {
     int32_t rc = -EINVAL;
     audio_effect_library_t *desc = (audio_effect_library_t *)handle;
@@ -243,7 +242,7 @@
 }
 
 
-int32_t qahw_effect_get_descriptor(qahw_effect_lib_handle_t handle,
+int32_t qahw_effect_get_descriptor_l(qahw_effect_lib_handle_t handle,
                                    const qahw_effect_uuid_t *uuid,
                                    qahw_effect_descriptor_t *effect_desc) {
     int32_t rc = -EINVAL;
@@ -257,12 +256,12 @@
 }
 
 
-int32_t qahw_effect_get_version() {
+int32_t qahw_effect_get_version_l() {
     return QAHW_EFFECT_API_VERSION_CURRENT;
 }
 
 
-int32_t qahw_effect_process(qahw_effect_handle_t self,
+int32_t qahw_effect_process_l(qahw_effect_handle_t self,
                             qahw_audio_buffer_t *in_buffer,
                             qahw_audio_buffer_t *out_buffer) {
     int32_t rc = -EINVAL;
@@ -281,7 +280,7 @@
 }
 
 
-int32_t qahw_effect_command(qahw_effect_handle_t self,
+int32_t qahw_effect_command_l(qahw_effect_handle_t self,
                             uint32_t cmd_code,
                             uint32_t cmd_size,
                             void *cmd_data,
@@ -302,7 +301,7 @@
 }
 
 
-int32_t qahw_effect_process_reverse(qahw_effect_handle_t self,
+int32_t qahw_effect_process_reverse_l(qahw_effect_handle_t self,
                                     qahw_audio_buffer_t *in_buffer,
                                     qahw_audio_buffer_t *out_buffer) {
     int32_t rc = -EINVAL;
diff --git a/qahw_api/src/qahw_api.cpp b/qahw_api/src/qahw_api.cpp
index 8967bd6..8967e79 100644
--- a/qahw_api/src/qahw_api.cpp
+++ b/qahw_api/src/qahw_api.cpp
@@ -64,14 +64,23 @@
 /* Flag to indicate qas status */
 bool g_qas_died = false;
 /* Count how many times hal is loaded */
-static unsigned int g_qas_load_count;
+static unsigned int g_qas_load_count = 0;
 /* Store HAL handle */
 qahw_module_handle_t *g_qas_handle = NULL;
 
+inline int qas_status(sp<Iqti_audio_server> server)
+{
+    if (server == 0) {
+        ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+        return -1;
+    }
+    return 1;
+}
+
 void death_notifier::binderDied(const wp<IBinder>& who)
 {
-    struct listnode *node;
-    p_stream_handle *handle;
+    struct listnode *node = NULL;
+    p_stream_handle *handle = NULL;
 
     if (g_audio_err_cb) {
         ALOGD("%s %d", __func__, __LINE__);
@@ -151,10 +160,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_get_sample_rate(out_handle);
         } else {
             return -ENODEV;
@@ -170,10 +177,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_set_sample_rate(out_handle, rate);
         } else {
             return -ENODEV;
@@ -189,10 +194,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_get_buffer_size(out_handle);
         } else {
             return -ENODEV;
@@ -209,10 +212,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return (audio_channel_mask_t)(-ENODEV);
-            }
+            if (qas_status(qas) == -1)
+                return (audio_channel_mask_t)(-ENODEV);
             return qas->qahw_out_get_channels(out_handle);
         } else {
             return (audio_channel_mask_t)(-ENODEV);
@@ -228,10 +229,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return AUDIO_FORMAT_INVALID;
-            }
+            if (qas_status(qas) == -1)
+                return AUDIO_FORMAT_INVALID;
             return qas->qahw_out_get_format(out_handle);
         } else {
             return AUDIO_FORMAT_INVALID;;
@@ -247,10 +246,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_standby(out_handle);
         } else {
             return -ENODEV;
@@ -267,10 +264,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_set_parameters(out_handle, kv_pairs);
         } else {
             return -ENODEV;
@@ -287,10 +282,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return NULL;
-            }
+            if (qas_status(qas) == -1)
+                return NULL;
             return qas->qahw_out_get_parameters(out_handle, keys);
         } else {
             return NULL;
@@ -308,10 +301,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_set_param_data(out_handle, param_id, payload);
         } else {
             return -ENODEV;
@@ -329,10 +320,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_get_param_data(out_handle, param_id, payload);
         } else {
             return -ENODEV;
@@ -348,10 +337,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_get_latency(out_handle);
         } else {
             return -ENODEV;
@@ -367,10 +354,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_set_volume(out_handle, left, right);
         } else {
             return -ENODEV;
@@ -386,10 +371,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_write(out_handle, out_buf);
         } else {
             return -ENODEV;
@@ -406,10 +389,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_get_render_position(out_handle, dsp_frames);
         } else {
             return -ENODEV;
@@ -427,10 +408,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_set_callback(out_handle, callback, cookie);
         } else {
             return -ENODEV;
@@ -446,10 +425,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_pause(out_handle);
         } else {
             return -ENODEV;
@@ -465,10 +442,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_resume(out_handle);
         } else {
             return -ENODEV;
@@ -484,10 +459,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-                ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+            if (qas_status(qas) == -1)
                 return -ENODEV;
-            }
             return qas->qahw_out_drain(out_handle, type);
         } else {
             return -EINVAL;
@@ -503,10 +476,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_flush(out_handle);
         } else {
             return -ENODEV;
@@ -523,10 +494,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_out_get_presentation_position(out_handle,
                                                  frames, timestamp);
         } else {
@@ -544,10 +513,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_get_sample_rate(in_handle);
         } else {
             return -ENODEV;
@@ -563,10 +530,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_set_sample_rate(in_handle, rate);
         } else {
             return -ENODEV;
@@ -582,10 +547,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_get_buffer_size(in_handle);
         } else {
             return -ENODEV;
@@ -601,10 +564,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_get_channels(in_handle);
         } else {
             return -ENODEV;
@@ -620,10 +581,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return (audio_format_t)-ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return (audio_format_t)(-ENODEV);
             return qas->qahw_in_get_format(in_handle);
         } else {
             return (audio_format_t)-ENODEV;
@@ -639,10 +598,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return (audio_format_t)-ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_set_format(in_handle, format);
         } else {
             return (audio_format_t)-ENODEV;
@@ -658,10 +615,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_standby(in_handle);
         } else {
             return -EINVAL;
@@ -677,10 +632,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_set_parameters(in_handle, kv_pairs);
         } else {
             return -ENODEV;
@@ -697,10 +650,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return NULL;
-            }
+            if (qas_status(qas) == -1)
+                return NULL;
             return qas->qahw_in_get_parameters(in_handle, keys);
         } else {
             return NULL;
@@ -716,10 +667,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_read(in_handle, in_buf);
         } else {
             return -ENODEV;
@@ -735,10 +684,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_get_input_frames_lost(in_handle);
         } else {
             return -ENODEV;
@@ -755,10 +702,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_in_get_capture_position(in_handle, frames, time);
         } else {
             return -ENODEV;
@@ -774,10 +719,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_init_check(hw_module);
         } else {
             return -ENODEV;
@@ -793,10 +736,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_set_voice_volume(hw_module, volume);
         } else {
             return -ENODEV;
@@ -812,10 +753,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_set_mode(hw_module, mode);;
         } else {
             return -ENODEV;
@@ -831,10 +770,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_set_mic_mute(hw_module, state);
         } else {
             return -ENODEV;
@@ -850,10 +787,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_get_mic_mute(hw_module, state);
         } else {
             return -ENODEV;
@@ -869,10 +804,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_set_parameters(hw_module, kv_pairs);
         } else {
             return -ENODEV;
@@ -889,10 +822,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return NULL;
-            }
+            if (qas_status(qas) == -1)
+                return NULL;
             return qas->qahw_get_parameters(hw_module, keys);;
         } else {
             return NULL;
@@ -910,10 +841,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_get_param_data(hw_module, param_id, payload);
         } else {
             return -ENODEV;
@@ -931,10 +860,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_set_param_data(hw_module, param_id, payload);
         } else {
             return -ENODEV;
@@ -955,10 +882,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_create_audio_patch(hw_module, num_sources,
                                          sources, num_sinks, sinks,
                                          handle);
@@ -979,10 +904,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_release_audio_patch(hw_module, handle);
         } else {
             return -ENODEV;
@@ -999,10 +922,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_get_audio_port(hw_module, port);
         } else {
             return -ENODEV;
@@ -1019,10 +940,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_set_audio_port_config(hw_module, config);
         } else {
             return -ENODEV;
@@ -1039,10 +958,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_get_input_buffer_size(hw_module, config);
         } else {
             return -ENODEV;
@@ -1064,10 +981,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_open_output_stream(hw_module, handle, devices,
                                                  flags, config, out_handle,
                                                  address);
@@ -1088,14 +1003,13 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_close_output_stream(out_handle);
         } else {
-            p_stream_handle *handle;
-            struct listnode *node, *tempnode;
+            p_stream_handle *handle = NULL;
+            struct listnode *node = NULL;
+            struct listnode *tempnode = NULL;
             pthread_mutex_lock(&list_lock);
             list_for_each_safe(node, tempnode, &stream_list) {
                 handle = node_to_item(node, p_stream_handle, list);
@@ -1105,10 +1019,9 @@
                     ALOGD("%s %d: clear memory of handle %p &handle %p", __func__, __LINE__, handle, &handle);
                     handle->sh_mem_dealer.clear();
                     handle->sh_mem_handle.clear();
+                    list_remove(node);
+                    free(node_to_item(node, p_stream_handle, list));
                 }
-                list_remove(node);
-                free(node_to_item(node, p_stream_handle, list));
-                ALOGD("%s %d: Freed node", __func__, __LINE__);
             }
             pthread_mutex_unlock(&list_lock);
             return -ENODEV;
@@ -1131,10 +1044,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_open_input_stream(hw_module, handle, devices,
                                            config, in_handle, flags,
                                            address, source);
@@ -1154,14 +1065,13 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_close_input_stream(in_handle);
         } else {
-            p_stream_handle *handle;
-            struct listnode *node, *tempnode;
+            p_stream_handle *handle = NULL;
+            struct listnode *node = NULL;
+            struct listnode *tempnode = NULL;
             pthread_mutex_lock(&list_lock);
             list_for_each_safe(node, tempnode, &stream_list) {
                 ALOGD("%s %d", __func__, __LINE__);
@@ -1169,13 +1079,12 @@
                 p_stream_handle *p_stream = (p_stream_handle *)in_handle;
                 if (handle != NULL && handle == p_stream) {
                     sh_mem_data *shmem_data = handle->shmem_data;
-                    ALOGD("%s %d: clear memory of handle %p &handle %p", __func__, __LINE__, handle, &handle);
+                    ALOGV("%s %d: clear memory of handle %p", __func__, __LINE__, handle);
                     handle->sh_mem_dealer.clear();
                     handle->sh_mem_handle.clear();
+                    list_remove(node);
+                    free(node_to_item(node, p_stream_handle, list));
                 }
-                list_remove(node);
-                free(node_to_item(node, p_stream_handle, list));
-                ALOGD("%s %d: Freed node", __func__, __LINE__);
             }
             pthread_mutex_unlock(&list_lock);
             return -EINVAL;
@@ -1191,10 +1100,8 @@
     if (g_binder_enabled) {
         if (!g_qas_died) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
             return qas->qahw_get_version();
         } else {
             return -ENODEV;
@@ -1208,12 +1115,11 @@
 {
     ALOGV("%d:%s",__LINE__, __func__);
     if (g_binder_enabled) {
-        if (!g_qas_died && (--g_qas_load_count == 0)) {
+        if (!g_qas_died && ((g_qas_load_count > 0) && (--g_qas_load_count == 0))) {
             sp<Iqti_audio_server> qas = get_qti_audio_server();
-            if (qas == 0) {
-               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-               return -ENODEV;
-            }
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            pthread_mutex_destroy(&list_lock);
             return qas->qahw_unload_module(hw_module);
         } else {
             return -ENODEV;
@@ -1232,10 +1138,8 @@
     ALOGV("%d:%s: g_binder_enabled %d",__LINE__, __func__, g_binder_enabled);
     if (g_binder_enabled) {
         sp<Iqti_audio_server> qas = get_qti_audio_server();
-        if (qas == 0) {
-           ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
-           return (void*)(-ENODEV);
-        }
+        if (qas_status(qas) == -1)
+            return (void*)(-ENODEV);
         g_qas_handle = qas->qahw_load_module(hw_module_id);
         if (g_qas_handle == NULL) {
             ALOGE("%s: HAL loading failed", __func__);
@@ -1254,6 +1158,178 @@
     }
     return g_qas_handle;
 }
+
+/* Audio effects API */
+qahw_effect_lib_handle_t qahw_effect_load_library(const char *lib_name)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return NULL;
+            return qas->qahw_effect_load_library(lib_name);
+        } else {
+            return NULL;
+        }
+    } else {
+        return qahw_effect_load_library_l(lib_name);
+    }
+}
+
+int32_t qahw_effect_unload_library(qahw_effect_lib_handle_t handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_unload_library(handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_unload_library_l(handle);
+    }
+}
+
+int32_t qahw_effect_create(qahw_effect_lib_handle_t handle,
+                           const qahw_effect_uuid_t *uuid,
+                           int32_t io_handle,
+                           qahw_effect_handle_t *effect_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_create(handle, uuid, io_handle, effect_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_create_l(handle, uuid, io_handle, effect_handle);
+    }
+}
+
+int32_t qahw_effect_release(qahw_effect_lib_handle_t handle,
+                            qahw_effect_handle_t effect_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_release(handle, effect_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_release_l(handle, effect_handle);
+    }
+}
+
+int32_t qahw_effect_get_descriptor(qahw_effect_lib_handle_t handle,
+                                   const qahw_effect_uuid_t *uuid,
+                                   qahw_effect_descriptor_t *effect_desc)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_get_descriptor(handle, uuid, effect_desc);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_get_descriptor_l(handle, uuid, effect_desc);
+    }
+}
+
+int32_t qahw_effect_get_version()
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_get_version();
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_get_version_l();
+    }
+}
+
+int32_t qahw_effect_process(qahw_effect_handle_t self,
+                            qahw_audio_buffer_t *in_buffer,
+                            qahw_audio_buffer_t *out_buffer)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_process(self, in_buffer, out_buffer);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_process_l(self, in_buffer, out_buffer);
+    }
+}
+
+int32_t qahw_effect_command(qahw_effect_handle_t self,
+                            uint32_t cmd_code,
+                            uint32_t cmd_size,
+                            void *cmd_data,
+                            uint32_t *reply_size,
+                            void *reply_data)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_command(self, cmd_code, cmd_size, cmd_data,
+                                            reply_size, reply_data);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_command_l(self, cmd_code, cmd_size, cmd_data,
+                                     reply_size, reply_data);
+    }
+}
+
+int32_t qahw_effect_process_reverse(qahw_effect_handle_t self,
+                                    qahw_audio_buffer_t *in_buffer,
+                                    qahw_audio_buffer_t *out_buffer)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died) {
+            sp<Iqti_audio_server> qas = get_qti_audio_server();
+            if (qas_status(qas) == -1)
+                return -ENODEV;
+            return qas->qahw_effect_process_reverse(self, in_buffer, out_buffer);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_effect_process_reverse_l(self, in_buffer, out_buffer);
+    }
+}
+
 #else
 void qahw_register_qas_death_notify_cb(audio_error_callback cb __unused, void* context __unused)
 {
@@ -1524,6 +1600,78 @@
     return qahw_set_param_data_l(hw_module, param_id, payload);
 }
 
+/* Audio effects API */
+qahw_effect_lib_handle_t qahw_effect_load_library(const char *lib_path)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_load_library_l(lib_path);
+}
+
+int32_t qahw_effect_unload_library(qahw_effect_lib_handle_t handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_unload_library_l(handle);
+}
+
+int32_t qahw_effect_create(qahw_effect_lib_handle_t handle,
+                           const qahw_effect_uuid_t *uuid,
+                           int32_t io_handle,
+                           qahw_effect_handle_t *effect_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_create_l(handle, uuid, io_handle, effect_handle);
+}
+
+int32_t qahw_effect_release(qahw_effect_lib_handle_t handle,
+                            qahw_effect_handle_t effect_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_release_l(handle, effect_handle);
+}
+
+int32_t qahw_effect_get_descriptor(qahw_effect_lib_handle_t handle,
+                                   const qahw_effect_uuid_t *uuid,
+                                   qahw_effect_descriptor_t *effect_desc)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_get_descriptor_l(handle, uuid, effect_desc);
+}
+
+int32_t qahw_effect_get_version()
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_get_version_l();
+}
+
+int32_t qahw_effect_process(qahw_effect_handle_t self,
+                            qahw_audio_buffer_t *in_buffer,
+                            qahw_audio_buffer_t *out_buffer)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_process_l(self, in_buffer, out_buffer);
+}
+
+int32_t qahw_effect_command(qahw_effect_handle_t self,
+                            uint32_t cmd_code,
+                            uint32_t cmd_size,
+                            void *cmd_data,
+                            uint32_t *reply_size,
+                            void *reply_data)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_command_l(self, cmd_code, cmd_size,
+                                 cmd_data, reply_size, reply_data);
+}
+
+int32_t qahw_effect_process_reverse(qahw_effect_handle_t self,
+                                    qahw_audio_buffer_t *in_buffer,
+                                    qahw_audio_buffer_t *out_buffer)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_effect_process_reverse_l(self, in_buffer,
+                                         out_buffer);
+}
+
 int qahw_create_audio_patch(qahw_module_handle_t *hw_module,
                         unsigned int num_sources,
                         const struct audio_port_config *sources,
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
index 2469b3c..d42f89d 100644
--- a/qahw_api/test/qahw_playback_test.c
+++ b/qahw_api/test/qahw_playback_test.c
@@ -609,7 +609,7 @@
     if (rc) {
         fprintf(log_file, "stream %d: could not open output stream, error - %d \n", params->stream_index, rc);
         fprintf(stderr, "stream %d: could not open output stream, error - %d \n", params->stream_index, rc);
-        pthread_exit(0);
+        return NULL;
     }
 
     fprintf(log_file, "stream %d: open output stream is success, out_handle %p\n", params->stream_index, params->out_handle);
@@ -634,14 +634,14 @@
             if (!(params->kvpair_values)) {
                fprintf(log_file, "stream %d: error!!No metadata for the clip\n", params->stream_index);
                fprintf(stderr, "stream %d: error!!No metadata for the clip\n", params->stream_index);
-               pthread_exit(0);;
+               return NULL;
             }
             read_kvpair(kvpair, params->kvpair_values, params->filetype);
             rc = qahw_out_set_parameters(params->out_handle, kvpair);
             if(rc){
                 fprintf(log_file, "stream %d: failed to set kvpairs\n", params->stream_index);
                 fprintf(stderr, "stream %d: failed to set kvpairs\n", params->stream_index);
-                pthread_exit(0);;
+                return NULL;
             }
             fprintf(log_file, "stream %d: kvpairs are set\n", params->stream_index);
             break;
@@ -674,7 +674,7 @@
         if (rc < 0) {
             fprintf(log_file, "stream %d: could not create effect command thread!\n", params->stream_index);
             fprintf(stderr, "stream %d: could not create effect command thread!\n", params->stream_index);
-            pthread_exit(0);
+            return NULL;
         }
 
         fprintf(log_file, "stream %d: loading effects\n", params->stream_index);
@@ -766,7 +766,7 @@
     if (data_ptr == NULL) {
         fprintf(log_file, "stream %d: failed to allocate data buffer\n", params->stream_index);
         fprintf(stderr, "stream %d: failed to allocate data buffer\n", params->stream_index);
-        pthread_exit(0);
+        return NULL;
     }
 
     latency = qahw_out_get_latency(params->out_handle);
diff --git a/qahw_api/test/qap_wrapper_extn.c b/qahw_api/test/qap_wrapper_extn.c
index de79ccf..3240cb6 100644
--- a/qahw_api/test/qap_wrapper_extn.c
+++ b/qahw_api/test/qap_wrapper_extn.c
@@ -1446,22 +1446,22 @@
 
     if (fp_input == NULL) {
         fprintf(stderr, "Open File Failed for %s\n", stream_info->filename);
-        pthread_exit(0);
+        return NULL;
     }
     qap_module_handle = stream_info->qap_module_handle;
     buffer = (qap_audio_buffer_t *) calloc(1, sizeof(qap_audio_buffer_t));
     if (buffer == NULL) {
         fprintf(stderr, "%s::%d: Memory Alloc Error\n", __func__, __LINE__);
-        pthread_exit(0);
+        return NULL;
     }
     buffer->common_params.data = calloc(1, FRAME_SIZE);
     if (buffer->common_params.data == NULL) {
         fprintf(stderr, "%s::%d: Memory Alloc Error\n", __func__, __LINE__);
-        pthread_exit(0);
         if (NULL != buffer) {
             free( buffer);
             buffer = NULL;
         }
+        return NULL;
     }
     buffer->buffer_parms.output_buf_params.output_id = output_device_id;
     fprintf(stdout, "%s::%d: output device id %d\n",
@@ -1472,13 +1472,13 @@
     ret = qap_module_cmd(qap_module_handle, QAP_MODULE_CMD_START, sizeof(QAP_MODULE_CMD_START), NULL, NULL, NULL);
     if (ret != QAP_STATUS_OK) {
         fprintf(stderr, "START failed\n");
-        pthread_exit(0);
         if (NULL != buffer &&  NULL != buffer->common_params.data) {
             free( buffer->common_params.data);
             buffer->common_params.data = NULL;
             free( buffer);
             buffer = NULL;
         }
+        return NULL;
     }
 
     do {