[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/multimedia/audio-tuning/audio-xml-parser/mt2635/AudioParamParser.h b/src/multimedia/audio-tuning/audio-xml-parser/mt2635/AudioParamParser.h
new file mode 100644
index 0000000..9449a1d
--- /dev/null
+++ b/src/multimedia/audio-tuning/audio-xml-parser/mt2635/AudioParamParser.h
@@ -0,0 +1,562 @@
+#ifndef AUDIO_PARAM_PARSER_H
+#define AUDIO_PARAM_PARSER_H
+
+#include <libxml/parser.h>
+#include <libxml/xmlreader.h>
+#include <libxml/tree.h>
+
+#ifdef WIN32
+#pragma warning( disable : 4996 )
+#ifdef __cplusplus
+#define EXPORT extern "C" __declspec(dllexport)
+#else
+#define EXPORT __declspec(dllexport)
+#endif
+#else /* WIN32*/
+#define EXPORT
+#ifdef __cplusplus
+extern "C" {
+#endif
+#endif
+
+#include "utstring.h"
+#include "uthash.h"
+#include "utlist.h"
+
+#ifndef WIN32
+#include <pthread.h>
+#endif
+
+/* Enable cus xml support */
+//#define APP_FORCE_ENABLE_CUS_XML
+
+/* Debugging Macro Definition */
+//#define FORCE_DEBUG_LEVEL
+
+#define XML_FOLDER_ON_TUNING_TOOL ".\\preload_xml\\"
+#define XML_CUS_FOLDER_ON_TUNING_TOOL ".\\cus_xml\\"
+#define XML_FOLDER_ON_DEVICE "/system/etc/audio_param/"
+#define XML_CUS_FOLDER_ON_DEVICE "/home/root/.audio_param/"
+
+#define MAX_AUDIO_TYPE_LEN 50
+#define INOTIFY_BUF_SIZE 512
+
+#define AUDIO_PARAM_XML_POSFIX "_AudioParam.xml"
+#define PARAM_UNIT_DESC_XML_POSFIX "_ParamUnitDesc.xml"
+#define PARAM_TREE_VIEW_XML_POSFIX "_ParamTreeView.xml"
+#define FEATURE_OPTIONS_XML "AudioParamOptions.xml"
+
+/* XML element definition */
+#define ELEM_AUDIO_FEATURE_OPTIONS "AudioParamOptions"
+#define ELEM_PARAM "Param"
+#define ELEM_PARAM_UNIT_DESC "ParamUnitDesc"
+#define ELEM_CATEGORY_TYPE_LIST "CategoryTypeList"
+#define ELEM_CATEGORY_TYPE "CategoryType"
+#define ELEM_CATEGORY_GROUP "CategoryGroup"
+#define ELEM_CATEGORY "Category"
+
+#define ELEM_AUDIO_PARAM "AudioParam"
+#define ELEM_PARAM_TREE "ParamTree"
+#define ELEM_PARAM_UNIT_POOL "ParamUnitPool"
+#define ELEM_PARAM_UNIT "ParamUnit"
+#define ELEM_PARAM "Param"
+#define ELEM_FIELD "Field"
+
+#define ELEM_PARAM_TREE_VIEW "ParamTreeView"
+#define ELEM_TREE_ROOT "TreeRoot"
+#define ELEM_SHEET "Sheet"
+#define ELEM_FEATURE "Feature"
+#define ELEM_FIELD_LIST "FieldList"
+#define ELEM_CATEGORY_PATH_LIST "CategoryPathList"
+
+/* XML attribute definition */
+#define ATTRI_NAME "name"
+#define ATTRI_TAB_NAME "tab_name"
+#define ATTRI_VERSION "version"
+#define ATTRI_WORDING "wording"
+#define ATTRI_PARAM_ID "param_id"
+#define ATTRI_PATH "path"
+#define ATTRI_VALUE "value"
+#define ATTRI_TYPE "type"
+#define ATTRI_ARRAY_INDEX "array_index"
+#define ATTRI_BIT "bit"
+#define ATTRI_CHECK_LIST "check_list"
+#define ATTRI_ALIAS "alias"
+#define ATTRI_FEATURE_OPTION "feature_option"
+#define ATTRI_SWITCH_AUDIO_TYPE "switch_audio_type"
+#define ATTRI_SWITCH_PARAM "switch_param"
+#define ATTRI_SWITCH_FIELD "switch_field"
+#define ATTRI_AUDIO_TYPE "audio_type"
+#define ATTRI_PARAM "param"
+#define ATTRI_VISIBLE "visible"
+
+/* DATA_TYPE string */
+#define DATA_TYPE_UNKNOWN_STRING "unknown"
+#define DATA_TYPE_STR_STRING "string"
+#define DATA_TYPE_INT_STRING "int"
+#define DATA_TYPE_UINT_STRING "uint"
+#define DATA_TYPE_FLOAT_STRING "float"
+#define DATA_TYPE_BYTE_ARRAY_STRING "byte_array"
+#define DATA_TYPE_UBYTE_ARRAY_STRING "ubyte_array"
+#define DATA_TYPE_SHORT_ARRAY_STRING "short_array"
+#define DATA_TYPE_USHORT_ARRAY_STRING "ushort_array"
+#define DATA_TYPE_INT_ARRAY_STRING "int_array"
+#define DATA_TYPE_UINT_ARRAY_STRING "uint_array"
+#define DATA_TYPE_DOUBLE_ARRAY_STRING "double_array"
+#define DATA_TYPE_FIELD_STRING "Field"
+
+#define ARRAY_SEPERATOR ","
+#define ARRAY_SEPERATOR_CH ','
+#define PARAM_FIELD_NAME_SEPERATOR "/"
+
+#define AUDIO_TYPE_FMT_STR(STR_LEN) AUDIO_TYPE_FMT(STR_LEN)
+#define AUDIO_TYPE_FMT(STR_LEN) "%"#STR_LEN"[^_]"
+
+typedef struct _AppHandle AppHandle;
+typedef struct _AudioType AudioType;
+typedef struct _FieldInfo FieldInfo;
+typedef struct _Category Category;
+typedef struct _CategoryAlias CategoryAlias;
+typedef struct _CategoryGroup CategoryGroup;
+typedef struct _CategoryNameAlias CategoryNameAlias;
+typedef struct _CategoryPath CategoryPath;
+typedef struct _CategoryType CategoryType;
+typedef struct _Feature Feature;
+typedef struct _FeatureField FeatureField;
+typedef struct _FeatureOption FeatureOption;
+typedef struct _Param Param;
+typedef struct _ParamInfo ParamInfo;
+typedef struct _ParamTreeView ParamTreeView;
+typedef struct _ParamUnit ParamUnit;
+typedef struct _TreeRoot TreeRoot;
+typedef struct _NotifyCb NotifyCb;
+
+typedef void(*NOTIFY_CB_FUN)(AppHandle *appHandle, const char *audioType);
+
+extern int appDebugLevel;
+
+typedef enum
+{
+DEBUG_LEVEL = 0,
+INFO_LEVEL,
+WARN_LEVEL,
+ERR_LEVEL,
+} MSG_LEVEL;
+
+typedef enum
+{
+ APP_ERROR = 0,
+ APP_NO_ERROR = 1,
+} APP_STATUS;
+
+typedef enum
+{
+ PARENT_IS_CATEGORY_GROUP = 0,
+ PARENT_IS_CATEGORY_TYPE = 1,
+} CATEGORY_PARENT_TYPE;
+
+/*
+ Due to the system/media/camera/include/system/camera_metadata.h declare the same TYPE_FLOAT enum name,
+ If module include the camera_metadata.h and AudioParamParser.h, AudioParamParser change the DATA_TYPE
+ enum decleration to avoid conflict.
+ User could using the APP_TYPE_FLOAT enum instead the TYPE_FLOAT.
+*/
+#ifndef SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
+typedef enum
+{
+ TYPE_UNKNOWN = -1,
+ TYPE_STR,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_FLOAT,
+ TYPE_BYTE_ARRAY,
+ TYPE_UBYTE_ARRAY,
+ TYPE_SHORT_ARRAY,
+ TYPE_USHORT_ARRAY,
+ TYPE_INT_ARRAY,
+ TYPE_UINT_ARRAY,
+ TYPE_DOUBLE_ARRAY,
+ TYPE_FIELD,
+} DATA_TYPE;
+#else
+typedef enum
+{
+ APP_TYPE_UNKNOWN = -1,
+ APP_TYPE_STR,
+ APP_TYPE_INT,
+ APP_TYPE_UINT,
+ APP_TYPE_FLOAT,
+ APP_TYPE_BYTE_ARRAY,
+ APP_TYPE_UBYTE_ARRAY,
+ APP_TYPE_SHORT_ARRAY,
+ APP_TYPE_USHORT_ARRAY,
+ APP_TYPE_INT_ARRAY,
+ APP_TYPE_UINT_ARRAY,
+ APP_TYPE_DOUBLE_ARRAY,
+ APP_TYPE_FIELD,
+} DATA_TYPE;
+#endif
+
+typedef union CategoryParent
+{
+ Category *category; /* Link to parent Category if it's not CategoryGroup */
+ CategoryType *categoryType; /* Link to parent CategoryType if it's CategoryGroup */
+} CategoryParent;
+
+/* UHash the parameter tree info from ParamTreeView.xml */
+struct _CategoryPath
+{
+ char *path;
+ Feature *feature;
+ UT_hash_handle hh;
+};
+
+struct _FeatureField
+{
+ FieldInfo *fieldInfo;
+ UT_hash_handle hh;
+};
+
+struct _Feature
+{
+ char *name;
+ char *featureOption;
+ FieldInfo *switchFieldInfo;
+ CategoryPath *categoryPathHash;
+ FeatureField *featureFieldHash;
+ AudioType *audioType;
+ UT_hash_handle hh;
+};
+
+struct _TreeRoot
+{
+ char *name; /* Key */
+ FieldInfo *switchFieldInfo;
+ xmlNode *treeRootNode; /* Used to traversal tree */
+ Feature *featureHash; /* Used to opt feature information */
+ ParamTreeView *paramTreeView; /* Belong to which paramTreeView */
+ UT_hash_handle hh;
+};
+
+struct _ParamTreeView
+{
+ int verMaj;
+ int verMin;
+ AudioType *audioType;
+ TreeRoot *treeRootHash;
+};
+
+/* Hash the Param & Field info from ParamUnitDesc.xml */
+struct _FieldInfo
+{
+ char *name; /* key */
+ size_t arrayIndex;
+ int startBit;
+ int endBit;
+ char *checkListStr; /* check list string array */
+ struct _ParamInfo *paramInfo; /* Link to parent ParamInfo */
+ UT_hash_handle hh; /* hash handle */
+};
+
+struct _ParamInfo
+{
+ char *name; /* key */
+ DATA_TYPE dataType;
+ struct _FieldInfo *fieldInfoHash;
+ AudioType *audioType; /* Link to parent AudioType */
+ UT_hash_handle hh; /* hash handle */
+};
+
+/* Hash the param name with value from AudioParam.xml */
+struct _Param
+{
+ char *name; /* key */
+ void *data; /* raw data */
+ size_t arraySize; /* Array size if the data is the array pointer */
+ ParamInfo *paramInfo;
+ struct _ParamUnit *paramUnit; /* Link to it's ParamUnit */
+ UT_hash_handle hh; /* hash handle */
+};
+
+/* Hash the id with ParamUnit from AudioParam.xml */
+struct _ParamUnit
+{
+ int paramId; /* key */
+ int refCount;
+ AudioType *audioType; /* Link to it's AudioType */
+ struct _Param *paramHash; /* ParamUnit's params */
+ UT_hash_handle hh;
+};
+
+/* Hash ParamTree info from AudioParam.xml */
+typedef struct
+{
+ char *categoryPath; /* key */
+ int paramId; /* Param id */
+ UT_hash_handle hh;
+} ParamTree;
+
+struct _Category
+{
+ char *wording; /* key */
+ char *name;
+ int visible;
+ CategoryParent parent;
+ CATEGORY_PARENT_TYPE parentType;
+ UT_hash_handle hh;
+};
+
+struct _CategoryAlias
+{
+ char *alias; /* key */
+ Category *category;
+ UT_hash_handle hh;
+};
+
+struct _CategoryGroup
+{
+ char *wording; /* key */
+ char *name;
+ int visible;
+ Category *categoryHash; /* Link to children */
+ CategoryType *categoryType; /* Link to parent */
+ UT_hash_handle hh;
+};
+
+struct _CategoryType
+{
+ char *wording; /* key */
+ char *name;
+ int visible;
+ CategoryGroup *categoryGroupHash; /* Link to children */
+ Category *categoryHash; /* Link to children */
+ CategoryAlias *categoryAliasHash; /* Save category alias information */
+ AudioType *audioType; /* Link to parent */
+ UT_hash_handle hh;
+};
+
+struct _AudioType
+{
+ char *name;
+ char *tabName;
+ int paramUnitDescVerMaj; /* ParamUniDesc version */
+ int paramUnitDescVerMin;
+ int audioParamVerMaj; /* AudioParam version */
+ int audioParamVerMin;
+ xmlDocPtr audioParamDoc;
+ xmlDocPtr paramUnitDescDoc;
+ xmlDocPtr paramTreeViewDoc;
+ ParamTree *paramTreeHash;
+ ParamUnit *paramUnitHash;
+ ParamInfo *paramInfoHash;
+ ParamTreeView *paramTreeView;
+ int unusedParamId;
+ int dirty; /* Indicate if the audio type modified without saveing*/
+ int allowReload; /* Indicate the audio type can be reload since xml updated */
+ CategoryType *categoryTypeHash;
+#ifndef WIN32
+ pthread_rwlock_t lock;
+ const char *lockCallerFun; /* Used to cache the lock holder */
+#endif
+ AppHandle *appHandle; /* Link to it's appHandle parent */
+ UT_hash_handle hh;
+};
+
+struct _FeatureOption
+{
+ char *name;
+ char *value;
+ UT_hash_handle hh;
+};
+
+struct _NotifyCb
+{
+ NOTIFY_CB_FUN cb;
+ char test[512];
+ struct _NotifyCb *next, *pre;
+};
+
+struct _AppHandle
+{
+ char *xmlDir;
+ char *xmlCusDir;
+ AudioType *audioTypeHash;
+ FeatureOption *featureOptionsHash;
+ xmlDocPtr featureOptionsDoc;
+#ifndef WIN32
+ pthread_t appThread;
+ int appThreadExit;
+ int inotifyFd;
+ pthread_rwlock_t lock;
+ const char *lockCallerFun; /* Used to cache the lock holder */
+#endif
+ NotifyCb *noficyCbList;
+};
+
+typedef struct AudioTypeVerInfo{
+ const char* audioTypeName;
+ int paramUnitDescVerMaj;
+ int paramUnitDescVerMin;
+ int audioParamVerMaj;
+ int audioParamVerMin;
+} AudioTypeVerInfo;
+
+static const AudioTypeVerInfo audioTypeSupportVerInfo [] =
+{
+ /* AudioType name, ParamUnitDescVer (maj, min), AudioParamVer (maj, min) */
+ {"AudioCommonSetting", 1, 0, 1, 0},
+ {"PlaybackACF", 1, 0, 1, 0},
+ {"Playback", 1, 0, 1, 0},
+ {"PlaybackDRC", 1, 0, 1, 0},
+ {"PlaybackHCF", 1, 0, 1, 0},
+ {"PlaybackVolAna", 1, 0, 1, 0},
+ {"PlaybackVolDigi", 1, 0, 1, 0},
+ {"PlaybackVolUI", 1, 0, 1, 0},
+ {"Record", 1, 0, 1, 0},
+ {"RecordDMNR", 1, 0, 1, 0},
+ {"RecordFIR", 1, 0, 1, 0},
+ {"RecordUI", 1, 0, 1, 0},
+ {"RecordVol", 1, 0, 1, 0},
+ {"RecordVolUI", 1, 0, 1, 0},
+ {"Speech", 1, 0, 1, 0},
+ {"SpeechDMNR", 1, 0, 1, 0},
+ {"SpeechGeneral", 1, 0, 1, 0},
+ {"SpeechMagiClarity", 1, 0, 1, 0},
+ {"SpeechUI", 1, 0, 1, 0},
+ {"SpeechVol", 1, 0, 1, 0},
+ {"SpeechVolUI", 1, 0, 1, 0},
+ {"VoIP", 1, 0, 1, 0},
+ {"VoIPDMNR", 1, 0, 1, 0},
+ {"VoIPGeneral", 1, 0, 1, 0},
+ {"VoIPUI", 1, 0, 1, 0},
+ {"VoIPVol", 1, 0, 1, 0},
+ {"VoIPVolUI", 1, 0, 1, 0},
+ {"Volume", 1, 0, 1, 0},
+ {"VolumeGainMap", 1, 0, 1, 0},
+ {NULL, 0, 0, 0, 0}
+};
+
+/***********************
+ * Public API
+ **********************/
+EXPORT void appSetDebugLevel(MSG_LEVEL level);
+EXPORT MSG_LEVEL appGetDebugLevel(void);
+
+/* appHandle API */
+EXPORT APP_STATUS appHandleInit(AppHandle *appHandle);
+EXPORT APP_STATUS appHandleUninit(AppHandle *appHandle);
+EXPORT void appHandleRedirectIOToConsole(void);
+EXPORT AppHandle *appHandleGetInstance(void); /* Never uninit global instance */
+EXPORT size_t appHandleGetNumOfAudioType(AppHandle *appHandle);
+EXPORT AudioType *appHandleGetAudioTypeByIndex(AppHandle *appHandle, size_t index);
+EXPORT AudioType *appHandleGetAudioTypeByName(AppHandle *appHandle, const char *name);
+EXPORT const char *appHandleGetFeatureOptionValue(AppHandle *appHandle, const char *featureOptionName);
+EXPORT int appHandleIsFeatureOptionEnabled(AppHandle *appHandle, const char *featureOptionName);
+EXPORT size_t appHandleGetNumOfFeatureOption(AppHandle *appHandle);
+EXPORT FeatureOption *appHandleGetFeatureOptionByIndex(AppHandle *appHandle, size_t index);
+EXPORT const char *appHandleGetBuildTimeStamp();
+EXPORT APP_STATUS appHandleCompressFiles(const char* srcDir, const char* destFile);
+EXPORT APP_STATUS appHandleUncompressFile(const char* srcFile, const char* destDir);
+
+/* Following 4 APIs will acquire app handle write lock automatically */
+EXPORT APP_STATUS appHandleParseXml(AppHandle *appHandle, const char *dir, const char *cusDir);
+EXPORT APP_STATUS appHandleReloadAudioType(AppHandle *appHandle, const char *audioTypeName);
+EXPORT void appHandleRegXmlChangedCb(AppHandle *appHandle, NOTIFY_CB_FUN nofiyCallback);
+EXPORT void appHandleUnregXmlChangedCb(AppHandle *appHandle, NOTIFY_CB_FUN nofiyCallback);
+
+/* AudioType API */
+EXPORT APP_STATUS audioTypeIsTuningToolSupportedXmlVer(AudioType *audioType);
+EXPORT APP_STATUS audioTypeIsDeviceSupportedXmlVer(AudioType *audioType);
+EXPORT size_t audioTypeGetNumOfCategoryType(AudioType *audioType);
+EXPORT CategoryType *audioTypeGetCategoryTypeByIndex(AudioType *audioType, size_t idnex);
+EXPORT CategoryType *audioTypeGetCategoryTypeByName(AudioType *audioType, const char *categoryTypeName);
+EXPORT CategoryType *audioTypeGetCategoryTypeByWording(AudioType *audioType, const char *categoryTypeWording);
+EXPORT xmlNode *audioTypeGetCategoryTypeListNode(AudioType *audioType);
+EXPORT ParamUnit *audioTypeGetParamUnit(AudioType *audioType, const char *categoryPath);
+EXPORT size_t audioTypeGetNumOfParamInfo(AudioType *audioType);
+EXPORT ParamInfo *audioTypeGetParamInfoByIndex(AudioType *audioType, size_t index);
+EXPORT ParamInfo *audioTypeGetParamInfoByName(AudioType *audioType, const char *paramName);
+EXPORT APP_STATUS audioTypeSaveAudioParamXml(AudioType *audioType, const char *saveDir, int clearDirtyBit);
+EXPORT int audioTypeReadLock(AudioType *audioType, const char *callerFun);
+EXPORT int audioTypeWriteLock(AudioType *audioType, const char *callerFun);
+EXPORT int audioTypeUnlock(AudioType *audioType);
+EXPORT TreeRoot *audioTypeGetTreeRoot(AudioType *audioType, const char *treeRootName);
+
+/* Following 3 write APIs will acquire write lock automatically */
+EXPORT APP_STATUS audioTypeSetParamData(AudioType *audioType, const char *categoryPath, ParamInfo *paramName, void *dataPtr, int arraySize);
+EXPORT APP_STATUS audioTypeSetFieldData(AudioType *audioType, const char *categoryPath, FieldInfo *fieldInfo, unsigned int val);
+EXPORT APP_STATUS audioTypeParamUnitCopy(AudioType *audioType, const char *srcCategoryPath, const char *dstCategoryPath);
+
+/* CategoryType API */
+EXPORT size_t categoryTypeGetNumOfCategoryGroup(CategoryType *categoryType);
+EXPORT CategoryGroup *categoryTypeGetCategoryGroupByIndex(CategoryType *categoryType, size_t index);
+EXPORT CategoryGroup *categoryTypeGetCategoryGroupByWording(CategoryType *categoryType, const char *wording);
+EXPORT size_t categoryTypeGetNumOfCategory(CategoryType *categoryType);
+EXPORT Category *categoryTypeGetCategoryByIndex(CategoryType *categoryType, size_t index);
+EXPORT Category *categoryTypeGetCategoryByWording(CategoryType *categoryType, const char *wording);
+
+/* CategoryGroup API */
+EXPORT size_t categoryGroupGetNumOfCategory(CategoryGroup *categoryGroup);
+EXPORT Category *categoryGroupGetCategoryByIndex(CategoryGroup *categoryGroup, size_t index);
+EXPORT Category *categoryGroupGetCategoryByWording(CategoryGroup *categoryGroup, const char *index);
+
+/* CategoryAlias API */
+EXPORT CategoryAlias *categoryAliasCreate(const char *alias, Category *category);
+EXPORT void categoryAliasRelease(CategoryAlias *categoryAlias);
+
+/* ParamInfo API */
+EXPORT size_t paramInfoGetNumOfFieldInfo(ParamInfo *paramInfo);
+EXPORT FieldInfo *paramInfoGetFieldInfoByIndex(ParamInfo *paramInfo, size_t index);
+EXPORT FieldInfo *paramInfoGetFieldInfoByName(ParamInfo *paramInfo, const char *fieldName);
+EXPORT char *paramNewDataStr(Param *param);
+
+/* ParamUnit API */
+EXPORT size_t paramUnitGetNumOfParam(ParamUnit *paramUnit);
+EXPORT Param *paramUnitGetParamByIndex(ParamUnit *paramUnit, size_t index);
+EXPORT Param *paramUnitGetParamByName(ParamUnit *paramUnit, const char *paramName);
+EXPORT ParamInfo *paramUnitGetParamInfo(ParamUnit *paramUnit, const char *paramInfoName);
+EXPORT FieldInfo *paramUnitGetFieldInfo(ParamUnit *paramUnit, const char *paramName, const char *fieldName);
+EXPORT APP_STATUS paramUnitGetFieldVal(ParamUnit *paramUnit, const char *paramName, const char *fieldName, unsigned int *val);
+
+/* Param API */
+EXPORT size_t paramGetArraySizeFromString(const char *str);
+EXPORT APP_STATUS paramGetFieldVal(Param *param, FieldInfo *fieldInfo, unsigned int *val);
+EXPORT APP_STATUS paramSetFieldVal(Param *param, FieldInfo *fieldInfo, unsigned int val);
+EXPORT DATA_TYPE paramDataTypeToEnum(const char *dataType);
+EXPORT const char *paramDataTypeToStr(DATA_TYPE dataType);
+
+/* Field API */
+EXPORT APP_STATUS fieldInfoGetCheckListValue(FieldInfo *fieldInfo, const char *checkName, unsigned int *checkVal);
+
+/* TreeRoot API */
+EXPORT Feature *treeRootGetFeatureByName(TreeRoot *treeRoot, const char *featureName);
+EXPORT int featureIsCategoryPathSupport(Feature *feature, const char *categoryPath);
+
+/* Xml Node related APIs */
+EXPORT xmlNode *findXmlNodeByElemName(xmlNode *node, const char *elemName);
+EXPORT xmlChar *xmlNodeGetProp(xmlNode *node, const char *prop);
+EXPORT xmlChar *xmlNodeGetWording(xmlNode *node);
+
+/* Utils APIs */
+EXPORT APP_STATUS utilConvDataStringToNative(DATA_TYPE dataType, const char *paramDataStr, void **paramData, size_t *arraySize);
+
+/* Unit test */
+EXPORT APP_STATUS unitTest(AppHandle *appHandle);
+EXPORT char *utilGetStdin(char *buf, int bufSize);
+
+/* Following APIs is designed for EM tool integration */
+EXPORT APP_STATUS utilNativeSetField(const char *audioTypeName, const char *categoryPath, const char *paramName, const char *fieldName, const char *fieldValueStr);
+EXPORT APP_STATUS utilNativeSetParam(const char *audioTypeName, const char *categoryPath, const char *paramName, const char *paramDataStr);
+EXPORT char *utilNativeGetCategory(const char *audioTypeName, const char *categoryTypeName);
+EXPORT char *utilNativeGetParam(const char *audioTypeName, const char *categoryPath, const char *paramName);
+EXPORT unsigned int utilNativeGetField(const char *audioTypeName, const char *categoryPath, const char *paramName, const char *fieldName);
+EXPORT APP_STATUS utilNativeSaveXml(const char *audioTypeName);
+EXPORT char *utilNativeGetChecklist(const char *audioTypeName, const char *paramName, const char *fieldName);
+
+#ifndef WIN32
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+#endif