1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_internal.h"
17 #include <ctype.h>
18 #include <limits.h>
19 #include "audio_adapter_info_common.h"
20 #include "cJSON.h"
21
22 #ifdef __LITEOS__
23 #define AUDIO_ADAPTER_CONFIG "/etc/adapter_config.json"
24 #else
25 #define AUDIO_ADAPTER_CONFIG "/system/etc/hdfconfig/adapter_config.json"
26 #endif
27 #define ADAPTER_NAME_LEN 32
28 #define PORT_NAME_LEN ADAPTER_NAME_LEN
29 #define SUPPORT_ADAPTER_NUM_MAX 8
30 #define SUPPORT_PORT_NUM_MAX 3
31 #define SUPPORT_PORT_ID_MAX 18
32 #define CONFIG_FILE_SIZE_MAX (SUPPORT_ADAPTER_NUM_MAX * 1024) // 8KB
33 #define CONFIG_CHANNEL_COUNT 2 // two channels
34 #define TIME_BASE_YEAR_1900 1900
35 #define DECIMAL_SYSTEM 10
36
37 int32_t g_adapterNum = 0;
38 struct AudioAdapterDescriptor *g_audioAdapterOut = NULL;
39 struct AudioAdapterDescriptor *g_audioAdapterDescs = NULL;
40 static const char *g_adaptersName[SUPPORT_ADAPTER_NUM_MAX] = {NULL};
41 static const char *g_portsName[SUPPORT_ADAPTER_NUM_MAX][SUPPORT_PORT_NUM_MAX] = {{NULL}};
42
ClearAdaptersAllName(void)43 static void ClearAdaptersAllName(void)
44 {
45 int i, j;
46
47 for (i = 0; i < SUPPORT_ADAPTER_NUM_MAX; i++) {
48 g_adaptersName[i] = NULL;
49 for (j = 0; j < SUPPORT_PORT_NUM_MAX; j++) {
50 g_portsName[i][j] = NULL;
51 }
52 }
53 }
54
AudioAdapterGetConfigOut(void)55 struct AudioAdapterDescriptor *AudioAdapterGetConfigOut(void)
56 {
57 return g_audioAdapterOut;
58 }
59
AudioAdapterGetConfigDescs(void)60 struct AudioAdapterDescriptor *AudioAdapterGetConfigDescs(void)
61 {
62 return g_audioAdapterDescs;
63 }
64
AudioAdapterGetAdapterNum(void)65 int32_t AudioAdapterGetAdapterNum(void)
66 {
67 return g_adapterNum;
68 }
69
AudioAdapterCheckPortFlow(const char * name)70 static int32_t AudioAdapterCheckPortFlow(const char *name)
71 {
72 uint32_t len;
73
74 if (name == NULL) {
75 LOG_FUN_ERR("Invalid parameter!\n");
76
77 return HDF_ERR_INVALID_PARAM;
78 }
79
80 len = strlen(name);
81 if (len == 0) {
82 LOG_FUN_ERR("port name is null!\n");
83
84 return HDF_FAILURE;
85 } else if (len >= PORT_NAME_LEN) {
86 LOG_FUN_ERR("port name is too long!\n");
87
88 return HDF_FAILURE;
89 } else {
90 /* Nothing to do */
91 }
92
93 if (strcmp(name, "AIP") && strcmp(name, "AOP") && strcmp(name, "AIOP")) {
94 LOG_FUN_ERR("Incorrect port name: [ %s ]!\n", name);
95
96 return HDF_FAILURE;
97 }
98
99 return HDF_SUCCESS;
100 }
101
AudioAdapterCheckName(const char * name)102 static int32_t AudioAdapterCheckName(const char *name)
103 {
104 uint32_t len;
105
106 if (name == NULL) {
107 LOG_FUN_ERR("Invalid parameter!\n");
108
109 return HDF_ERR_INVALID_PARAM;
110 }
111
112 len = strlen(name);
113 if (len == 0) {
114 LOG_FUN_ERR("adapter name is null!\n");
115
116 return HDF_FAILURE;
117 } else if (len >= ADAPTER_NAME_LEN) {
118 LOG_FUN_ERR("adapter name is too long!\n");
119
120 return HDF_FAILURE;
121 } else {
122 /* Nothing to do */
123 }
124
125 if (!isalpha(*name++)) { // Names must begin with a letter
126 LOG_FUN_ERR("The adapter name of the illegal!\n");
127
128 return HDF_FAILURE;
129 }
130
131 while (*name != '\0') {
132 if (*name == '_') {
133 name++;
134 continue;
135 }
136
137 if (!isalnum(*name++)) {
138 LOG_FUN_ERR("The adapter name of the illegal!\n");
139
140 return HDF_FAILURE;
141 }
142 }
143
144 return HDF_SUCCESS;
145 }
146
AudioAdapterExist(const char * adapterName)147 int32_t AudioAdapterExist(const char *adapterName)
148 {
149 if (adapterName == NULL) {
150 LOG_FUN_ERR("Invalid parameter!\n");
151
152 return HDF_ERR_INVALID_PARAM;
153 }
154 if (g_audioAdapterDescs == NULL || g_adapterNum <= 0 || g_adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
155 LOG_FUN_ERR("no adapter info");
156
157 return HDF_FAILURE;
158 }
159 for (int i = 0; i < g_adapterNum; i++) {
160 if (strcmp(adapterName, g_audioAdapterDescs[i].adapterName) == 0) {
161 return HDF_SUCCESS;
162 }
163 }
164
165 return HDF_FAILURE;
166 }
167
AudioAdapterPortSync(struct AudioPort * outPorts,struct AudioPort * desPorts,uint32_t portNum)168 static int32_t AudioAdapterPortSync(struct AudioPort *outPorts,
169 struct AudioPort *desPorts, uint32_t portNum)
170 {
171 uint32_t index;
172 int32_t ret;
173
174 if (outPorts == NULL || desPorts == NULL ||
175 portNum == 0 || portNum > SUPPORT_PORT_NUM_MAX) {
176 LOG_FUN_ERR("Invalid parameter!\n");
177
178 return HDF_ERR_INVALID_PARAM;
179 }
180
181 for (index = 0; index < portNum; index++) {
182 if (outPorts[index].portName && desPorts[index].portName) {
183 ret = memcpy_s((void *)outPorts[index].portName, PORT_NAME_LEN,
184 desPorts[index].portName, strlen(desPorts[index].portName));
185 if (ret != EOK) {
186 LOG_FUN_ERR("memcpy_s port name fail!\n");
187
188 return HDF_FAILURE;
189 }
190 outPorts[index].dir = desPorts[index].dir;
191 outPorts[index].portId = desPorts[index].portId;
192 }
193 }
194
195 return HDF_SUCCESS;
196 }
197
AudioAdaptersSync(void)198 static int32_t AudioAdaptersSync(void)
199 {
200 int32_t i, ret;
201
202 if (g_audioAdapterDescs == NULL || g_audioAdapterOut == NULL ||
203 g_adapterNum <= 0 || g_adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
204 return HDF_FAILURE;
205 }
206
207 for (i = 0; i < g_adapterNum; i++) {
208 if (g_audioAdapterDescs[i].adapterName &&
209 g_audioAdapterOut[i].adapterName) {
210 ret = memcpy_s((void *)g_audioAdapterOut[i].adapterName, ADAPTER_NAME_LEN,
211 g_audioAdapterDescs[i].adapterName,
212 strlen(g_audioAdapterDescs[i].adapterName));
213 if (ret != EOK) {
214 LOG_FUN_ERR("memcpy_s adapter name fail!\n");
215
216 return HDF_FAILURE;
217 }
218
219 g_audioAdapterOut[i].portNum = g_audioAdapterDescs[i].portNum;
220 ret = AudioAdapterPortSync(g_audioAdapterOut[i].ports,
221 g_audioAdapterDescs[i].ports, g_audioAdapterOut[i].portNum);
222 if (ret != HDF_SUCCESS) {
223 LOG_FUN_ERR("port sync fail!\n");
224
225 return HDF_FAILURE;
226 }
227 }
228 }
229
230 return HDF_SUCCESS;
231 }
232
AudioAdapterJudegReleaseDescs(const struct AudioAdapterDescriptor * desc)233 static void AudioAdapterJudegReleaseDescs(const struct AudioAdapterDescriptor *desc)
234 {
235 uint32_t portIdx;
236
237 if (desc == NULL) {
238 return;
239 }
240
241 if (desc->adapterName != NULL) {
242 AudioMemFree((void **)&desc->adapterName);
243 }
244
245 if (desc->ports != NULL) {
246 portIdx = 0;
247 if (desc->portNum <= 0 || desc->portNum > SUPPORT_PORT_NUM_MAX) {
248 LOG_FUN_ERR("desc->portNum error!\n");
249 AudioMemFree((void **)&desc->ports);
250
251 return;
252 }
253
254 while (portIdx < desc->portNum) {
255 if (desc->ports[portIdx].portName != NULL) {
256 AudioMemFree((void **)&desc->ports[portIdx].portName);
257 }
258 portIdx++;
259 }
260 AudioMemFree((void **)&desc->ports);
261 }
262 }
263
AudioAdapterReleaseDescs(struct AudioAdapterDescriptor * descs,int32_t adapterNum)264 static void AudioAdapterReleaseDescs(struct AudioAdapterDescriptor *descs, int32_t adapterNum)
265 {
266 int32_t adapterIdx = 0;
267
268 if (descs == NULL || adapterNum <= 0 || adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
269 return;
270 }
271
272 if (adapterNum > g_adapterNum) {
273 adapterNum = g_adapterNum;
274 }
275
276 while (adapterIdx < adapterNum) {
277 AudioAdapterJudegReleaseDescs(&descs[adapterIdx]);
278 adapterIdx++;
279 }
280
281 AudioMemFree((void **)&descs);
282 }
283
AudioAdapterGetDir(char * dir)284 static int32_t AudioAdapterGetDir(char *dir)
285 {
286 if (dir == NULL) {
287 return HDF_FAILURE;
288 }
289 if (strcmp(dir, "PORT_OUT") == 0) {
290 return PORT_OUT;
291 } else if (strcmp(dir, "PORT_IN") == 0) {
292 return PORT_IN;
293 } else if (strcmp(dir, "PORT_OUT_IN") == 0) {
294 return PORT_OUT_IN;
295 } else {
296 return HDF_FAILURE;
297 }
298 }
299
AudioAdaptersGetArraySize(cJSON * cJsonObj,int * size)300 static int32_t AudioAdaptersGetArraySize(cJSON *cJsonObj, int *size)
301 {
302 int adapterArraySize;
303
304 if (cJsonObj == NULL || size == NULL) {
305 LOG_FUN_ERR("Invalid parameter!\n");
306
307 return HDF_ERR_INVALID_PARAM;
308 }
309
310 /* Follow the new adapterNum by the number of actual parses */
311 adapterArraySize = cJSON_GetArraySize(cJsonObj);
312 if (adapterArraySize <= 0) {
313 LOG_FUN_ERR("Failed to get JSON array size!\n");
314
315 return HDF_FAILURE;
316 }
317 *size = adapterArraySize;
318
319 return HDF_SUCCESS;
320 }
321
AudioAdapterParsePort(struct AudioPort * info,cJSON * port)322 static int32_t AudioAdapterParsePort(struct AudioPort *info, cJSON *port)
323 {
324 int32_t ret;
325 uint32_t tmpId;
326 cJSON *portDir = NULL;
327 cJSON *portID = NULL;
328 cJSON *portName = NULL;
329
330 if (info == NULL || port == NULL) {
331 LOG_FUN_ERR("Invalid parameter!\n");
332
333 return HDF_ERR_INVALID_PARAM;
334 }
335
336 portDir = cJSON_GetObjectItem(port, "dir");
337 if (portDir == NULL) {
338 return HDF_FAILURE;
339 }
340 ret = AudioAdapterGetDir(portDir->valuestring);
341 if (ret == HDF_FAILURE) {
342 LOG_FUN_ERR("port dir error!\n");
343
344 return ret;
345 }
346 info->dir = ret;
347
348 portID = cJSON_GetObjectItem(port, "id");
349 if (portID == NULL) {
350 return HDF_FAILURE;
351 }
352 tmpId = portID->valueint;
353 if (tmpId < 0 || tmpId > SUPPORT_PORT_ID_MAX) {
354 LOG_FUN_ERR("portID error!\n");
355
356 return HDF_FAILURE;
357 }
358 info->portId = (uint32_t)tmpId;
359
360 portName = cJSON_GetObjectItem(port, "name");
361 if (portName == NULL || portName->valuestring == NULL) {
362 return HDF_FAILURE;
363 }
364 ret = AudioAdapterCheckPortFlow(portName->valuestring);
365 if (ret != HDF_SUCCESS) {
366 LOG_FUN_ERR("Port name error!\n");
367
368 return ret;
369 }
370 info->portName = (char *)calloc(1, PORT_NAME_LEN);
371 if (info->portName == NULL) {
372 LOG_FUN_ERR("Out of memory\n");
373
374 return HDF_ERR_MALLOC_FAIL;
375 }
376 ret = memcpy_s((void *)info->portName, PORT_NAME_LEN,
377 portName->valuestring, strlen(portName->valuestring));
378 if (ret != EOK) {
379 LOG_FUN_ERR("memcpy_s port name fail");
380
381 return HDF_FAILURE;
382 }
383
384 return HDF_SUCCESS;
385 }
386
AudioAdapterParsePorts(struct AudioAdapterDescriptor * desc,cJSON * adapter)387 static int32_t AudioAdapterParsePorts(struct AudioAdapterDescriptor *desc, cJSON *adapter)
388 {
389 uint32_t i;
390 int32_t ret, tmpNum;
391 cJSON *adapterPort = NULL;
392 int32_t realSize = 0;
393 if (desc == NULL || adapter == NULL) {
394 LOG_FUN_ERR("Invalid parameter!\n");
395
396 return HDF_ERR_INVALID_PARAM;
397 }
398 cJSON *adapterPortNum = cJSON_GetObjectItem(adapter, "portnum");
399 if (adapterPortNum == NULL) {
400 return HDF_FAILURE;
401 }
402 tmpNum = cJSON_GetNumberValue(adapterPortNum);
403 if (tmpNum <= 0 || tmpNum > SUPPORT_PORT_NUM_MAX) {
404 LOG_FUN_ERR("portnum error!\n");
405
406 return HDF_FAILURE;
407 }
408 desc->portNum = (uint32_t)tmpNum;
409
410 cJSON *adapterPorts = cJSON_GetObjectItem(adapter, "port");
411 if (adapterPorts == NULL) {
412 return HDF_FAILURE;
413 }
414 ret = AudioAdaptersGetArraySize(adapterPorts, &realSize);
415 if (ret != HDF_SUCCESS || realSize != desc->portNum) {
416 LOG_FUN_ERR("realSize = %d, portNum = %d.\n", realSize, desc->portNum);
417 LOG_FUN_ERR("The defined portnum does not match the actual portnum!\n");
418
419 return HDF_FAILURE;
420 }
421
422 desc->ports = (struct AudioPort *)calloc(1, desc->portNum * sizeof(struct AudioPort));
423 if (desc->ports == NULL) {
424 LOG_FUN_ERR("Out of memory!\n");
425
426 return HDF_ERR_MALLOC_FAIL;
427 }
428 for (i = 0; i < desc->portNum; i++) {
429 adapterPort = cJSON_GetArrayItem(adapterPorts, i);
430 if (adapterPort) {
431 ret = AudioAdapterParsePort(&desc->ports[i], adapterPort);
432 if (ret != HDF_SUCCESS) {
433 return ret;
434 }
435 }
436 }
437 return HDF_SUCCESS;
438 }
439
AudioAdapterParseAdapter(struct AudioAdapterDescriptor * desc,cJSON * adapter)440 static int32_t AudioAdapterParseAdapter(struct AudioAdapterDescriptor *desc,
441 cJSON *adapter)
442 {
443 int32_t ret;
444
445 if (desc == NULL || adapter == NULL) {
446 LOG_FUN_ERR("Invalid parameter!\n");
447
448 return HDF_ERR_INVALID_PARAM;
449 }
450
451 cJSON *adapterName = cJSON_GetObjectItem(adapter, "name");
452 if (adapterName == NULL || adapterName->valuestring == NULL) {
453 return HDF_FAILURE;
454 }
455 ret = AudioAdapterCheckName(adapterName->valuestring);
456 if (ret != HDF_SUCCESS) {
457 LOG_FUN_ERR("The Adapter name is incorrect!\n");
458
459 return ret;
460 }
461
462 desc->adapterName = (char *)calloc(1, ADAPTER_NAME_LEN);
463 if (desc->adapterName == NULL) {
464 LOG_FUN_ERR("Out of memory!\n");
465
466 return HDF_ERR_MALLOC_FAIL;
467 }
468 ret = memcpy_s((void *)desc->adapterName, ADAPTER_NAME_LEN,
469 adapterName->valuestring, strlen(adapterName->valuestring));
470 if (ret != EOK) {
471 LOG_FUN_ERR("memcpy_s adapter name fail!\n");
472
473 return HDF_FAILURE;
474 }
475
476 ret = AudioAdapterParsePorts(desc, adapter);
477 if (ret != HDF_SUCCESS) {
478 return ret;
479 }
480
481 return HDF_SUCCESS;
482 }
483
AudioAdaptersGetConfig(const char * fpath)484 static char *AudioAdaptersGetConfig(const char *fpath)
485 {
486 char *pJsonStr = NULL;
487
488 if (fpath == NULL || access(fpath, F_OK | R_OK)) {
489 /* The file path is bad or unreadable */
490 return NULL;
491 }
492 FILE *fp = fopen(fpath, "r");
493 if (fp == NULL) {
494 LOG_FUN_ERR("Can not open config file [ %s ].\n", fpath);
495 return NULL;
496 }
497 fseek(fp, 0, SEEK_END);
498 int32_t jsonStrSize = ftell(fp);
499 if (jsonStrSize <= 0) {
500 fclose(fp);
501 return NULL;
502 }
503 rewind(fp);
504 if (jsonStrSize > CONFIG_FILE_SIZE_MAX) {
505 LOG_FUN_ERR("The configuration file is too large to load!\n");
506 fclose(fp);
507 return NULL;
508 }
509 pJsonStr = (char *)calloc(1, (uint32_t)jsonStrSize);
510 if (NULL == pJsonStr) {
511 fclose(fp);
512 return NULL;
513 }
514 if (fread(pJsonStr, jsonStrSize, 1, fp) != 1) {
515 LOG_FUN_ERR("read to file fail!");
516 fclose(fp);
517 AudioMemFree((void **)&pJsonStr);
518 return NULL;
519 }
520 fclose(fp);
521 return pJsonStr;
522 }
523
AudioAdaptersGetConfigToJsonObj(const char * fpath)524 cJSON *AudioAdaptersGetConfigToJsonObj(const char *fpath)
525 {
526 char *pJsonStr = AudioAdaptersGetConfig(fpath);
527 if (pJsonStr == NULL) {
528 return NULL;
529 }
530 cJSON *cJsonObj = cJSON_Parse(pJsonStr);
531 if (cJsonObj == NULL) {
532 AudioMemFree((void **)&pJsonStr);
533 return NULL;
534 }
535 AudioMemFree((void **)&pJsonStr);
536 cJSON *adapterNum = cJSON_GetObjectItem(cJsonObj, "adapterNum");
537 if (adapterNum == NULL) {
538 cJSON_Delete(cJsonObj);
539 return NULL;
540 }
541 g_adapterNum = adapterNum->valueint;
542 if (g_adapterNum <= 0 || g_adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
543 LOG_FUN_ERR("Adapter number error!\n");
544 cJSON_Delete(cJsonObj);
545 return NULL;
546 }
547 return cJsonObj;
548 }
549
AudioAdaptersSetAdapter(struct AudioAdapterDescriptor ** descs,int32_t adapterNum,cJSON * adaptersObj)550 static int32_t AudioAdaptersSetAdapter(struct AudioAdapterDescriptor **descs,
551 int32_t adapterNum, cJSON *adaptersObj)
552 {
553 int32_t i, ret;
554 cJSON *adapterObj = NULL;
555
556 if (descs == NULL || adaptersObj == NULL ||
557 adapterNum <= 0 || adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
558 LOG_FUN_ERR("Invalid parameter!\n");
559
560 return HDF_ERR_INVALID_PARAM;
561 }
562 if (*descs != NULL) {
563 /* Existing content is no longer assigned twice */
564 return HDF_SUCCESS;
565 }
566
567 *descs = (struct AudioAdapterDescriptor *)calloc(1,
568 adapterNum * sizeof(struct AudioAdapterDescriptor));
569 if (*descs == NULL) {
570 LOG_FUN_ERR("calloc g_audioAdapterDescs failed");
571
572 return HDF_ERR_MALLOC_FAIL;
573 }
574
575 for (i = 0; i < adapterNum; i++) {
576 adapterObj = cJSON_GetArrayItem(adaptersObj, i);
577 if (adapterObj) {
578 ret = AudioAdapterParseAdapter(&(*descs)[i], adapterObj);
579 if (ret != HDF_SUCCESS) {
580 AudioAdapterReleaseDescs(*descs, adapterNum);
581 *descs = NULL;
582
583 return HDF_FAILURE;
584 }
585 }
586 }
587
588 return HDF_SUCCESS;
589 }
590
AudioAdaptersNamesRepair(void)591 static void AudioAdaptersNamesRepair(void)
592 {
593 int i, realNum;
594
595 if (g_audioAdapterOut == NULL ||
596 g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
597 return;
598 }
599
600 realNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
601 for (i = 0; i < realNum; i++) {
602 if (g_adaptersName[i] == NULL) {
603 return;
604 }
605
606 if (strcmp(g_audioAdapterOut[i].adapterName, g_audioAdapterDescs[i].adapterName)) {
607 /* Retrieve the location of the port name */
608 g_audioAdapterOut[i].adapterName = g_adaptersName[i];
609 }
610 }
611 }
612
AudioPortsNamesRepair(void)613 static void AudioPortsNamesRepair(void)
614 {
615 int i, j, adapterNum, portNum;
616
617 if (g_audioAdapterOut == NULL ||
618 g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
619 return;
620 }
621
622 adapterNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
623 for (i = 0; i < adapterNum; i++) {
624 portNum = (g_audioAdapterOut[i].portNum < SUPPORT_PORT_NUM_MAX) ?
625 g_audioAdapterOut[i].portNum : SUPPORT_PORT_NUM_MAX;
626 for (j = 0; j < portNum; j++) {
627 if (g_portsName[i][j] == NULL) {
628 return;
629 }
630 if (strcmp(g_audioAdapterOut[i].ports[j].portName, g_audioAdapterDescs[i].ports[j].portName)) {
631 /* Retrieve the location of the sound card name */
632 g_audioAdapterOut[i].ports[j].portName = g_portsName[i][j];
633 }
634 }
635 }
636 }
637
AudioAdaptersNamesRecord(void)638 static void AudioAdaptersNamesRecord(void)
639 {
640 int i, currentNum;
641
642 if (g_audioAdapterOut == NULL ||
643 g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
644 return;
645 }
646
647 currentNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
648 for (i = 0; i < currentNum; i++) {
649 /* Record the location of the sound card name */
650 g_adaptersName[i] = g_audioAdapterOut[i].adapterName;
651 }
652 }
653
AudioPortsNamesRecord(void)654 static void AudioPortsNamesRecord(void)
655 {
656 int i, j, adapterCurNum, portCurNum;
657
658 if (g_audioAdapterOut == NULL || g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
659 return;
660 }
661
662 adapterCurNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
663 for (i = 0; i < adapterCurNum; i++) {
664 portCurNum = (g_audioAdapterOut[i].portNum < SUPPORT_PORT_NUM_MAX) ?
665 g_audioAdapterOut[i].portNum : SUPPORT_PORT_NUM_MAX;
666 for (j = 0; j < portCurNum; j++) {
667 /* Record the location of the port name */
668 g_portsName[i][j] = g_audioAdapterOut[i].ports[j].portName;
669 }
670 }
671 }
672
AudioAdaptersForUser(struct AudioAdapterDescriptor ** descs,int * size)673 int32_t AudioAdaptersForUser(struct AudioAdapterDescriptor **descs, int *size)
674 {
675 int32_t realSize;
676
677 if (descs == NULL || size == NULL) {
678 return HDF_ERR_INVALID_PARAM;
679 }
680 if (g_audioAdapterDescs != NULL && g_audioAdapterOut != NULL &&
681 g_adapterNum > 0 && g_adapterNum <= SUPPORT_ADAPTER_NUM_MAX) {
682 AudioAdaptersNamesRepair();
683 AudioPortsNamesRepair();
684 /* Existing content is no longer assigned twice */
685 *descs = g_audioAdapterOut;
686 *size = g_adapterNum;
687
688 return HDF_SUCCESS;
689 }
690 cJSON *cJsonObj = AudioAdaptersGetConfigToJsonObj(AUDIO_ADAPTER_CONFIG);
691 if (cJsonObj == NULL) {
692 return HDF_FAILURE;
693 }
694 cJSON *adaptersObj = cJSON_GetObjectItem(cJsonObj, "adapters");
695 if (adaptersObj == NULL) {
696 cJSON_Delete(cJsonObj);
697
698 return HDF_FAILURE;
699 }
700 if (AudioAdaptersGetArraySize(adaptersObj, &realSize) != HDF_SUCCESS || realSize != g_adapterNum) {
701 LOG_FUN_ERR("realSize = %d, adaptersNum = %d.\n", realSize, g_adapterNum);
702 LOG_FUN_ERR("The defined adaptersnum does not match the actual adapters!\n");
703 g_adapterNum = 0;
704 cJSON_Delete(cJsonObj);
705
706 return HDF_FAILURE;
707 }
708 if (AudioAdaptersSetAdapter(&g_audioAdapterDescs, g_adapterNum, adaptersObj) != HDF_SUCCESS) {
709 g_adapterNum = 0;
710 cJSON_Delete(cJsonObj);
711
712 return HDF_FAILURE;
713 }
714 if (AudioAdaptersSetAdapter(&g_audioAdapterOut, g_adapterNum, adaptersObj) != HDF_SUCCESS) {
715 /* g_audioAdapterOut failure also releases g_audioAdapterDescs */
716 AudioAdapterReleaseDescs(g_audioAdapterDescs, g_adapterNum);
717 ClearAdaptersAllName();
718 g_audioAdapterDescs = NULL;
719 g_adapterNum = 0;
720 cJSON_Delete(cJsonObj);
721
722 return HDF_FAILURE;
723 }
724 AudioAdaptersNamesRecord();
725 AudioPortsNamesRecord();
726 *descs = g_audioAdapterOut;
727 *size = g_adapterNum;
728 cJSON_Delete(cJsonObj);
729
730 return HDF_SUCCESS;
731 }
732
733 static enum AudioFormat g_formatIdZero = AUDIO_FORMAT_PCM_16_BIT;
HdmiPortInit(struct AudioPort portIndex,struct AudioPortCapability * capabilityIndex)734 int32_t HdmiPortInit(struct AudioPort portIndex, struct AudioPortCapability *capabilityIndex)
735 {
736 if (capabilityIndex == NULL) {
737 LOG_FUN_ERR("capabilityIndex Is NULL");
738 return HDF_FAILURE;
739 }
740 capabilityIndex->hardwareMode = true;
741 capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
742 capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
743 capabilityIndex->deviceType = portIndex.dir;
744 capabilityIndex->deviceId = PIN_OUT_SPEAKER;
745 capabilityIndex->formatNum = 1;
746 capabilityIndex->formats = &g_formatIdZero;
747 capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000 | AUDIO_SAMPLE_RATE_MASK_24000;
748 capabilityIndex->subPortsNum = 1;
749 capabilityIndex->subPorts = (struct AudioSubPortCapability *)calloc(capabilityIndex->subPortsNum,
750 sizeof(struct AudioSubPortCapability));
751 if (capabilityIndex->subPorts == NULL) {
752 LOG_FUN_ERR("The pointer is null!");
753 return HDF_FAILURE;
754 }
755 capabilityIndex->subPorts->portId = portIndex.portId;
756 capabilityIndex->subPorts->desc = portIndex.portName;
757 capabilityIndex->subPorts->mask = PORT_PASSTHROUGH_LPCM;
758 return HDF_SUCCESS;
759 }
760
FormatToBits(enum AudioFormat format,uint32_t * formatBits)761 int32_t FormatToBits(enum AudioFormat format, uint32_t *formatBits)
762 {
763 if (formatBits == NULL) {
764 return HDF_FAILURE;
765 }
766 switch (format) {
767 case AUDIO_FORMAT_PCM_32_BIT:
768 *formatBits = BIT_NUM_32;
769 return HDF_SUCCESS;
770 case AUDIO_FORMAT_PCM_24_BIT:
771 *formatBits = BIT_NUM_24;
772 return HDF_SUCCESS;
773 case AUDIO_FORMAT_PCM_16_BIT:
774 *formatBits = BIT_NUM_16;
775 return HDF_SUCCESS;
776 case AUDIO_FORMAT_PCM_8_BIT:
777 *formatBits = BIT_NUM_8;
778 return HDF_SUCCESS;
779 default:
780 return HDF_ERR_NOT_SUPPORT;
781 }
782 }
783
BitsToFormat(enum AudioFormat * format,long formatBits)784 int32_t BitsToFormat(enum AudioFormat *format, long formatBits)
785 {
786 if (format == NULL) {
787 return HDF_FAILURE;
788 }
789 switch (formatBits) {
790 case BIT_NUM_32:
791 *format = AUDIO_FORMAT_PCM_32_BIT;
792 return HDF_SUCCESS;
793 case BIT_NUM_24:
794 *format = AUDIO_FORMAT_PCM_24_BIT;
795 return HDF_SUCCESS;
796 case BIT_NUM_16:
797 *format = AUDIO_FORMAT_PCM_16_BIT;
798 return HDF_SUCCESS;
799 case BIT_NUM_8:
800 *format = AUDIO_FORMAT_PCM_8_BIT;
801 return HDF_SUCCESS;
802 default:
803 return HDF_ERR_NOT_SUPPORT;
804 }
805 }
806
CheckAttrRoute(long param)807 int32_t CheckAttrRoute(long param)
808 {
809 if (param < DEEP_BUFF || param > LOW_LATRNCY) {
810 return HDF_FAILURE;
811 }
812 return HDF_SUCCESS;
813 }
814
CheckAttrChannel(unsigned long param)815 int32_t CheckAttrChannel(unsigned long param)
816 {
817 if (param != 1 && param != 2) { // channel 1 and 2
818 return HDF_FAILURE;
819 }
820 return HDF_SUCCESS;
821 }
822
TransferRoute(char * value,int32_t * route)823 int32_t TransferRoute(char *value, int32_t *route)
824 {
825 if (value == NULL || route == NULL) {
826 return HDF_FAILURE;
827 }
828 char *endptr = NULL;
829 errno = 0;
830 long tempRoute = strtol(value, &endptr, DECIMAL_SYSTEM);
831 if ((errno == ERANGE && (tempRoute == LONG_MAX || tempRoute == LONG_MIN)) || (errno != 0 && tempRoute == 0)) {
832 return HDF_FAILURE;
833 }
834 int32_t ret = CheckAttrRoute(tempRoute);
835 if (ret == 0) {
836 *route = tempRoute;
837 }
838 return ret;
839 }
840
TransferFormat(char * value,int32_t * format)841 int32_t TransferFormat(char *value, int32_t *format)
842 {
843 if (value == NULL || format == NULL) {
844 return HDF_FAILURE;
845 }
846 char *endptr = NULL;
847 errno = 0;
848 long tempFormat = strtol(value, &endptr, DECIMAL_SYSTEM);
849 if ((errno == ERANGE && (tempFormat == LONG_MAX || tempFormat == LONG_MIN)) || (errno != 0 && tempFormat == 0)) {
850 return HDF_FAILURE;
851 }
852 enum AudioFormat audioFormat;
853 int32_t ret = BitsToFormat(&audioFormat, tempFormat);
854 if (ret == HDF_SUCCESS) {
855 ret = CheckAttrFormat(audioFormat);
856 if (ret == 0) {
857 *format = audioFormat;
858 }
859 }
860 return ret;
861 }
862
TransferChannels(char * value,uint32_t * channels)863 int32_t TransferChannels(char *value, uint32_t *channels)
864 {
865 if (value == NULL || channels == NULL) {
866 return HDF_FAILURE;
867 }
868 char *endptr = NULL;
869 errno = 0;
870 unsigned long tempChannels = strtoul(value, &endptr, DECIMAL_SYSTEM);
871 if ((errno == ERANGE && (tempChannels == ULONG_MAX)) || (errno != 0 && tempChannels == 0)) {
872 return HDF_FAILURE;
873 }
874 int32_t ret = CheckAttrChannel(tempChannels);
875 if (ret == 0) {
876 *channels = tempChannels;
877 }
878 return ret;
879 }
880
TransferFrames(char * value,uint64_t * frames)881 int32_t TransferFrames(char *value, uint64_t *frames)
882 {
883 if (value == NULL || frames == NULL) {
884 return HDF_FAILURE;
885 }
886 char *endptr = NULL;
887 errno = 0;
888 uint64_t tempFrames = strtoull(value, &endptr, 10);
889 if ((errno == ERANGE && (tempFrames == ULLONG_MAX)) || (errno != 0 && tempFrames == 0)) {
890 return HDF_FAILURE;
891 } else {
892 *frames = tempFrames;
893 return HDF_SUCCESS;
894 }
895 }
896
TransferSampleRate(char * value,uint32_t * sampleRate)897 int32_t TransferSampleRate(char *value, uint32_t *sampleRate)
898 {
899 if (value == NULL || sampleRate == NULL) {
900 return HDF_FAILURE;
901 }
902 char *endptr = NULL;
903 errno = 0;
904 unsigned long tempSampleRate = strtoul(value, &endptr, DECIMAL_SYSTEM);
905 if ((errno == ERANGE && (tempSampleRate == ULONG_MAX)) || (errno != 0 && tempSampleRate == 0)) {
906 return HDF_FAILURE;
907 }
908 int32_t ret = CheckAttrSamplingRate(tempSampleRate);
909 if (ret == 0) {
910 *sampleRate = tempSampleRate;
911 }
912 return ret;
913 }
914
KeyValueListToMap(const char * keyValueList,struct ParamValMap mParamValMap[],int32_t * count)915 int32_t KeyValueListToMap(const char *keyValueList, struct ParamValMap mParamValMap[], int32_t *count)
916 {
917 if (NULL == keyValueList || mParamValMap == NULL || NULL == count) {
918 return HDF_FAILURE;
919 }
920 int i = 0;
921 char *mParaMap[MAP_MAX];
922 char buffer[ERROR_REASON_DESC_LEN] = {0};
923 int32_t ret = sprintf_s(buffer, ERROR_REASON_DESC_LEN - 1, "%s", keyValueList);
924 if (ret < 0) {
925 LOG_FUN_ERR("sprintf_s failed!");
926 return HDF_FAILURE;
927 }
928 char *tempBuf = buffer;
929 char *outPtr = NULL;
930 char *inPtr = NULL;
931 while (((mParaMap[i] = strtok_r(tempBuf, ";", &outPtr)) != NULL) && i < MAP_MAX) {
932 tempBuf = mParaMap[i];
933 if ((mParaMap[i] = strtok_r(tempBuf, "=", &inPtr)) != NULL) {
934 ret = strncpy_s(mParamValMap[i].key, EXTPARAM_LEN - 1, mParaMap[i], strlen(mParaMap[i]) + 1);
935 if (ret != 0) {
936 return HDF_FAILURE;
937 }
938 tempBuf = NULL;
939 }
940 if ((mParaMap[i] = strtok_r(tempBuf, "=", &inPtr)) != NULL) {
941 ret = strncpy_s(mParamValMap[i].value, EXTPARAM_LEN - 1, mParaMap[i], strlen(mParaMap[i]) + 1);
942 if (ret != 0) {
943 return HDF_FAILURE;
944 }
945 tempBuf = NULL;
946 }
947 tempBuf = NULL;
948 i++;
949 }
950 *count = i;
951 return HDF_SUCCESS;
952 }
953
AddElementToList(char * keyValueList,int32_t listLenth,const char * key,void * value)954 int32_t AddElementToList(char *keyValueList, int32_t listLenth, const char *key, void *value)
955 {
956 if (NULL == keyValueList || NULL == key || NULL == value) {
957 return HDF_FAILURE;
958 }
959 int32_t ret = HDF_FAILURE;
960 char strValue[MAP_MAX] = { 0 };
961 if (strcmp(key, AUDIO_ATTR_PARAM_ROUTE) == 0) {
962 ret = sprintf_s(strValue, sizeof(strValue), "%s=%d;", key, *((int32_t *)value));
963 } else if (strcmp(key, AUDIO_ATTR_PARAM_FORMAT) == 0) {
964 uint32_t formatBits = 0;
965 ret = FormatToBits((enum AudioFormat)(*((int32_t *)value)), &formatBits);
966 if (ret == 0) {
967 ret = sprintf_s(strValue, sizeof(strValue), "%s=%u;", key, formatBits);
968 }
969 } else if (strcmp(key, AUDIO_ATTR_PARAM_CHANNELS) == 0) {
970 ret = sprintf_s(strValue, sizeof(strValue), "%s=%u;", key, *((uint32_t *)value));
971 } else if (strcmp(key, AUDIO_ATTR_PARAM_FRAME_COUNT) == 0) {
972 ret = sprintf_s(strValue, sizeof(strValue), "%s=%llu;", key, *((uint64_t *)value));
973 } else if (strcmp(key, AUDIO_ATTR_PARAM_SAMPLING_RATE) == 0) {
974 ret = sprintf_s(strValue, sizeof(strValue), "%s=%u", key, *((uint32_t *)value));
975 } else {
976 LOG_FUN_ERR("NO this key correspond value!");
977 return HDF_FAILURE;
978 }
979 if (ret < 0) {
980 LOG_FUN_ERR("sprintf_s failed!");
981 return HDF_FAILURE;
982 }
983 ret = strncat_s(keyValueList, listLenth - 1, strValue, strlen(strValue));
984 if (ret < 0) {
985 LOG_FUN_ERR("strcat_s failed!");
986 return HDF_FAILURE;
987 }
988
989 return HDF_SUCCESS;
990 }
991
SetExtParam(const char * key,char * value,struct ExtraParams * mExtraParams)992 int32_t SetExtParam(const char *key, char *value, struct ExtraParams *mExtraParams)
993 {
994 if (key == NULL || value == NULL || mExtraParams == NULL) {
995 return HDF_FAILURE;
996 }
997 int ret = HDF_FAILURE;
998 if (strcmp(key, AUDIO_ATTR_PARAM_ROUTE) == 0) {
999 int32_t route;
1000 ret = TransferRoute(value, &route);
1001 if (ret < 0) {
1002 return HDF_FAILURE;
1003 }
1004 mExtraParams->route = route;
1005 } else if (strcmp(key, AUDIO_ATTR_PARAM_FORMAT) == 0) {
1006 int32_t format;
1007 ret = TransferFormat(value, &format);
1008 if (ret < 0) {
1009 return HDF_FAILURE;
1010 }
1011 mExtraParams->format = format;
1012 } else if (strcmp(key, AUDIO_ATTR_PARAM_CHANNELS) == 0) {
1013 uint32_t channels;
1014 ret = TransferChannels(value, &channels);
1015 if (ret < 0) {
1016 return HDF_FAILURE;
1017 }
1018 mExtraParams->channels = channels;
1019 } else if (strcmp(key, AUDIO_ATTR_PARAM_FRAME_COUNT) == 0) {
1020 uint64_t frames;
1021 ret = TransferFrames(value, &frames);
1022 if (ret < 0) {
1023 return HDF_FAILURE;
1024 }
1025 mExtraParams->frames = frames;
1026 mExtraParams->flag = true;
1027 } else if (strcmp(key, AUDIO_ATTR_PARAM_SAMPLING_RATE) == 0) {
1028 uint32_t sampleRate = 0;
1029 ret = TransferSampleRate(value, &sampleRate);
1030 if (ret < 0) {
1031 return HDF_FAILURE;
1032 }
1033 mExtraParams->sampleRate = sampleRate;
1034 } else {
1035 LOG_FUN_ERR("NO this key correspond value or value is invalid!");
1036 return HDF_FAILURE;
1037 }
1038 return ret;
1039 }
1040
GetErrorReason(int reason,char * reasonDesc)1041 int32_t GetErrorReason(int reason, char *reasonDesc)
1042 {
1043 int32_t ret;
1044 if (NULL == reasonDesc) {
1045 return HDF_FAILURE;
1046 }
1047 switch (reason) {
1048 case HDF_FAILURE:
1049 ret = snprintf_s(reasonDesc, ERROR_REASON_DESC_LEN - 1, strlen("NOT SUPPORT") + 1, "%s", "NOT SUPPORT");
1050 break;
1051 case HDF_ERR_NOT_SUPPORT:
1052 ret = snprintf_s(reasonDesc, ERROR_REASON_DESC_LEN - 1, strlen("BUFFER FULL") + 1, "%s", "BUFFER FULL");
1053 break;
1054 default:
1055 ret = snprintf_s(reasonDesc, ERROR_REASON_DESC_LEN - 1, strlen("UNKNOW") + 1, "%s", "UNKNOW");
1056 break;
1057 }
1058 if (ret < 0) {
1059 LOG_FUN_ERR("sprintf_s failed!");
1060 return HDF_FAILURE;
1061 }
1062 return HDF_SUCCESS;
1063 }
GetCurrentTime(char * currentTime)1064 int32_t GetCurrentTime(char *currentTime)
1065 {
1066 if (NULL == currentTime) {
1067 return HDF_FAILURE;
1068 }
1069 // Get the current time
1070 char *week[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
1071 time_t timeSec;
1072 time(&timeSec);
1073 struct tm *specificTime = localtime(&timeSec);
1074 int32_t ret = sprintf_s(currentTime, ERROR_REASON_DESC_LEN - 1, "%d/%d/%d %s %d:%d:%d",
1075 (TIME_BASE_YEAR_1900 + specificTime->tm_year), (1 + specificTime->tm_mon), specificTime->tm_mday,
1076 week[specificTime->tm_wday], specificTime->tm_hour, specificTime->tm_min, specificTime->tm_sec);
1077 if (ret < 0) {
1078 LOG_FUN_ERR("sprintf_s failed!");
1079 return HDF_FAILURE;
1080 }
1081
1082 return HDF_SUCCESS;
1083 }
1084
1085