diff --git a/Android.mk b/Android.mk
index e590854..0cfc567 100644
--- a/Android.mk
+++ b/Android.mk
@@ -14,6 +14,7 @@
 include $(MY_LOCAL_PATH)/mm-audio/Android.mk
 include $(MY_LOCAL_PATH)/visualizer/Android.mk
 include $(MY_LOCAL_PATH)/post_proc/Android.mk
+include $(MY_LOCAL_PATH)/qahw/Android.mk
 include $(MY_LOCAL_PATH)/qahw_api/Android.mk
 endif
 
diff --git a/configure.ac b/configure.ac
index 9a17458..805d00c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,6 +75,7 @@
 fi
 AC_SUBST([TARGET_CFLAGS])
 
+AM_CONDITIONAL([QTI_AUDIO_SERVER_ENABLED],[test x$BOARD_SUPPORTS_QTI_AUDIO_SERVER = xtrue])
 AM_CONDITIONAL([QAHW_SUPPORT], [test x$BOARD_SUPPORTS_QAHW = xtrue])
 AM_CONDITIONAL([HDMI_EDID],    [test x$AUDIO_FEATURE_ENABLED_HDMI_EDID = xtrue])
 AM_CONDITIONAL([FM_POWER_OPT], [test x$AUDIO_FEATURE_ENABLED_FM_POWER_OPT = xtrue])
