blob: 6e758f696cc2210e38878c4d36ab659f3dcc27ea [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/* MediaTek Inc. (C) 2016. All rights reserved.
2 *
3 * Copyright Statement:
4 * This software/firmware and related documentation ("MediaTek Software") are
5 * protected under relevant copyright laws. The information contained herein is
6 * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
7 * the prior written permission of MediaTek inc. and/or its licensors, any
8 * reproduction, modification, use or disclosure of MediaTek Software, and
9 * information contained herein, in whole or in part, shall be strictly
10 * prohibited.
11 */
12
13/*
14 * Description:
15 * Implement ParamUnit related APIs
16 */
17
18#include "AudioParamParserPriv.h"
19
20EXPORT ParamUnit *paramUnitCreate(AudioType *audioType, int id, Param *param) {
21 size_t numOfParam, i;
22 ParamUnit *paramUnit = (ParamUnit *)malloc(sizeof(ParamUnit));
23 paramUnit->paramId = id;
24 paramUnit->refCount = 0;
25 paramUnit->audioType = audioType;
26 paramUnit->paramHash = param;
27
28 /* Update param's param unit info */
29 numOfParam = paramUnitGetNumOfParam(paramUnit);
30 for (i = 0; i < numOfParam; i++) {
31 Param *param = paramUnitGetParamByIndex(paramUnit, i);
32 param->paramUnit = paramUnit;
33 }
34
35 return paramUnit;
36}
37
38EXPORT ParamUnit *paramUnitClone(ParamUnit *oldParamUnit) {
39 Param *item;
40 ParamUnit *paramUnit;
41
42 if (!oldParamUnit) {
43 ERR_LOG("Original ParamUnit is NULL\n");
44 return NULL;
45 }
46
47 paramUnit = (ParamUnit *)malloc(sizeof(ParamUnit));
48 paramUnit->paramId = oldParamUnit->paramId;
49 paramUnit->refCount = oldParamUnit->refCount;
50 paramUnit->audioType = oldParamUnit->audioType;
51 paramUnit->paramHash = paramHashClone(oldParamUnit->paramHash);
52
53 /* Update param's param unit info */
54 if (paramUnit->paramHash) {
55 for (item = paramUnit->paramHash; item != NULL; item = item->hh.next) {
56 item->paramUnit = paramUnit;
57 }
58 }
59
60 return paramUnit;
61}
62
63EXPORT void paramUnitRelease(ParamUnit *paramUnit) {
64 if (paramUnit) {
65 /* Free ParamUnit's param hash */
66 if (paramUnit->paramHash) {
67 Param *tmp, *item;
68 HASH_ITER(hh, paramUnit->paramHash, item, tmp) {
69 HASH_DEL(paramUnit->paramHash, item);
70 paramRelease(item);
71 }
72 free(paramUnit->paramHash);
73 }
74 free(paramUnit);
75 }
76}
77
78EXPORT size_t paramUnitGetNumOfParam(ParamUnit *paramUnit) {
79 if (!paramUnit) {
80 ERR_LOG("paramUnit is NULL!\n");
81 return 0;
82 }
83
84 return HASH_COUNT(paramUnit->paramHash);
85}
86
87EXPORT Param *paramUnitGetParamByIndex(ParamUnit *paramUnit, size_t index) {
88 Param *param = NULL;
89 size_t i = 0;
90
91 if (!paramUnit) {
92 ERR_LOG("paramUnit is NULL!\n");
93 return NULL;
94 }
95
96 for (param = paramUnit->paramHash; param ; param = param->hh.next) {
97 if (index == i++) {
98 return param;
99 }
100 }
101
102 return NULL;
103}
104
105EXPORT Param *paramUnitGetParamByName(ParamUnit *paramUnit, const char *name) {
106 Param *param = NULL;
107
108 if (!paramUnit) {
109 ERR_LOG("paramUnit is NULL!\n");
110 return NULL;
111 }
112
113 INFO_LOG("AudioType = %s, name = %s\n", paramUnit->audioType ? paramUnit->audioType->name : "NULL", name);
114
115 HASH_FIND_STR(paramUnit->paramHash, name, param);
116
117 if (param && appDebugLevel <= DEBUG_LEVEL) {
118 utilShowParamValue(param);
119 }
120
121 DEBUG_LOG("name = %s, param data = 0x%p, size = "APP_SIZE_T_FT"\n", name, param ? param->data : NULL, param ? param->arraySize : 0);
122 return param;
123}
124
125
126EXPORT APP_STATUS paramUnitGetFieldVal(ParamUnit *paramUnit, const char *paramName, const char *fieldName, unsigned int *val) {
127 ParamInfo *paramInfo;
128 FieldInfo *fieldInfo;
129 Param *param;
130
131 if (!paramUnit) {
132 ERR_LOG("paramUnit is NULL!\n");
133 return APP_ERROR;
134 }
135
136 /* Query field Info */
137 paramInfo = audioTypeGetParamInfoByName(paramUnit->audioType, paramName);
138 if (!paramInfo) {
139 WARN_LOG("Cannot find paramInfo. (param = %s\n)", paramName);
140 return APP_ERROR;
141 }
142
143 fieldInfo = paramInfoGetFieldInfoByName(paramInfo, fieldName);
144 if (!fieldInfo) {
145 WARN_LOG("Cannot find fieldInfo. (fieldName = %s\n)", fieldName);
146 return APP_ERROR;
147 }
148
149 /* Query param */
150 param = paramUnitGetParamByName(paramUnit, paramName);
151 if (!param) {
152 WARN_LOG("Cannot get param. (name = %s)\n", paramName);
153 return APP_ERROR;
154 }
155
156 /* Query field val */
157 return paramGetFieldVal(param, fieldInfo, val);
158}
159
160EXPORT ParamInfo *paramUnitGetParamInfo(ParamUnit *paramUnit, const char *paramInfoName) {
161 if (!paramUnit) {
162 ERR_LOG("paramUnit is NULL!\n");
163 return NULL;
164 }
165
166 return audioTypeGetParamInfoByName(paramUnit->audioType, paramInfoName);
167}
168
169EXPORT FieldInfo *paramUnitGetFieldInfo(ParamUnit *paramUnit, const char *paramName, const char *fieldName) {
170 ParamInfo *paramInfo;
171 if (!paramUnit || !paramName || !fieldName) {
172 WARN_LOG("Cannot get field info. (paramUnit id=%d, paramInfoName=%s, fieldInfoName=%s\n)", paramUnit ? paramUnit->paramId : -1, paramName, fieldName);
173 return NULL;
174 }
175
176 paramInfo = audioTypeGetParamInfoByName(paramUnit->audioType, paramName);
177 if (paramInfo) {
178 return paramInfoGetFieldInfoByName(paramInfo, fieldName);
179 } else {
180 return NULL;
181 }
182}