| // SPDX-License-Identifier: MediaTekProprietary | 
 | /* 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 ParamUnit related APIs | 
 |  */ | 
 |  | 
 | #include "AudioParamParserPriv.h" | 
 |  | 
 | EXPORT ParamUnit *paramUnitCreate(AudioType *audioType, int id, Param *param) { | 
 |     size_t numOfParam = 0, i = 0; | 
 |     ParamUnit *paramUnit = (ParamUnit *)malloc(sizeof(ParamUnit)); | 
 |     if (!paramUnit) { | 
 |         ERR_LOG("malloc fail!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     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); | 
 |         if (param) { | 
 |             param->paramUnit = paramUnit; | 
 |         } else { | 
 |             WARN_LOG("paramUnitGetParamByIndex fail (idx = "APP_SIZE_T_FT")", i); | 
 |         } | 
 |     } | 
 |  | 
 |     return paramUnit; | 
 | } | 
 |  | 
 | EXPORT ParamUnit *paramUnitClone(ParamUnit *oldParamUnit) { | 
 |     Param *item = NULL; | 
 |     ParamUnit *paramUnit = NULL; | 
 |  | 
 |     if (!oldParamUnit) { | 
 |         ERR_LOG("Original ParamUnit is NULL\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     paramUnit = (ParamUnit *)malloc(sizeof(ParamUnit)); | 
 |     if (!paramUnit) { | 
 |         ERR_LOG("malloc fail!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     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) { | 
 |                 if (paramUnit->paramHash) { | 
 |                     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; | 
 |  | 
 |     if (!paramUnit) { | 
 |         ERR_LOG("paramUnit is NULL!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     INFO_LOG("AudioType = %s, name = %s\n", paramUnit->audioType ? paramUnit->audioType->name : "NULL", name); | 
 |  | 
 |     HASH_FIND_STR(paramUnit->paramHash, name, param); | 
 |  | 
 |     if (param && appDebugLevel <= DEBUG_LEVEL) { | 
 |         utilShowParamValue(param); | 
 |     } | 
 |  | 
 |     DEBUG_LOG("name = %s, param data = 0x%p, size = "APP_SIZE_T_FT"\n", name, param ? param->data : NULL, param ? param->arraySize : 0); | 
 |     return param; | 
 | } | 
 |  | 
 |  | 
 | EXPORT APP_STATUS paramUnitGetFieldVal(ParamUnit *paramUnit, const char *paramName, const char *fieldName, unsigned int *val) { | 
 |     ParamInfo *paramInfo = NULL; | 
 |     FieldInfo *fieldInfo = NULL; | 
 |     Param *param = NULL; | 
 |  | 
 |     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 = NULL; | 
 |     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; | 
 |     } | 
 | } |