| #include "AudioParamParserPriv.h" | 
 |  | 
 | EXPORT ParamUnit *paramUnitCreate(AudioType *audioType, int id, Param *param) | 
 | { | 
 |     size_t numOfParam, i; | 
 |     ParamUnit *paramUnit = (ParamUnit *)malloc(sizeof(ParamUnit)); | 
 |     paramUnit->paramId = id; | 
 |     paramUnit->refCount = 0; | 
 |     paramUnit->audioType = audioType; | 
 |     paramUnit->paramHash = param; | 
 |  | 
 |     /* Update param's param unit info */ | 
 |     numOfParam = paramUnitGetNumOfParam(paramUnit); | 
 |     for (i = 0; i < numOfParam; i++) | 
 |     { | 
 |         Param *param = paramUnitGetParamByIndex(paramUnit, i); | 
 |         param->paramUnit = paramUnit; | 
 |     } | 
 |  | 
 |     return paramUnit; | 
 | } | 
 |  | 
 | EXPORT ParamUnit *paramUnitClone(ParamUnit *oldParamUnit) | 
 | { | 
 |     Param *item; | 
 |     ParamUnit *paramUnit; | 
 |  | 
 |     if (!oldParamUnit) | 
 |     { | 
 |         ERR_LOG("Original ParamUnit is NULL\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     paramUnit = (ParamUnit *)malloc(sizeof(ParamUnit)); | 
 |     paramUnit->paramId = oldParamUnit->paramId; | 
 |     paramUnit->refCount = oldParamUnit->refCount; | 
 |     paramUnit->audioType = oldParamUnit->audioType; | 
 |     paramUnit->paramHash = paramHashClone(oldParamUnit->paramHash); | 
 |  | 
 |     /* Update param's param unit info */ | 
 |     if (paramUnit->paramHash) | 
 |     { | 
 |         for (item = paramUnit->paramHash; item != NULL; item = item->hh.next) | 
 |         { | 
 |             item->paramUnit = paramUnit; | 
 |         } | 
 |     } | 
 |  | 
 |     return paramUnit; | 
 | } | 
 |  | 
 | EXPORT void paramUnitRelease(ParamUnit *paramUnit) | 
 | { | 
 |     if (paramUnit) | 
 |     { | 
 |         /* Free ParamUnit's param hash */ | 
 |         if (paramUnit->paramHash) | 
 |         { | 
 |             Param *tmp, *item; | 
 |             HASH_ITER(hh, paramUnit->paramHash, item, tmp) | 
 |             { | 
 |                 HASH_DEL(paramUnit->paramHash, item); | 
 |                 paramRelease(item); | 
 |             } | 
 |             free(paramUnit->paramHash); | 
 |         } | 
 |         free(paramUnit); | 
 |     } | 
 | } | 
 |  | 
 | EXPORT size_t paramUnitGetNumOfParam(ParamUnit *paramUnit) | 
 | { | 
 |     if (!paramUnit) | 
 |     { | 
 |         ERR_LOG("paramUnit is NULL!\n"); | 
 |         return 0; | 
 |     } | 
 |  | 
 |     return HASH_COUNT(paramUnit->paramHash); | 
 | } | 
 |  | 
 | EXPORT Param *paramUnitGetParamByIndex(ParamUnit *paramUnit, size_t index) | 
 | { | 
 |     Param *param = NULL; | 
 |     size_t i = 0; | 
 |  | 
 |     if (!paramUnit) | 
 |     { | 
 |         ERR_LOG("paramUnit is NULL!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     for (param = paramUnit->paramHash; param ; param = param->hh.next) | 
 |     { | 
 |         if (index == i++) | 
 |         { | 
 |             return param; | 
 |         } | 
 |     } | 
 |  | 
 |     return NULL; | 
 | } | 
 |  | 
 | EXPORT Param *paramUnitGetParamByName(ParamUnit *paramUnit, const char *name) | 
 | { | 
 |     Param *param = NULL; | 
 |  | 
 |     INFO_LOG("name = %s\n", name); | 
 |     if (!paramUnit) | 
 |     { | 
 |         ERR_LOG("paramUnit is NULL!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     HASH_FIND_STR(paramUnit->paramHash, name, param); | 
 |  | 
 |     if (param && appDebugLevel <= DEBUG_LEVEL) | 
 |     { | 
 |         utilShowParamValue(param); | 
 |     } | 
 |  | 
 |     DEBUG_LOG("name = %s, param data = 0x%p, size = %d\n", name, param ? param->data : NULL, param ? param->arraySize : NULL); | 
 |     return param; | 
 | } | 
 |  | 
 |  | 
 | EXPORT APP_STATUS paramUnitGetFieldVal(ParamUnit *paramUnit, const char *paramName, const char *fieldName, unsigned int *val) | 
 | { | 
 |     ParamInfo *paramInfo; | 
 |     FieldInfo *fieldInfo; | 
 |     Param *param; | 
 |  | 
 |     if (!paramUnit) | 
 |     { | 
 |         ERR_LOG("paramUnit is NULL!\n"); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     /* Query field Info */ | 
 |     paramInfo = audioTypeGetParamInfoByName(paramUnit->audioType, paramName); | 
 |     if (!paramInfo) | 
 |     { | 
 |         WARN_LOG("Cannot find paramInfo. (param = %s\n)", paramName); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     fieldInfo = paramInfoGetFieldInfoByName(paramInfo, fieldName); | 
 |     if (!fieldInfo) | 
 |     { | 
 |         WARN_LOG("Cannot find fieldInfo. (fieldName = %s\n)", fieldName); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     /* Query param */ | 
 |     param = paramUnitGetParamByName(paramUnit, paramName); | 
 |     if (!param) | 
 |     { | 
 |         WARN_LOG("Cannot get param. (name = %s)\n", paramName); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     /* Query field val */ | 
 |     return paramGetFieldVal(param, fieldInfo, val); | 
 | } | 
 |  | 
 | EXPORT ParamInfo *paramUnitGetParamInfo(ParamUnit *paramUnit, const char *paramInfoName) | 
 | { | 
 |     if (!paramUnit) | 
 |     { | 
 |         ERR_LOG("paramUnit is NULL!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     return audioTypeGetParamInfoByName(paramUnit->audioType, paramInfoName); | 
 | } | 
 |  | 
 | EXPORT FieldInfo *paramUnitGetFieldInfo(ParamUnit *paramUnit, const char *paramName, const char *fieldName) | 
 | { | 
 |     ParamInfo *paramInfo; | 
 |     if (!paramUnit || !paramName || !fieldName) | 
 |     { | 
 |         WARN_LOG("Cannot get field info. (paramUnit id=%d, paramInfoName=%s, fieldInfoName=%s\n)", paramUnit ? paramUnit->paramId : -1, paramName, fieldName); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     paramInfo = audioTypeGetParamInfoByName(paramUnit->audioType, paramName); | 
 |     if (paramInfo) | 
 |     { | 
 |         return paramInfoGetFieldInfoByName(paramInfo, fieldName); | 
 |     } | 
 |     else | 
 |     { | 
 |         return NULL; | 
 |     } | 
 | } |