blob: 36def3eaafd8d07df7bc80076ee70a3e8130afab [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001#include "AudioParamParserPriv.h"
2#include <errno.h>
3
4Param *paramCreate(const char *name, ParamInfo *paramInfo, const char *paramValue)
5{
6 Param *param = NULL;
7 if (!paramInfo)
8 {
9 ERR_LOG("The paramInfo is NULL, cannot create %s param!\n", name);
10 return NULL;
11 }
12
13 param = (Param *)malloc(sizeof(Param));
14 param->data = NULL;
15 param->name = strdup(name);
16 param->paramInfo = paramInfo;
17 paramSetupDataInfoByStr(param, paramValue);
18
19 return param;
20}
21
22EXPORT void paramRelease(Param *param)
23{
24 if (param)
25 {
26 if (param->name)
27 {
28 free(param->name);
29 }
30 if (param->data)
31 {
32 free(param->data);
33 }
34 free(param);
35 }
36}
37
38EXPORT Param *paramHashClone(Param *paramHash)
39{
40 Param *param = NULL, *item, *newItem;
41 size_t i;
42 if (!paramHash)
43 {
44 ERR_LOG("paramHash is NULL\n");
45 return NULL;
46 }
47
48 for (item = paramHash; item != NULL; item = item->hh.next)
49 {
50 newItem = malloc(sizeof(Param));
51 newItem->arraySize = item->arraySize;
52 newItem->paramInfo = item->paramInfo;
53 newItem->paramUnit = item->paramUnit;
54 newItem->name = strdup(item->name);
55
56 switch (item->paramInfo->dataType)
57 {
58 case TYPE_STR:
59 newItem->data = strdup(item->data);
60 break;
61 case TYPE_INT:
62 newItem->data = malloc(sizeof(int));
63 *(int *)newItem->data = *(int *)item->data;
64 break;
65 case TYPE_UINT:
66 newItem->data = malloc(sizeof(unsigned int));
67 *(unsigned int *)newItem->data = *(unsigned int *)item->data;
68 break;
69 case TYPE_FLOAT:
70 newItem->data = malloc(sizeof(float));
71 *(float *)newItem->data = *(float *)item->data;
72 break;
73 case TYPE_BYTE_ARRAY:
74 newItem->data = malloc(sizeof(char) * item->arraySize);
75 for (i = 0; i < item->arraySize; i++)
76 {
77 ((char *)newItem->data)[i] = ((char *)item->data)[i];
78 }
79 break;
80 case TYPE_UBYTE_ARRAY:
81 newItem->data = malloc(sizeof(unsigned char) * item->arraySize);
82 for (i = 0; i < item->arraySize; i++)
83 {
84 ((unsigned char *)newItem->data)[i] = ((unsigned char *)item->data)[i];
85 }
86 break;
87 case TYPE_SHORT_ARRAY:
88 newItem->data = malloc(sizeof(short) * item->arraySize);
89 for (i = 0; i < item->arraySize; i++)
90 {
91 ((short *)newItem->data)[i] = ((short *)item->data)[i];
92 }
93 break;
94 case TYPE_USHORT_ARRAY:
95 newItem->data = malloc(sizeof(unsigned short) * item->arraySize);
96 for (i = 0; i < item->arraySize; i++)
97 {
98 ((unsigned short *)newItem->data)[i] = ((unsigned short *)item->data)[i];
99 }
100 break;
101 case TYPE_INT_ARRAY:
102 newItem->data = malloc(sizeof(int) * item->arraySize);
103 for (i = 0; i < item->arraySize; i++)
104 {
105 ((int *)newItem->data)[i] = ((int *)item->data)[i];
106 }
107 break;
108 case TYPE_UINT_ARRAY:
109 newItem->data = malloc(sizeof(unsigned int) * item->arraySize);
110 for (i = 0; i < item->arraySize; i++)
111 {
112 ((unsigned int *)newItem->data)[i] = ((unsigned int *)item->data)[i];
113 }
114 break;
115 case TYPE_DOUBLE_ARRAY:
116 newItem->data = malloc(sizeof(double) * item->arraySize);
117 for (i = 0; i < item->arraySize; i++)
118 {
119 ((double *)newItem->data)[i] = ((double *)item->data)[i];
120 }
121 break;
122 case TYPE_FIELD:
123 case TYPE_UNKNOWN:
124 break;
125 }
126 HASH_ADD_KEYPTR(hh, param, newItem->name, strlen(newItem->name), newItem);
127 }
128
129 return param;
130}
131
132EXPORT DATA_TYPE paramDataTypeToEnum(const char *dataType)
133{
134 if (!dataType)
135 {
136 ERR_LOG("dataType is NULL\n");
137 return TYPE_UNKNOWN;
138 }
139
140 if (!strcmp(DATA_TYPE_STR_STRING, dataType))
141 {
142 return TYPE_STR;
143 }
144 else if (!strcmp(DATA_TYPE_INT_STRING, dataType))
145 {
146 return TYPE_INT;
147 }
148 else if (!strcmp(DATA_TYPE_UINT_STRING, dataType))
149 {
150 return TYPE_UINT;
151 }
152 else if (!strcmp(DATA_TYPE_FLOAT_STRING, dataType))
153 {
154 return TYPE_FLOAT;
155 }
156 else if (!strcmp(DATA_TYPE_BYTE_ARRAY_STRING, dataType))
157 {
158 return TYPE_BYTE_ARRAY;
159 }
160 else if (!strcmp(DATA_TYPE_UBYTE_ARRAY_STRING, dataType))
161 {
162 return TYPE_UBYTE_ARRAY;
163 }
164 else if (!strcmp(DATA_TYPE_SHORT_ARRAY_STRING, dataType))
165 {
166 return TYPE_SHORT_ARRAY;
167 }
168 else if (!strcmp(DATA_TYPE_USHORT_ARRAY_STRING, dataType))
169 {
170 return TYPE_USHORT_ARRAY;
171 }
172 else if (!strcmp(DATA_TYPE_INT_ARRAY_STRING, dataType))
173 {
174 return TYPE_INT_ARRAY;
175 }
176 else if (!strcmp(DATA_TYPE_UINT_ARRAY_STRING, dataType))
177 {
178 return TYPE_UINT_ARRAY;
179 }
180 else if (!strcmp(DATA_TYPE_DOUBLE_ARRAY_STRING, dataType))
181 {
182 return TYPE_DOUBLE_ARRAY;
183 }
184 else
185 {
186 return TYPE_UNKNOWN;
187 }
188}
189
190EXPORT const char *paramDataTypeToStr(DATA_TYPE dataType)
191{
192 switch (dataType)
193 {
194 case TYPE_STR:
195 return DATA_TYPE_STR_STRING;
196 case TYPE_INT:
197 return DATA_TYPE_INT_STRING;
198 case TYPE_UINT:
199 return DATA_TYPE_UINT_STRING;
200 case TYPE_FLOAT:
201 return DATA_TYPE_FLOAT_STRING;
202 case TYPE_BYTE_ARRAY:
203 return DATA_TYPE_BYTE_ARRAY_STRING;
204 case TYPE_UBYTE_ARRAY:
205 return DATA_TYPE_UBYTE_ARRAY_STRING;
206 case TYPE_SHORT_ARRAY:
207 return DATA_TYPE_SHORT_ARRAY_STRING;
208 case TYPE_USHORT_ARRAY:
209 return DATA_TYPE_USHORT_ARRAY_STRING;
210 case TYPE_INT_ARRAY:
211 return DATA_TYPE_INT_ARRAY_STRING;
212 case TYPE_UINT_ARRAY:
213 return DATA_TYPE_UINT_ARRAY_STRING;
214 case TYPE_DOUBLE_ARRAY:
215 return DATA_TYPE_DOUBLE_ARRAY_STRING;
216 case TYPE_UNKNOWN:
217 return DATA_TYPE_UNKNOWN_STRING;
218 case TYPE_FIELD:
219 return DATA_TYPE_FIELD_STRING;
220 }
221 return DATA_TYPE_UNKNOWN_STRING;
222}
223
224EXPORT APP_STATUS paramSetupDataInfoByStr(Param *param, const char *str)
225{
226 return utilConvDataStringToNative(param->paramInfo->dataType, str, &param->data, &param->arraySize);
227}
228
229EXPORT size_t paramGetArraySizeFromString(const char *str)
230{
231 size_t numOfSeperator = 0;
232
233 if (!str)
234 {
235 ERR_LOG("str is NULL!\n");
236 return 0;
237 }
238
239 while ((str = strstr(str, ARRAY_SEPERATOR)) != NULL)
240 {
241 numOfSeperator++;
242 str++;
243 }
244
245 return numOfSeperator + 1;
246}
247
248EXPORT APP_STATUS paramGetFieldVal(Param *param, FieldInfo *fieldInfo, unsigned int *val)
249{
250 unsigned char uchar;
251 unsigned short ushort;
252 unsigned int uint;
253
254 if (!param)
255 {
256 WARN_LOG("param is NULL\n");
257 return APP_ERROR;
258 }
259
260 if (!fieldInfo)
261 {
262 WARN_LOG("param is NULL\n");
263 return APP_ERROR;
264 }
265
266 if (fieldInfo->arrayIndex >= param->arraySize)
267 {
268 WARN_LOG("Param's array size is less than field index. (param=%s, field index=%lu >= array size=%lu)\n", param->name, fieldInfo->arrayIndex, param->arraySize);
269 return APP_ERROR;
270 }
271
272 if (fieldInfo->startBit < 0)
273 {
274 WARN_LOG("The startBit < 0 (param=%s, startBit=%d)\n", param->name, fieldInfo->startBit);
275 return APP_ERROR;
276 }
277
278 if (fieldInfo->endBit >= 32)
279 {
280 WARN_LOG("The startBit >= 32 (param=%s, endBit=%d)\n", param->name, fieldInfo->endBit);
281 return APP_ERROR;
282 }
283
284 switch (param->paramInfo->dataType)
285 {
286 case TYPE_BYTE_ARRAY:
287 case TYPE_UBYTE_ARRAY:
288 if (fieldInfo->startBit > fieldInfo->endBit || fieldInfo->endBit >= 8)
289 {
290 WARN_LOG("Field's bit information is not match param type. (param=%s, start bit=%d, end bit=%d)\n", param->name, fieldInfo->startBit, fieldInfo->endBit);
291 return APP_ERROR;
292 }
293 uchar = ((unsigned char *)param->data)[fieldInfo->arrayIndex];
294 *val = ((uchar >> (fieldInfo->startBit)) & ((1 << (fieldInfo->endBit - fieldInfo->startBit + 1)) - 1));
295 return APP_NO_ERROR;
296 case TYPE_SHORT_ARRAY:
297 case TYPE_USHORT_ARRAY:
298 if (fieldInfo->startBit > fieldInfo->endBit || fieldInfo->endBit >= 16)
299 {
300 WARN_LOG("Field's bit information is not match param type. (param=%s, start bit=%d, end bit=%d)\n", param->name, fieldInfo->startBit, fieldInfo->endBit);
301 return APP_ERROR;
302 }
303 ushort = ((unsigned short *)param->data)[fieldInfo->arrayIndex];
304 *val = ((ushort >> (fieldInfo->startBit)) & ((1 << (fieldInfo->endBit - fieldInfo->startBit + 1)) - 1));
305 return APP_NO_ERROR;
306 case TYPE_INT_ARRAY:
307 case TYPE_UINT_ARRAY:
308 if (fieldInfo->startBit > fieldInfo->endBit || fieldInfo->endBit >= 32)
309 {
310 WARN_LOG("Field's bit information is not match param type. (param=%s, start bit=%d, end bit=%d)\n", param->name, fieldInfo->startBit, fieldInfo->endBit);
311 return APP_ERROR;
312 }
313 uint = ((unsigned int *)param->data)[fieldInfo->arrayIndex];
314 *val = ((uint >> (fieldInfo->startBit)) & ((1 << (fieldInfo->endBit - fieldInfo->startBit + 1)) - 1));
315 return APP_NO_ERROR;
316 default:
317 WARN_LOG("Param didn't support field info (param=%s, type=%s)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType));
318 return APP_ERROR;
319 }
320
321 return APP_ERROR;
322}
323
324EXPORT char *paramNewDataStr(Param *param)
325{
326 return utilConvDataToString(param->paramInfo->dataType, param->data, param->arraySize);
327}
328
329EXPORT APP_STATUS paramSetupDataInfoByVal(Param *param, void *data, int arraySize)
330{
331 int i;
332
333 if (!param)
334 {
335 ERR_LOG("Param is NULL\n");
336 return APP_ERROR;
337 }
338
339 switch (param->paramInfo->dataType)
340 {
341 case TYPE_BYTE_ARRAY:
342 param->data = malloc(sizeof(char) * arraySize);
343 for (i = 0; i < arraySize; i++)
344 {
345 ((char *)param->data)[i] = ((char *)data)[i];
346 }
347 param->arraySize = arraySize;
348 break;
349 case TYPE_UBYTE_ARRAY:
350 param->data = malloc(sizeof(unsigned char) * arraySize);
351 for (i = 0; i < arraySize; i++)
352 {
353 ((unsigned char *)param->data)[i] = ((unsigned char *)data)[i];
354 }
355 param->arraySize = arraySize;
356 break;
357 case TYPE_SHORT_ARRAY:
358 param->data = malloc(sizeof(short) * arraySize);
359 for (i = 0; i < arraySize; i++)
360 {
361 ((short *)param->data)[i] = ((short *)data)[i];
362 }
363 param->arraySize = arraySize;
364 break;
365 case TYPE_USHORT_ARRAY:
366 param->data = malloc(sizeof(unsigned short) * arraySize);
367 for (i = 0; i < arraySize; i++)
368 {
369 ((unsigned short *)param->data)[i] = ((unsigned short *)data)[i];
370 }
371 param->arraySize = arraySize;
372 break;
373 case TYPE_INT_ARRAY:
374 param->data = malloc(sizeof(int) * arraySize);
375 for (i = 0; i < arraySize; i++)
376 {
377 ((int *)param->data)[i] = ((int *)data)[i];
378 }
379 param->arraySize = arraySize;
380 break;
381 case TYPE_UINT_ARRAY:
382 param->data = malloc(sizeof(unsigned int) * arraySize);
383 for (i = 0; i < arraySize; i++)
384 {
385 ((unsigned int *)param->data)[i] = ((unsigned int *)data)[i];
386 }
387 param->arraySize = arraySize;
388 break;
389 case TYPE_DOUBLE_ARRAY:
390 param->data = malloc(sizeof(double) * arraySize);
391 for (i = 0; i < arraySize; i++)
392 {
393 ((double *)param->data)[i] = ((double *)data)[i];
394 }
395 param->arraySize = arraySize;
396 break;
397 case TYPE_STR:
398 param->data = strdup((const char *)data);
399 break;
400 case TYPE_INT:
401 param->data = malloc(sizeof(int));
402 *(int *)param->data = *(int *)data;
403 break;
404 case TYPE_UINT:
405 param->data = malloc(sizeof(unsigned int));
406 *(unsigned int *)param->data = *(unsigned int *)data;
407 break;
408 case TYPE_FLOAT:
409 param->data = malloc(sizeof(float));
410 *(float *)param->data = *(float *)data;
411 break;
412 default:
413 return APP_ERROR;
414 }
415
416 return APP_NO_ERROR;
417}
418
419EXPORT APP_STATUS paramSetFieldVal(Param *param, FieldInfo *fieldInfo, unsigned int val)
420{
421 unsigned long mask;
422
423 if (!param)
424 {
425 ERR_LOG("param is NULL\n");
426 return APP_ERROR;
427 }
428
429 if (!fieldInfo)
430 {
431 ERR_LOG("param is NULL\n");
432 return APP_ERROR;
433 }
434
435 if (fieldInfo->arrayIndex >= param->arraySize)
436 {
437 ERR_LOG("Param's array size is less than field index. (param=%s, field index=%lu >= array size=%lu)\n", param->name, fieldInfo->arrayIndex, param->arraySize);
438 return APP_ERROR;
439 }
440
441 if (fieldInfo->startBit < 0)
442 {
443 ERR_LOG("The startBit < 0 (param=%s, startBit=%d)\n", param->name, fieldInfo->startBit);
444 return APP_ERROR;
445 }
446
447 if (fieldInfo->endBit >= 32)
448 {
449 ERR_LOG("The startBit >= 32 (param=%s, endBit=%d)\n", param->name, fieldInfo->endBit);
450 return APP_ERROR;
451 }
452
453 if (fieldInfo->endBit == 31 && fieldInfo->startBit == 0)
454 {
455 mask = 0xFFFFFFFF;
456 }
457 else
458 {
459 mask = ((1 << (fieldInfo->endBit - fieldInfo->startBit + 1)) - 1);
460 }
461
462 switch (param->paramInfo->dataType)
463 {
464 case TYPE_BYTE_ARRAY:
465 case TYPE_UBYTE_ARRAY:
466 if (fieldInfo->startBit > fieldInfo->endBit || fieldInfo->endBit >= 8)
467 {
468 ERR_LOG("Field's bit information is not match param type. (param=%s, start bit=%d, end bit=%d)\n", param->name, fieldInfo->startBit, fieldInfo->endBit);
469 return APP_ERROR;
470 }
471
472 ((unsigned char *)param->data)[fieldInfo->arrayIndex] =
473 ((((unsigned char *)param->data)[fieldInfo->arrayIndex] & ~(mask << fieldInfo->startBit)) | (unsigned char)(val & mask) << fieldInfo->startBit);
474 return APP_NO_ERROR;
475 case TYPE_SHORT_ARRAY:
476 case TYPE_USHORT_ARRAY:
477 if (fieldInfo->startBit > fieldInfo->endBit || fieldInfo->endBit >= 16)
478 {
479 ERR_LOG("Field's bit information is not match param type. (param=%s, start bit=%d, end bit=%d)\n", param->name, fieldInfo->startBit, fieldInfo->endBit);
480 return APP_ERROR;
481 }
482
483 ((unsigned short *)param->data)[fieldInfo->arrayIndex] =
484 ((((unsigned short *)param->data)[fieldInfo->arrayIndex] & ~(mask << fieldInfo->startBit)) | (unsigned short)(val & mask) << fieldInfo->startBit);
485 return APP_NO_ERROR;
486 case TYPE_INT_ARRAY:
487 case TYPE_UINT_ARRAY:
488 if (fieldInfo->startBit > fieldInfo->endBit || fieldInfo->endBit >= 32)
489 {
490 ERR_LOG("Field's bit information is not match param type. (param=%s, start bit=%d, end bit=%d)\n", param->name, fieldInfo->startBit, fieldInfo->endBit);
491 return APP_ERROR;
492 }
493
494 ((unsigned int *)param->data)[fieldInfo->arrayIndex] =
495 ((((unsigned int *)param->data)[fieldInfo->arrayIndex] & ~(mask << fieldInfo->startBit)) | (val & mask) << fieldInfo->startBit);
496 return APP_NO_ERROR;
497 default:
498 ERR_LOG("Param is not array type, cannot query field value (param=%s, type=%s)\n", param->name, paramDataTypeToStr(param->paramInfo->dataType));
499 return APP_ERROR;
500 }
501
502 return APP_ERROR;
503}
504