Merge tag 'AUDIO.LA.8.0.r1-10200-KAILUA.0' into staging/lineage-21.0_merge-AUDIO.LA.8.0.r1-10200-KAILUA.0

AUDIO.LA.8.0.r1-10200-KAILUA.0

# By Anand Mohan (1) and others
# Via Gerrit - the friendly Code Review server (3) and others
* tag 'AUDIO.LA.8.0.r1-10200-KAILUA.0':
  pal: avoid implicit device switch during resume if call is active
  PAL: setMixerParameter after all the custom payload updated done
  pal: update the sva/tri/quad mic related mixer path for kalama
  Bluetooth: Add conditional check to call init

Change-Id: I25febeb305bd5ffbb103c9fc76a22484d4784fe7
diff --git a/.gitupstream b/.gitupstream
new file mode 100644
index 0000000..3fee311
--- /dev/null
+++ b/.gitupstream
@@ -0,0 +1 @@
+https://git.codelinaro.org/clo/la/platform/vendor/qcom/opensource/arpal-lx
diff --git a/Android.mk b/Android.mk
index 2253871..1786003 100644
--- a/Android.mk
+++ b/Android.mk
@@ -7,12 +7,22 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := libarpal_headers
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/inc
+LOCAL_EXPORT_C_INCLUDE_DIRS := \
+    $(LOCAL_PATH)/inc \
+    $(LOCAL_PATH)/stream/inc \
+    $(LOCAL_PATH)/device/inc \
+    $(LOCAL_PATH)/session/inc \
+    $(LOCAL_PATH)/resource_manager/inc \
+    $(LOCAL_PATH)/context_manager/inc \
+    $(LOCAL_PATH)/utils/inc \
+    $(LOCAL_PATH)/plugins/codecs
 
 LOCAL_VENDOR_MODULE := true
 
 include $(BUILD_HEADER_LIBRARY)
 
+ifneq ($(QCPATH),)
+
 include $(CLEAR_VARS)
 
 LOCAL_MODULE        := libar-pal
@@ -44,13 +54,6 @@
 endif
 
 LOCAL_C_INCLUDES := \
-    $(LOCAL_PATH)/stream/inc \
-    $(LOCAL_PATH)/device/inc \
-    $(LOCAL_PATH)/session/inc \
-    $(LOCAL_PATH)/resource_manager/inc \
-    $(LOCAL_PATH)/context_manager/inc \
-    $(LOCAL_PATH)/utils/inc \
-    $(LOCAL_PATH)/plugins/codecs \
     $(TOP)/system/media/audio_route/include \
     $(TOP)/system/media/audio/include
 
@@ -141,7 +144,6 @@
     libcapiv2_headers \
     libagm_headers \
     libacdb_headers \
-    liblisten_headers \
     libarosal_headers \
     libvui_dmgr_headers
 
@@ -173,6 +175,8 @@
 
 include $(BUILD_SHARED_LIBRARY)
 
+endif
+
 #-------------------------------------------
 #            Build CHARGER_LISTENER LIB
 #-------------------------------------------
diff --git a/Makefile.am b/Makefile.am
index 98f5df9..16411f3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -24,6 +24,7 @@
             ./device/inc/UltrasoundDevice.h \
             ./session/inc/Session.h \
             ./session/inc/PayloadBuilder.h \
+            ./session/inc/kvh2xml.h \
             ./session/inc/SessionGsl.h \
             ./session/inc/SessionAlsaUtils.h \
             ./session/inc/SessionAlsaPcm.h \
@@ -101,6 +102,7 @@
             ${top_srcdir}/session/inc/ACDEngine.h \
             ${top_srcdir}/session/inc/Session.h \
             ${top_srcdir}/session/inc/PayloadBuilder.h \
+            $(top_srcdir)/session/inc/kvh2xml.h \
             ${top_srcdir}/session/inc/SessionGsl.h \
             ${top_srcdir}/session/inc/SessionAlsaPcm.h \
             ${top_srcdir}/session/inc/SessionAlsaCompress.h \
@@ -135,6 +137,7 @@
 AM_CPPFLAGS += -Wno-sign-compare -Wno-unused-result
 AM_CPPFLAGS += -D__unused=__attribute__\(\(__unused__\)\) -DLINUX_ENABLED
 AM_CPPFLAGS += -DSND_AUDIOCODEC_ALAC=0x00000020 -DSND_AUDIOCODEC_APE=0x00000021
+AM_CPPFLAGS += $(GECKO_CFLAGS)
 AM_CPPFLAGS += -DCONFIG_GSL
 
 pal_sources = ${top_srcdir}/stream/src/Stream.cpp \
diff --git a/ipc/HwBinders/pal_ipc_client/Android.mk b/ipc/HwBinders/pal_ipc_client/Android.mk
index 7c99a63..b559a3a 100644
--- a/ipc/HwBinders/pal_ipc_client/Android.mk
+++ b/ipc/HwBinders/pal_ipc_client/Android.mk
@@ -5,6 +5,7 @@
 LOCAL_MODULE := libpalclient
 LOCAL_MODULE_OWNER := qti
 LOCAL_VENDOR_MODULE := true
+LOCAL_CFLAGS := -Wno-unused-parameter -Wno-unused-variable -Wno-format
 LOCAL_SRC_FILES := \
     src/pal_client_wrapper.cpp
 
diff --git a/ipc/HwBinders/pal_ipc_server/Android.mk b/ipc/HwBinders/pal_ipc_server/Android.mk
index 628544f..59beb4d 100644
--- a/ipc/HwBinders/pal_ipc_server/Android.mk
+++ b/ipc/HwBinders/pal_ipc_server/Android.mk
@@ -1,4 +1,7 @@
 LOCAL_PATH := $(call my-dir)
+
+ifneq ($(QCPATH),)
+
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := vendor.qti.hardware.pal@1.0-impl
@@ -9,7 +12,7 @@
     src/pal_server_wrapper.cpp
 
 LOCAL_C_INCLUDES := \
-    $(TOP)/vendor/qcom/opensource/pal/utils/inc
+    $(call project-path-for,qcom-audio)/pal/utils/inc
 
 LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/inc
 
@@ -32,3 +35,4 @@
 
 include $(BUILD_SHARED_LIBRARY)
 
+endif
diff --git a/plugins/Android.mk b/plugins/Android.mk
index c455f97..4ea07b6 100644
--- a/plugins/Android.mk
+++ b/plugins/Android.mk
@@ -1,3 +1,5 @@
 LOCAL_PATH := $(call my-dir)
 
+ifneq ($(QCPATH),)
 include $(call all-subdir-makefiles)
