• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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