diff --git a/qahw/Android.mk b/qahw/Android.mk
new file mode 100644
index 0000000..c7df9e3
--- /dev/null
+++ b/qahw/Android.mk
@@ -0,0 +1,38 @@
+ifeq ($(strip $(BOARD_SUPPORTS_QAHW)),true)
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+libqahw-inc := $(LOCAL_PATH)/inc
+
+LOCAL_MODULE := libqahwwrapper
+LOCAL_MODULE_TAGS := optional
+LOCAL_C_INCLUDES   := $(libqahw-inc)
+
+LOCAL_SRC_FILES := \
+    src/qahw.c \
+    src/qahw_effect.c
+
+LOCAL_SHARED_LIBRARIES := \
+    liblog \
+    libcutils \
+    libhardware \
+    libdl
+
+LOCAL_CFLAGS += -Wall -Werror
+
+LOCAL_COPY_HEADERS_TO   := mm-audio/qahw/inc
+LOCAL_COPY_HEADERS      := inc/qahw.h
+LOCAL_COPY_HEADERS      += inc/qahw_effect_api.h
+
+LOCAL_PRELINK_MODULE    := false
+
+include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_COPY_HEADERS_TO   := mm-audio/qahw_api/inc
+LOCAL_COPY_HEADERS      := inc/qahw_defs.h
+
+include $(BUILD_COPY_HEADERS)
+endif
diff --git a/qahw/Makefile.am b/qahw/Makefile.am
new file mode 100644
index 0000000..b6ebd8b
--- /dev/null
+++ b/qahw/Makefile.am
@@ -0,0 +1,20 @@
+AM_CFLAGS = -I $(top_srcdir)/inc
+
+h_sources = inc/qahw.h \
+            inc/qahw_effect_api.h
+
+qahw_include_HEADERS = $(h_sources)
+qahw_includedir = $(includedir)/mm-audio/qahw/inc
+
+qahw_api_include_HEADERS = inc/qahw_defs.h
+qahw_api_includedir = $(includedir)/mm-audio/qahw_api/inc
+
+lib_LTLIBRARIES = libqahwwrapper.la
+libqahwwrapper_la_SOURCES = src/qahw.c \
+                     src/qahw_effect.c
+
+libqahwwrapper_la_CFLAGS  = $(AM_CFLAGS)
+libqahwwrapper_la_CFLAGS += -include stddef.h
+libqahwwrapper_la_CFLAGS += -D__unused=__attribute__\(\(__unused__\)\)
+libqahwwrapper_la_CFLAGS += -Werror
+libqahwwrapper_la_LDFLAGS = -shared -avoid-version -llog -lcutils -lhardware
diff --git a/qahw/configure.ac b/qahw/configure.ac
new file mode 100644
index 0000000..c87447e
--- /dev/null
+++ b/qahw/configure.ac
@@ -0,0 +1,36 @@
+#                                               -*- Autoconf -*-
+# configure.ac -- Autoconf script for halinterface
+#
+
+# Process this file with autoconf to produce a configure script.
+
+# Requires autoconf tool later than 2.61
+AC_PREREQ([2.69])
+# Initialize the audiohalwrapper-interface package version 1.0.0
+AC_INIT(audiohalwrapperinterface,1.0.0)
+# Does not strictly follow GNU Coding standards
+AM_INIT_AUTOMAKE([foreign])
+# Disables auto rebuilding of configure, Makefile.ins
+#AM_MAINTAINER_MODE
+# defines some macros variable to be included by source
+AC_CONFIG_HEADERS([config.h])
+# defines some macros variable to be included by source
+AC_CONFIG_MACRO_DIR([m4])
+
+# Checks for programs.
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_PROG_CXX
+AC_PROG_LIBTOOL
+AC_PROG_AWK
+AC_PROG_CPP
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+PKG_PROG_PKG_CONFIG
+
+AC_CONFIG_FILES([ \
+        Makefile
+        ])
+
+AC_OUTPUT
diff --git a/qahw/inc/qahw.h b/qahw/inc/qahw.h
new file mode 100644
index 0000000..b7088ed
--- /dev/null
+++ b/qahw/inc/qahw.h
@@ -0,0 +1,482 @@
+/*
+ * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Copyright (C) 2011 The Android Open Source Project *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef QTI_AUDIO_QAHW_H
+#define QTI_AUDIO_QAHW_H
+
+#include <stdint.h>
+#include <strings.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <cutils/bitops.h>
+#include <system/audio.h>
+#include "qahw_defs.h"
+
+__BEGIN_DECLS
+/*
+ * Helper macros for module implementors.
+ *
+ * The derived modules should provide convenience macros for supported
+ * versions so that implementations can explicitly specify module
+ * versions at definition time.
+ */
+
+#define QAHW_MAKE_API_VERSION(maj,min) \
+            ((((maj) & 0xff) << 8) | ((min) & 0xff))
+
+/* First generation of audio devices had version hardcoded to 0. all devices with
+ * versions < 1.0 will be considered of first generation API.
+ */
+#define QAHW_MODULE_API_VERSION_0_0 QAHW_MAKE_API_VERSION(0, 0)
+
+/* Minimal QTI audio HAL version supported by the audio framework */
+#define QAHW_MODULE_API_VERSION_MIN QAHW_MODULE_API_VERSION_0_0
+
+/**
+ * List of known audio HAL modules. This is the base name of the audio HAL
+ * library composed of the "audio." prefix, one of the base names below and
+ * a suffix specific to the device.
+ * e.g: audio.primary.goldfish.so or audio.a2dp.default.so
+ */
+
+#define QAHW_MODULE_ID_PRIMARY     "audio.primary"
+#define QAHW_MODULE_ID_A2DP        "audio.a2dp"
+#define QAHW_MODULE_ID_USB         "audio.usb"
+
+typedef void qahw_module_handle_t;
+typedef void qahw_stream_handle_t;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/**************************************/
+/* Output stream specific APIs **/
+
+/*
+ * This method creates and opens the audio hardware output stream.
+ * The "address" parameter qualifies the "devices" audio device type if needed.
+ * The format format depends on the device type:
+ * - Bluetooth devices use the MAC address of the device in the form "00:11:22:AA:BB:CC"
+ * - USB devices use the ALSA card and device numbers in the form  "card=X;device=Y"
+ * - Other devices may use a number or any other string.
+ */
+
+int qahw_open_output_stream_l(qahw_module_handle_t *hw_module,
+                            audio_io_handle_t handle,
+                            audio_devices_t devices,
+                            audio_output_flags_t flags,
+                            struct audio_config *config,
+                            qahw_stream_handle_t **out_handle,
+                            const char *address);
+
+int qahw_close_output_stream_l(qahw_stream_handle_t *out_handle);
+
+/*
+ * Return the sampling rate in Hz - eg. 44100.
+ */
+uint32_t qahw_out_get_sample_rate_l(const qahw_stream_handle_t *stream);
+
+/*
+ *  use set_parameters with key QAHW_PARAMETER_STREAM_SAMPLING_RATE
+ */
+int qahw_out_set_sample_rate_l(qahw_stream_handle_t *stream, uint32_t rate);
+
+/*
+ * Return size of input/output buffer in bytes for this stream - eg. 4800.
+ * It should be a multiple of the frame size.  See also get_input_buffer_size.
+ */
+size_t qahw_out_get_buffer_size_l(const qahw_stream_handle_t *stream);
+
+/*
+ * Return the channel mask -
+ *  e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
+ */
+audio_channel_mask_t qahw_out_get_channels_l(const qahw_stream_handle_t *stream);
+
+/*
+ * Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
+ */
+audio_format_t qahw_out_get_format_l(const qahw_stream_handle_t *stream);
+
+/*
+ * Put the audio hardware input/output into standby mode.
+ * Driver should exit from standby mode at the next I/O operation.
+ * Returns 0 on success and <0 on failure.
+ */
+int qahw_out_standby_l(qahw_stream_handle_t *stream);
+
+/*
+ * set/get audio stream parameters. The function accepts a list of
+ * parameter key value pairs in the form: key1=value1;key2=value2;...
+ *
+ * Some keys are reserved for standard parameters (See AudioParameter class)
+ *
+ * If the implementation does not accept a parameter change while
+ * the output is active but the parameter is acceptable otherwise, it must
+ * return -ENOSYS.
+ *
+ * The audio flinger will put the stream in standby and then change the
+ * parameter value.
+ */
+int qahw_out_set_parameters_l(qahw_stream_handle_t *stream, const char*kv_pairs);
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char* qahw_out_get_parameters_l(const qahw_stream_handle_t *stream,
+                               const char *keys);
+
+/* API to set playback stream specific config parameters */
+int qahw_out_set_param_data_l(qahw_stream_handle_t *out_handle,
+                            qahw_param_id param_id,
+                            qahw_param_payload *payload);
+
+/* API to get playback stream specific config parameters */
+int qahw_out_get_param_data_l(qahw_stream_handle_t *out_handle,
+                            qahw_param_id param_id,
+                            qahw_param_payload *payload);
+
+/*
+ * Return the audio hardware driver estimated latency in milliseconds.
+ */
+uint32_t qahw_out_get_latency_l(const qahw_stream_handle_t *stream);
+
+/*
+ * Use this method in situations where audio mixing is done in the
+ * hardware. This method serves as a direct interface with hardware,
+ * allowing you to directly set the volume as apposed to via the framework.
+ * This method might produce multiple PCM outputs or hardware accelerated
+ * codecs, such as MP3 or AAC.
+ */
+int qahw_out_set_volume_l(qahw_stream_handle_t *stream, float left, float right);
+
+/*
+ * Write audio buffer present in meta_data starting from offset
+ * along with timestamp to driver. Returns number of bytes
+ * written or a negative status_t. If at least one frame was written successfully
+ * prior to the error, it is suggested that the driver return that successful
+ * (short) byte count and then return an error in the subsequent call.
+ * timestamp is only sent driver is session has been opened with timestamp flag
+ * otherwise its ignored.
+ *
+ * If set_callback() has previously been called to enable non-blocking mode
+ * the write() is not allowed to block. It must write only the number of
+ * bytes that currently fit in the driver/hardware buffer and then return
+ * this byte count. If this is less than the requested write size the
+ * callback function must be called when more space is available in the
+ * driver/hardware buffer.
+ */
+ssize_t qahw_out_write_l(qahw_stream_handle_t *stream,
+                       qahw_out_buffer_t *out_buf);
+
+/*
+ * return the number of audio frames written by the audio dsp to DAC since
+ * the output has exited standby
+ */
+int qahw_out_get_render_position_l(const qahw_stream_handle_t *stream,
+                                 uint32_t *dsp_frames);
+
+/*
+ * set the callback function for notifying completion of non-blocking
+ * write and drain.
+ * Calling this function implies that all future rite() and drain()
+ * must be non-blocking and use the callback to signal completion.
+ */
+int qahw_out_set_callback_l(qahw_stream_handle_t *stream,
+                          qahw_stream_callback_t callback,
+                          void *cookie);
+
+/*
+ * Notifies to the audio driver to stop playback however the queued buffers are
+ * retained by the hardware. Useful for implementing pause/resume. Empty implementation
+ * if not supported however should be implemented for hardware with non-trivial
+ * latency. In the pause state audio hardware could still be using power. User may
+ * consider calling suspend after a timeout.
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_pause_l(qahw_stream_handle_t *out_handle);
+
+/*
+ * Notifies to the audio driver to resume playback following a pause.
+ * Returns error if called without matching pause.
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_resume_l(qahw_stream_handle_t *out_handle);
+
+/*
+ * Requests notification when data buffered by the driver/hardware has
+ * been played. If set_callback() has previously been called to enable
+ * non-blocking mode, the drain() must not block, instead it should return
+ * quickly and completion of the drain is notified through the callback.
+ * If set_callback() has not been called, the drain() must block until
+ * completion.
+ * If type==AUDIO_DRAIN_ALL, the drain completes when all previously written
+ * data has been played.
+ * If type==AUDIO_DRAIN_EARLY_NOTIFY, the drain completes shortly before all
+ * data for the current track has played to allow time for the framework
+ * to perform a gapless track switch.
+ *
+ * Drain must return immediately on stop() and flush() call
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_drain_l(qahw_stream_handle_t *out_handle, qahw_drain_type_t type);
+
+/*
+ * Notifies to the audio driver to flush the queued data. Stream must already
+ * be paused before calling flush().
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_flush_l(qahw_stream_handle_t *out_handle);
+
+/*
+ * Return a recent count of the number of audio frames presented to an external observer.
+ * This excludes frames which have been written but are still in the pipeline.
+ * The count is not reset to zero when output enters standby.
+ * Also returns the value of CLOCK_MONOTONIC as of this presentation count.
+ * The returned count is expected to be 'recent',
+ * but does not need to be the most recent possible value.
+ * However, the associated time should correspond to whatever count is returned.
+ * Example:  assume that N+M frames have been presented, where M is a 'small' number.
+ * Then it is permissible to return N instead of N+M,
+ * and the timestamp should correspond to N rather than N+M.
+ * The terms 'recent' and 'small' are not defined.
+ * They reflect the quality of the implementation.
+ *
+ * 3.0 and higher only.
+ */
+int qahw_out_get_presentation_position_l(const qahw_stream_handle_t *out_handle,
+                                       uint64_t *frames, struct timespec *timestamp);
+
+/* Input stream specific APIs */
+
+/* This method creates and opens the audio hardware input stream */
+int qahw_open_input_stream_l(qahw_module_handle_t *hw_module,
+                           audio_io_handle_t handle,
+                           audio_devices_t devices,
+                           struct audio_config *config,
+                           qahw_stream_handle_t **stream_in,
+                           audio_input_flags_t flags,
+                           const char *address,
+                           audio_source_t source);
+
+int qahw_close_input_stream_l(qahw_stream_handle_t *in_handle);
+
+/*
+ * Return the sampling rate in Hz - eg. 44100.
+ */
+uint32_t qahw_in_get_sample_rate_l(const qahw_stream_handle_t *in_handle);
+
+/*
+ * currently unused - use set_parameters with key
+ *    QAHW_PARAMETER_STREAM_SAMPLING_RATE
+ */
+int qahw_in_set_sample_rate_l(qahw_stream_handle_t *in_handle, uint32_t rate);
+
+/*
+ * Return size of input/output buffer in bytes for this stream - eg. 4800.
+ * It should be a multiple of the frame size.  See also get_input_buffer_size.
+ */
+size_t qahw_in_get_buffer_size_l(const qahw_stream_handle_t *in_handle);
+
+/*
+ * Return the channel mask -
+ *  e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
+ */
+audio_channel_mask_t qahw_in_get_channels_l(const qahw_stream_handle_t *in_handle);
+
+/*
+ * Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
+ */
+audio_format_t qahw_in_get_format_l(const qahw_stream_handle_t *in_handle);
+
+/*
+ * currently unused - use set_parameters with key
+ *     QAHW_PARAMETER_STREAM_FORMAT
+ */
+int qahw_in_set_format_l(qahw_stream_handle_t *in_handle, audio_format_t format);
+
+/*
+ * Put the audio hardware input/output into standby mode.
+ * Driver should exit from standby mode at the next I/O operation.
+ * Returns 0 on success and <0 on failure.
+ */
+int qahw_in_standby_l(qahw_stream_handle_t *in_handle);
+
+/*
+ * set/get audio stream parameters. The function accepts a list of
+ * parameter key value pairs in the form: key1=value1;key2=value2;...
+ *
+ * Some keys are reserved for standard parameters (See AudioParameter class)
+ *
+ * If the implementation does not accept a parameter change while
+ * the output is active but the parameter is acceptable otherwise, it must
+ * return -ENOSYS.
+ *
+ * The audio flinger will put the stream in standby and then change the
+ * parameter value.
+ */
+int qahw_in_set_parameters_l(qahw_stream_handle_t *in_handle, const char *kv_pairs);
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char* qahw_in_get_parameters_l(const qahw_stream_handle_t *in_handle,
+                              const char *keys);
+/*
+ * Read audio buffer in from audio driver. Returns number of bytes read, or a
+ * negative status_t. meta_data structure is filled buffer pointer, start
+ * offset and valid catpure timestamp (if session is opened with timetamp flag)
+ * and buffer. if at least one frame was read prior to the error,
+ * read should return that byte count and then return an error in the
+ * subsequent call.
+ */
+ssize_t qahw_in_read_l(qahw_stream_handle_t *in_handle,
+                     qahw_in_buffer_t *in_buf);
+/*
+ * Return the amount of input frames lost in the audio driver since the
+ * last call of this function.
+ * Audio driver is expected to reset the value to 0 and restart counting
+ * upon returning the current value by this function call.
+ * Such loss typically occurs when the user space process is blocked
+ * longer than the capacity of audio driver buffers.
+ *
+ * Unit: the number of input audio frames
+ */
+uint32_t qahw_in_get_input_frames_lost_l(qahw_stream_handle_t *in_handle);
+
+/*
+ * Return a recent count of the number of audio frames received and
+ * the clock time associated with that frame count.
+ *
+ * frames is the total frame count received. This should be as early in
+ *     the capture pipeline as possible. In general,
+ *     frames should be non-negative and should not go "backwards".
+ *
+ * time is the clock MONOTONIC time when frames was measured. In general,
+ *     time should be a positive quantity and should not go "backwards".
+ *
+ * The status returned is 0 on success, -ENOSYS if the device is not
+ * ready/available, or -EINVAL if the arguments are null or otherwise invalid.
+ */
+int qahw_in_get_capture_position_l(const qahw_stream_handle_t *in_handle,
+                                 int64_t *frames, int64_t *time);
+
+/* Module specific APIs */
+
+/* convenience API for opening and closing an audio HAL module */
+qahw_module_handle_t *qahw_load_module_l(const char *hw_module_id);
+
+int qahw_unload_module_l(qahw_module_handle_t *hw_module);
+
+/*
+ * check to see if the audio hardware interface has been initialized.
+ * returns 0 on success, -ENODEV on failure.
+ */
+int qahw_init_check_l(const qahw_module_handle_t *hw_module);
+
+/* set the audio volume of a voice call. Range is between 0.0 and 1.0 */
+int qahw_set_voice_volume_l(qahw_module_handle_t *hw_module, float volume);
+
+/*
+ * set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode
+ * is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
+ * playing, and AUDIO_MODE_IN_CALL when a call is in progress.
+ */
+int qahw_set_mode_l(qahw_module_handle_t *hw_module, audio_mode_t mode);
+
+/* Mute/unmute mic during voice/voip/HFP call */
+int qahw_set_mic_mute_l(qahw_module_handle_t *hw_module, bool state);
+
+/* Get mute/unmute status of mic during voice call */
+int qahw_get_mic_mute_l(qahw_module_handle_t *hw_module, bool *state);
+
+/* set/get global audio parameters */
+int qahw_set_parameters_l(qahw_module_handle_t *hw_module, const char *kv_pairs);
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char* qahw_get_parameters_l(const qahw_module_handle_t *hw_module,
+                           const char *keys);
+
+/* Returns audio input buffer size according to parameters passed or
+ * 0 if one of the parameters is not supported.
+ * See also get_buffer_size which is for a particular stream.
+ */
+size_t qahw_get_input_buffer_size_l(const qahw_module_handle_t *hw_module,
+                                  const struct audio_config *config);
+
+/*returns current QTI HAL version */
+int qahw_get_version_l();
+
+/* Api to implement get parameters based on keyword param_id
+ * and store data in payload.
+ */
+int qahw_get_param_data_l(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload);
+
+/* Api to implement set parameters based on keyword param_id
+ * and data present in payload.
+ */
+int qahw_set_param_data_l(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload);
+
+/* Creates an audio patch between several source and sink ports.
+ * The handle is allocated by the HAL and should be unique for this
+ * audio HAL module.
+ */
+int qahw_create_audio_patch_l(qahw_module_handle_t *hw_module,
+                        unsigned int num_sources,
+                        const struct audio_port_config *sources,
+                        unsigned int num_sinks,
+                        const struct audio_port_config *sinks,
+                        audio_patch_handle_t *handle);
+
+/* Release an audio patch */
+int qahw_release_audio_patch_l(qahw_module_handle_t *hw_module,
+                        audio_patch_handle_t handle);
+/* Fills the list of supported attributes for a given audio port.
+ * As input, "port" contains the information (type, role, address etc...)
+ * needed by the HAL to identify the port.
+ * As output, "port" contains possible attributes (sampling rates, formats,
+ * channel masks, gain controllers...) for this port.
+ */
+int qahw_get_audio_port_l(qahw_module_handle_t *hw_module,
+                      struct audio_port *port);
+
+/* Set audio port configuration */
+int qahw_set_audio_port_config_l(qahw_module_handle_t *hw_module,
+                     const struct audio_port_config *config);
+#ifdef __cplusplus
+}
+#endif
+
+__END_DECLS
+
+#endif  // QTI_AUDIO_QAHW_H
diff --git a/qahw/inc/qahw_defs.h b/qahw/inc/qahw_defs.h
new file mode 100644
index 0000000..c13a1a4
--- /dev/null
+++ b/qahw/inc/qahw_defs.h
@@ -0,0 +1,393 @@
+/*
+ * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Copyright (C) 2011 The Android Open Source Project *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/cdefs.h>
+#include <stdint.h>
+
+#ifndef QTI_AUDIO_HAL_DEFS_H
+#define QTI_AUDIO_HAL_DEFS_H
+
+__BEGIN_DECLS
+
+/**************************************/
+
+/**
+ *  standard audio parameters that the HAL may need to handle
+ */
+
+/**
+ *  audio device parameters
+ */
+
+/* BT SCO Noise Reduction + Echo Cancellation parameters */
+#define QAHW_PARAMETER_KEY_BT_NREC "bt_headset_nrec"
+#define QAHW_PARAMETER_VALUE_ON "on"
+#define QAHW_PARAMETER_VALUE_OFF "off"
+
+/* TTY mode selection */
+#define QAHW_PARAMETER_KEY_TTY_MODE "tty_mode"
+#define QAHW_PARAMETER_VALUE_TTY_OFF "tty_off"
+#define QAHW_PARAMETER_VALUE_TTY_VCO "tty_vco"
+#define QAHW_PARAMETER_VALUE_TTY_HCO "tty_hco"
+#define QAHW_PARAMETER_VALUE_TTY_FULL "tty_full"
+
+/* Hearing Aid Compatibility - Telecoil (HAC-T) mode on/off
+   Strings must be in sync with CallFeaturesSetting.java */
+#define QAHW_PARAMETER_KEY_HAC "HACSetting"
+#define QAHW_PARAMETER_VALUE_HAC_ON "ON"
+#define QAHW_PARAMETER_VALUE_HAC_OFF "OFF"
+
+/* A2DP sink address set by framework */
+#define QAHW_PARAMETER_A2DP_SINK_ADDRESS "a2dp_sink_address"
+
+/* A2DP source address set by framework */
+#define QAHW_PARAMETER_A2DP_SOURCE_ADDRESS "a2dp_source_address"
+
+/* Screen state */
+#define QAHW_PARAMETER_KEY_SCREEN_STATE "screen_state"
+
+/* Bluetooth SCO wideband */
+#define QAHW_PARAMETER_KEY_BT_SCO_WB "bt_wbs"
+
+/* Get a new HW synchronization source identifier.
+ * Return a valid source (positive integer) or AUDIO_HW_SYNC_INVALID if an error occurs
+ * or no HW sync is available. */
+#define QAHW_PARAMETER_HW_AV_SYNC "hw_av_sync"
+
+/**
+ *  audio stream parameters
+ */
+
+#define QAHW_PARAMETER_STREAM_ROUTING "routing"             /* audio_devices_t */
+#define QAHW_PARAMETER_STREAM_FORMAT "format"               /* audio_format_t */
+#define QAHW_PARAMETER_STREAM_CHANNELS "channels"           /* audio_channel_mask_t */
+#define QAHW_PARAMETER_STREAM_FRAME_COUNT "frame_count"     /* size_t */
+#define QAHW_PARAMETER_STREAM_INPUT_SOURCE "input_source"   /* audio_source_t */
+#define QAHW_PARAMETER_STREAM_SAMPLING_RATE "sampling_rate" /* uint32_t */
+
+#define QAHW_PARAMETER_DEVICE_CONNECT "connect"            /* audio_devices_t */
+#define QAHW_PARAMETER_DEVICE_DISCONNECT "disconnect"      /* audio_devices_t */
+
+/* Query supported formats. The response is a '|' separated list of strings from
+ * audio_format_t enum e.g: "sup_formats=AUDIO_FORMAT_PCM_16_BIT" */
+#define QAHW_PARAMETER_STREAM_SUP_FORMATS "sup_formats"
+
+/* Query supported channel masks. The response is a '|' separated list of
+ * strings from audio_channel_mask_t enum
+ * e.g: "sup_channels=AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_MONO" */
+#define QAHW_PARAMETER_STREAM_SUP_CHANNELS "sup_channels"
+
+/* Query supported sampling rates. The response is a '|' separated list of
+ * integer values e.g: "sup_sampling_rates=44100|48000" */
+#define QAHW_PARAMETER_STREAM_SUP_SAMPLING_RATES "sup_sampling_rates"
+
+/* Set the HW synchronization source for an output stream. */
+#define QAHW_PARAMETER_STREAM_HW_AV_SYNC "hw_av_sync"
+
+/* Enable mono audio playback if 1, else should be 0. */
+#define QAHW_PARAMETER_MONO_OUTPUT "mono_output"
+
+/**
+ * audio codec parameters
+ */
+
+#define QAHW_OFFLOAD_CODEC_PARAMS           "music_offload_codec_param"
+#define QAHW_OFFLOAD_CODEC_BIT_PER_SAMPLE   "music_offload_bit_per_sample"
+#define QAHW_OFFLOAD_CODEC_BIT_RATE         "music_offload_bit_rate"
+#define QAHW_OFFLOAD_CODEC_AVG_BIT_RATE     "music_offload_avg_bit_rate"
+#define QAHW_OFFLOAD_CODEC_ID               "music_offload_codec_id"
+#define QAHW_OFFLOAD_CODEC_BLOCK_ALIGN      "music_offload_block_align"
+#define QAHW_OFFLOAD_CODEC_SAMPLE_RATE      "music_offload_sample_rate"
+#define QAHW_OFFLOAD_CODEC_ENCODE_OPTION    "music_offload_encode_option"
+#define QAHW_OFFLOAD_CODEC_NUM_CHANNEL      "music_offload_num_channels"
+#define QAHW_OFFLOAD_CODEC_DOWN_SAMPLING    "music_offload_down_sampling"
+#define QAHW_OFFLOAD_CODEC_DELAY_SAMPLES    "delay_samples"
+#define QAHW_OFFLOAD_CODEC_PADDING_SAMPLES  "padding_samples"
+
+/**
+ * extended audio codec parameters
+ */
+
+#define QAHW_OFFLOAD_CODEC_WMA_FORMAT_TAG "music_offload_wma_format_tag"
+#define QAHW_OFFLOAD_CODEC_WMA_BLOCK_ALIGN "music_offload_wma_block_align"
+#define QAHW_OFFLOAD_CODEC_WMA_BIT_PER_SAMPLE "music_offload_wma_bit_per_sample"
+#define QAHW_OFFLOAD_CODEC_WMA_CHANNEL_MASK "music_offload_wma_channel_mask"
+#define QAHW_OFFLOAD_CODEC_WMA_ENCODE_OPTION "music_offload_wma_encode_option"
+#define QAHW_OFFLOAD_CODEC_WMA_ENCODE_OPTION1 "music_offload_wma_encode_option1"
+#define QAHW_OFFLOAD_CODEC_WMA_ENCODE_OPTION2 "music_offload_wma_encode_option2"
+
+#define QAHW_OFFLOAD_CODEC_FLAC_MIN_BLK_SIZE "music_offload_flac_min_blk_size"
+#define QAHW_OFFLOAD_CODEC_FLAC_MAX_BLK_SIZE "music_offload_flac_max_blk_size"
+#define QAHW_OFFLOAD_CODEC_FLAC_MIN_FRAME_SIZE "music_offload_flac_min_frame_size"
+#define QAHW_OFFLOAD_CODEC_FLAC_MAX_FRAME_SIZE "music_offload_flac_max_frame_size"
+
+#define QAHW_OFFLOAD_CODEC_ALAC_FRAME_LENGTH "music_offload_alac_frame_length"
+#define QAHW_OFFLOAD_CODEC_ALAC_COMPATIBLE_VERSION "music_offload_alac_compatible_version"
+#define QAHW_OFFLOAD_CODEC_ALAC_BIT_DEPTH "music_offload_alac_bit_depth"
+#define QAHW_OFFLOAD_CODEC_ALAC_PB "music_offload_alac_pb"
+#define QAHW_OFFLOAD_CODEC_ALAC_MB "music_offload_alac_mb"
+#define QAHW_OFFLOAD_CODEC_ALAC_KB "music_offload_alac_kb"
+#define QAHW_OFFLOAD_CODEC_ALAC_NUM_CHANNELS "music_offload_alac_num_channels"
+#define QAHW_OFFLOAD_CODEC_ALAC_MAX_RUN "music_offload_alac_max_run"
+#define QAHW_OFFLOAD_CODEC_ALAC_MAX_FRAME_BYTES "music_offload_alac_max_frame_bytes"
+#define QAHW_OFFLOAD_CODEC_ALAC_AVG_BIT_RATE "music_offload_alac_avg_bit_rate"
+#define QAHW_OFFLOAD_CODEC_ALAC_SAMPLING_RATE "music_offload_alac_sampling_rate"
+#define QAHW_OFFLOAD_CODEC_ALAC_CHANNEL_LAYOUT_TAG "music_offload_alac_channel_layout_tag"
+
+#define QAHW_OFFLOAD_CODEC_APE_COMPATIBLE_VERSION "music_offload_ape_compatible_version"
+#define QAHW_OFFLOAD_CODEC_APE_COMPRESSION_LEVEL "music_offload_ape_compression_level"
+#define QAHW_OFFLOAD_CODEC_APE_FORMAT_FLAGS "music_offload_ape_format_flags"
+#define QAHW_OFFLOAD_CODEC_APE_BLOCKS_PER_FRAME "music_offload_ape_blocks_per_frame"
+#define QAHW_OFFLOAD_CODEC_APE_FINAL_FRAME_BLOCKS "music_offload_ape_final_frame_blocks"
+#define QAHW_OFFLOAD_CODEC_APE_TOTAL_FRAMES "music_offload_ape_total_frames"
+#define QAHW_OFFLOAD_CODEC_APE_BITS_PER_SAMPLE "music_offload_ape_bits_per_sample"
+#define QAHW_OFFLOAD_CODEC_APE_NUM_CHANNELS "music_offload_ape_num_channels"
+#define QAHW_OFFLOAD_CODEC_APE_SAMPLE_RATE "music_offload_ape_sample_rate"
+#define QAHW_OFFLOAD_CODEC_APE_SEEK_TABLE_PRESENT "music_offload_seek_table_present"
+
+#define QAHW_OFFLOAD_CODEC_VORBIS_BITSTREAM_FMT "music_offload_vorbis_bitstream_fmt"
+
+/* Set or Query stream profile type */
+#define QAHW_PARAMETER_STREAM_PROFILE "audio_stream_profile"
+
+/* audio input flags for compress and timestamp mode.
+ * check other input flags defined in audio.h for conflicts
+ */
+#define QAHW_INPUT_FLAG_TIMESTAMP 0x80000000
+#define QAHW_INPUT_FLAG_COMPRESS  0x40000000
+
+/* Query fm volume */
+#define QAHW_PARAMETER_KEY_FM_VOLUME "fm_volume"
+
+/* Query if a2dp  is supported */
+#define QAHW_PARAMETER_KEY_HANDLE_A2DP_DEVICE "isA2dpDeviceSupported"
+
+#define MAX_OUT_CHANNELS 8
+#define MAX_INP_CHANNELS 8
+
+#define QAHW_PCM_CHANNEL_FL    1  /* Front left channel.                           */
+#define QAHW_PCM_CHANNEL_FR    2  /* Front right channel.                          */
+#define QAHW_PCM_CHANNEL_FC    3  /* Front center channel.                         */
+#define QAHW_PCM_CHANNEL_LS    4  /* Left surround channel.                        */
+#define QAHW_PCM_CHANNEL_RS    5  /* Right surround channel.                       */
+#define QAHW_PCM_CHANNEL_LFE   6  /* Low frequency effect channel.                 */
+#define QAHW_PCM_CHANNEL_CS    7  /* Center surround channel; Rear center channel. */
+#define QAHW_PCM_CHANNEL_LB    8  /* Left back channel; Rear left channel.         */
+#define QAHW_PCM_CHANNEL_RB    9  /* Right back channel; Rear right channel.       */
+#define QAHW_PCM_CHANNEL_TS   10  /* Top surround channel.                         */
+#define QAHW_PCM_CHANNEL_CVH  11  /* Center vertical height channel.               */
+#define QAHW_PCM_CHANNEL_MS   12  /* Mono surround channel.                        */
+#define QAHW_PCM_CHANNEL_FLC  13  /* Front left of center.                         */
+#define QAHW_PCM_CHANNEL_FRC  14  /* Front right of center.                        */
+#define QAHW_PCM_CHANNEL_RLC  15  /* Rear left of center.                          */
+#define QAHW_PCM_CHANNEL_RRC  16  /* Rear right of center.                         */
+
+/* type of asynchronous write callback events. Mutually exclusive */
+typedef enum {
+    QAHW_STREAM_CBK_EVENT_WRITE_READY, /* non blocking write completed */
+    QAHW_STREAM_CBK_EVENT_DRAIN_READY,  /* drain completed */
+    QAHW_STREAM_CBK_EVENT_ERROR,  /* stream hit some error */
+
+    QAHW_STREAM_CBK_EVENT_ADSP = 0x100    /* callback event from ADSP PP,
+                                           * corresponding payload will be
+                                           * sent as is to the client
+                                           */
+} qahw_stream_callback_event_t;
+
+typedef int qahw_stream_callback_t(qahw_stream_callback_event_t event,
+                                   void *param,
+                                   void *cookie);
+
+/* type of drain requested to audio_stream_out->drain(). Mutually exclusive */
+typedef enum {
+    QAHW_DRAIN_ALL,            /* drain() returns when all data has been played */
+    QAHW_DRAIN_EARLY_NOTIFY    /* drain() returns a short time before all data
+                                  from the current track has been played to
+                                  give time for gapless track switch */
+} qahw_drain_type_t;
+
+/* meta data flags */
+/*TBD: Extend this based on stb requirement*/
+typedef enum {
+ QAHW_META_DATA_FLAGS_NONE = 0,
+} qahw_meta_data_flags_t;
+
+typedef struct {
+    const void *buffer;    /* write buffer pointer */
+    size_t bytes;          /* size of buffer */
+    size_t offset;         /* offset in buffer from where valid byte starts */
+    int64_t *timestamp;    /* timestmap */
+    qahw_meta_data_flags_t flags; /* meta data flags */
+    uint32_t reserved[64]; /*reserved for future */
+} qahw_out_buffer_t;
+
+typedef struct {
+    void *buffer;          /* read buffer pointer */
+    size_t bytes;          /* size of buffer */
+    size_t offset;         /* offset in buffer from where valid byte starts */
+    int64_t *timestamp;    /* timestmap */
+    uint32_t reserved[64]; /*reserved for future */
+} qahw_in_buffer_t;
+
+#define MAX_SECTORS 8
+
+struct qahw_source_tracking_param {
+    uint8_t   vad[MAX_SECTORS];
+    uint16_t  doa_speech;
+    uint16_t  doa_noise[3];
+    uint8_t   polar_activity[360];
+};
+
+struct qahw_sound_focus_param {
+    uint16_t  start_angle[MAX_SECTORS];
+    uint8_t   enable[MAX_SECTORS];
+    uint16_t  gain_step;
+};
+
+struct aptx_dec_bt_addr {
+    uint32_t nap;
+    uint32_t uap;
+    uint32_t lap;
+};
+
+struct qahw_aptx_dec_param {
+   struct aptx_dec_bt_addr bt_addr;
+};
+
+struct qahw_avt_device_drift_param {
+   /* Flag to indicate if resync is required on the client side for
+    * drift correction. Flag is set to TRUE for the first get_param response
+    * after device interface starts. This flag value can be used by client
+    * to identify if device interface restart has happened and if any
+    * re-sync is required at their end for drift correction.
+    */
+    uint32_t        resync_flag;
+    /* Accumulated drift value in microseconds.
+     * Positive drift value indicates AV timer is running faster than device.
+     * Negative drift value indicates AV timer is running slower than device.
+     */
+    int32_t         avt_device_drift_value;
+    /* 64-bit absolute timestamp of reference */
+    uint64_t        ref_timer_abs_ts;
+};
+
+/*use these for setting infine window.i.e free run mode */
+#define QAHW_MAX_RENDER_START_WINDOW 0x8000000000000000
+#define QAHW_MAX_RENDER_END_WINDOW   0x7FFFFFFFFFFFFFFF
+
+struct qahw_out_render_window_param {
+   uint64_t        render_ws; /* render window start value microseconds*/
+   uint64_t        render_we; /* render window end value microseconds*/
+};
+
+struct qahw_out_start_delay_param {
+   uint64_t       start_delay; /* session start delay in microseconds*/
+};
+
+struct qahw_out_enable_drift_correction {
+   bool        enable; /* enable drift correction*/
+};
+
+struct qahw_out_correct_drift {
+    /*
+     * adjust time in microseconds, a positive value
+     * to advance the clock or a negative value to
+     * delay the clock.
+     */
+    int64_t        adjust_time;
+};
+
+#define QAHW_MAX_ADSP_STREAM_CMD_PAYLOAD_LEN 512
+
+typedef enum {
+    QAHW_STREAM_PP_EVENT = 0,
+    QAHW_STREAM_ENCDEC_EVENT = 1,
+} qahw_event_id;
+
+/* payload format for HAL parameter
+ * QAHW_PARAM_ADSP_STREAM_CMD
+ */
+struct qahw_adsp_event {
+    qahw_event_id event_type;      /* type of the event */
+    uint32_t payload_length;       /* length in bytes of the payload */
+    void *payload;                 /* the actual payload */
+};
+
+struct qahw_out_channel_map_param {
+   uint8_t       channels;                               /* Input Channels */
+   uint8_t       channel_map[AUDIO_CHANNEL_COUNT_MAX];   /* Input Channel Map */
+};
+
+struct qahw_device_cfg_param {
+   uint32_t   sample_rate;
+   uint32_t   channels;
+   uint32_t   bit_width;
+   audio_format_t format;
+   audio_devices_t device;
+   uint8_t    channel_map[AUDIO_CHANNEL_COUNT_MAX];
+   uint16_t   channel_allocation;
+};
+
+typedef struct qahw_mix_matrix_params {
+    uint16_t num_output_channels;
+    uint16_t num_input_channels;
+    uint8_t has_output_channel_map;
+    uint32_t output_channel_map[AUDIO_CHANNEL_COUNT_MAX];
+    uint8_t has_input_channel_map;
+    uint32_t input_channel_map[AUDIO_CHANNEL_COUNT_MAX];
+    uint8_t has_mixer_coeffs;
+    float mixer_coeffs[AUDIO_CHANNEL_COUNT_MAX][AUDIO_CHANNEL_COUNT_MAX];
+} qahw_mix_matrix_params_t;
+
+typedef union {
+    struct qahw_source_tracking_param st_params;
+    struct qahw_sound_focus_param sf_params;
+    struct qahw_aptx_dec_param aptx_params;
+    struct qahw_avt_device_drift_param drift_params;
+    struct qahw_out_render_window_param render_window_params;
+    struct qahw_out_start_delay_param start_delay;
+    struct qahw_out_enable_drift_correction drift_enable_param;
+    struct qahw_out_correct_drift drift_correction_param;
+    struct qahw_adsp_event adsp_event_params;
+    struct qahw_out_channel_map_param channel_map_params;
+    struct qahw_device_cfg_param device_cfg_params;
+    struct qahw_mix_matrix_params mix_matrix_params;
+} qahw_param_payload;
+
+typedef enum {
+    QAHW_PARAM_SOURCE_TRACK,
+    QAHW_PARAM_SOUND_FOCUS,
+    QAHW_PARAM_APTX_DEC,
+    QAHW_PARAM_AVT_DEVICE_DRIFT,  /* PARAM to query AV timer vs device drift */
+    QAHW_PARAM_OUT_RENDER_WINDOW, /* PARAM to set render window */
+    QAHW_PARAM_OUT_START_DELAY, /* PARAM to set session start delay*/
+    /* enable adsp drift correction this must be called before out_write */
+    QAHW_PARAM_OUT_ENABLE_DRIFT_CORRECTION,
+    /* param to set drift value to be adjusted by dsp */
+    QAHW_PARAM_OUT_CORRECT_DRIFT,
+    QAHW_PARAM_ADSP_STREAM_CMD,
+    QAHW_PARAM_OUT_CHANNEL_MAP,    /* PARAM to set i/p channel map */
+    QAHW_PARAM_DEVICE_CONFIG,      /* PARAM to set device config */
+    QAHW_PARAM_OUT_MIX_MATRIX_PARAMS,
+    QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
+} qahw_param_id;
+
+__END_DECLS
+
+#endif  // QTI_AUDIO_HAL_DEFS_H
+
diff --git a/qahw_api/inc/qahw_effect_api.h b/qahw/inc/qahw_effect_api.h
similarity index 99%
rename from qahw_api/inc/qahw_effect_api.h
rename to qahw/inc/qahw_effect_api.h
index 5b380b1..de53cd3 100644
--- a/qahw_api/inc/qahw_effect_api.h
+++ b/qahw/inc/qahw_effect_api.h
@@ -31,7 +31,7 @@
 
 #include <system/audio.h>
 