+endif
diff --git a/session/inc/kvh2xml.h b/session/inc/kvh2xml.h
new file mode 100644
index 0000000..2d4e4b5
--- /dev/null
+++ b/session/inc/kvh2xml.h
@@ -0,0 +1,568 @@
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+typedef enum {
+	PLATFORM_LA = 1, 	/**< @h2xmle_name {LA} */
+	PLATFORM_LE = 2,	/**< @h2xmle_name {LE} */
+}platforms;
+/**
+  	@h2xml_platforms{PLATFORM_LA,PLATFORM_LE}
+*/
+
+enum AllKeyIds{
+	STREAMRX = 0xA1000000,       /**< @h2xmle_name{Stream} */
+	DEVICERX = 0xA2000000,       /**< @h2xmle_name{DeviceRX} */
+	DEVICETX = 0xA3000000,       /**< @h2xmle_name{DeviceTX} */
+	VOLUME = 0xA4000000,         /**< @h2xmle_name{Volume} */
+	SAMPLINGRATE = 0xA5000000,   /**< @h2xmle_name{SamplingRate} */
+	BITWIDTH = 0xA6000000,       /**< @h2xmle_name{BitWidth} */
+	PAUSE = 0xA7000000,          /**< @h2xmle_name{Pause} */
+	MUTE = 0xA8000000,           /**< @h2xmle_name{Mute} */
+	CHANNELS = 0xA9000000,       /**< @h2xmle_name{Channels} */
+	ECNS = 0xAA000000,           /**< @h2xmle_name{ECNS} */
+	INSTANCE = 0xAB000000,       /**< @h2xmle_name{Instance} */
+	DEVICEPP_RX = 0xAC000000,    /**< @h2xmle_name{DevicePP_Rx} */
+	DEVICEPP_TX = 0xAD000000,    /**< @h2xmle_name{DevicePP_Tx} */
+	MEDIAFMTID = 0xae000000,
+	STREAMPP_RX = 0xaf000000,
+	STREAMPP_TX = 0xb0000000,
+	STREAMTX = 0xb1000000,
+	EQUALIZER_SWITCH = 0xb2000000,
+	VSID = 0xb3000000,
+	BTPROFILE = 0xb4000000,
+	BTFORMAT = 0xb5000000,
+	PBE_SWITCH = 0xb6000000,
+	BASS_BOOST_SWITCH = 0xb7000000,
+	REVERB_SWITCH = 0xb8000000,
+	VIRTUALIZER_SWITCH = 0xb9000000,
+	SW_SIDETONE = 0xba000000,
+	STREAM_SLOWTALK = 0xbb000000,
+	STREAM_CONFIG = 0xbc000000,
+	STREAM_MUXDEMUX = 0xbd000000,
+	SPKRPROTDEVMAP = 0xbe000000,
+	SPKRPROTVIMAP = 0xbf000000,
+	RAS_SWITCH = 0xd0000000,
+	VOIP_SAMPLE_RATE = 0xd100000,
+	PROXYTXTYPE = 0xd1000000,
+	GAIN = 0xd2000000,
+	STREAM = 0xd3000000,
+	STREAMCHANNELS = 0xd4000000,
+	ICL = 0xd5000000,
+	DEVICETX_EXT = 0xd7000000,
+	DATALOGGING = 0xd8000000,
+	DTMF_SWITCH = 0xde000000,
+	DTMF_GEN_TONE = 0xdf000000,
+	TAG_KEY_SLOT_MASK = 0xe0000000,
+	DUTYCYCLE = 0xe1000000
+};
+
+/**
+	@h2xmlk_key {STREAMRX}
+	@h2xmlk_description {Type of Rx Stream}
+*/
+enum Key_StreamRX {
+	PCM_DEEP_BUFFER = 0xa1000001,
+	PCM_RX_LOOPBACK = 0xa1000003,
+	VOIP_RX_PLAYBACK = 0xa1000005,
+	COMPRESSED_OFFLOAD_PLAYBACK = 0xa100000a,
+	HFP_RX_PLAYBACK = 0xa100000c,
+	PCM_LL_PLAYBACK = 0xa100000e,
+	PCM_OFFLOAD_PLAYBACK = 0xa100000f,
+	VOICE_CALL_RX = 0xa1000010,
+	PCM_ULL_PLAYBACK = 0xa1000011,
+	PCM_PROXY_PLAYBACK = 0xa1000012,
+	INCALL_MUSIC = 0xa1000013,
+	GENERIC_PLAYBACK = 0xa1000014,
+	HAPTICS_PLAYBACK = 0xa1000015,
+	RAW_PLAYBACK = 0xa1000019,
+};
+
+/**
+	@h2xmlk_key {STREAMTX}
+	@h2xmlk_description {Type of Tx Stream}
+*/
+enum Key_StreamTX {
+	PCM_RECORD = 0xb1000001,
+	VOICE_UI = 0xb1000003,
+	VOIP_TX_RECORD = 0xb1000004,
+	HFP_RX_CAPTURE = 0xb1000005,
+	VOICE_CALL_TX = 0xb1000007,
+	RAW_RECORD = 0xb1000009,
+	PCM_ULL_RECORD = 0xb100000a,
+	PCM_PROXY_RECORD = 0xb100000b,
+	INCALL_RECORD = 0xb100000c,
+	ACD = 0xb100000d,
+	SENSOR_PCM_DATA = 0xb100000e,
+	VOICE_RECOGNITION_RECORD = 0xb1000011,
+	COMPRESS_CAPTURE = 0xb1000012,
+};
+
+/**
+	@h2xmlk_key {INSTANCE}
+	@h2xmlk_description {Stream Instance Id}
+*/
+enum Key_Instance {
+	INSTANCE_1 = 1, /**< @h2xmle_name {Instance_1}*/
+	INSTANCE_2 = 2, /**< @h2xmle_name {Instance_2}*/
+	INSTANCE_3 = 3, /**< @h2xmle_name {Instance_3}*/
+	INSTANCE_4 = 4,
+	INSTANCE_5 = 5,
+	INSTANCE_6 = 6,
+	INSTANCE_7 = 7,
+	INSTANCE_8 = 8,
+};
+
+/**
+	@h2xmlk_key {DEVICERX}
+	@h2xmlk_description {Rx Device}
+*/
+enum Key_DeviceRX {
+	SPEAKER = 0xa2000001,
+	HEADPHONES = 0xa2000002,
+	BT_RX = 0xa2000003,
+	HANDSET = 0xa2000004,
+	USB_RX = 0xa2000005,
+	HDMI_RX = 0xa2000006,
+	PROXY_RX = 0xa2000007,
+	PROXY_RX_VOICE = 0xa2000008,
+	HAPTICS_DEVICE = 0xa2000009,
+	ULTRASOUND_RX = 0xa200000a,
+	ULTRASOUND_RX_DEDICATED = 0xa200000b,
+};
+/**
+	@h2xmlk_key {DEVICETX}
+	@h2xmlk_description {Tx Device}
+*/
+enum Key_DeviceTX {
+	SPEAKER_MIC = 0xa3000001,
+	BT_TX = 0xa3000002,
+	HEADPHONE_MIC = 0xa3000003,
+	HANDSETMIC = 0xa3000004,
+	USB_TX = 0xa3000005,
+	HANDSETMIC_VA = 0xa3000006,
+	HEADSETMIC_VA = 0xa3000007,
+	PROXY_TX = 0xa3000008,
+	VI_TX = 0xa3000009,
+	FM_TX = 0xa300000a,
+	ULTRASOUND_TX = 0xa300000b,
+	ECHO_REF_TX = 0xa300000d,
+};
+
+/**
+	@h2xmlk_key {DEVICEPP_RX}
+	@h2xmlk_description {Rx Device Post/Pre Processing Chain}
+*/
+enum Key_DevicePP_RX {
+	DEVICEPP_RX_DEFAULT = 0xac000001,
+	DEVICEPP_RX_AUDIO_MBDRC = 0xac000002,
+	DEVICEPP_RX_VOIP_MBDRC = 0xac000003,
+	DEVICEPP_RX_HFPSINK = 0xac000004,
+	DEVICEPP_RX_VOICE_DEFAULT = 0xac000005,
+	DEVICEPP_RX_ULTRASOUND_GENERATOR = 0xac000006,
+	DEVICEPP_RX_VOICE_RVE = 0xac000007,
+	DEVICEPP_RX_VOICE_NN_NS = 0xac000009,
+	DEVICEPP_RX_AUDIO_MSPP = 0xac00000b,
+};
+
+/**
+	@h2xmlk_key {DEVICEPP_TX}
+	@h2xmlk_description {Tx Device Post/Pre Processing Chain}
+*/
+enum Key_DevicePP_TX {
+	DEVICEPP_TX_FLUENCE_FFECNS = 0xad000001,
+	DEVICEPP_TX_AUDIO_FLUENCE_SMECNS = 0xad000002,
+	DEVICEPP_TX_AUDIO_FLUENCE_ENDFIRE = 0xad000003,
+	DEVICEPP_TX_AUDIO_FLUENCE_PRO = 0xad000004,
+	DEVICEPP_TX_VOIP_FLUENCE_PRO = 0xad000005,
+	DEVICEPP_TX_HFP_SINK_FLUENCE_SMECNS = 0xad000006,
+	DEVICEPP_TX_VOIP_FLUENCE_SMECNS = 0xad000007,
+	DEVICEPP_TX_VOICE_FLUENCE_SMECNS = 0xad000008,
+	DEVICEPP_TX_VOICE_FLUENCE_ENDFIRE = 0xad000009,
+	DEVICEPP_TX_VOICE_FLUENCE_PRO = 0xad00000a,
+	DEVICEPP_TX_RAW_LPI = 0xad00000c,
+	DEVICEPP_TX_VOIP_FLUENCE_ENDFIRE = 0xad00000d,
+	DEVICEPP_TX_RAW_NLPI = 0xad00000e,
+	DEVICEPP_TX_VOICE_FLUENCE_NN_SM = 0xad00000f,
+	DEVICEPP_TX_VOIP_FLUENCE_NN_SM = 0xad000010,
+	DEVICEPP_TX_FLUENCE_FFEC = 0xad000012,
+	DEVICEPP_TX_VOICE_FLUENCE_ENDFIRE_RVE = 0xad000013,
+	DEVICEPP_TX_VOICE_RECOGNITION = 0xad000017,
+	DEVICEPP_TX_AAD = 0xad000019,
+	DEVICEPP_TX_FLUENCE_FFNS_AAD = 0xad00001a,
+	DEVICEPP_TX_RAW_LPI_AAD = 0xad00001b,
+	DEVICEPP_TX_AUDIO_RECORD_ENQORE = 0xad000023,
+};
+
+enum Key_StreamConfig {
+	STREAM_CFG_VUI_SVA = 0xbc000001,
+};
+
+/**
+	@h2xmlk_key {VOLUME}
+	@h2xmlk_description {Volume}
+*/
+enum Key_Volume {
+	LEVEL_0 = 0, /**< @h2xmle_name {Level_0}*/
+	LEVEL_1 = 1, /**< @h2xmle_name {Level_1}*/
+	LEVEL_2 = 2, /**< @h2xmle_name {Level_2}*/
+	LEVEL_3 = 3, /**< @h2xmle_name {Level_3}*/
+	LEVEL_4 = 4, /**< @h2xmle_name {Level_4}*/
+	LEVEL_5 = 5, /**< @h2xmle_name {Level_5}*/
+	LEVEL_6 = 6, /**< @h2xmle_name {Level_6}*/
+	LEVEL_7 = 7, /**< @h2xmle_name {Level_7}*/
+	LEVEL_8 = 8, /**< @h2xmle_name {Level_8}*/
+	LEVEL_9 = 9, /**< @h2xmle_name {Level_9}*/
+	LEVEL_10 = 10, /**< @h2xmle_name {Level_10}*/
+	LEVEL_11 = 11, /**< @h2xmle_name {Level_11}*/
+	LEVEL_12 = 12, /**< @h2xmle_name {Level_12}*/
+	LEVEL_13 = 13, /**< @h2xmle_name {Level_13}*/
+	LEVEL_14 = 14, /**< @h2xmle_name {Level_14}*/
+	LEVEL_15 = 15, /**< @h2xmle_name {Level_15}*/
+};
+
+/**
+	@h2xmlk_key {GAIN}
+	@h2xmlk_description {Gain}
+*/
+enum Key_Gain {
+	GAIN_0 = 0, /**< @h2xmle_name {Gain_0}*/
+	GAIN_1 = 1, /**< @h2xmle_name {Gain_1}*/
+	GAIN_2 = 2, /**< @h2xmle_name {Gain_2}*/
+	GAIN_3 = 3, /**< @h2xmle_name {Gain_3}*/
+	GAIN_4 = 4, /**< @h2xmle_name {Gain_4}*/
+	GAIN_5 = 5, /**< @h2xmle_name {Gain_5}*/
+	GAIN_6 = 6, /**< @h2xmle_name {Gain_6}*/
+	GAIN_7 = 7, /**< @h2xmle_name {Gain_7}*/
+	GAIN_8 = 8, /**< @h2xmle_name {Gain_8}*/
+	GAIN_9 = 9, /**< @h2xmle_name {Gain_9}*/
+	GAIN_10 = 10, /**< @h2xmle_name {Gain_10}*/
+	GAIN_11 = 11, /**< @h2xmle_name {Gain_11}*/
+	GAIN_12 = 12, /**< @h2xmle_name {Gain_12}*/
+	GAIN_13 = 13, /**< @h2xmle_name {Gain_13}*/
+	GAIN_14 = 14, /**< @h2xmle_name {Gain_14}*/
+	GAIN_15 = 15, /**< @h2xmle_name {Gain_15}*/
+};
+
+/**
+	@h2xmlk_key {SAMPLINGRATE}
+	@h2xmlk_sampleRate
+	@h2xmlk_description {Sampling Rate}
+*/
+enum Key_SamplingRate {
+	SAMPLINGRATE_8K = 8000,   /**< @h2xmle_sampleRate{8000} @h2xmle_name {SR_8K}*/
+	SAMPLINGRATE_16K = 16000, /**< @h2xmle_sampleRate{16000} @h2xmle_name {SR_16K}*/
+	SAMPLINGRATE_22K = 22050, /**< @h2xmle_sampleRate{22050} @h2xmle_name {SR_22K}*/
+	SAMPLINGRATE_24K = 24000, /**< @h2xmle_sampleRate{24000} @h2xmle_name {SR_24K}*/
+	SAMPLINGRATE_32K = 32000, /**< @h2xmle_sampleRate{32000} @h2xmle_name {SR_32K}*/
+	SAMPLINGRATE_44K = 44100, /**< @h2xmle_sampleRate{44100} @h2xmle_name {SR_44.1K}*/
+	SAMPLINGRATE_48K = 48000, /**< @h2xmle_sampleRate{48000} @h2xmle_name {SR_48K}*/
+	SAMPLINGRATE_96K = 96000, /**< @h2xmle_sampleRate{96000} @h2xmle_name {SR_96K}*/
+	SAMPLINGRATE_192K = 192000, /**< @h2xmle_sampleRate{192000} @h2xmle_name {SR_192K}*/
+	SAMPLINGRATE_352K = 352800, /**< @h2xmle_sampleRate{352800} @h2xmle_name {SR_352K}*/
+	SAMPLINGRATE_384K = 384000, /**< @h2xmle_sampleRate{384000} @h2xmle_name {SR_384K}*/
+};
+/**
+	@h2xmlk_key {BITWIDTH}
+	@h2xmlk_description {Bit Width}
+*/
+enum Key_BitWidth {
+	BITWIDTH_16 = 16, /**< @h2xmle_name {BW_16}*/
+	BITWIDTH_24 = 24, /**< @h2xmle_name {BW_24}*/
+	BITWIDTH_32 = 32, /**< @h2xmle_name {BW_32}*/
+};
+/**
+	@h2xmlk_key {PAUSE}
+	@h2xmlk_description {Pause}
+*/
+enum Key_Pause {
+	OFF = 0, /**< @h2xmle_name {Off}*/
+	ON = 1, /**< @h2xmle_name {On}*/
+};
+/**
+	@h2xmlk_key {MUTE}
+	@h2xmlk_description {Mute}
+*/
+enum Key_Mute {
+	MUTE_OFF = 0, /**< @h2xmle_name {Off}*/
+	MUTE_ON = 1, /**< @h2xmle_name {On}*/
+};
+/**
+	@h2xmlk_key {CHANNELS}
+	@h2xmlk_description {Channels}
+*/
+enum Key_Channels {
+	CHANNELS_1 = 1, /**< @h2xmle_name {CHS_1}*/
+	CHANNELS_2 = 2, /**< @h2xmle_name {CHS_2}*/
+        CHANNELS_3 = 3, /**< @h2xmle_name {CHS_3}*/
+	CHANNELS_4 = 4, /**< @h2xmle_name {CHS_4}*/
+        CHANNELS_5 = 5, /**< @h2xmle_name {CHS_5}*/
+        CHANNELS_5_1 = 6, /**< @h2xmle_name {CHS_6}*/
+	CHANNELS_7 = 7, /**< @h2xmle_name {CHS_7}*/
+	CHANNELS_8 = 8, /**< @h2xmle_name {CHS_8}*/
+};
+
+/**
+	@h2xmlk_key {ECNS}
+	@h2xmlk_description {ECNS}
+*/
+enum Key_ECNS {
+	ECNS_OFF = 0, /**< @h2xmle_name {ECNS_Off}*/
+	ECNS_ON = 1, /**< @h2xmle_name {ECNS_On}*/
+	EC_ON = 2,
+	NS_ON = 3,
+};
+
+/**
+	@h2xmlk_key {DTMF}
+	@h2xmlk_description {DMTF_SWITCH}
+*/
+enum Key_Dtmf {
+	DISABLE = 0,
+	ENABLE = 1,
+};
+
+/**
+	@h2xmlk_gkeys
+	@h2xmlk_description {Graph Keys}
+*/
+enum Graph_Keys {
+	gk_StreamRX = STREAMRX,
+	gk_DeviceRX = DEVICERX,
+	gk_DeviceTX = DEVICETX,
+	gk_DevicePP_RX = DEVICEPP_RX,
+	gk_DevicePP_TX = DEVICEPP_TX,
+	gk_Instance = INSTANCE,
+	gk_StreamPP_RX = STREAMPP_RX,
+	gk_StreamPP_TX = STREAMPP_TX,
+	gk_StreamTX = STREAMTX,
+	gk_VSID = VSID,
+	gk_BtProfile = BTPROFILE,
+	gk_BtFormat = BTFORMAT,
+	gk_SW_Sidetone = SW_SIDETONE,
+	gk_Stream_Config = STREAM_CONFIG,
+	gk_ProxyTxType = PROXYTXTYPE,
+	gk_Stream = STREAM,
+	gk_DeviceTX_EXT = DEVICETX_EXT,
+};
+/**
+	@h2xmlk_ckeys
+	@h2xmlk_description {Calibration Keys}
+*/
+enum Cal_Keys {
+	ck_volume = VOLUME,
+	ck_channels = CHANNELS,
+	ck_sp_dev_map = SPKRPROTDEVMAP,
+	ck_ras_switch = RAS_SWITCH,
+	ck_sp_vi_map = SPKRPROTVIMAP,
+	ck_gain = GAIN,
+	ck_stream_channels = STREAMCHANNELS,
+	ck_voip_sample_rate = VOIP_SAMPLE_RATE,
+};
+
+#define DEVICE_HW_ENDPOINT_RX        0xC0000004
+/**
+        @h2xmlk_modTag {"device_hw_ep_rx",DEVICE_HW_ENDPOINT_RX}
+	@h2xmlk_description {Hw EP Rx}
+*/
+enum HW_ENDPOINT_RX_Keys {
+	tk1_hweprx = DEVICERX,
+	tk2_hweprx = SAMPLINGRATE,
+	tk3_hweprx = BITWIDTH,
+	tk4_hweprx = CHANNELS,
+};
+#define DEVICE_HW_ENDPOINT_TX        0xC0000005
+/**
+        @h2xmlk_modTag {"device_hw_ep_tx",DEVICE_HW_ENDPOINT_TX}
+	@h2xmlk_description {Hw EP Tx}
+*/
+enum HW_ENDPOINT_TX_Keys {
+	tk1_hweptx = DEVICETX,
+	tk2_hweptx = SAMPLINGRATE,
+	tk3_hweptx = BITWIDTH,
+	tk4_hweptx = CHANNELS,
+};
+#define TAG_PAUSE       0xC0000006
+/**
+	@h2xmlk_modTag {"stream_pause", TAG_PAUSE}
+	@h2xmlk_description {Stream Pause}
+*/
+enum TAG_PAUSE_Keys {
+	tk1_Pause = PAUSE,
+};
+#define TAG_MUTE        0xC0000007
+/**
+	@h2xmlk_modTag {"stream_mute", TAG_MUTE}
+	@h2xmlk_description {Stream Mute}
+*/
+enum TAG_MUTE_Keys {
+	tk1_Mute = MUTE,
+};
+
+#define TAG_ECNS  0xC000000A
+/**
+	@h2xmlk_modTag {"device_ecns", TAG_ECNS}
+	@h2xmlk_description {Ecns On/Off}
+*/
+enum TAG_ECNS_Keys {
+	tk1_Ecns = ECNS,
+};
+
+#define TAG_STREAM_VOLUME  0xC000000D
+/**
+	@h2xmlk_modTag {"stream_volume", TAG_STREAM_VOLUME}
+	@h2xmlk_description {Stream Volume}
+*/
+enum TAG_STREAM_VOLUME_Keys {
+	tk1_Volume = VOLUME,
+};
+
+#define TAG_DEVICE_PP_MFC  0xC0000011
+/**
+	@h2xmlk_modTag {"device_pp_mfc", TAG_DEVICE_PP_MFC}
+	@h2xmlk_description {Device PP MFC}
+*/
+enum TAG_DEVICE_PP_MFC_Keys {
+	tk1_SamplingRate = SAMPLINGRATE,
+	tk2_BitWidth     = BITWIDTH,
+	tk3_Channels     = CHANNELS,
+};
+
+#define TAG_STREAM_MFC  0xc000000b
+
+// Same enum names as TAG_DEVICE_PP_MFC_Keys
+/*enum TAG_STREAM_MFC_Keys {
+	tk1_SamplingRate = SAMPLINGRATE,
+	tk2_BitWidth     = BITWIDTH,
+	tk3_Channels     = CHANNELS,
+};*/
+
+
+#define TAG_STREAM_PLACEHOLDER_DECODER  0xc0000012
+
+enum TAG_STREAM_PLACEHOLDER_DECODER_Keys {
+	tk1_MediaFmtID = MEDIAFMTID,
+};
+
+#define TAG_STREAM_EQUALIZER  0xc0000014
+
+enum TAG_STREAM_EQUALIZER_Keys {
+	tk1_Equalizer = EQUALIZER_SWITCH,
+};
+
+#define TAG_STREAM_VIRTUALIZER  0xc0000015
+
+enum TAG_STREAM_VIRTUALIZER_Keys {
+	tk1_Virtualizer_Switch = VIRTUALIZER_SWITCH,
+};
+
+#define TAG_STREAM_REVERB  0xc0000016
+
+enum TAG_STREAM_REVERB_Keys {
+	tk1_Reverb_Switch = REVERB_SWITCH,
+};
+
+#define TAG_STREAM_PBE  0xc0000017
+
+enum TAG_STREAM_PBE_Keys {
+	tk1_PBE_Switch = PBE_SWITCH,
+};
+
+#define TAG_STREAM_BASS_BOOST  0xc0000018
+
+enum TAG_STREAM_BASS_BOOST_Keys {
+	tk1_BASS_BOOST_Switch = BASS_BOOST_SWITCH,
+};
+
+#define PER_STREAM_PER_DEVICE_MFC  0xc0000019
+
+// Same enum names as TAG_DEVICE_PP_MFC_Keys
+/*enum TAG_PSPD_MFC_Keys {
+	tk1_SamplingRate = SAMPLINGRATE,
+	tk2_BitWidth     = BITWIDTH,
+	tk3_Channels     = CHANNELS,
+};*/
+
+#define TAG_STREAM_SLOWTALK  0xc0000025
+
+enum TAG_STREAM_SLOWTALK_Keys {
+	tk1_Stream_SlowTalk = STREAM_SLOWTALK,
+};
+
+#define TAG_MODULE_CHANNELS  0xc0000026
+
+enum TAG_MODULE_CHANNELS_Keys {
+	tk1_Channels = CHANNELS,
+};
+
+#define TAG_STREAM_MUXDEMUX  0xc0000027
+
+enum TAG_STREAM_MUXDEMUX_Keys {
+	tk1_Stream_MuxDemux= STREAM_MUXDEMUX,
+};
+
+#define TAG_DEVICE_MUX  0xc0000040
+
+enum TAG_DEVICE_MUX_Keys {
+	tk1_SlotMask= TAG_KEY_SLOT_MASK,
+};
+
+#define TAG_MODULE_MSPP  0xc0000043
+
+/**
+	@h2xmlk_modTagList
+*/
+enum TAGS_DEFINITIONS {
+        SHMEM_ENDPOINT              = 0xC0000001, /**< @h2xmle_name {"sh_ep"} */
+        STREAM_INPUT_MEDIA_FORMAT   = 0xC0000002, /**< @h2xmle_name {"stream_input_media_format" } */
+        STREAM_OUTPUT_MEDIA_FORMAT  = 0xC0000003, /**< @h2xmle_name {"stream_output_media_format" } */
+        DEVICE_SVA                  = 0xC0000008, /**< @h2xmle_name {"device_sva"} */
+        DEVICE_ADAM                 = 0xC0000009, /**< @h2xmle_name {"device_adam"} */
+        STREAM_MFC                  = 0xC000000B, /**< @h2xmle_name {"stream_mfc"} */
+        DEVICE_MFC                  = 0xC000000C, /**< @h2xmle_name {"device_mfc"} */
+        STREAM_PCM_DECODER          = 0xC000000E, /**< @h2xmle_name {"stream_pcm_decoder"} */
+        STREAM_PCM_ENCODER          = 0xC000000F, /**< @h2xmle_name {"stream_pcm_encoder"} */
+        STREAM_PCM_CONVERTER        = 0xC0000010, /**< @h2xmle_name {"stream_pcm_converter"} */
+        STREAM_SPR                  = 0xc0000013,
+        BT_ENCODER                  = 0xc0000020,
+        COP_PACKETIZER_V0           = 0xc0000021,
+        RATE_ADAPTER_MODULE         = 0xc0000022,
+        BT_PCM_CONVERTER            = 0xc0000023,
+        BT_DECODER                  = 0xc0000024,
+        MODULE_VI                   = 0xc0000028,
+        MODULE_SP                   = 0xc0000029,
+        MODULE_GAPLESS              = 0xc000002a,
+        WR_SHMEM_ENDPOINT           = 0xc000002c,
+        RD_SHMEM_ENDPOINT           = 0xc000002e,
+        COP_PACKETIZER_V2           = 0xc000002f,
+        COP_DEPACKETIZER_V2         = 0xc0000030,
+        CONTEXT_DETECTION_ENGINE    = 0xc0000031,
+        ULTRASOUND_DETECTION_MODULE = 0xc0000032,
+        DEVICE_POP_SUPPRESSOR       = 0xc000003a,
+};
+typedef enum TAGS_DEFINITIONS TAGS_DEFINITIONS;
diff --git a/utils/inc/ListenSoundModelLib.h b/utils/inc/ListenSoundModelLib.h
new file mode 100644
index 0000000..46103fa
--- /dev/null
+++ b/utils/inc/ListenSoundModelLib.h
@@ -0,0 +1,919 @@
+/*
+ * ListenSoundModelLib.h
+ *
+ * This is the interface file of sound model library which provides
+ * the APIs to get sound model information and merge, delete functionality
+ * which will be used by STHAL.
+ *
+ * Copyright (c) 2019-2020, 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.
+ */
+
+/*======================================================================
+DESCRIPTION : ListenSoundModelLibrary Version 3
+====================================================================*/
+
+#ifndef __LISTEN_SOUND_MODEL_LIB_V3_H__
+#define __LISTEN_SOUND_MODEL_LIB_V3_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#if defined(_SML_NO_DLL)
+#define DllFunc
+#define CDECLARE
+#elif defined(_MSC_VER) && defined(_EXPORT)
+#define DllFunc   __declspec( dllexport )
+#define CDECLARE    __cdecl
+#elif defined(_MSC_VER)
+#define DllFunc   __declspec( dllimport )
+#define CDECLARE    __cdecl
+#else   // For other compiler like gcc
+#define DllFunc
+#define CDECLARE
+#endif
+
+#define LSMLIB_VERSION 2 // %%% some unique number that changes when API changes
+                         // %%% could be == SoundModel version supported for SVA 2.0
+
+#define MAX_STRING_LEN (100 * 2)  // maximum byte size of string representing Unicode character string
+// %%% NOTE: "MAX_STRING_LEN" replaces old constant "MAX_KEYWORD"
+
+
+// SVA 2.0
+// Keyword & User Identifier as zero terminated strings
+typedef char * keywordId_t;
+typedef char * userId_t;
+
+
+typedef struct {
+    //state machine parameters
+    float minSnrOnset;                  // The minimum snr of frame that speech segment starts
+    float minSnrLeave;                  // The minimum snr of frame that speech segment ends
+    float snrFloor;                     // The minimum snr value assumed in the end point detector
+    float snrThresholds;                // The minimum snr value of speech to verify
+    float forgettingFactorNoise;        // The forgetting factor used for noise estimation
+    int numFrameTransientFrame;         // the number of frames in the beginning that are used for noise estimate(valid only for online mode)
+    float minEnergyFrameRatio;          // the number of frame are used for noise estimation = minenergyFrameRatio * #frames of input(valid only for batch mode)
+
+    //post processing parameters
+    //Note:
+    int numMinFramesInPhrase;           // the minimum nubmer of samples for a speech phrase (targetted speech)
+    int numMinFramesInSpeech;           //the minimum number of samples for a speech intereval
+    int numMaxFrameInSpeechGap;         //the maximum allowable number of samples for a speech gap
+    int numFramesInHead;                //the speech head
+    int numFramesInTail;                //the speech tail
+} listen_epd_params;
+
+typedef struct {
+    int16_t *data;              /* Audio samples ( in Raw PCM format: 16kHz, 16bit, mono ) */
+    uint32_t n_samples;         /* number of audio samples */
+} listen_user_recording;
+
+typedef struct {
+    uint8_t *data;              /* block of memory containing Model data */
+    uint32_t size;              /* size of memory allocated for Model data */
+} listen_language_model_type;
+
+typedef struct {
+    uint8_t *data;              /* block of memory containing Model data */
+    uint32_t size;              /* size of memory allocated for Model data */
+} listen_model_type;
+
+// kwihyuk - comments will update
+// %%% the numbering - names are up to you, as long as type + version is unique between SVA 1.0 and 2.0 SMs
+typedef enum {
+    kKeywordModel = 1,           /* Keyword model */
+    kUserKeywordModel = 2,    /* Userkeyword model */
+    kTargetSoundModel = 3,
+    kMultiUserKeywordModel = 4, /* Multiple Keyword models */
+    kKeywordModelWithVop = 5,   //kwihyuk
+    kSecondStageKeywordModel = 6,   //kwihyuk
+    kSecondStageKeywordModelWithVop = 7,    //kwihyuk
+} listen_model_enum;
+
+typedef enum {
+    kSuccess = 0,
+    kFailure = 1
+} listen_detection_status_enum;
+
+typedef struct {
+    listen_model_enum type;     /* model type: Keyword, User, TargetSound */
+    uint32_t          version;  /* model version */
+    uint32_t          size;     /* total size of the model: header + payload size */
+} listen_sound_model_info;
+
+
+typedef struct {
+    listen_detection_status_enum status; // SUCCESS or FAILURE
+    uint32_t size;               // size in bytes of payload data
+                                                 // just contains result confidence level values
+    uint8_t *data;             // block of memory containing data payload
+} listen_event_payload;
+
+// SVA 2.0
+typedef struct {
+    uint16_t                numKeywords;  /* total number of keywords  */
+    uint16_t                numUsers;    /* total number of users  */
+    uint16_t                numActiveUserKeywordPairs;    /* total number of active user+keyword pairs in SM */
+    bool                    isStripped; /* if corresponding keyword is stripped or not */
+    uint16_t                *langPerKw; /* Language code of each keyword */
+    /* number active Users per keyword - included as convenience */
+    uint16_t                *numUsersSetPerKw;
+    bool                    *isUserDefinedKeyword;
+    /* Ordered 'truth' table of all possible pairs of users for each keyword.
+    * Active entries marked with 1, inactive 0.keywordPhrase
+    * 16-bit short (rather than boolean) is used to match SM model data size */
+    uint16_t                **userKeywordPairFlags;
+    uint16_t                model_indicator; /* for SM 3.0, indicate which models were combined */
+} listen_sound_model_header;
+
+
+
+
+// SVA 2.0
+// %%% this should match the 'sensitivity' data structure input in VoiceWakeupParamType
+typedef struct {
+    uint8_t   size     ;  // number of keyword plus activePair confidence levels set d
+    uint8_t   *pConfLevels;  // level of each keyword and each active user+keyword pair
+} listen_confidence_levels ;
+
+// SVA 2.0
+typedef enum {
+    kSingleKWDetectionEvent = 1,         /* SVA 1.0 model */
+    kMultiKWDetectionEvent = 2,       /* SVA 2.0 model */
+} listen_detection_type_enum;
+
+
+// duplicates existing SVA1.0 typedef
+// Do not include listen_detection_entry_v1 in SVA 1.0 header if both headers included
+typedef struct {
+    char keyword[MAX_STRING_LEN];
+    uint16_t keywordConfidenceLevel;
+    uint16_t userConfidenceLevel;
+} listen_detection_event_v1;
+
+// denotes that a particular entry in confidence level array is not active
+static const uint8_t  NO_CONF_LEVEL = 0;
+
+typedef struct {
+
+    char     keywordPhrase[MAX_STRING_LEN]; /* string containing phrase string of keyword with highest confidence score */
+    char     userName[MAX_STRING_LEN];  /* string containing name of user with highest confidence score */
+
+    uint8_t  highestKeywordConfidenceLevel;  // set to zero if detection status is Failed
+    uint8_t  highestUserConfidenceLevel;     // set to zero if detection status is Failed
+
+    listen_confidence_levels  pairConfidenceLevels; // confidence levels of ALL pair (active or not)
+} listen_detection_event_v2;
+
+// modified for SVA 2.0 - this should override SVA 1.0 typedef
+typedef struct {
+    // %%% uint16_t version;
+    listen_detection_type_enum   detection_data_type;
+    // data structure filled is based on detection_data_type
+    union {
+        listen_detection_event_v1 event_v1;  // for SVA 1.0
+        listen_detection_event_v2 event_v2;  // for SVA 2.0
+    } event;
+} listen_detection_event_type;
+
+typedef enum {
+    kSucess = 0,
+    kFailed = 1,
+    kBadParam,
+    kKeywordNotFound,
+    kUserNotFound,
+    kUserKwPairNotActive,
+    kSMVersionUnsupported,
+    kUserDataForKwAlreadyPresent,
+    kDuplicateKeyword,
+    kDuplicateUserKeywordPair,
+    kMaxKeywordsExceeded,
+    kMaxUsersExceeded,
+    kEventStructUnsupported,    // payload contains event data that can not be processed, or mismatches SM version
+    kLastKeyword,
+    kNoSignal,
+    kLowSnr,
+    kRecordingTooShort,
+    kRecordingTooLong,
+    kNeedRetrain,
+    kUserUDKPairNotRemoved,
+    kCannotCreateUserUDK,
+    kOutputArrayTooSmall,
+    kTooManyAbnormalUserScores,
+    kWrongModel,
+    kWrongModelAndIndicator,
+    kDuplicateModel,
+} listen_status_enum;
+
+/*
+*   Notes:
+*       1. The client code that calls getKeywordPhrases(), getUserNames() must allocate DstStr as [MAX_STRING_LEN]
+*       2. The client code that calls getUserKeywordModelSize(), createUserDefinedKeywordModel(),
+*           createUserKeywordModel() should assign meaningful string for keywordId or userId, empty string is not recommended.
+*       3. verifyUserRecording() should be called before calling createUserKeywordModel(). If pConfidenceLevel returned
+*           in verifyUserRecording() is below a CONFIDENCE_THRESHOLD value, the recording should be rejected and not used
+*           to a create user model. The client code should decide the CONFIDENCE_THRESHOLD value, a recommended value range for
+*           CONFIDENCE_THRESHOLD is 60~70.
+*
+*/
+
+    /*
+    * findKeywordEndPosition
+    *
+    * Returns the keyword end position of user recordings from the keyword model
+    * the keyword model finds the keyword end position by using keyword end finding algorithm inside SVA
+    *
+    * Param [in]  pKeywordModel - pointer to keyword model data which will be used to find keyword end
+    * Param [in]  keywordId - null terminated string contains keyword phrase string
+    * Param [in]  pUserRecording - a single recording of user speaking keyword
+                                   other speech such as following command may follows
+    * Param [out] pKendPosition - returns keyword end position from the start of user recording in number of samples
+    *
+    * Return - status
+    *       kBadParam - When any input pointer (except pEpdParameter) is NULL
+    *       kKeywordNotFound - When keywordId not exist in the model
+    *       kSMVersionUnsupported - When pKeywordModel is not 2.0 model
+    */
+DllFunc listen_status_enum CDECLARE findKeywordEndPosition(
+                listen_model_type           *pKeywordModel,
+                keywordId_t                 keywordId,
+                listen_user_recording       *pUserRecording,
+                uint32_t                    *pKendPosition);
+
+    /*
+    * verifyUserRecording
+    *
+    * Returns the confidence level ( 0 ~ 100 ) that user recording matches keyword
+    * User data is to be appended for a specific keyword in the model
+    * // will be updated or removed
+    * if input is SM 3.0 which combiend with GMM and other sound models,
+    * then parsing to GMM model and run same procedure.
+    *
+    * Param [in]  pKeywordModel - pointer to user-independent keyword model data
+    * Param [in]  keywordId - null terminated string contains keyword phrase string
+    * Param [in]  listen_epd_params - epd parameter
+                                      if null is passing, default epd parameter will be used internally
+    * Param [in]  pUserRecording - a single recording of user speaking keyword
+    * Param [out] pConfidenceLevel - returns confidence level returned by keyword detection
+    *
+    * Return - status
+    *       kBadParam - When any input pointer (except pEpdParameter) is NULL
+    *       kKeywordNotFound - When keywordId not exist in the model
+    *       kSMVersionUnsupported - When pKeywordModel is not 2.0 (have to contain GMM) model
+    *       kLowSnr - When user recording is too noisy
+    *       kNoSignal - When user recording is non-speech
+    */
+DllFunc listen_status_enum CDECLARE verifyUserRecording(
+        listen_model_type           *pKeywordModel,
+        keywordId_t                 keywordId, // add for SVA 2.0
+        listen_epd_params           *pEpdParameter,
+        listen_user_recording       *pUserRecording,
+        int16_t                     *pConfidenceLevel);
+
+    /*
+    * checkUserRecording
+    *
+    * Returns the status of user recordings that if user recording has problem with SNR(Signal Noise Ratio) and length
+    *
+    * Param [in]  pLanguageModel - pointer to language model
+    * Param [in]  pEpdParameter - pointer to EPD parameters
+    *                            Default parameter will be used if eEpdParameter is NULL
+    * Param [in]  pUserRecording - User recording that is going to be tested
+    * Param [out]  pOutSnr - SNR of user recording
+    * Param [in]  maxPhonemeLength (optional parameter) - maximum phoneme length allowed for each user recording
+    *                                                   - It is optional parameter, whose default value is 0.
+    *
+    * Return - status
+    *       kBadParam - When any input pointer (except pEpdParameter) is NULL
+    *         kLowSnr   - When user recording is too noisy
+    *         kNoSignal - When user recording is non-speech
+    *       kRecordingTooShort - When user recording is too short
+    */
+DllFunc listen_status_enum CDECLARE checkUserRecording(
+        listen_language_model_type  *pLanguageModel,
+        listen_epd_params           *pEpdParameter,
+        listen_user_recording       *pUserRecording,
+        float                       *pOutSnr,
+        uint32_t                    maxPhonemeLength);
+
+    /*
+    * checkRecordingsQuality
+    *
+    * Returns the status of the last user recording in recording array that
+    * if user recording has problem with SNR(Signal Noise Ratio) and length
+    * Check the consistency of the input recordings if numUserRecording > 1
+    *
+    * Param [in]  pLanguageModel - pointer to language model
+    * Param [in]  pEpdParameter - pointer to EPD parameters
+    *                            Default parameter will be used if eEpdParameter is NULL
+    * Param [in]  numUserRecording - number of input recordings
+    * Param [in]  pUserRecordings - User recordings those are going to be tested
+    * Param [out]  pOutSnr - SNR of user recording
+    *
+    * Return - status
+    *       kBadParam - When any input pointer (except pEpdParameter) is NULL
+    *         kLowSnr   - When user recording is too noisy
+    *         kNoSignal - When user recording is non-speech
+    *       kRecordingTooShort - When user recording is too short
+    */
+
+DllFunc listen_status_enum CDECLARE checkRecordingsQuality(
+        listen_language_model_type  *pLanguageModel,
+        listen_epd_params           *pEpdParameter,
+        uint32_t                     numUserRecording,
+        listen_user_recording       *pUserRecordings[],
+        float                       *pOutSnr);
+
+    /*
+    * tuneUserDefinedKeywordModelThreshold
+    *
+    * This function tunes threshold of user defined keyword.
+    *
+    * This function can be used when programmer want to make testing stage after training stage of user defined keyword
+    * even though threshold of user defined keyword is automatically tunned when create user defined keyword,
+    * this function can be useful when tune more threshold of user defined keyword
+    *
+    * Param [in]  pUserDefinedKeyword - pointer to user defined keyword
+    * Param [in]  keywordId - keyword spell
+    * Param [in]  pUserRecording - user recording from testing stage
+    * Param [out]  pOutputUserDefinedKeyword - tunned user defined keyword
+    *
+    * Return - listen_status_enum
+    * Return - status
+    *       kBadParam - When any input pointer is NULL, or pUserDefinedKeyword is not UDK
+    *       kKeywordNotFound - When keywordId not exist in the model
+    */
+DllFunc listen_status_enum CDECLARE tuneUserDefinedKeywordModelThreshold(
+        listen_model_type           *pUserDefinedKeyword,
+        keywordId_t                 keywordId,
+        listen_user_recording       *pUserRecording,
+        listen_model_type           *pOutputUserDefinedKeyword);
+
+
+    /*
+    * getUserDefinedKeywordSize
+    *
+    * Get the size required to hold user defined keyword model that extends given keyword model
+    * with give user data
+    *
+    * Param [in]  pUserDefinedKeyword - pointer to previous user defined keyword
+                                        if pUserDefinedKeyword is NULL, this will create new user defined keyword model
+                                        if pUserDefinedKeyword is not NULL, this will train incrementally ( not supported now )
+
+    * Param [in]  keywordId - keyword spell of user defined keyword
+    * Param [in]  userId - user spell of user defined keyword
+    * Param [in]  pEpdParameter - epd parameter which is used for chopping user recording.
+                                   if eEpdParameter is NULL, default parameter will be used
+    * Param [in]  numUserRecording - number of user recording
+    * Param [in]  pUserRecordings[] -  multiple recording of user speaking keyword
+    * Param [in]  pLanguageModel - language model
+    * Param [out]  pOutputSize - pointer to where output model size will be written
+    *
+    * Return - listen_status_enum
+    * Return - status
+    *       kBadParam - When any input pointer (except pUserDefinedKeyword, pEpdParameter) is NULL, or pLanguageModel is fake
+    *       kNoSignal - When user recording is non-speech
+    */
+DllFunc listen_status_enum CDECLARE getUserDefinedKeywordSize(
+        listen_model_type           *pUserDefinedKeyword,
+        keywordId_t                 keywordId,
+        userId_t                    userId,
+        listen_epd_params           *pEpdParameter,
+        uint32_t                    numUserRecording,
+        listen_user_recording       *pUserRecordings[],
+        listen_language_model_type  *pLanguageModel,
+        uint32_t                    *pOutputSize);
+
+    /*
+    * getUserDefinedKeywordApproxSize
+    *
+    * Get the size required to hold user-keyword model that extends given keyword model
+    * with give user data
+    *
+    * Param [in]  keywordId - null terminated string containing keyword phrase string
+    * Param [in]  userId - null terminated string containing user name string
+    * Param [in]  pLanguageModel - pointer to language model data
+    * Param [out] pOutputSize - size of approximated output model
+    * Param [in]  maxPhonemeLength (optional parameter) - maximum phoneme length allowed for each user recording
+    *                                                   - It is optional parameter, whose default value is 0.
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    */
+
+DllFunc listen_status_enum CDECLARE getUserDefinedKeywordApproxSize(
+    keywordId_t keywordId,
+    userId_t userId,
+    listen_language_model_type *pLanguageModel,
+    uint32_t                        *pOutputSize,
+    uint32_t                        maxPhonemeLength);
+
+    /*
+    * createUserDefinedKeywordModel
+    *
+    * Description : Create User Defined Keyword Model
+    *
+    * Param [in]  pUserDefinedKeyword - pointer to previous user defined keyword
+                                        if pUserDefinedKeyword is NULL, this will create new user defined keyword model
+                                        if pUserDefinedKeyword is not NULL, this will train incrementally ( not supported now )
+
+    * Param [in]  keywordId - keyword spell of user defined keyword
+    * Param [in]  userId - user spell of user defined keyword
+    * Param [in]  pEpdParameter - epd parameter which is used for chopping user recording.
+                                   if eEpdParameter is NULL, default parameter will be used
+    * Param [in]  numUserRecording - number of user recording
+    * Param [in]  pUserRecordings[] - multiple recording of user speaking keyword
+    * Param [in]  pLanguageModel - language model
+    * Param [out] pOutputUserDefinedKeyword - pointer to where output model will be written
+    * Param [out] pMatchingScore - pointer to matching score
+    *
+    * Return - listen_status_enum
+    * Return - status
+    *       kBadParam - When any input pointer (except pUserDefinedKeyword, pEpdParameter) is NULL, or pLanguageModel is fake
+    *       kNoSignal - When user recording is non-speech
+    *       kCannotCreateUserUDK - When creation process fails somewhere
+    *       kOutputArrayTooSmall - When output size is smaller than actual udk model size
+    */
+DllFunc listen_status_enum CDECLARE createUserDefinedKeywordModel(
+        listen_model_type          *pUserDefinedKeyword,
+        keywordId_t                 keywordId,
+        userId_t                    userId,
+        listen_epd_params           *pEpdParameter,
+        uint32_t                     numUserRecording,
+        listen_user_recording      *pUserRecordings[],
+        listen_language_model_type  *pLanguageModel,
+        listen_model_type           *pOutputUserDefinedKeyword,
+        int16_t                     *pMatchingScore);
+
+    /*
+    * getStrippedUserKeywordModelSize
+    *
+    * Return stripped model size
+    *
+    * Param[in] pModel - pointer to (user)keyword model data
+    * Param[out] nStrippedModelSize - return model size of stripped model
+    *
+    * Return - status
+    *           kBadParam - When any input pointer is NULL
+    *           kSMVersionUnsupported - When pModel is not 2.0 model
+    *
+    */
+DllFunc listen_status_enum CDECLARE getStrippedUserKeywordModelSize(
+        listen_model_type           *pModel,
+        uint32_t                    *nStrippedModelSize);
+
+
+    /*
+    * stripUserKeywordModel
+    *
+    * Return stripped model
+    *
+    * Param[in] pModel - pointer to (user)keyword model data
+    * Param[out] pStrippedModel - pointer to stripped model data
+    *
+    * Return - status
+    *           kBadParam - When any input pointer is NULL
+    *           kSMVersionUnsupported - When pModel is not 2.0 model
+    *
+    */
+DllFunc listen_status_enum CDECLARE stripUserKeywordModel(
+        listen_model_type           *pModel,
+        listen_model_type           *pStrippedModel);
+
+    /*
+    * getUserKeywordModelSize
+    *
+    * Get the size required to hold user-keyword model that extends given keyword model
+    * with give user data
+    *
+    * Param [in]  pKeywordModel - pointer to keyword model data
+    * Param [in]  keywordId - null terminated string containing keyword phrase string
+    * Param [in]  userId - null terminated string containing user name string
+    * Param [out] nUserKeywordModelSize - size of user keyword model
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    *       kKeywordNotFound - When keywordId not exist in the model
+    *       kSMVersionUnsupported - When pKeywordModel is not 2.0/3.0 model
+    */
+DllFunc listen_status_enum CDECLARE getUserKeywordModelSize(
+        listen_model_type           *pKeywordModel,
+        keywordId_t                 keywordId, // add for SVA 2.0
+        userId_t                    userId, // add for SVA 2.0
+        uint32_t                    *nUserKeywordModelSize);
+
+    /*
+    * createUserKeywordModel
+    *
+    * Create a user keyword model
+    * Writes the user keyword model into given memory location
+    *
+    * Param [in]  pKeywordModel - pointer to Keyword model  or User keyword model data
+                                if it is keyword model, create user-keyword model
+                                if it is user keyword model, incrementally train user keyword model
+    * Param [in]  keywordId - user data is to be appended for keyword in model with given identifier
+    * Param [in]  userId - identifier of user data is created
+    *            If identifier is already used, will replace existing user data with newly created data.
+    *            The User Name is passed to this function so that if this is the first time user data is
+    *            being added for a new user, the User's Name can be stored in the SM
+    * Param [in]  pEpdParameter - end point detection parameter
+    *                             if eEpdParameter is NULL, default parameter will be used
+    * Param [in]  numUserRecording - number of user recordings
+    * Param [in]  pUserRecordings - multiple recording of user speaking keyword
+    * Param [out] pUserKeywordModel - pointer to where user keyword model data is to be written
+    * Param [out] pUserMatchingScore - pointer to user matching score
+    * Return - status
+    *       kBadParam - When any input pointer (except pEpdParameter) is NULL
+    *       kKeywordNotFound - When keywordId not exist in the model
+    *       kSMVersionUnsupported - When pKeywordModel is not 2.0 or 3.0 model
+    *        kLowSnr    - When user recording is too noisy
+    *        kNoSignal - When user recording is non-speech
+    *       kCannotCreateUserUDK - When pKeywordModel is UDK model
+    */
+DllFunc listen_status_enum CDECLARE createUserKeywordModel(
+        listen_model_type           *pKeywordModel,
+        keywordId_t                 keywordId, // add for SVA 2.0
+        userId_t                    userId, // add for SVA 2.0
+        listen_epd_params           *pEpdParameter,
+        uint32_t                    numUserRecording,
+        listen_user_recording       *pUserRecordings[],
+        listen_model_type           *pUserKeywordModel,
+        int16_t                     *pUserMatchingScore);
+
+// Since size of new SM after removing data will be less than or equal to size of
+// input SM, this function could be optional and size of pInputModel could be used
+// to allocate memory for pResultModel when deleteFromModel() called.
+    /*
+    * getSizeAfterDeleting
+    *
+    * Return the size of sound model after removing data from a given SM for either
+    * a keyword, a user, or a specific user+keyword pair.
+    *
+    * Param [in]  pInputModel - pointer to sound model
+    * Param [in]  keywordId - data for this keyword in model with given identifier is removed
+    *           If userId is 'null', then all keyword-only data and all user data associated
+    *           with the given non-null keywordId is removed.
+    *           If userId is also non-null, then only data associated with the userId+keywordId
+    *           pair is removed.
+    * Param [in]  userId - all data for this user in model with given identifier is removed
+    *           If keywordId is 'null', then all all user data for the given non-null userId
+    *           is removed.
+    *           If keywordId is also non-null, then only data associated with the userId+keywordId
+    *           pair is removed.
+    * Param [out]  nOutputModelSize - outputs size of resulting soundmodel after removing data.
+    * Return - status
+    *       kBadParam - When any input pointer (except keywordId, userId) is NULL
+    *       kLastKeyword - When pInputModel has only one keyword
+    *       kSMVersionUnsupported - When pInputModel is not 2.0 model
+    *       kKeywordNotFound - When keywordId not exist in the model
+    *       kUserNotFound - When userId not exist in the model
+    *       kUserKWPairNotActive - When <keywordId, userId> pair not exist in the model
+    *       kUserUDKPairNotRemoved - When <keywordId, userId> pair to delete is UDK
+    */
+DllFunc listen_status_enum CDECLARE getSizeAfterDeleting(
+        listen_model_type           *pInputModel,
+        keywordId_t                 keywordId, // add for SVA 2.0
+        userId_t                    userId, // add for SVA 2.0
+        uint32_t                    *nOutputModelSize);
+
+// If getSizeAfterDeleting() supported, call it get size of new sound model after
+// removing desired data from given input sound model, and
+// allocate ResultModel with this size
+// Otherwise, use size of input SoundModel since size of ResultModel will be
+// less than or equal to size of input SoundModel.
+    /*
+    * deleteFromModel
+    *
+    * Return a new sound model after removing data from a given SM for a keyword, a user,
+    * or a user+keyword pair.
+    *
+    * Param [in]  pInputModel - pointer to sound model
+    * Param [in]  keywordId - data for this keyword in model with given identifier is removed
+    *           If userId is 'null', then all keyword-only data and all user data associated
+    *           with the given non-null keywordId is removed.
+    *           If userId is also non-null, then only data associated with the userId+keywordId
+    *           pair is removed.
+    * Param [in]  userId - all data for this user in model with given identifier is removed
+    *           If keywordId is 'null', then all all user data for the given non-null userId
+    *           is removed.
+    *           If keywordId is also non-null, then only data associated with the userId+keywordId
+    *           pair is removed.
+    * Param [out]  pResultModel - pointer to where user keyword model data is to be written
+    * Return - status
+    *       kBadParam - When any input pointer (except keywordId, userId) is NULL
+    *       kLastKeyword - When pInputModel has only one keyword
+    *       kSMVersionUnsupported - When pInputModel is not 2.0 or 3.0 model
+    *       kKeywordNotFound - When keywordId not exist in the model
+    *       kUserNotFound - When userId not exist in the model
+    *       kUserKWPairNotActive - When <keywordId, userId> pair not exist in the model
+    *       kUserUDKPairNotRemoved - When <keywordId, userId> pair to delete is UDK
+    */
+DllFunc listen_status_enum CDECLARE deleteFromModel(
+        listen_model_type           *pInputModel,
+        keywordId_t                 keywordId, // add for SVA 2.0
+        userId_t                    userId, // add for SVA 2.0
+        listen_model_type           *pResultModel);
+
+
+    /*
+    * getMergedModelSize
+    *
+    * Return the size of sound model after merging required models
+    *
+    * Param [in]  numModels - number of model files to be merged
+    * Param [in]  pModels - array of pointers to Keyword or User keyword model data
+    * Param [out]  nOutputModelSize - outputs size of resulting soundmodel after merging models
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    *       kSMVersionUnsupported - When pInputModel is not 2.0 model
+    *       kDuplicateKeyword - When same keywordId exists in more than 1 model
+    *       kDuplicateUserKeywordPair
+    *       kMaxKeywordsExceeded
+    *       kMaxUsersExceeded,
+    */
+DllFunc listen_status_enum CDECLARE getMergedModelSize(
+        uint16_t                    numModels,
+        listen_model_type           *pModels[],
+        uint32_t                    *nOutputModelSize);
+
+
+
+    /*
+    * mergeModels
+    *
+    * merges two or more Sound Models
+    *
+    * Writes the new merged model into given memory location
+    *
+    * Param [in]  numModels - number of model files to be merged
+    * Param [in]  pModels - array of pointers to Keyword or User keyword model data
+    * Param [out]  pMergedModel - pointer to where merged model data is to be written
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    *       kSMVersionUnsupported - When pInputModel is not 2.0 model
+    *       kDuplicateKeyword - When same keywordId exists in more than 1 model
+    *       kDuplicateUserKeywordPair - N/A to current version
+    *       kMaxKeywordsExceeded - N/A to current version
+    *       kMaxUsersExceeded - N/A to current version
+    */
+DllFunc listen_status_enum CDECLARE mergeModels(
+        uint16_t                    numModels,
+        listen_model_type       *pModels[],
+        listen_model_type       *pMergedModel);
+
+
+
+/* ParseFromBigSoundModel
+*
+* Parse the big 3.0 sound model to individual sub models
+*
+* Param [in]   *pSM3p0Model – The pointer to the big 3.0 sound model
+* Param [out]  p1stStageModel - pointer to parsed 1stStageModel
+* Param [out]  p2ndStageKWModel - pointer to parsed 2nd stage KW Model
+* Param [out]  p2stStageVoPModel - pointer to parsed 2nd stage VoP Model
+* Param [out]  indicator – returned indicator, indicating what types of models parsed/returned
+* Return - status
+*       kBadParam - When any input pointer is NULL
+*       kSMVersionUnsupported - When pInputModel is not 3.0 model
+*       kDuplicateKeyword - When same keywordId exists in more than 1 model
+*       kWrongModel - when input is broken
+*/
+
+DllFunc listen_status_enum CDECLARE parseFromBigSoundModel(
+        listen_model_type       *pSM3p0Model,
+        listen_model_type       *p1stStageModel,
+        listen_model_type       *p2ndStageKWModel,
+        listen_model_type       *p2stStageVoPModel,
+        uint16_t                *indicator );
+
+
+
+
+    /*
+    * parseDetectionEventData
+    *
+    * parse event payload into detection event.
+    *
+    * Version of input SM will detemine DetectionType created/returned
+    *
+    * Param [in]  pUserKeywordModel - pointer to keyword or user keyword model data
+    * Param [in]  pEventPayload - pointer to received event payload data
+    * Param [out] pDetectEvent - pointer to where detection event data is to be written
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    *       kSMVersionUnsupported - When pUserKeywordModel is not 2.0 model
+    *       kEventStructUnsupported - When pEventPayload->size != numKeywords + numActiveUsers
+    */
+
+DllFunc listen_status_enum CDECLARE parseDetectionEventData(
+        listen_model_type           *pUserKeywordModel,
+        listen_event_payload        *pEventPayload,
+        listen_detection_event_type *pDetectionEvent);
+
+
+// Declared in both SVA 1.0 and SVA 2.0 versions and SML 3.0 of ListenSoundModelMLib
+//
+    /*
+    * querySoundModel
+    *
+    * Returns the information about a sound model
+    * Sound model could be of any type: Keyword, UserKeyword, TargetSound,...
+    * Sound model could be any versions
+    *
+    * Param [in] pSoundModel - pointer to model data
+    * Param [out] pListenSoundModelInfo - returns information about the give sound model
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    *       kFailed - When input model failed to be decoded
+    *        kSMVersionUnsupported - When pSoundModel is fake model (invalid model other than 1.0 model, 2.0 model and 3.0 model)
+    */
+DllFunc listen_status_enum CDECLARE querySoundModel(
+        listen_model_type           *pSoundModel,
+        listen_sound_model_info     *pListenSoundModelInfo);
+
+
+    /*
+    * getSoundModelHeader
+    *
+    * Returns additional information about the sound model
+    * Sound model could be of any type: Keyword, UserKeyword, TargetSound,...
+    * Keyword
+    *
+    * Param [in] pSoundModel - pointer to model data
+    * Param [out] pListenSoundModelHeader - returns header field from sound model
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    *       kSMVersionUnsupported - When pSoundModel is not 2.0 or 3.0 model
+    */
+
+DllFunc listen_status_enum CDECLARE getSoundModelHeader(
+        listen_model_type           *pSoundModel,
+        listen_sound_model_header   *pListenSoundModelHeader);
+
+
+    /*
+    * release sound model header
+    *
+    * deallocate sound model header
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    */
+DllFunc listen_status_enum CDECLARE releaseSoundModelHeader(
+        listen_sound_model_header   *pListenSoundModelHeader);
+
+
+    /*
+    * getKeywordPhrases
+    *
+    * Get keyword phrase string for all Keywords defined in given SM 2.0 / 3.0
+    *
+    * App calling this function must allocate memory for all phrases
+    * by getting the number of keywords from querySoundModel() and allocating
+    * totalNumKeywords*MAX_STRING_LEN
+    * This function copies phrases into this allocated keywords array
+    *
+    * Param [in]  pSoundModel - pointer to model data
+    * Param [in/out] numKeywords - [in]  number of string entries allocated in keywords array
+    *                             [out] number of keyword phrase strings copied keyword array
+    * Param [out] keywords - array of keyword phrase null-terminated strings
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL, or numKeywords < real keywords number
+    *       kSMVersionUnsupported - When pSoundModel is not 2.0 or 3.0 model
+    */
+DllFunc listen_status_enum CDECLARE getKeywordPhrases(
+        listen_model_type           *pSoundModel,
+        uint16_t                    *numKeywords,
+        keywordId_t                 *keywords);
+
+
+    /*
+    * getUserNames
+    *
+    * Get user names for user data associated with a given SM 2.0 / 3.0
+    *
+    * App calling this function must allocate memory for all names
+    * by getting the number of users  from querySoundModel() and allocating
+    * totalNumUsers*MAX_STRING_LEN
+    * This function copies names into this allocated keywords array
+    *
+    * Param [in]  pSoundModel - pointer to model data
+    * Param [in/out] numUsers - [in]  number of string entries allocated in users array
+    *                          [out] number of user name strings copied users array
+    * Param [out] users - array of user name null-terminated strings
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL, or numUsers < real users number, or pSoundModel is keyword-only model
+    *       kSMVersionUnsupported - When pSoundModel is not 2.0 or 3.0 model
+    */
+DllFunc listen_status_enum CDECLARE getUserNames(
+        listen_model_type           *pSoundModel,
+        uint16_t                        *numUsers,
+        userId_t                        *users);
+
+    /*
+    * loadConfParams
+    *
+    * Load configurable parameters to the sound model library
+    *
+    * Param [in] pConfData - pointer to param data
+    * Param [in] confDataSize - size of memory allocated for param data
+    *
+    * Return - status
+    *       kBadParam - When any input pointer is NULL
+    */
+DllFunc listen_status_enum CDECLARE loadConfParams(
+        uint8_t                     *pConfData,
+        uint32_t                    confDataSize);
+    /*
+    * getBinaryModelSize
+    *
+    * Return binary model size
+    *
+    * Param[in] pListenModel - pointer to (user)keyword model data
+    * Param[out] nBinaryModelSize - return model size of binary model
+    *
+    * Return - status
+    *           kBadParam - When any input pointer is NULL
+    *           kSMVersionUnsupported - When pModel is not 2.0 or 3.0 model
+    *
+    */
+
+DllFunc listen_status_enum CDECLARE getBinaryModelSize(
+        listen_model_type           *pListenModel,
+        uint32_t                    *nBinaryModelSize);
+
+    /*
+    * getSortedKeywordStatesUserKeywordModelSize
+    *
+    * Return sorted model size
+    *
+    * Param[in] pModel - pointer to (user)keyword model data
+    * Param[out] nSortedModelSize - return model size of sorted keyword states model
+    *
+    * Return - status
+    *           kBadParam - When any input pointer is NULL
+    *
+    */
+
+DllFunc listen_status_enum CDECLARE getSortedKeywordStatesUserKeywordModelSize(
+    listen_model_type           *pModel,
+    uint32_t                    *nSortedModelSize);
+
+    /*
+    * sortKeywordStatesOfUserKeywordModel
+    *
+    * Return sorted model
+    *
+    * Param[in] pInputModel - pointer to (user)keyword model data
+    * Param[out] pSortedModel - pointer to sorted keyword states model data
+    *
+    * Return - status
+    *           kBadParam - When any input pointer is NULL
+    *           kSMVersionUnsupported - when pModel is not 2.0 model
+    *
+    */
+
+DllFunc listen_status_enum CDECLARE sortKeywordStatesOfUserKeywordModel(
+        listen_model_type           *pInputModel,
+        listen_model_type           *pSortedModel);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* __LISTEN_SOUND_MODEL_LIB_V3_H__ */
+