blob: b3ee7e4202ba6dafda0337cf33d7af6b2fcac0c8 [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:
* Implement ParamInfo & FieldInfo related APIs
*/
#include "AudioParamParserPriv.h"
EXPORT size_t paramInfoGetNumOfFieldInfo(ParamInfo *paramInfo) {
if (!paramInfo) {
ERR_LOG("paramInfo is NULL!\n");
return 0;
}
return HASH_COUNT(paramInfo->fieldInfoHash);
}
EXPORT FieldInfo *paramInfoGetFieldInfoByIndex(ParamInfo *paramInfo, size_t index) {
FieldInfo *fieldInfo = NULL;
size_t i = 0;
if (!paramInfo) {
ERR_LOG("paramInfo is NULL!\n");
return NULL;
}
for (fieldInfo = paramInfo->fieldInfoHash; fieldInfo ; fieldInfo = fieldInfo->hh.next) {
if (index == i++) {
return fieldInfo;
}
}
return NULL;
}
EXPORT FieldInfo *paramInfoGetFieldInfoByName(ParamInfo *paramInfo, const char *fieldName) {
FieldInfo *fieldInfo;
if (!paramInfo) {
ERR_LOG("paramInfo is NULL!\n");
return NULL;
}
/* Query Param name */
HASH_FIND_STR(paramInfo->fieldInfoHash, fieldName, fieldInfo);
return fieldInfo;
}
EXPORT ParamInfo *paramInfoCreate(const char *name, DATA_TYPE dataType, AudioType *audioType) {
ParamInfo *paramInfo = (ParamInfo *)malloc(sizeof(ParamInfo));
paramInfo->audioType = audioType;
paramInfo->name = strdup(name);
paramInfo->dataType = dataType;
paramInfo->fieldInfoHash = NULL;
return paramInfo;
}
EXPORT FieldInfo *fieldInfoCreate(const char *fieldName, unsigned int arrayIndex, int startBit, int endBit, const char *checkList, ParamInfo *paramInfo) {
FieldInfo *fieldInfo = (FieldInfo *)malloc(sizeof(FieldInfo));
/* Setup members */
fieldInfo->name = strdup(fieldName);
fieldInfo->arrayIndex = arrayIndex;
fieldInfo->startBit = startBit;
fieldInfo->endBit = endBit;
fieldInfo->paramInfo = paramInfo;
if (checkList) {
fieldInfo->checkListStr = strdup(checkList);
} else {
#ifdef WIN32
fieldInfo->checkListStr = utilGenCheckList(endBit - startBit + 1);
#else
/* Reduce memory usage, don't generate check list automatically */
fieldInfo->checkListStr = strdup("");
#endif
}
return fieldInfo;
}
EXPORT void paramInfoRelease(ParamInfo *paramInfo) {
if (paramInfo == NULL) {
return;
}
if (paramInfo->fieldInfoHash) {
FieldInfo *tmp, *item;
HASH_ITER(hh, paramInfo->fieldInfoHash, item, tmp) {
HASH_DEL(paramInfo->fieldInfoHash, item);
fieldInfoRelease(item);
}
}
free(paramInfo->name);
free(paramInfo);
}
EXPORT void fieldInfoRelease(FieldInfo *fieldInfo) {
if (fieldInfo == NULL) {
return;
}
if (fieldInfo->checkListStr) {
free(fieldInfo->checkListStr);
}
free(fieldInfo->name);
free(fieldInfo);
}
EXPORT APP_STATUS fieldInfoGetCheckListValue(FieldInfo *fieldInfo, const char *checkName, unsigned int *checkVal) {
char *checkList;
char *valStr;
char *nameStr;
char *restOfStr = NULL;
if (!fieldInfo) {
ERR_LOG("fieldInfo is NULL\n");
return APP_ERROR;
}
if (!checkName) {
ERR_LOG("checkName is NULL\n");
return APP_ERROR;
}
if (!checkVal) {
ERR_LOG("checkVal is NULL\n");
return APP_ERROR;
}
checkList = strdup(fieldInfo->checkListStr);
valStr = utilStrtok(checkList, ARRAY_SEPERATOR, &restOfStr);
if (!valStr) {
ERR_LOG("Cannot parse valStr\n");
free(checkList);
return APP_ERROR;
}
while ((nameStr = utilStrtok(NULL, ARRAY_SEPERATOR, &restOfStr)) != NULL) {
if (!strncmp(nameStr, checkName, strlen(checkName) + 1)) {
*checkVal = strtoul(valStr, NULL, 0);
free(checkList);
return APP_NO_ERROR;
}
valStr = utilStrtok(NULL, ARRAY_SEPERATOR, &restOfStr);
if (!valStr) {
ERR_LOG("Cannot parse valStr\n");
free(checkList);
return APP_ERROR;
}
}
free(checkList);
return APP_ERROR;
}