-#include "qahw_api.h"
+#include "qahw.h"
 
 __BEGIN_DECLS
 
diff --git a/qahw_api/src/qahw.c b/qahw/src/qahw.c
similarity index 87%
rename from qahw_api/src/qahw.c
rename to qahw/src/qahw.c
index b5a85d7..91fc5bf 100644
--- a/qahw_api/src/qahw.c
+++ b/qahw/src/qahw.c
@@ -37,7 +37,7 @@
 #include <cutils/list.h>
 
 #include <hardware/audio.h>
-#include "qahw_api.h"
+#include "qahw.h"
 
 #define NO_ERROR 0
 #define MAX_MODULE_NAME_LENGTH  100
@@ -119,7 +119,7 @@
 /******************************************************************************/
 
 /* call this function without anylock held */
-static bool is_valid_qahw_stream(void *qahw_stream,
+static bool is_valid_qahw_stream_l(void *qahw_stream,
                                  qahw_stream_direction_t dir)
 {
 
@@ -174,7 +174,7 @@
 }
 
 /* call this fucntion with ahw_module_init_lock held*/
-static qahw_module_t* get_qahw_module_by_ptr(qahw_module_t *qahw_module)
+static qahw_module_t* get_qahw_module_by_ptr_l(qahw_module_t *qahw_module)
 {
     struct listnode *node = NULL;
     qahw_module_t *module = NULL, *module_temp = NULL;
@@ -194,7 +194,7 @@
 }
 
 /* call this function with qahw_module_init_lock held*/
-static qahw_module_t* get_qahw_module_by_name(const char *qahw_name)
+static qahw_module_t* get_qahw_module_by_name_l(const char *qahw_name)
 {
     struct listnode *node = NULL;
     qahw_module_t *module = NULL, *module_temp = NULL;
@@ -217,13 +217,13 @@
 /*
  * Return the sampling rate in Hz - eg. 44100.
  */
-uint32_t qahw_out_get_sample_rate(const qahw_stream_handle_t *out_handle)
+uint32_t qahw_out_get_sample_rate_l(const qahw_stream_handle_t *out_handle)
 {
     uint32_t rate = 0;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGV("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -244,13 +244,13 @@
  * currently unused - use set_parameters with key
  *    AUDIO_PARAMETER_STREAM_SAMPLING_RATE
  */
-int qahw_out_set_sample_rate(qahw_stream_handle_t *out_handle, uint32_t rate)
+int qahw_out_set_sample_rate_l(qahw_stream_handle_t *out_handle, uint32_t rate)
 {
     int32_t rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -267,13 +267,13 @@
     return rc;
 }
 
-size_t qahw_out_get_buffer_size(const qahw_stream_handle_t *out_handle)
+size_t qahw_out_get_buffer_size_l(const qahw_stream_handle_t *out_handle)
 {
     size_t buf_size = 0;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -290,13 +290,13 @@
     return buf_size;
 }
 
-audio_channel_mask_t qahw_out_get_channels(const qahw_stream_handle_t *out_handle)
+audio_channel_mask_t qahw_out_get_channels_l(const qahw_stream_handle_t *out_handle)
 {
     audio_channel_mask_t ch_mask = 0;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -313,13 +313,13 @@
     return ch_mask;
 }
 
-audio_format_t qahw_out_get_format(const qahw_stream_handle_t *out_handle)
+audio_format_t qahw_out_get_format_l(const qahw_stream_handle_t *out_handle)
 {
     audio_format_t format = AUDIO_FORMAT_INVALID;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -336,13 +336,13 @@
     return format;
 }
 
-int qahw_out_standby(qahw_stream_handle_t *out_handle)
+int qahw_out_standby_l(qahw_stream_handle_t *out_handle)
 {
     int32_t rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -361,13 +361,13 @@
     return rc;
 }
 
-int qahw_out_set_parameters(qahw_stream_handle_t *out_handle, const char *kv_pairs)
+int qahw_out_set_parameters_l(qahw_stream_handle_t *out_handle, const char *kv_pairs)
 {
     int rc = NO_ERROR;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         rc = -EINVAL;
         goto exit;
@@ -387,14 +387,14 @@
     return rc;
 }
 
-char *qahw_out_get_parameters(const qahw_stream_handle_t *out_handle,
+char *qahw_out_get_parameters_l(const qahw_stream_handle_t *out_handle,
                                const char *keys)
 {
     char *str_param = NULL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -413,7 +413,7 @@
 }
 
 /* API to get playback stream specific config parameters */
-int qahw_out_set_param_data(qahw_stream_handle_t *out_handle,
+int qahw_out_set_param_data_l(qahw_stream_handle_t *out_handle,
                             qahw_param_id param_id,
                             qahw_param_payload *payload)
 {
@@ -426,7 +426,7 @@
         goto exit;
     }
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -446,7 +446,7 @@
 }
 
 /* API to get playback stream specific config parameters */
-int qahw_out_get_param_data(qahw_stream_handle_t *out_handle,
+int qahw_out_get_param_data_l(qahw_stream_handle_t *out_handle,
                             qahw_param_id param_id,
                             qahw_param_payload *payload)
 {
@@ -454,7 +454,7 @@
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -473,13 +473,13 @@
     return rc;
 }
 
-uint32_t qahw_out_get_latency(const qahw_stream_handle_t *out_handle)
+uint32_t qahw_out_get_latency_l(const qahw_stream_handle_t *out_handle)
 {
     uint32_t latency = 0;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -497,13 +497,13 @@
     return latency;
 }
 
-int qahw_out_set_volume(qahw_stream_handle_t *out_handle, float left, float right)
+int qahw_out_set_volume_l(qahw_stream_handle_t *out_handle, float left, float right)
 {
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -522,7 +522,7 @@
    return rc;
 }
 
-ssize_t qahw_out_write(qahw_stream_handle_t *out_handle,
+ssize_t qahw_out_write_l(qahw_stream_handle_t *out_handle,
         qahw_out_buffer_t *out_buf)
 {
     int rc = -EINVAL;
@@ -534,7 +534,7 @@
         goto exit;
     }
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -557,14 +557,14 @@
     return rc;
 }
 
-int qahw_out_get_render_position(const qahw_stream_handle_t *out_handle,
+int qahw_out_get_render_position_l(const qahw_stream_handle_t *out_handle,
                                  uint32_t *dsp_frames)
 {
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -582,7 +582,7 @@
     return rc;
 }
 
-int qahw_out_set_callback(qahw_stream_handle_t *out_handle,
+int qahw_out_set_callback_l(qahw_stream_handle_t *out_handle,
                           qahw_stream_callback_t callback,
                           void *cookie)
 {
@@ -591,7 +591,7 @@
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -610,14 +610,14 @@
     return rc;
 }
 
-int qahw_out_pause(qahw_stream_handle_t *out_handle)
+int qahw_out_pause_l(qahw_stream_handle_t *out_handle)
 {
     /*TBD:load hal func pointer and call */
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -636,14 +636,14 @@
     return rc;
 }
 
-int qahw_out_resume(qahw_stream_handle_t *out_handle)
+int qahw_out_resume_l(qahw_stream_handle_t *out_handle)
 {
     /*TBD:load hal func pointer and call */
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -662,14 +662,14 @@
     return rc;
 }
 
-int qahw_out_drain(qahw_stream_handle_t *out_handle, qahw_drain_type_t type )
+int qahw_out_drain_l(qahw_stream_handle_t *out_handle, qahw_drain_type_t type )
 {
     /*TBD:load hal func pointer and call */
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -688,13 +688,13 @@
     return rc;
 }
 
-int qahw_out_flush(qahw_stream_handle_t *out_handle)
+int qahw_out_flush_l(qahw_stream_handle_t *out_handle)
 {
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -713,14 +713,14 @@
     return rc;
 }
 
-int qahw_out_get_presentation_position(const qahw_stream_handle_t *out_handle,
+int qahw_out_get_presentation_position_l(const qahw_stream_handle_t *out_handle,
                            uint64_t *frames, struct timespec *timestamp)
 {
     int rc = -EINVAL;
     qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
     audio_stream_out_t *out = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         goto exit;
     }
@@ -740,13 +740,13 @@
 }
 
 /* Input stream specific APIs */
-uint32_t qahw_in_get_sample_rate(const qahw_stream_handle_t *in_handle)
+uint32_t qahw_in_get_sample_rate_l(const qahw_stream_handle_t *in_handle)
 {
     uint32_t rate = 0;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -768,13 +768,13 @@
  * currently unused - use set_parameters with key
  *    AUDIO_PARAMETER_STREAM_SAMPLING_RATE
  */
-int qahw_in_set_sample_rate(qahw_stream_handle_t *in_handle, uint32_t rate)
+int qahw_in_set_sample_rate_l(qahw_stream_handle_t *in_handle, uint32_t rate)
 {
     int rc = -EINVAL;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -793,13 +793,13 @@
     return rc;
 }
 
-size_t qahw_in_get_buffer_size(const qahw_stream_handle_t *in_handle)
+size_t qahw_in_get_buffer_size_l(const qahw_stream_handle_t *in_handle)
 {
     size_t buf_size = 0;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -818,13 +818,13 @@
 }
 
 
-audio_channel_mask_t qahw_in_get_channels(const qahw_stream_handle_t *in_handle)
+audio_channel_mask_t qahw_in_get_channels_l(const qahw_stream_handle_t *in_handle)
 {
     audio_channel_mask_t ch_mask = 0;;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -842,13 +842,13 @@
     return ch_mask;
 }
 
-audio_format_t qahw_in_get_format(const qahw_stream_handle_t *in_handle)
+audio_format_t qahw_in_get_format_l(const qahw_stream_handle_t *in_handle)
 {
     audio_format_t format = AUDIO_FORMAT_INVALID;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -870,13 +870,13 @@
  * currently unused - use set_parameters with key
  *     AUDIO_PARAMETER_STREAM_FORMAT
  */
-int qahw_in_set_format(qahw_stream_handle_t *in_handle, audio_format_t format)
+int qahw_in_set_format_l(qahw_stream_handle_t *in_handle, audio_format_t format)
 {
     int rc = -EINVAL;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -895,13 +895,13 @@
     return rc;
 }
 
-int qahw_in_standby(qahw_stream_handle_t *in_handle)
+int qahw_in_standby_l(qahw_stream_handle_t *in_handle)
 {
     int rc = -EINVAL;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -933,13 +933,13 @@
  * The audio flinger will put the stream in standby and then change the
  * parameter value.
  */
-int qahw_in_set_parameters(qahw_stream_handle_t *in_handle, const char *kv_pairs)
+int qahw_in_set_parameters_l(qahw_stream_handle_t *in_handle, const char *kv_pairs)
 {
     int rc = -EINVAL;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -961,14 +961,14 @@
  * Returns a pointer to a heap allocated string. The caller is responsible
  * for freeing the memory for it using free().
  */
-char * qahw_in_get_parameters(const qahw_stream_handle_t *in_handle,
+char * qahw_in_get_parameters_l(const qahw_stream_handle_t *in_handle,
                               const char *keys)
 {
     char *str_param = NULL;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -991,7 +991,7 @@
  *  negative status_t. If at least one frame was read prior to the error,
  *  read should return that byte count and then return an error in the subsequent call.
  */
-ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
+ssize_t qahw_in_read_l(qahw_stream_handle_t *in_handle,
                      qahw_in_buffer_t *in_buf)
 {
     int rc = -EINVAL;
@@ -1003,7 +1003,7 @@
         goto exit;
     }
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -1037,13 +1037,13 @@
  *
  * Unit: the number of input audio frames
  */
-uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
+uint32_t qahw_in_get_input_frames_lost_l(qahw_stream_handle_t *in_handle)
 {
     uint32_t rc = 0;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     audio_stream_in_t *in = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         goto exit;
     }
@@ -1076,7 +1076,7 @@
  * The status returned is 0 on success, -ENOSYS if the device is not
  * ready/available, or -EINVAL if the arguments are null or otherwise invalid.
  */
-int qahw_in_get_capture_position(const qahw_stream_handle_t *in_handle __unused,
+int qahw_in_get_capture_position_l(const qahw_stream_handle_t *in_handle __unused,
                                  int64_t *frames __unused, int64_t *time __unused)
 {
     /*TBD:: do we need this*/
@@ -1087,14 +1087,14 @@
  * check to see if the audio hardware interface has been initialized.
  * returns 0 on success, -ENODEV on failure.
  */
-int qahw_init_check(const qahw_module_handle_t *hw_module)
+int qahw_init_check_l(const qahw_module_handle_t *hw_module)
 {
     int rc = -EINVAL;
     qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1114,14 +1114,14 @@
     return rc;
 }
 /* set the audio volume of a voice call. Range is between 0.0 and 1.0 */
-int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume)
+int qahw_set_voice_volume_l(qahw_module_handle_t *hw_module, float volume)
 {
     int rc = -EINVAL;
     qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1147,14 +1147,14 @@
  * is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
  * playing, and AUDIO_MODE_IN_CALL when a call is in progress.
  */
-int qahw_set_mode(qahw_module_handle_t *hw_module, audio_mode_t mode)
+int qahw_set_mode_l(qahw_module_handle_t *hw_module, audio_mode_t mode)
 {
     int rc = -EINVAL;
     qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1175,14 +1175,14 @@
     return rc;
 }
 
-int qahw_set_mic_mute(qahw_module_handle_t *hw_module, bool state)
+int qahw_set_mic_mute_l(qahw_module_handle_t *hw_module, bool state)
 {
     int rc = -EINVAL;
     qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1203,7 +1203,7 @@
     return rc;
 }
 
-int qahw_get_mic_mute(qahw_module_handle_t *hw_module, bool *state)
+int qahw_get_mic_mute_l(qahw_module_handle_t *hw_module, bool *state)
 {
     size_t rc = 0;
     qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
@@ -1211,7 +1211,7 @@
     audio_hw_device_t *audio_device;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1233,7 +1233,7 @@
 }
 
 /* set/get global audio parameters */
-int qahw_set_parameters(qahw_module_handle_t *hw_module, const char *kv_pairs)
+int qahw_set_parameters_l(qahw_module_handle_t *hw_module, const char *kv_pairs)
 {
     int rc = -EINVAL;
     qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
@@ -1241,7 +1241,7 @@
     audio_hw_device_t *audio_device;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1266,7 +1266,7 @@
  * Returns a pointer to a heap allocated string. The caller is responsible
  * for freeing the memory for it using free().
  */
-char * qahw_get_parameters(const qahw_module_handle_t *hw_module,
+char * qahw_get_parameters_l(const qahw_module_handle_t *hw_module,
                            const char *keys)
 {
     char *str_param = NULL;
@@ -1275,7 +1275,7 @@
     audio_hw_device_t *audio_device;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1298,7 +1298,7 @@
 /* Api to implement get parameters  based on keyword param_id
  * and store data in payload.
  */
-int qahw_get_param_data(const qahw_module_handle_t *hw_module,
+int qahw_get_param_data_l(const qahw_module_handle_t *hw_module,
                         qahw_param_id param_id,
                         qahw_param_payload *payload)
 {
@@ -1307,7 +1307,7 @@
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1332,7 +1332,7 @@
 /* Api to implement set parameters  based on keyword param_id
  * and data present in payload.
  */
-int qahw_set_param_data(const qahw_module_handle_t *hw_module,
+int qahw_set_param_data_l(const qahw_module_handle_t *hw_module,
                         qahw_param_id param_id,
                         qahw_param_payload *payload)
 {
@@ -1341,7 +1341,7 @@
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1367,7 +1367,7 @@
  * The handle is allocated by the HAL and should be unique for this
  * audio HAL module.
  */
-int qahw_create_audio_patch(qahw_module_handle_t *hw_module,
+int qahw_create_audio_patch_l(qahw_module_handle_t *hw_module,
                         unsigned int num_sources,
                         const struct audio_port_config *sources,
                         unsigned int num_sinks,
@@ -1379,7 +1379,7 @@
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1406,7 +1406,7 @@
 }
 
 /* Release an audio patch */
-int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
+int qahw_release_audio_patch_l(qahw_module_handle_t *hw_module,
                         audio_patch_handle_t handle)
 {
     int ret = 0;
@@ -1414,7 +1414,7 @@
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1442,7 +1442,7 @@
  * As output, "port" contains possible attributes (sampling rates, formats,
  * channel masks, gain controllers...) for this port.
  */
-int qahw_get_audio_port(qahw_module_handle_t *hw_module,
+int qahw_get_audio_port_l(qahw_module_handle_t *hw_module,
                       struct audio_port *port)
 {
     int ret = 0;
@@ -1450,7 +1450,7 @@
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1473,7 +1473,7 @@
 }
 
 /* Set audio port configuration */
-int qahw_set_audio_port_config(qahw_module_handle_t *hw_module,
+int qahw_set_audio_port_config_l(qahw_module_handle_t *hw_module,
                      const struct audio_port_config *config)
 {
     int ret = 0;
@@ -1481,7 +1481,7 @@
     qahw_module_t *qahw_module_temp;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1507,7 +1507,7 @@
  * 0 if one of the parameters is not supported.
  * See also get_buffer_size which is for a particular stream.
  */
-size_t qahw_get_input_buffer_size(const qahw_module_handle_t *hw_module,
+size_t qahw_get_input_buffer_size_l(const qahw_module_handle_t *hw_module,
                                   const struct audio_config *config)
 {
     size_t rc = 0;
@@ -1516,7 +1516,7 @@
     audio_hw_device_t *audio_device;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1546,7 +1546,7 @@
  * - USB devices use the ALSA card and device numbers in the form  "card=X;device=Y"
  * - Other devices may use a number or any other string.
  */
-int qahw_open_output_stream(qahw_module_handle_t *hw_module,
+int qahw_open_output_stream_l(qahw_module_handle_t *hw_module,
                             audio_io_handle_t handle,
                             audio_devices_t devices,
                             audio_output_flags_t flags,
@@ -1561,7 +1561,7 @@
     qahw_stream_out_t *qahw_stream_out = NULL;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1634,7 +1634,7 @@
     return rc;
 }
 
-int qahw_close_output_stream(qahw_stream_handle_t *out_handle)
+int qahw_close_output_stream_l(qahw_stream_handle_t *out_handle)
 {
 
     int rc = 0;
@@ -1642,7 +1642,7 @@
     qahw_module_t *qahw_module = NULL;
     audio_hw_device_t *audio_device = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_out, STREAM_DIR_OUT)) {
         ALOGE("%s::Invalid out handle %p", __func__, out_handle);
         rc = -EINVAL;
         goto exit;
@@ -1669,7 +1669,7 @@
 }
 
 /* This method creates and opens the audio hardware input stream */
-int qahw_open_input_stream(qahw_module_handle_t *hw_module,
+int qahw_open_input_stream_l(qahw_module_handle_t *hw_module,
                            audio_io_handle_t handle,
                            audio_devices_t devices,
                            struct audio_config *config,
@@ -1685,7 +1685,7 @@
     qahw_stream_in_t *qahw_stream_in = NULL;
 
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     pthread_mutex_unlock(&qahw_module_init_lock);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
@@ -1738,14 +1738,14 @@
     return rc;
 }
 
-int qahw_close_input_stream(qahw_stream_handle_t *in_handle)
+int qahw_close_input_stream_l(qahw_stream_handle_t *in_handle)
 {
     int rc = 0;
     qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
     qahw_module_t *qahw_module = NULL;
     audio_hw_device_t *audio_device = NULL;
 
-    if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+    if (!is_valid_qahw_stream_l((void *)qahw_stream_in, STREAM_DIR_IN)) {
         ALOGV("%s::Invalid in handle %p", __func__, in_handle);
         rc = -EINVAL;
         goto exit;
@@ -1772,13 +1772,13 @@
 }
 
 /*returns current QTI HAL verison */
-int qahw_get_version() {
+int qahw_get_version_l() {
     return QAHW_MODULE_API_VERSION_CURRENT;
 }
 
 /* convenience API for opening and closing an audio HAL module */
 
-qahw_module_handle_t *qahw_load_module(const char *hw_module_id)
+qahw_module_handle_t *qahw_load_module_l(const char *hw_module_id)
 {
     int rc = -EINVAL;
     qahw_module_handle_t *qahw_mod_handle = NULL;
@@ -1806,7 +1806,7 @@
     /* return exiting module ptr if already loaded */
     pthread_mutex_lock(&qahw_module_init_lock);
     if (qahw_list_count > 0) {
-        qahw_module = get_qahw_module_by_name(hw_module_id);
+        qahw_module = get_qahw_module_by_name_l(hw_module_id);
         if(qahw_module != NULL) {
             qahw_mod_handle = (void *)qahw_module;
             pthread_mutex_lock(&qahw_module->lock);
@@ -1876,7 +1876,7 @@
     return qahw_mod_handle;
 }
 
-int qahw_unload_module(qahw_module_handle_t *hw_module)
+int qahw_unload_module_l(qahw_module_handle_t *hw_module)
 {
     int rc = -EINVAL;
     bool is_empty = false;
@@ -1887,7 +1887,7 @@
      * it is closed
     */
     pthread_mutex_lock(&qahw_module_init_lock);
-    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    qahw_module_temp = get_qahw_module_by_ptr_l(qahw_module);
     if (qahw_module_temp == NULL) {
         ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
         goto error_exit;
diff --git a/qahw_api/src/qahw_effect.c b/qahw/src/qahw_effect.c
similarity index 100%
rename from qahw_api/src/qahw_effect.c
rename to qahw/src/qahw_effect.c
diff --git a/qahw_api/Android.mk b/qahw_api/Android.mk
index ee06a30..ba402ba 100644
--- a/qahw_api/Android.mk
+++ b/qahw_api/Android.mk
@@ -4,28 +4,27 @@
 
 include $(CLEAR_VARS)
 
-libqahw-inc := $(LOCAL_PATH)/inc
+libqahwapi-inc := $(LOCAL_PATH)/inc
 
 LOCAL_MODULE := libqahw
 LOCAL_MODULE_TAGS := optional
-LOCAL_C_INCLUDES   := $(libqahw-inc)
+LOCAL_C_INCLUDES   := $(libqahwapi-inc)
+LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio/qahw/inc
 
 LOCAL_SRC_FILES := \
-    src/qahw.c \
-    src/qahw_effect.c
+    src/qahw_api.cpp
 
 LOCAL_SHARED_LIBRARIES := \
     liblog \
     libcutils \
     libhardware \
-    libdl
+    libdl \
+    libqahwwrapper
 
 LOCAL_CFLAGS += -Wall -Werror
 
 LOCAL_COPY_HEADERS_TO   := mm-audio/qahw_api/inc
 LOCAL_COPY_HEADERS      := inc/qahw_api.h
-LOCAL_COPY_HEADERS      += inc/qahw_defs.h
-LOCAL_COPY_HEADERS      += inc/qahw_effect_api.h
 LOCAL_COPY_HEADERS      += inc/qahw_effect_audiosphere.h
 LOCAL_COPY_HEADERS      += inc/qahw_effect_bassboost.h
 LOCAL_COPY_HEADERS      += inc/qahw_effect_environmentalreverb.h
@@ -40,4 +39,5 @@
 
 #test app compilation
 include $(LOCAL_PATH)/test/Android.mk
+
 endif
diff --git a/qahw_api/Makefile.am b/qahw_api/Makefile.am
index 7c74d25..13fe417 100644
--- a/qahw_api/Makefile.am
+++ b/qahw_api/Makefile.am
@@ -1,8 +1,4 @@
-AM_CFLAGS = -I $(top_srcdir)/qahw_api/inc
-
 h_sources = inc/qahw_api.h \
-            inc/qahw_defs.h \
-            inc/qahw_effect_api.h \
             inc/qahw_effect_audiosphere.h \
             inc/qahw_effect_bassboost.h \
             inc/qahw_effect_environmentalreverb.h \
@@ -11,15 +7,22 @@
             inc/qahw_effect_virtualizer.h \
             inc/qahw_effect_visualizer.h
 
+AM_CPPFLAGS := -I $(top_srcdir)/qahw_api/inc/
+AM_CPPFLAGS += -I $(PKG_CONFIG_SYSROOT_DIR)/usr/include/mm-audio/audio-hal-server
+AM_CPPFLAGS += -I $(PKG_CONFIG_SYSROOT_DIR)/usr/include/mm-audio/qahw/inc
+AM_CPPFLAGS += -D__unused=__attribute__\(\(__unused__\)\)
+
 library_include_HEADERS = $(h_sources)
 library_includedir = $(includedir)/mm-audio/qahw_api/inc
 
-lib_LTLIBRARIES = libqahw.la
-libqahw_la_SOURCES = src/qahw.c \
-                     src/qahw_effect.c
-libqahw_la_CFLAGS = -Dstrlcpy=g_strlcpy $(GLIB_CFLAGS) -include glib.h $(AM_CFLAGS) -include stddef.h
-libqahw_la_CFLAGS += -D__unused=__attribute__\(\(__unused__\)\)
-libqahw_la_CFLAGS += -Wno-sign-compare -Werror
-libqahw_la_CFLAGS += -Dstrlcat=g_strlcat -Dstrlcpy=g_strlcpy -include glib.h $(GLIB_CFLAGS)
-libqahw_la_LIBADD = $(GLIB_LIBS) -llog -lcutils -lhardware -ldl
-libqahw_la_LDFLAGS = -module -shared -avoid-version
+lib_LTLIBRARIES     = libqahw.la
+libqahw_la_SOURCES   = src/qahw_api.cpp
+libqahw_la_LIBADD    = -lqahwwrapper
+libqahw_la_CPPFLAGS := $(AM_CPPFLAGS)
+libqahw_la_CPPFLAGS += -std=c++11 -DHAVE_PTHREADS -DHAVE_ANDROID_OS
+libqahw_la_CPPFLAGS += -DDEBUG_REFS_CALLSTACK_ENABLED=0
+libqahw_la_LDFLAGS   = -ltinyalsa -lhardware -lexpat -lcutils -llog -ldl -lbinder -shared -avoid-version -llog -lcutils -lpthread -lutils
+if QTI_AUDIO_SERVER_ENABLED
+AM_CPPFLAGS += -DQTI_AUDIO_SERVER_ENABLED
+libqahw_la_LDFLAGS +=  -lqtiaudioserver
+endif
diff --git a/qahw_api/inc/qahw_api.h b/qahw_api/inc/qahw_api.h
index 5e0e661..0aa3c79 100644
--- a/qahw_api/inc/qahw_api.h
+++ b/qahw_api/inc/qahw_api.h
@@ -16,8 +16,8 @@
  * limitations under the License.
  */
 
-#ifndef QTI_AUDIO_HAL_API_H
-#define QTI_AUDIO_HAL_API_H
+#ifndef QTI_AUDIO_QAHW_API_H
+#define QTI_AUDIO_QAHW_API_H
 
 #include <stdint.h>
 #include <strings.h>
@@ -61,6 +61,7 @@
 
 typedef void qahw_module_handle_t;
 typedef void qahw_stream_handle_t;
+typedef void (*audio_error_callback)(void* context);
 
 /**************************************/
 /* Output stream specific APIs **/
@@ -471,6 +472,8 @@
 int qahw_set_audio_port_config(qahw_module_handle_t *hw_module,
                      const struct audio_port_config *config);
 
+void qahw_register_qas_death_notify_cb(audio_error_callback cb, void* context);
+
 __END_DECLS
 
-#endif  // QTI_AUDIO_HAL_API_H
+#endif  // QTI_AUDIO_QAHW_API_H
diff --git a/qahw_api/src/qahw_api.cpp b/qahw_api/src/qahw_api.cpp
new file mode 100644
index 0000000..8967bd6
--- /dev/null
+++ b/qahw_api/src/qahw_api.cpp
@@ -0,0 +1,1626 @@
+/*
+* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above
+*       copyright notice, this list of conditions and the following
+*       disclaimer in the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of The Linux Foundation nor the names of its
+*       contributors may be used to endorse or promote products derived
+*       from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#define LOG_TAG "qahw_api"
+#define LOG_NDEBUG 0
+#define LOG_NDDEBUG 0
+
+#include <utils/Errors.h>
+#include <dlfcn.h>
+#include <utils/Log.h>
+#include <stdlib.h>
+#include <cutils/list.h>
+#include <assert.h>
+
+#include <hardware/audio.h>
+#include <cutils/properties.h>
+#include "qahw_api.h"
+#include "qahw.h"
+
+#if QTI_AUDIO_SERVER_ENABLED
+#include <mm-audio/qti-audio-server/qti_audio_server.h>
+#include <mm-audio/qti-audio-server/qti_audio_server_client.h>
+
+using namespace audiohal;
+extern struct listnode stream_list;
+extern pthread_mutex_t list_lock;
+
+/* Flag to indicate if QAS is enabled or not */
+bool g_binder_enabled = false;
+/* QTI audio server handle */
+sp<Iqti_audio_server> g_qas = NULL;
+/* Handle for client context*/
+void* g_ctxt = NULL;
+/* Death notification handle */
+sp<death_notifier> g_death_notifier = NULL;
+/* Client callback handle */
+audio_error_callback g_audio_err_cb = NULL;
+/* Flag to indicate qas status */
+bool g_qas_died = false;
+/* Count how many times hal is loaded */
+static unsigned int g_qas_load_count;
+/* Store HAL handle */
+qahw_module_handle_t *g_qas_handle = NULL;
+
+void death_notifier::binderDied(const wp<IBinder>& who)
+{
+    struct listnode *node;
+    p_stream_handle *handle;
+
+    if (g_audio_err_cb) {
+        ALOGD("%s %d", __func__, __LINE__);
+        g_audio_err_cb(g_ctxt);
+    }
+    g_qas_died = true;
+
+    pthread_mutex_lock(&list_lock);
+    list_for_each(node, &stream_list) {
+        handle = node_to_item(node, p_stream_handle, list);
+         if (handle != NULL) {
+            sh_mem_data *shmem_data = handle->shmem_data;
+            ALOGD("%s: %d: signal to unblock any wait conditions", __func__, __LINE__);
+            pthread_cond_signal(&shmem_data->c_cond);
+            shmem_data->status = 0;
+        }
+    }
+    pthread_mutex_unlock(&list_lock);
+
+}
+
+void qahw_register_qas_death_notify_cb(audio_error_callback cb, void* context)
+{
+    ALOGD("%s %d", __func__, __LINE__);
+    g_audio_err_cb = cb;
+    g_ctxt = context;
+}
+
+death_notifier::death_notifier()
+{
+    ALOGV("%s %d", __func__, __LINE__);
+    sp<ProcessState> proc(ProcessState::self());
+    proc->startThreadPool();
+}
+
+sp<Iqti_audio_server> get_qti_audio_server() {
+    sp<IServiceManager> sm;
+    sp<IBinder> binder;
+    int retry_cnt = 5;
+
+    if (g_qas == 0) {
+        sm = defaultServiceManager();
+        if (sm != NULL) {
+            do {
+                binder = sm->getService(String16(QTI_AUDIO_SERVER));
+                if (binder != 0)
+                    break;
+                else
+                    ALOGE("%d:%s: get qas service failed",__LINE__, __func__);
+
+                 ALOGW("qti_audio_server not published, waiting...");
+                usleep(500000);
+            } while (--retry_cnt);
+        } else {
+            ALOGE("%d:%s: defaultServiceManager failed",__LINE__, __func__);
+        }
+        if (binder == NULL)
+            return NULL;
+
+        if (g_death_notifier == NULL) {
+            g_death_notifier = new death_notifier();
+            if (g_death_notifier == NULL) {
+                ALOGE("%d: %s() unable to allocate death notifier", __LINE__, __func__);
+                return NULL;
+            }
+        }
+        binder->linkToDeath(g_death_notifier);
+        g_qas = interface_cast<Iqti_audio_server>(binder);
+        assert(g_qas != 0);
+    }
+    return g_qas;
+}
+
+uint32_t qahw_out_get_sample_rate(const qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_get_sample_rate(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_get_sample_rate_l(out_handle);
+    }
+}
+
+int qahw_out_set_sample_rate(qahw_stream_handle_t *out_handle, uint32_t rate)
+{
+    ALOGV("%d:%s %d",__LINE__, __func__, rate);
+    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;
+            }
+            return qas->qahw_out_set_sample_rate(out_handle, rate);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_set_sample_rate_l(out_handle, rate);
+    }
+}
+
+size_t qahw_out_get_buffer_size(const qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_get_buffer_size(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_get_buffer_size_l(out_handle);
+    }
+}
+
+audio_channel_mask_t qahw_out_get_channels(const qahw_stream_handle_t
+                                              *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return (audio_channel_mask_t)(-ENODEV);
+            }
+            return qas->qahw_out_get_channels(out_handle);
+        } else {
+            return (audio_channel_mask_t)(-ENODEV);
+        }
+    } else {
+        return qahw_out_get_channels_l(out_handle);
+    }
+}
+
+audio_format_t qahw_out_get_format(const qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return AUDIO_FORMAT_INVALID;
+            }
+            return qas->qahw_out_get_format(out_handle);
+        } else {
+            return AUDIO_FORMAT_INVALID;;
+        }
+    } else {
+        return qahw_out_get_format_l(out_handle);
+    }
+}
+
+int qahw_out_standby(qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_standby(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_standby_l(out_handle);
+    }
+}
+
+int qahw_out_set_parameters(qahw_stream_handle_t *out_handle,
+                                const char *kv_pairs)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_set_parameters(out_handle, kv_pairs);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_set_parameters_l(out_handle, kv_pairs);
+    }
+}
+
+char *qahw_out_get_parameters(const qahw_stream_handle_t *out_handle,
+                                 const char *keys)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_get_parameters(out_handle, keys);
+        } else {
+            return NULL;
+        }
+    } else {
+        return qahw_out_get_parameters_l(out_handle, keys);
+    }
+}
+
+int qahw_out_set_param_data(qahw_stream_handle_t *out_handle,
+                            qahw_param_id param_id,
+                            qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_set_param_data(out_handle, param_id, payload);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_set_param_data_l(out_handle, param_id, payload);
+    }
+}
+
+int qahw_out_get_param_data(qahw_stream_handle_t *out_handle,
+                            qahw_param_id param_id,
+                            qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_get_param_data(out_handle, param_id, payload);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_get_param_data_l(out_handle, param_id, payload);
+    }
+}
+
+uint32_t qahw_out_get_latency(const qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_get_latency(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_get_latency_l(out_handle);
+    }
+}
+
+int qahw_out_set_volume(qahw_stream_handle_t *out_handle, float left, float right)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_set_volume(out_handle, left, right);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_set_volume_l(out_handle, left, right);
+    }
+}
+
+ssize_t qahw_out_write(qahw_stream_handle_t *out_handle,
+                        qahw_out_buffer_t *out_buf)
+{
+    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;
+            }
+            return qas->qahw_out_write(out_handle, out_buf);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_write_l(out_handle, out_buf);
+    }
+}
+
+int qahw_out_get_render_position(const qahw_stream_handle_t *out_handle,
+                                 uint32_t *dsp_frames)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_get_render_position(out_handle, dsp_frames);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_get_render_position_l(out_handle, dsp_frames);
+    }
+}
+
+int qahw_out_set_callback(qahw_stream_handle_t *out_handle,
+                          qahw_stream_callback_t callback,
+                          void *cookie)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_set_callback(out_handle, callback, cookie);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_set_callback_l(out_handle, callback, cookie);
+    }
+}
+
+int qahw_out_pause(qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_pause(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_pause_l(out_handle);
+    }
+}
+
+int qahw_out_resume(qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_resume(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_resume_l(out_handle);
+    }
+}
+
+int qahw_out_drain(qahw_stream_handle_t *out_handle, qahw_drain_type_t type )
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_drain(out_handle, type);
+        } else {
+            return -EINVAL;
+        }
+    } else {
+        return qahw_out_drain_l(out_handle, type);
+    }
+}
+
+int qahw_out_flush(qahw_stream_handle_t *out_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_out_flush(out_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_flush_l(out_handle);
+    }
+}
+
+int qahw_out_get_presentation_position(const qahw_stream_handle_t *out_handle,
+                           uint64_t *frames, struct timespec *timestamp)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_out_get_presentation_position(out_handle,
+                                                 frames, timestamp);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_out_get_presentation_position_l(out_handle,
+                                         frames, timestamp);
+    }
+}
+
+uint32_t qahw_in_get_sample_rate(const qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_in_get_sample_rate(in_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_get_sample_rate_l(in_handle);
+    }
+}
+
+int qahw_in_set_sample_rate(qahw_stream_handle_t *in_handle, uint32_t rate)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_in_set_sample_rate(in_handle, rate);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_set_sample_rate_l(in_handle, rate);
+    }
+}
+
+size_t qahw_in_get_buffer_size(const qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_in_get_buffer_size(in_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_get_buffer_size_l(in_handle);
+    }
+}
+
+audio_channel_mask_t qahw_in_get_channels(const qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_in_get_channels(in_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_get_channels_l(in_handle);
+    }
+}
+
+audio_format_t qahw_in_get_format(const qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return (audio_format_t)-ENODEV;
+            }
+            return qas->qahw_in_get_format(in_handle);
+        } else {
+            return (audio_format_t)-ENODEV;
+        }
+    } else {
+        return qahw_in_get_format_l(in_handle);
+    }
+}
+
+int qahw_in_set_format(qahw_stream_handle_t *in_handle, audio_format_t format)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_in_set_format(in_handle, format);
+        } else {
+            return (audio_format_t)-ENODEV;
+        }
+    } else {
+        return qahw_in_set_format_l(in_handle, format);
+    }
+}
+
+int qahw_in_standby(qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_in_standby(in_handle);
+        } else {
+            return -EINVAL;
+        }
+    } else {
+        return qahw_in_standby_l(in_handle);
+    }
+}
+
+int qahw_in_set_parameters(qahw_stream_handle_t *in_handle, const char *kv_pairs)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_in_set_parameters(in_handle, kv_pairs);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_set_parameters_l(in_handle, kv_pairs);
+    }
+}
+
+char* qahw_in_get_parameters(const qahw_stream_handle_t *in_handle,
+                              const char *keys)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_in_get_parameters(in_handle, keys);
+        } else {
+            return NULL;
+        }
+    } else {
+        return qahw_in_get_parameters_l(in_handle, keys);
+    }
+}
+
+ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
+                     qahw_in_buffer_t *in_buf)
+{
+    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;
+            }
+            return qas->qahw_in_read(in_handle, in_buf);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_read_l(in_handle, in_buf);
+    }
+}
+
+uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_in_get_input_frames_lost(in_handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_get_input_frames_lost_l(in_handle);
+    }
+}
+
+int qahw_in_get_capture_position(const qahw_stream_handle_t *in_handle,
+                                 int64_t *frames, int64_t *time)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_in_get_capture_position(in_handle, frames, time);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_in_get_capture_position_l(in_handle, frames, time);
+    }
+}
+
+int qahw_init_check(const qahw_module_handle_t *hw_module)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_init_check(hw_module);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_init_check_l(hw_module);
+    }
+}
+
+int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_set_voice_volume(hw_module, volume);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_set_voice_volume_l(hw_module, volume);
+    }
+}
+
+int qahw_set_mode(qahw_module_handle_t *hw_module, audio_mode_t mode)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_set_mode(hw_module, mode);;
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_set_mode_l(hw_module, mode);
+    }
+}
+
+int qahw_set_mic_mute(qahw_module_handle_t *hw_module, bool state)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_set_mic_mute(hw_module, state);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_set_mic_mute_l(hw_module, state);
+    }
+}
+
+int qahw_get_mic_mute(qahw_module_handle_t *hw_module, bool *state)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_get_mic_mute(hw_module, state);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_get_mic_mute_l(hw_module, state);
+    }
+}
+
+int qahw_set_parameters(qahw_module_handle_t *hw_module, const char *kv_pairs)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_set_parameters(hw_module, kv_pairs);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_set_parameters_l(hw_module, kv_pairs);
+    }
+}
+
+char* qahw_get_parameters(const qahw_module_handle_t *hw_module,
+                           const char *keys)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_get_parameters(hw_module, keys);;
+        } else {
+            return NULL;
+        }
+    } else {
+        return qahw_get_parameters_l(hw_module, keys);
+    }
+}
+
+int qahw_get_param_data(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_get_param_data(hw_module, param_id, payload);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_get_param_data_l(hw_module, param_id, payload);
+    }
+}
+
+int qahw_set_param_data(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_set_param_data(hw_module, param_id, payload);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_set_param_data_l(hw_module, param_id, payload);
+    }
+}
+
+int qahw_create_audio_patch(qahw_module_handle_t *hw_module,
+                        unsigned int num_sources,
+                        const struct audio_port_config *sources,
+                        unsigned int num_sinks,
+                        const struct audio_port_config *sinks,
+                        audio_patch_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_create_audio_patch(hw_module, num_sources,
+                                         sources, num_sinks, sinks,
+                                         handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_create_audio_patch_l(hw_module, num_sources,
+                                         sources, num_sinks, sinks,
+                                         handle);
+    }
+}
+
+int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
+                        audio_patch_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_release_audio_patch(hw_module, handle);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_release_audio_patch_l(hw_module, handle);
+    }
+}
+
+int qahw_get_audio_port(qahw_module_handle_t *hw_module,
+                      struct audio_port *port)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_get_audio_port(hw_module, port);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_get_audio_port_l(hw_module, port);
+    }
+}
+
+int qahw_set_audio_port_config(qahw_module_handle_t *hw_module,
+                     const struct audio_port_config *config)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_set_audio_port_config(hw_module, config);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_set_audio_port_config_l(hw_module, config);
+    }
+}
+
+size_t qahw_get_input_buffer_size(const qahw_module_handle_t *hw_module,
+                                  const struct audio_config *config)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_get_input_buffer_size(hw_module, config);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_get_input_buffer_size_l(hw_module, config);
+    }
+}
+
+int qahw_open_output_stream(qahw_module_handle_t *hw_module,
+                            audio_io_handle_t handle,
+                            audio_devices_t devices,
+                            audio_output_flags_t flags,
+                            struct audio_config *config,
+                            qahw_stream_handle_t **out_handle,
+                            const char *address)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_open_output_stream(hw_module, handle, devices,
+                                                 flags, config, out_handle,
+                                                 address);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_open_output_stream_l(hw_module, handle, devices,
+                                           flags, config, out_handle,
+                                           address);
+    }
+}
+
+int qahw_close_output_stream(qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    int status;
+    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;
+            }
+            return qas->qahw_close_output_stream(out_handle);
+        } else {
+            p_stream_handle *handle;
+            struct listnode *node, *tempnode;
+            pthread_mutex_lock(&list_lock);
+            list_for_each_safe(node, tempnode, &stream_list) {
+                handle = node_to_item(node, p_stream_handle, list);
+                p_stream_handle *p_stream = (p_stream_handle *)out_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);
+                    handle->sh_mem_dealer.clear();
+                    handle->sh_mem_handle.clear();
+                }
+                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;
+        }
+    } else {
+        return qahw_close_output_stream_l(out_handle);
+    }
+}
+
+int qahw_open_input_stream(qahw_module_handle_t *hw_module,
+                           audio_io_handle_t handle,
+                           audio_devices_t devices,
+                           struct audio_config *config,
+                           qahw_stream_handle_t **in_handle,
+                           audio_input_flags_t flags,
+                           const char *address,
+                           audio_source_t source)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    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;
+            }
+            return qas->qahw_open_input_stream(hw_module, handle, devices,
+                                           config, in_handle, flags,
+                                           address, source);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_open_input_stream_l(hw_module, handle, devices,
+                                       config, in_handle, flags,
+                                       address, source);
+    }
+}
+
+int qahw_close_input_stream(qahw_stream_handle_t *in_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_close_input_stream(in_handle);
+        } else {
+            p_stream_handle *handle;
+            struct listnode *node, *tempnode;
+            pthread_mutex_lock(&list_lock);
+            list_for_each_safe(node, tempnode, &stream_list) {
+                ALOGD("%s %d", __func__, __LINE__);
+                handle = node_to_item(node, p_stream_handle, list);
+                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);
+                    handle->sh_mem_dealer.clear();
+                    handle->sh_mem_handle.clear();
+                }
+                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;
+        }
+    } else {
+        return qahw_close_input_stream_l(in_handle);
+    }
+}
+
+int qahw_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 == 0) {
+               ALOGE("%d:%s: invalid HAL handle",__LINE__, __func__);
+               return -ENODEV;
+            }
+            return qas->qahw_get_version();
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_get_version_l();
+    }
+}
+
+int qahw_unload_module(qahw_module_handle_t *hw_module)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    if (g_binder_enabled) {
+        if (!g_qas_died && (--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;
+            }
+            return qas->qahw_unload_module(hw_module);
+        } else {
+            return -ENODEV;
+        }
+    } else {
+        return qahw_unload_module_l(hw_module);
+    }
+}
+
+qahw_module_handle_t *qahw_load_module(const char *hw_module_id)
+{
+    char value[PROPERTY_VALUE_MAX];
+
+    ALOGV("%d:%s",__LINE__, __func__);
+    g_binder_enabled = property_get_bool("persist.vendor.audio.qas.enabled", false);
+    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);
+        }
+        g_qas_handle = qas->qahw_load_module(hw_module_id);
+        if (g_qas_handle == NULL) {
+            ALOGE("%s: HAL loading failed", __func__);
+        } else if (g_qas_load_count == 0) {
+            g_qas_load_count++;
+            g_qas_died = false;
+            pthread_mutex_init(&list_lock, (const pthread_mutexattr_t *) NULL);
+            list_init(&stream_list);
+            ALOGV("%s %d: stream_list %p", __func__, __LINE__, stream_list);
+        } else {
+            g_qas_load_count++;
+            ALOGD("%s: returning existing instance of hal", __func__);
+        }
+    } else {
+        g_qas_handle = qahw_load_module_l(hw_module_id);
+    }
+    return g_qas_handle;
+}
+#else
+void qahw_register_qas_death_notify_cb(audio_error_callback cb __unused, void* context __unused)
+{
+}
+
+uint32_t qahw_out_get_sample_rate(const qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_sample_rate_l(out_handle);
+}
+
+int qahw_out_set_sample_rate(qahw_stream_handle_t *out_handle, uint32_t rate)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_set_sample_rate_l(out_handle, rate);
+}
+
+size_t qahw_out_get_buffer_size(const qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_buffer_size_l(out_handle);
+}
+
+audio_channel_mask_t qahw_out_get_channels(const qahw_stream_handle_t
+                                              *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_channels_l(out_handle);
+}
+
+audio_format_t qahw_out_get_format(const qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_format_l(out_handle);
+}
+
+int qahw_out_standby(qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_standby_l(out_handle);
+}
+
+int qahw_out_set_parameters(qahw_stream_handle_t *out_handle,
+                                const char *kv_pairs)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_set_parameters_l(out_handle, kv_pairs);
+}
+
+char *qahw_out_get_parameters(const qahw_stream_handle_t *out_handle,
+                                 const char *keys)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_parameters_l(out_handle, keys);
+}
+
+int qahw_out_set_param_data(qahw_stream_handle_t *out_handle,
+                            qahw_param_id param_id,
+                            qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_set_param_data_l(out_handle, param_id, payload);
+}
+
+int qahw_out_get_param_data(qahw_stream_handle_t *out_handle,
+                            qahw_param_id param_id,
+                            qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_param_data_l(out_handle, param_id, payload);
+}
+
+uint32_t qahw_out_get_latency(const qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_latency_l(out_handle);
+}
+
+int qahw_out_set_volume(qahw_stream_handle_t *out_handle, float left, float right)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_set_volume_l(out_handle, left, right);
+}
+
+ssize_t qahw_out_write(qahw_stream_handle_t *out_handle,
+                        qahw_out_buffer_t *out_buf)
+{
+    return qahw_out_write_l(out_handle, out_buf);
+}
+
+int qahw_out_get_render_position(const qahw_stream_handle_t *out_handle,
+                                 uint32_t *dsp_frames)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_render_position_l(out_handle, dsp_frames);
+}
+
+int qahw_out_set_callback(qahw_stream_handle_t *out_handle,
+                          qahw_stream_callback_t callback,
+                          void *cookie)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_set_callback_l(out_handle, callback, cookie);
+}
+
+int qahw_out_pause(qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_pause_l(out_handle);
+}
+
+int qahw_out_resume(qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_resume_l(out_handle);
+}
+
+int qahw_out_drain(qahw_stream_handle_t *out_handle, qahw_drain_type_t type )
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_drain_l(out_handle, type);
+}
+
+int qahw_out_flush(qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_flush_l(out_handle);
+}
+
+int qahw_out_get_presentation_position(const qahw_stream_handle_t *out_handle,
+                           uint64_t *frames, struct timespec *timestamp)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_out_get_presentation_position_l(out_handle,
+                                     frames, timestamp);
+}
+
+uint32_t qahw_in_get_sample_rate(const qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_sample_rate_l(in_handle);
+}
+
+int qahw_in_set_sample_rate(qahw_stream_handle_t *in_handle, uint32_t rate)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_set_sample_rate_l(in_handle, rate);
+}
+
+size_t qahw_in_get_buffer_size(const qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_buffer_size_l(in_handle);
+}
+
+audio_channel_mask_t qahw_in_get_channels(const qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_channels_l(in_handle);
+}
+
+audio_format_t qahw_in_get_format(const qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_format_l(in_handle);
+}
+
+int qahw_in_set_format(qahw_stream_handle_t *in_handle, audio_format_t format)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_set_format_l(in_handle, format);
+}
+
+int qahw_in_standby(qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_standby_l(in_handle);
+}
+
+int qahw_in_set_parameters(qahw_stream_handle_t *in_handle, const char *kv_pairs)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_set_parameters_l(in_handle, kv_pairs);
+}
+
+char* qahw_in_get_parameters(const qahw_stream_handle_t *in_handle,
+                              const char *keys)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_parameters_l(in_handle, keys);
+}
+
+ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
+                     qahw_in_buffer_t *in_buf)
+{
+    return qahw_in_read_l(in_handle, in_buf);
+}
+
+uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_input_frames_lost_l(in_handle);
+}
+
+int qahw_in_get_capture_position(const qahw_stream_handle_t *in_handle,
+                                 int64_t *frames, int64_t *time)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_in_get_capture_position_l(in_handle, frames, time);
+}
+
+int qahw_init_check(const qahw_module_handle_t *hw_module)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_init_check_l(hw_module);
+}
+
+int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_set_voice_volume_l(hw_module, volume);
+}
+
+int qahw_set_mode(qahw_module_handle_t *hw_module, audio_mode_t mode)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_set_mode_l(hw_module, mode);
+}
+
+int qahw_set_mic_mute(qahw_module_handle_t *hw_module, bool state)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_set_mic_mute_l(hw_module, state);
+}
+
+int qahw_get_mic_mute(qahw_module_handle_t *hw_module, bool *state)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_get_mic_mute_l(hw_module, state);
+}
+
+int qahw_set_parameters(qahw_module_handle_t *hw_module, const char *kv_pairs)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_set_parameters_l(hw_module, kv_pairs);
+}
+
+char* qahw_get_parameters(const qahw_module_handle_t *hw_module,
+                           const char *keys)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_get_parameters_l(hw_module, keys);
+}
+
+int qahw_get_param_data(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_get_param_data_l(hw_module, param_id, payload);
+}
+
+int qahw_set_param_data(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_set_param_data_l(hw_module, param_id, payload);
+}
+
+int qahw_create_audio_patch(qahw_module_handle_t *hw_module,
+                        unsigned int num_sources,
+                        const struct audio_port_config *sources,
+                        unsigned int num_sinks,
+                        const struct audio_port_config *sinks,
+                        audio_patch_handle_t *handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_create_audio_patch_l(hw_module, num_sources,
+                                     sources, num_sinks, sinks,
+                                     handle);
+}
+
+int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
+                        audio_patch_handle_t handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_release_audio_patch_l(hw_module, handle);
+}
+
+int qahw_get_audio_port(qahw_module_handle_t *hw_module,
+                      struct audio_port *port)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_get_audio_port_l(hw_module, port);
+}
+
+int qahw_set_audio_port_config(qahw_module_handle_t *hw_module,
+                     const struct audio_port_config *config)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_set_audio_port_config_l(hw_module, config);
+}
+
+size_t qahw_get_input_buffer_size(const qahw_module_handle_t *hw_module,
+                                  const struct audio_config *config)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_get_input_buffer_size_l(hw_module, config);
+}
+
+int qahw_open_output_stream(qahw_module_handle_t *hw_module,
+                            audio_io_handle_t handle,
+                            audio_devices_t devices,
+                            audio_output_flags_t flags,
+                            struct audio_config *config,
+                            qahw_stream_handle_t **out_handle,
+                            const char *address)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_open_output_stream_l(hw_module, handle, devices,
+                                       flags, config, out_handle,
+                                       address);
+}
+
+int qahw_close_output_stream(qahw_stream_handle_t *out_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_close_output_stream_l(out_handle);
+}
+
+int qahw_open_input_stream(qahw_module_handle_t *hw_module,
+                           audio_io_handle_t handle,
+                           audio_devices_t devices,
+                           struct audio_config *config,
+                           qahw_stream_handle_t **in_handle,
+                           audio_input_flags_t flags,
+                           const char *address,
+                           audio_source_t source)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_open_input_stream_l(hw_module, handle, devices,
+                                   config, in_handle, flags,
+                                   address, source);
+}
+
+int qahw_close_input_stream(qahw_stream_handle_t *in_handle)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_close_input_stream_l(in_handle);
+}
+
+int qahw_get_version()
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_get_version_l();
+}
+
+int qahw_unload_module(qahw_module_handle_t *hw_module)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_unload_module_l(hw_module);
+}
+
+qahw_module_handle_t *qahw_load_module(const char *hw_module_id)
+{
+    ALOGV("%d:%s",__LINE__, __func__);
+    return qahw_load_module_l(hw_module_id);
+}
+#endif
