blob: eef274e0ccfba106cc6963f4d65937f283ecee07 [file] [log] [blame]
/* MediaTek Inc. (C) 2016. All rights reserved.
*
* Copyright Statement:
* This software/firmware and related documentation ("MediaTek Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
* the prior written permission of MediaTek inc. and/or its licensors, any
* reproduction, modification, use or disclosure of MediaTek Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*/
/*
* Description:
* Explor all public AudioParamParser APIs
*/
#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 <dlfcn.h>
#include <pthread.h>
#if defined(MTK_YOCTO_AUDIO)
#include <logger/utils/Log.h>
#else
#include <utils/Log.h>
#endif
#endif
/* Enable cus xml support */
#define APP_FORCE_ENABLE_CUS_XML
/* Debugging Macro Definition */
//#define FORCE_DEBUG_LEVEL
static const char *XML_FOLDER_LIST_ON_TUNING_TOOL[] = {
".\\preload_xml\\",
NULL
};
#define XML_CUS_FOLDER_ON_TUNING_TOOL ".\\cus_xml\\"
static const char *XML_FOLDER_LIST_ON_DEVICE[] = {
"/odm/etc/audio_param/",
"/vendor/etc/audio_param/",
"/system/etc/audio_param/",
NULL
};
/* For AudioParamParser on EM, No valid audio type list */
static const char *EM_AUDIO_TYPE_LOADING_LIST[] = {
NULL
};
static const char *ATCMDHANDLER_AUDIO_TYPE_LOADING_LIST[] = {
"PlaybackACF",
"PlaybackDRC",
"PlaybackHCF",
"PlaybackVolDigi",
"SpeechVol",
"VoIPVol",
"Volume",
"VolumeGainMap",
NULL
};
#if defined(SYS_IMPL)
#define APP_LIB_NAME "libaudio_param_parser-sys.so"
#else
#if defined(MTK_YOCTO_AUDIO)
#define APP_LIB_NAME "libaudioparamparser.so.1.0.0"
#else
#define APP_LIB_NAME "libaudio_param_parser-vnd.so"
#endif
#endif
#ifndef XML_CUS_FOLDER_ON_DEVICE
#if defined(MTK_YOCTO_AUDIO)
#define XML_CUS_FOLDER_ON_DEVICE "/home/root/.audio_param/"
#else
#define XML_CUS_FOLDER_ON_DEVICE "/data/vendor/audiohal/audio_param/"
#endif
#endif
#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"
#define ATTRI_PATH_DESC "path_desc"
/* 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"[^_]"
#define APP_GET_FIELD_KEY "APP_GET_FIELD"
#define APP_GET_FO_KEY "APP_GET_FO"
#define APP_GET_PARAM_KEY "APP_GET_PARAM"
#define APP_GET_CATEGORY_KEY "APP_GET_CATEGORY"
#define APP_SET_PARAM_KEY "APP_SET_PARAM"
#define APP_SET_FIELD_KEY "APP_SET_FIELD"
#define APP_SAVE_XML_KEY "APP_SAVE_XML"
#define APP_GET_CHECKLIST_KEY "APP_GET_CHECKLIST"
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);
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; /* Used to handle CategoryType->categoryHash */
UT_hash_handle hh2; /* Used to handle CategoryType->allCategoryHash */
};
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 (not include these category under CategoryGroup) */
Category *allCategoryHash; /* Link to children (include these category under CategoryGroup) */
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;
struct _NotifyCb *next, *pre;
};
struct _AppHandle {
const char **xmlDir;
char *xmlCusDir;
AudioType *audioTypeHash;
FeatureOption *featureOptionsHash;
xmlDocPtr featureOptionsDoc;
int xmlCusDirReady;
int xmlChangedNotifyEnabled; /* Used to identify notify enabled */
#ifndef WIN32
pthread_t appThread;
int appThreadExit; /* Used to identify thread exit */
int inotifyFd;
pthread_rwlock_t lock;
pthread_rwlock_t notifyLock;
const char *lockCallerFun; /* Used to cache the lock holder */
#endif
NotifyCb *noficyCbList;
int saveXmlWithHexMode;
int normalizeXmlContent; /* Breakdown all parameter tree element & add category path */
};
typedef struct AudioTypeVerInfo {
const char *audioTypeName;
int paramUnitDescVerMaj;
int paramUnitDescVerMin;
int audioParamVerMaj;
int audioParamVerMin;
} AudioTypeVerInfo;
/*
AudioParamParser will built-in ParamUnitDesc/AudioParam's maj number checking,
The ParamUnitDesc/AudioParam's min number is checking by client.
*/
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},
{"SpeechDeReverb", 1, 0, 1, 0},
{NULL, 0, 0, 0, 0}
};
typedef struct AppOps {
void *handle;
AppHandle *(*appHandleGetInstance)(void);
int (*appSetAudioTypeLoadingList)(const char *audioTypeLoadingList[]);
const char *(*appGetAudioTypeLoadingList)(void);
void (*appSetDebugLevel)(MSG_LEVEL level);
MSG_LEVEL (*appGetDebugLevel)(void);
APP_STATUS (*appHandleInit)(AppHandle *appHandle);
APP_STATUS (*appHandleUninit)(AppHandle *appHandle);
void (*appHandleRedirectIOToConsole)(void);
size_t (*appHandleGetNumOfAudioType)(AppHandle *appHandle);
AudioType *(*appHandleGetAudioTypeByIndex)(AppHandle *appHandle, size_t index);
AudioType *(*appHandleGetAudioTypeByName)(AppHandle *appHandle, const char *name);
const char *(*appHandleGetFeatureOptionValue)(AppHandle *appHandle, const char *featureOptionName);
int (*appHandleIsFeatureOptionEnabled)(AppHandle *appHandle, const char *featureOptionName);
size_t (*appHandleGetNumOfFeatureOption)(AppHandle *appHandle);
FeatureOption *(*appHandleGetFeatureOptionByIndex)(AppHandle *appHandle, size_t index);
const char *(*appHandleGetBuildTimeStamp)(void);
APP_STATUS (*appHandleCompressFiles)(const char *srcDir, const char *destFile);
APP_STATUS (*appHandleUncompressFile)(const char *srcFile, const char *destDir);
/* Following 2 APIs will acquire app handle write lock automatically */
APP_STATUS (*appHandleParseXml)(AppHandle *appHandle, const char *dir[], const char *cusDir);
APP_STATUS (*appHandleReloadAudioType)(AppHandle *appHandle, const char *audioTypeName);
/* AudioType API */
APP_STATUS (*audioTypeIsTuningToolSupportedXmlVer)(AudioType *audioType);
APP_STATUS (*audioTypeIsDeviceSupportedXmlVer)(AudioType *audioType);
size_t (*audioTypeGetNumOfCategoryType)(AudioType *audioType);
CategoryType *(*audioTypeGetCategoryTypeByIndex)(AudioType *audioType, size_t idnex);
CategoryType *(*audioTypeGetCategoryTypeByName)(AudioType *audioType, const char *categoryTypeName);
CategoryType *(*audioTypeGetCategoryTypeByWording)(AudioType *audioType, const char *categoryTypeWording);
xmlNode *(*audioTypeGetCategoryTypeListNode)(AudioType *audioType);
xmlNode *(*audioTypeGetParamUnitNode)(AudioType *audioType);
ParamUnit *(*audioTypeGetParamUnit)(AudioType *audioType, const char *categoryPath);
size_t (*audioTypeGetNumOfParamInfo)(AudioType *audioType);
ParamInfo *(*audioTypeGetParamInfoByIndex)(AudioType *audioType, size_t index);
ParamInfo *(*audioTypeGetParamInfoByName)(AudioType *audioType, const char *paramName);
APP_STATUS (*audioTypeSaveAudioParamXml)(AudioType *audioType, const char *saveDir, int clearDirtyBit);
int (*audioTypeReadLock)(AudioType *audioType, const char *callerFun);
int (*audioTypeWriteLock)(AudioType *audioType, const char *callerFun);
int (*audioTypeUnlock)(AudioType *audioType);
TreeRoot *(*audioTypeGetTreeRoot)(AudioType *audioType, const char *treeRootName);
/* Following 3 write APIs will acquire write lock automatically */
APP_STATUS (*audioTypeSetParamData)(AudioType *audioType, const char *categoryPath, ParamInfo *paramName, void *dataPtr, int arraySize);
APP_STATUS (*audioTypeSetFieldData)(AudioType *audioType, const char *categoryPath, FieldInfo *fieldInfo, unsigned int val);
APP_STATUS (*audioTypeParamUnitCopy)(AudioType *audioType, const char *srcCategoryPath, const char *dstCategoryPath);
/* CategoryType API */
size_t (*categoryTypeGetNumOfCategoryGroup)(CategoryType *categoryType);
CategoryGroup *(*categoryTypeGetCategoryGroupByIndex)(CategoryType *categoryType, size_t index);
CategoryGroup *(*categoryTypeGetCategoryGroupByWording)(CategoryType *categoryType, const char *wording);
size_t (*categoryTypeGetNumOfCategory)(CategoryType *categoryType);
Category *(*categoryTypeGetCategoryByIndex)(CategoryType *categoryType, size_t index);
Category *(*categoryTypeGetCategoryByWording)(CategoryType *categoryType, const char *wording);
Category *(*categoryTypeGetCategoryByName)(CategoryType *categoryType, const char *name);
/* CategoryGroup API */
size_t (*categoryGroupGetNumOfCategory)(CategoryGroup *categoryGroup);
Category *(*categoryGroupGetCategoryByIndex)(CategoryGroup *categoryGroup, size_t index);
Category *(*categoryGroupGetCategoryByWording)(CategoryGroup *categoryGroup, const char *index);
/* CategoryAlias API */
CategoryAlias *(*categoryAliasCreate)(const char *alias, Category *category);
void (*categoryAliasRelease)(CategoryAlias *categoryAlias);
/* ParamInfo API */
size_t (*paramInfoGetNumOfFieldInfo)(ParamInfo *paramInfo);
FieldInfo *(*paramInfoGetFieldInfoByIndex)(ParamInfo *paramInfo, size_t index);
FieldInfo *(*paramInfoGetFieldInfoByName)(ParamInfo *paramInfo, const char *fieldName);
char *(*paramNewDataStr)(Param *param);
char *(*paramNewDataStrWithMode)(Param *param, int uArrayHexMode);
/* ParamUnit API */
size_t (*paramUnitGetNumOfParam)(ParamUnit *paramUnit);
Param *(*paramUnitGetParamByIndex)(ParamUnit *paramUnit, size_t index);
Param *(*paramUnitGetParamByName)(ParamUnit *paramUnit, const char *paramName);
ParamInfo *(*paramUnitGetParamInfo)(ParamUnit *paramUnit, const char *paramInfoName);
FieldInfo *(*paramUnitGetFieldInfo)(ParamUnit *paramUnit, const char *paramName, const char *fieldName);
APP_STATUS (*paramUnitGetFieldVal)(ParamUnit *paramUnit, const char *paramName, const char *fieldName, unsigned int *val);
/* Param API */
size_t (*paramGetArraySizeFromString)(const char *str);
size_t (*paramGetNumOfBytes)(Param *param);
APP_STATUS (*paramGetFieldVal)(Param *param, FieldInfo *fieldInfo, unsigned int *val);
APP_STATUS (*paramSetFieldVal)(Param *param, FieldInfo *fieldInfo, unsigned int val);
DATA_TYPE (*paramDataTypeToEnum)(const char *dataType);
const char *(*paramDataTypeToStr)(DATA_TYPE dataType);
/* Field API */
APP_STATUS (*fieldInfoGetCheckListValue)(FieldInfo *fieldInfo, const char *checkName, unsigned int *checkVal);
/* TreeRoot API */
Feature *(*treeRootGetFeatureByName)(TreeRoot *treeRoot, const char *featureName);
int (*featureIsCategoryPathSupport)(Feature *feature, const char *categoryPath);
/* Xml Node related APIs */
xmlNode *(*findXmlNodeByElemName)(xmlNode *node, const char *elemName);
xmlChar *(*xmlNodeGetProp)(xmlNode *node, const char *prop);
xmlChar *(*xmlNodeGetWording)(xmlNode *node);
/* Control cust XML enabl API */
void (*appHandleCustXmlEnableChanged)(AppHandle* appHandle, int enable);
/* XML changed callback APIs */
void (*appHandleRegXmlChangedCb)(AppHandle *appHandle, NOTIFY_CB_FUN nofiyCallback);
void (*appHandleUnregXmlChangedCb)(AppHandle *appHandle, NOTIFY_CB_FUN nofiyCallback);
/* Utils APIs */
APP_STATUS (*utilConvDataStringToNative)(DATA_TYPE dataType, const char *paramDataStr, void **paramData, size_t *arraySize);
/* Unit test */
APP_STATUS (*unitTest)(AppHandle *appHandle);
char *(*utilGetStdin)(char *buf, int bufSize);
/* Following APIs is designed for EM tool integration */
APP_STATUS (*utilNativeSetField)(const char *audioTypeName, const char *categoryPath, const char *paramName, const char *fieldName, const char *fieldValueStr);
APP_STATUS (*utilNativeSetParam)(const char *audioTypeName, const char *categoryPath, const char *paramName, const char *paramDataStr);
char *(*utilNativeGetCategory)(const char *audioTypeName, const char *categoryTypeName);
char *(*utilNativeGetParam)(const char *audioTypeName, const char *categoryPath, const char *paramName);
unsigned int (*utilNativeGetField)(const char *audioTypeName, const char *categoryPath, const char *paramName, const char *fieldName);
APP_STATUS (*utilNativeSaveXml)(const char *audioTypeName);
const char *(*utilNativeGetChecklist)(const char *audioTypeName, const char *paramName, const char *fieldName);
} AppOps;
extern const char **appAudioTypeLoadingList;
extern int appDebugLevel;
static AppOps appOps;
static short appOpsInited = 0;
#ifndef WIN32
EXPORT static AppOps *appOpsGetInstance(void) {
const char *error;
const char *funName = NULL;
if (appOpsInited == 0) {
ALOGD("%s(), init AppOps struct, lib is %s", __FUNCTION__, APP_LIB_NAME);
/* dlopen */
appOps.handle = dlopen(APP_LIB_NAME, RTLD_LAZY);
if (!appOps.handle) {
ALOGE("%s(), dlopen fail! (%s)\n", __FUNCTION__, dlerror());
return NULL;
}
dlerror(); /* Clear any existing error */
funName = "appHandleGetInstance";
appOps.appHandleGetInstance = (AppHandle * ( *)(void)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* dlsym */
funName = "appSetAudioTypeLoadingList";
appOps.appSetAudioTypeLoadingList = (int ( *)(const char *audioTypeLoadingList[])) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appGetAudioTypeLoadingList";
appOps.appGetAudioTypeLoadingList = (const char*( *)(void)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appSetDebugLevel";
appOps.appSetDebugLevel = (void ( *)(MSG_LEVEL level)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appGetDebugLevel";
appOps.appGetDebugLevel = (MSG_LEVEL( *)(void)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* appHandle API */
funName = "appHandleInit";
appOps.appHandleInit = (APP_STATUS( *)(AppHandle * appHandle)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleUninit";
appOps.appHandleUninit = (APP_STATUS( *)(AppHandle * appHandle)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleRedirectIOToConsole";
appOps.appHandleRedirectIOToConsole = (void ( *)(void)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetNumOfAudioType";
appOps.appHandleGetNumOfAudioType = (size_t ( *)(AppHandle * appHandle)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetAudioTypeByIndex";
appOps.appHandleGetAudioTypeByIndex = (AudioType * ( *)(AppHandle * appHandle, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetAudioTypeByName";
appOps.appHandleGetAudioTypeByName = (AudioType * ( *)(AppHandle * appHandle, const char * name)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetFeatureOptionValue";
appOps.appHandleGetFeatureOptionValue = (const char * ( *)(AppHandle * appHandle, const char * featureOptionName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleIsFeatureOptionEnabled";
appOps.appHandleIsFeatureOptionEnabled = (int ( *)(AppHandle * appHandle, const char * featureOptionName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetNumOfFeatureOption";
appOps.appHandleGetNumOfFeatureOption = (size_t ( *)(AppHandle * appHandle)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetFeatureOptionByIndex";
appOps.appHandleGetFeatureOptionByIndex = (FeatureOption * ( *)(AppHandle * appHandle, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleGetBuildTimeStamp";
appOps.appHandleGetBuildTimeStamp = (const char * ( *)(void)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleCompressFiles";
appOps.appHandleCompressFiles = (APP_STATUS( *)(const char * srcDir, const char * destFile)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleUncompressFile";
appOps.appHandleUncompressFile = (APP_STATUS( *)(const char * srcFile, const char * destDir)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Following 2 APIs will acquire app handle write lock automatically */
funName = "appHandleParseXml";
appOps.appHandleParseXml = (APP_STATUS( *)(AppHandle * appHandle, const char * dir[], const char * cusDir)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleReloadAudioType";
appOps.appHandleReloadAudioType = (APP_STATUS( *)(AppHandle * appHandle, const char * audioTypeName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* AudioType API */
funName = "audioTypeIsTuningToolSupportedXmlVer";
appOps.audioTypeIsTuningToolSupportedXmlVer = (APP_STATUS( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeIsDeviceSupportedXmlVer";
appOps.audioTypeIsDeviceSupportedXmlVer = (APP_STATUS( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetNumOfCategoryType";
appOps.audioTypeGetNumOfCategoryType = (size_t ( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetCategoryTypeByIndex";
appOps.audioTypeGetCategoryTypeByIndex = (CategoryType * ( *)(AudioType * audioType, size_t idnex)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetCategoryTypeByName";
appOps.audioTypeGetCategoryTypeByName = (CategoryType * ( *)(AudioType * audioType, const char * categoryTypeName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetCategoryTypeByWording";
appOps.audioTypeGetCategoryTypeByWording = (CategoryType * ( *)(AudioType * audioType, const char * categoryTypeWording)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetCategoryTypeListNode";
appOps.audioTypeGetCategoryTypeListNode = (xmlNode * ( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetParamUnitNode";
appOps.audioTypeGetParamUnitNode = (xmlNode * ( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetParamUnit";
appOps.audioTypeGetParamUnit = (ParamUnit * ( *)(AudioType * audioType, const char * categoryPath)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetNumOfParamInfo";
appOps.audioTypeGetNumOfParamInfo = (size_t ( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetParamInfoByIndex";
appOps.audioTypeGetParamInfoByIndex = (ParamInfo * ( *)(AudioType * audioType, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetParamInfoByName";
appOps.audioTypeGetParamInfoByName = (ParamInfo * ( *)(AudioType * audioType, const char * paramName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeSaveAudioParamXml";
appOps.audioTypeSaveAudioParamXml = (APP_STATUS( *)(AudioType * audioType, const char * saveDir, int clearDirtyBit)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeReadLock";
appOps.audioTypeReadLock = (int ( *)(AudioType * audioType, const char * callerFun)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeWriteLock";
appOps.audioTypeWriteLock = (int ( *)(AudioType * audioType, const char * callerFun)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeUnlock";
appOps.audioTypeUnlock = (int ( *)(AudioType * audioType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeGetTreeRoot";
appOps.audioTypeGetTreeRoot = (TreeRoot * ( *)(AudioType * audioType, const char * treeRootName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Following 3 write APIs will acquire write lock automatically */
funName = "audioTypeSetParamData";
appOps.audioTypeSetParamData = (APP_STATUS( *)(AudioType * audioType, const char * categoryPath, ParamInfo * paramName, void * dataPtr, int arraySize)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeSetFieldData";
appOps.audioTypeSetFieldData = (APP_STATUS( *)(AudioType * audioType, const char * categoryPath, FieldInfo * fieldInfo, unsigned int val)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "audioTypeParamUnitCopy";
appOps.audioTypeParamUnitCopy = (APP_STATUS( *)(AudioType * audioType, const char * srcCategoryPath, const char * dstCategoryPath)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* CategoryType API */
funName = "categoryTypeGetNumOfCategoryGroup";
appOps.categoryTypeGetNumOfCategoryGroup = (size_t ( *)(CategoryType * categoryType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryTypeGetCategoryGroupByIndex";
appOps.categoryTypeGetCategoryGroupByIndex = (CategoryGroup * ( *)(CategoryType * categoryType, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryTypeGetCategoryGroupByWording";
appOps.categoryTypeGetCategoryGroupByWording = (CategoryGroup * ( *)(CategoryType * categoryType, const char * wording)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryTypeGetNumOfCategory";
appOps.categoryTypeGetNumOfCategory = (size_t ( *)(CategoryType * categoryType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryTypeGetCategoryByIndex";
appOps.categoryTypeGetCategoryByIndex = (Category * ( *)(CategoryType * categoryType, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryTypeGetCategoryByWording";
appOps.categoryTypeGetCategoryByWording = (Category * ( *)(CategoryType * categoryType, const char * wording)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryTypeGetCategoryByName";
appOps.categoryTypeGetCategoryByName = (Category * ( *)(CategoryType * categoryType, const char * name)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* CategoryGroup API */
funName = "categoryGroupGetNumOfCategory";
appOps.categoryGroupGetNumOfCategory = (size_t ( *)(CategoryGroup * categoryGroup)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryGroupGetCategoryByIndex";
appOps.categoryGroupGetCategoryByIndex = (Category * ( *)(CategoryGroup * categoryGroup, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryGroupGetCategoryByWording";
appOps.categoryGroupGetCategoryByWording = (Category * ( *)(CategoryGroup * categoryGroup, const char * index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* CategoryAlias API */
funName = "categoryAliasCreate";
appOps.categoryAliasCreate = (CategoryAlias * ( *)(const char * alias, Category * category)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "categoryAliasRelease";
appOps.categoryAliasRelease = (void ( *)(CategoryAlias * categoryAlias)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* ParamInfo API */
funName = "paramInfoGetNumOfFieldInfo";
appOps.paramInfoGetNumOfFieldInfo = (size_t ( *)(ParamInfo * paramInfo)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramInfoGetFieldInfoByIndex";
appOps.paramInfoGetFieldInfoByIndex = (FieldInfo * ( *)(ParamInfo * paramInfo, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramInfoGetFieldInfoByName";
appOps.paramInfoGetFieldInfoByName = (FieldInfo * ( *)(ParamInfo * paramInfo, const char * fieldName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramNewDataStr";
appOps.paramNewDataStr = (char * ( *)(Param * param)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramNewDataStrWithMode";
appOps.paramNewDataStrWithMode = (char * ( *)(Param * param, int uArrayHexMode)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* ParamUnit API */
funName = "paramUnitGetNumOfParam";
appOps.paramUnitGetNumOfParam = (size_t ( *)(ParamUnit * paramUnit)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramUnitGetParamByIndex";
appOps.paramUnitGetParamByIndex = (Param * ( *)(ParamUnit * paramUnit, size_t index)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramUnitGetParamByName";
appOps.paramUnitGetParamByName = (Param * ( *)(ParamUnit * paramUnit, const char * paramName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramUnitGetParamInfo";
appOps.paramUnitGetParamInfo = (ParamInfo * ( *)(ParamUnit * paramUnit, const char * paramInfoName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramUnitGetFieldInfo";
appOps.paramUnitGetFieldInfo = (FieldInfo * ( *)(ParamUnit * paramUnit, const char * paramName, const char * fieldName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramUnitGetFieldVal";
appOps.paramUnitGetFieldVal = (APP_STATUS( *)(ParamUnit * paramUnit, const char * paramName, const char * fieldName, unsigned int * val)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Param API */
funName = "paramGetArraySizeFromString";
appOps.paramGetArraySizeFromString = (size_t ( *)(const char * str)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramGetNumOfBytes";
appOps.paramGetNumOfBytes = (size_t ( *)(Param * param)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramGetFieldVal";
appOps.paramGetFieldVal = (APP_STATUS( *)(Param * param, FieldInfo * fieldInfo, unsigned int * val)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramSetFieldVal";
appOps.paramSetFieldVal = (APP_STATUS( *)(Param * param, FieldInfo * fieldInfo, unsigned int val)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramDataTypeToEnum";
appOps.paramDataTypeToEnum = (DATA_TYPE( *)(const char * dataType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "paramDataTypeToStr";
appOps.paramDataTypeToStr = (const char * ( *)(DATA_TYPE dataType)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Field API */
funName = "fieldInfoGetCheckListValue";
appOps.fieldInfoGetCheckListValue = (APP_STATUS( *)(FieldInfo * fieldInfo, const char * checkName, unsigned int * checkVal)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* TreeRoot API */
funName = "treeRootGetFeatureByName";
appOps.treeRootGetFeatureByName = (Feature * ( *)(TreeRoot * treeRoot, const char * featureName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "featureIsCategoryPathSupport";
appOps.featureIsCategoryPathSupport = (int ( *)(Feature * feature, const char * categoryPath)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Xml Node related APIs */
funName = "findXmlNodeByElemName";
appOps.findXmlNodeByElemName = (xmlNode * ( *)(xmlNode * node, const char * elemName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "xmlNodeGetProp";
appOps.xmlNodeGetProp = (xmlChar * ( *)(xmlNode * node, const char * prop)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "xmlNodeGetWording";
appOps.xmlNodeGetWording = (xmlChar * ( *)(xmlNode * node)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleCustXmlEnableChanged";
appOps.appHandleCustXmlEnableChanged = (void ( *)(AppHandle * appHandle, int enable)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* XML changed callback APIs */
funName = "appHandleRegXmlChangedCb";
appOps.appHandleRegXmlChangedCb = (void ( *)(AppHandle * appHandle, NOTIFY_CB_FUN nofiyCallback)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "appHandleUnregXmlChangedCb";
appOps.appHandleUnregXmlChangedCb = (void ( *)(AppHandle * appHandle, NOTIFY_CB_FUN nofiyCallback)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Utils APIs */
funName = "utilConvDataStringToNative";
appOps.utilConvDataStringToNative = (APP_STATUS( *)(DATA_TYPE dataType, const char * paramDataStr, void **paramData, size_t * arraySize)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Unit test */
funName = "unitTest";
appOps.unitTest = (APP_STATUS( *)(AppHandle * appHandle)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilGetStdin";
appOps.utilGetStdin = (char * ( *)(char * buf, int bufSize)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
/* Following APIs is designed for EM tool integration */
funName = "utilNativeSetField";
appOps.utilNativeSetField = (APP_STATUS( *)(const char * audioTypeName, const char * categoryPath, const char * paramName, const char * fieldName, const char * fieldValueStr)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilNativeSetParam";
appOps.utilNativeSetParam = (APP_STATUS( *)(const char * audioTypeName, const char * categoryPath, const char * paramName, const char * paramDataStr)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilNativeGetCategory";
appOps.utilNativeGetCategory = (char * ( *)(const char * audioTypeName, const char * categoryTypeName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilNativeGetParam";
appOps.utilNativeGetParam = (char * ( *)(const char * audioTypeName, const char * categoryPath, const char * paramName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilNativeGetField";
appOps.utilNativeGetField = (unsigned int ( *)(const char * audioTypeName, const char * categoryPath, const char * paramName, const char * fieldName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilNativeSaveXml";
appOps.utilNativeSaveXml = (APP_STATUS( *)(const char * audioTypeName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
funName = "utilNativeGetChecklist";
appOps.utilNativeGetChecklist = (const char * ( *)(const char * audioTypeName, const char * paramName, const char * fieldName)) dlsym(appOps.handle, funName);
error = dlerror();
if (error != NULL) {
ALOGE("%s(), dlsym %s fail. (%s)\n", __FUNCTION__, funName, error);
return NULL;
}
appOpsInited = 1;
}
return &appOps;
}
EXPORT static __attribute__((unused)) int appIsFeatureOptionEnabled(const char* fo) {
AppOps* appOps = appOpsGetInstance();
if (appOps == NULL) {
ALOGE("%s(), AppOps is NULL!\n", __FUNCTION__);
return -1;
}
AppHandle *appHandle = appOps->appHandleGetInstance();
if (appHandle == NULL) {
ALOGE("%s(), AppHandle is NULL!\n", __FUNCTION__);
return -1;
}
return appOps->appHandleIsFeatureOptionEnabled(appHandle, fo);
}
EXPORT static __attribute__((unused)) const char* appGetFeatureOptionValue(const char* fo) {
AppOps* appOps = appOpsGetInstance();
if (appOps == NULL) {
ALOGE("%s(), AppOps is NULL!\n", __FUNCTION__);
return NULL;
}
AppHandle *appHandle = appOps->appHandleGetInstance();
if (appHandle == NULL) {
ALOGE("%s(), AppHandle is NULL!\n", __FUNCTION__);
return NULL;
}
return appOps->appHandleGetFeatureOptionValue(appHandle, fo);
}
static __attribute__((unused)) void appOpsDelInstance() {
if (appOpsInited == 1) {
dlclose(appOps.handle);
appOps.handle = NULL;
appOpsInited = 0;
}
}
#endif
#ifndef WIN32
#ifdef __cplusplus
}
#endif
#endif
#endif