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__ */
+