• 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_adapter_info_common.h"
17 #include <ctype.h>
18 #include <limits.h>
19 #include "cJSON.h"
20 #include "osal_mem.h"
21 #include "audio_uhdf_log.h"
22 
23 #define HDF_LOG_TAG HDF_AUDIO_HAL_IMPL
24 
25 #define AUDIO_ADAPTER_CONFIG    HDF_CONFIG_DIR"/audio_adapter.json"
26 #define ADAPTER_NAME_LEN        32
27 #define PORT_NAME_LEN           ADAPTER_NAME_LEN
28 #define SUPPORT_PORT_NUM_MAX    4
29 #define SUPPORT_PORT_ID_MAX     41
30 #define CONFIG_FILE_SIZE_MAX    (SUPPORT_ADAPTER_NUM_MAX * 1024 * 2)  // 16KB
31 #define CONFIG_CHANNEL_COUNT    2 // two channels
32 #define TIME_BASE_YEAR_1900     1900
33 #define DECIMAL_SYSTEM          10
34 #define MAX_ADDR_RECORD_NUM     (SUPPORT_ADAPTER_NUM_MAX * 3)
35 
36 int32_t g_adapterNum = 0;
37 struct AudioAdapterDescriptor *g_audioAdapterOut = NULL;
38 struct AudioAdapterDescriptor *g_audioAdapterDescs = NULL;
39 static const char *g_adaptersName[SUPPORT_ADAPTER_NUM_MAX] = {NULL};
40 static const char *g_portsName[SUPPORT_ADAPTER_NUM_MAX][SUPPORT_PORT_NUM_MAX] = {{NULL}};
41 
42 
43 struct AudioAddrDB g_localAudioAddrList[MAX_ADDR_RECORD_NUM];
44 bool g_fuzzCheckFlag = true;
45 
AudioSetFuzzCheckFlag(bool check)46 void AudioSetFuzzCheckFlag(bool check)
47 {
48     g_fuzzCheckFlag = check;
49     return;
50 }
51 
AudioAdapterAddrMgrInit()52 void AudioAdapterAddrMgrInit()
53 {
54     (void)memset_s(&g_localAudioAddrList, sizeof(g_localAudioAddrList), 0, sizeof(g_localAudioAddrList));
55     for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
56         g_localAudioAddrList[index].addrType = AUDIO_INVALID_ADDR;
57     }
58     return;
59 }
60 
AudioAddAdapterAddrToList(AudioHandle adapter,const struct AudioAdapterDescriptor * desc)61 int32_t AudioAddAdapterAddrToList(AudioHandle adapter, const struct AudioAdapterDescriptor *desc)
62 {
63     int pos = MAX_ADDR_RECORD_NUM;
64     if (adapter == NULL || desc == NULL || desc->adapterName == NULL) {
65         AUDIO_FUNC_LOGE("adapter or desc or desc->adapterName is null!");
66         return AUDIO_HAL_ERR_INVALID_OBJECT;
67     }
68     for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
69         if (g_localAudioAddrList[index].adapterName) {
70             if (!strcmp(g_localAudioAddrList[index].adapterName, desc->adapterName)) {
71                 AUDIO_FUNC_LOGE("The adapter has been loaded. Please reselect the adapter!");
72                 return AUDIO_HAL_ERR_NOTREADY;
73             } else {
74                 continue;
75             }
76         } else {
77             if (pos == MAX_ADDR_RECORD_NUM && (g_localAudioAddrList[index].addrType == AUDIO_INVALID_ADDR)) {
78                 pos = index;
79             }
80         }
81     }
82     if (pos < MAX_ADDR_RECORD_NUM) {
83         g_localAudioAddrList[pos].adapterName = desc->adapterName;
84         g_localAudioAddrList[pos].addrValue = adapter;
85         g_localAudioAddrList[pos].addrType = AUDIO_ADAPTER_ADDR;
86         return AUDIO_HAL_SUCCESS;
87     }
88     return AUDIO_HAL_ERR_INVALID_PARAM;
89 }
90 
AudioCheckAdapterAddr(AudioHandle adapter)91 int32_t AudioCheckAdapterAddr(AudioHandle adapter)
92 {
93     if (g_fuzzCheckFlag == false) {
94         return AUDIO_HAL_SUCCESS;
95     }
96     if (adapter != NULL) {
97         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
98             if (g_localAudioAddrList[index].addrValue == adapter &&
99                 g_localAudioAddrList[index].addrType == AUDIO_ADAPTER_ADDR) {
100                 return AUDIO_HAL_SUCCESS;
101             }
102         }
103         return AUDIO_HAL_ERR_INVALID_OBJECT;
104     }
105     return AUDIO_HAL_ERR_INVALID_PARAM;
106 }
107 
AudioDelAdapterAddrFromList(AudioHandle adapter)108 int32_t AudioDelAdapterAddrFromList(AudioHandle adapter)
109 {
110     if (adapter != NULL) {
111         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
112             if (g_localAudioAddrList[index].addrValue == adapter &&
113                 g_localAudioAddrList[index].addrType == AUDIO_ADAPTER_ADDR) {
114                 g_localAudioAddrList[index].addrValue = NULL;
115                 g_localAudioAddrList[index].adapterName = NULL;
116                 g_localAudioAddrList[index].addrType = AUDIO_INVALID_ADDR;
117                 return AUDIO_HAL_SUCCESS;
118             }
119         }
120         return AUDIO_HAL_ERR_INVALID_OBJECT;
121     }
122     return AUDIO_HAL_ERR_INVALID_PARAM;
123 }
124 
AudioAddRenderAddrToList(AudioHandle render)125 int32_t AudioAddRenderAddrToList(AudioHandle render)
126 {
127     if (render != NULL) {
128         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
129             if (g_localAudioAddrList[index].addrValue == NULL) {
130                 g_localAudioAddrList[index].addrValue = render;
131                 g_localAudioAddrList[index].addrType = AUDIO_RENDER_ADDR;
132                 return AUDIO_HAL_SUCCESS;
133             }
134         }
135         return AUDIO_HAL_ERR_INVALID_OBJECT;
136     }
137     return AUDIO_HAL_ERR_INVALID_PARAM;
138 }
139 
AudioCheckRenderAddr(AudioHandle render)140 int32_t AudioCheckRenderAddr(AudioHandle render)
141 {
142     if (g_fuzzCheckFlag == false) {
143         return AUDIO_HAL_SUCCESS;
144     }
145     if (render != NULL) {
146         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
147             if (g_localAudioAddrList[index].addrValue == render &&
148                 g_localAudioAddrList[index].addrType == AUDIO_RENDER_ADDR) {
149                 return AUDIO_HAL_SUCCESS;
150             }
151         }
152         return AUDIO_HAL_ERR_INVALID_OBJECT;
153     }
154     return AUDIO_HAL_ERR_INVALID_PARAM;
155 }
156 
AudioDelRenderAddrFromList(AudioHandle render)157 int32_t AudioDelRenderAddrFromList(AudioHandle render)
158 {
159     if (render != NULL) {
160         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
161             if (g_localAudioAddrList[index].addrValue == render &&
162                 g_localAudioAddrList[index].addrType == AUDIO_RENDER_ADDR) {
163                 g_localAudioAddrList[index].addrValue = NULL;
164                 g_localAudioAddrList[index].addrType = AUDIO_INVALID_ADDR;
165                 return AUDIO_HAL_SUCCESS;
166             }
167         }
168         return AUDIO_HAL_ERR_INVALID_OBJECT;
169     }
170     return AUDIO_HAL_ERR_INVALID_PARAM;
171 }
172 
AudioAddCaptureAddrToList(AudioHandle capture)173 int32_t AudioAddCaptureAddrToList(AudioHandle capture)
174 {
175     if (capture != NULL) {
176         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
177             if (g_localAudioAddrList[index].addrValue == NULL) {
178                 g_localAudioAddrList[index].addrValue = capture;
179                 g_localAudioAddrList[index].addrType = AUDIO_CAPTURE_ADDR;
180                 return AUDIO_HAL_SUCCESS;
181             }
182         }
183     }
184     return AUDIO_HAL_ERR_INVALID_OBJECT;
185 }
186 
AudioCheckCaptureAddr(AudioHandle capture)187 int32_t AudioCheckCaptureAddr(AudioHandle capture)
188 {
189     if (g_fuzzCheckFlag == false) {
190         return AUDIO_HAL_SUCCESS;
191     }
192     if (capture != NULL) {
193         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
194             if (g_localAudioAddrList[index].addrValue == capture &&
195                 g_localAudioAddrList[index].addrType == AUDIO_CAPTURE_ADDR) {
196                 return AUDIO_HAL_SUCCESS;
197             }
198         }
199         return AUDIO_HAL_ERR_INVALID_OBJECT;
200     }
201     return AUDIO_HAL_ERR_INVALID_PARAM;
202 }
203 
204 
AudioDelCaptureAddrFromList(AudioHandle capture)205 int32_t AudioDelCaptureAddrFromList(AudioHandle capture)
206 {
207     if (capture != NULL) {
208         for (int index = 0; index < MAX_ADDR_RECORD_NUM; index++) {
209             if (g_localAudioAddrList[index].addrValue == capture &&
210                 g_localAudioAddrList[index].addrType == AUDIO_CAPTURE_ADDR) {
211                 g_localAudioAddrList[index].addrValue = NULL;
212                 g_localAudioAddrList[index].addrType = AUDIO_INVALID_ADDR;
213                 return AUDIO_HAL_SUCCESS;
214             }
215         }
216         return AUDIO_HAL_ERR_INVALID_OBJECT;
217     }
218     return AUDIO_HAL_ERR_INVALID_PARAM;
219 }
220 
ClearAdaptersAllName(void)221 static void ClearAdaptersAllName(void)
222 {
223     int i, j;
224 
225     for (i = 0; i < SUPPORT_ADAPTER_NUM_MAX; i++) {
226         g_adaptersName[i] = NULL;
227         for (j = 0; j < SUPPORT_PORT_NUM_MAX; j++) {
228             g_portsName[i][j] = NULL;
229         }
230     }
231 }
232 
AudioAdapterGetConfigOut(void)233 struct AudioAdapterDescriptor *AudioAdapterGetConfigOut(void)
234 {
235     return g_audioAdapterOut;
236 }
237 
AudioAdapterGetConfigDescs(void)238 struct AudioAdapterDescriptor *AudioAdapterGetConfigDescs(void)
239 {
240     return g_audioAdapterDescs;
241 }
242 
AudioAdapterGetAdapterNum(void)243 int32_t AudioAdapterGetAdapterNum(void)
244 {
245     return g_adapterNum;
246 }
247 
AudioAdapterCheckPortFlow(const char * name)248 static int32_t AudioAdapterCheckPortFlow(const char *name)
249 {
250     uint32_t len;
251 
252     if (name == NULL) {
253         AUDIO_FUNC_LOGE("Invalid parameter!\n");
254 
255         return HDF_ERR_INVALID_PARAM;
256     }
257 
258     len = strlen(name);
259     if (len == 0) {
260         AUDIO_FUNC_LOGE("port name is null!\n");
261 
262         return HDF_FAILURE;
263     } else if (len >= PORT_NAME_LEN) {
264         AUDIO_FUNC_LOGE("port name is too long!\n");
265 
266         return HDF_FAILURE;
267     } else {
268         /* Nothing to do */
269     }
270 
271     if (strcmp(name, "AIP") && strcmp(name, "AOP") && strcmp(name, "AIOP")) {
272         AUDIO_FUNC_LOGE("Incorrect port name: [ %{public}s ]!\n", name);
273 
274         return HDF_FAILURE;
275     }
276 
277     return HDF_SUCCESS;
278 }
279 
AudioAdapterCheckName(const char * name)280 static int32_t AudioAdapterCheckName(const char *name)
281 {
282     uint32_t len;
283 
284     if (name == NULL) {
285         AUDIO_FUNC_LOGE("Invalid parameter!\n");
286 
287         return HDF_ERR_INVALID_PARAM;
288     }
289 
290     len = strlen(name);
291     if (len == 0) {
292         AUDIO_FUNC_LOGE("adapter name is null!\n");
293 
294         return HDF_FAILURE;
295     } else if (len >= ADAPTER_NAME_LEN) {
296         AUDIO_FUNC_LOGE("adapter name is too long!\n");
297 
298         return HDF_FAILURE;
299     } else {
300         /* Nothing to do */
301     }
302 
303     if (!isalpha(*name++)) { // Names must begin with a letter
304         AUDIO_FUNC_LOGE("The adapter name of the illegal!\n");
305 
306         return HDF_FAILURE;
307     }
308 
309     while (*name != '\0') {
310         if (*name == '_') {
311             name++;
312             continue;
313         }
314 
315         if (!isalnum(*name++)) {
316             AUDIO_FUNC_LOGE("The adapter name of the illegal!\n");
317 
318             return HDF_FAILURE;
319         }
320     }
321 
322     return HDF_SUCCESS;
323 }
324 
AudioAdapterExist(const char * adapterName)325 int32_t AudioAdapterExist(const char *adapterName)
326 {
327     if (adapterName == NULL) {
328         AUDIO_FUNC_LOGE("Invalid parameter!\n");
329 
330         return HDF_ERR_INVALID_PARAM;
331     }
332     if (g_audioAdapterDescs == NULL || g_adapterNum <= 0 || g_adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
333         AUDIO_FUNC_LOGE("no adapter info");
334 
335         return HDF_FAILURE;
336     }
337     for (int i = 0; i < g_adapterNum; i++) {
338         if (strcmp(adapterName, g_audioAdapterDescs[i].adapterName) == 0) {
339             return HDF_SUCCESS;
340         }
341     }
342     AUDIO_FUNC_LOGE("adapterName=%{public}s does not exist!", adapterName);
343     return HDF_FAILURE;
344 }
345 
AudioAdapterJudegReleaseDescs(const struct AudioAdapterDescriptor * desc)346 static void AudioAdapterJudegReleaseDescs(const struct AudioAdapterDescriptor *desc)
347 {
348     uint32_t portIdx;
349 
350     if (desc == NULL) {
351         AUDIO_FUNC_LOGE("param desc is null!");
352         return;
353     }
354 
355     if (desc->adapterName != NULL) {
356         AudioMemFree((void **)&desc->adapterName);
357     }
358 
359     if (desc->ports != NULL) {
360         portIdx = 0;
361         if (desc->portNum <= 0 || desc->portNum > SUPPORT_PORT_NUM_MAX) {
362             AUDIO_FUNC_LOGE("desc->portNum error!\n");
363             AudioMemFree((void **)&desc->ports);
364 
365             return;
366         }
367 
368         while (portIdx < desc->portNum) {
369             if (desc->ports[portIdx].portName != NULL) {
370                 AudioMemFree((void **)&desc->ports[portIdx].portName);
371             }
372             portIdx++;
373         }
374         AudioMemFree((void **)&desc->ports);
375     }
376 }
377 
AudioAdapterReleaseDescs(const struct AudioAdapterDescriptor * descs,int32_t adapterNum)378 static void AudioAdapterReleaseDescs(const struct AudioAdapterDescriptor *descs, int32_t adapterNum)
379 {
380     int32_t adapterIdx = 0;
381 
382     if (descs == NULL || adapterNum <= 0 || adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
383         AUDIO_FUNC_LOGE("descs is null or adapterNum is invalid!");
384         return;
385     }
386 
387     if (adapterNum > g_adapterNum) {
388         adapterNum = g_adapterNum;
389     }
390 
391     while (adapterIdx < adapterNum) {
392         AudioAdapterJudegReleaseDescs(&descs[adapterIdx]);
393         adapterIdx++;
394     }
395 
396     AudioMemFree((void **)&descs);
397 }
398 
AudioAdapterGetDir(const char * dir)399 static int32_t AudioAdapterGetDir(const char *dir)
400 {
401     if (dir == NULL) {
402         AUDIO_FUNC_LOGE("param dir is null!");
403         return HDF_FAILURE;
404     }
405     if (strcmp(dir, "PORT_OUT") == 0) {
406         return PORT_OUT;
407     } else if (strcmp(dir, "PORT_IN") == 0) {
408         return PORT_IN;
409     } else if (strcmp(dir, "PORT_OUT_IN") == 0) {
410         return PORT_OUT_IN;
411     } else {
412         return HDF_FAILURE;
413     }
414 }
415 
AudioAdaptersGetArraySize(const cJSON * cJsonObj,uint32_t * size)416 static int32_t AudioAdaptersGetArraySize(const cJSON *cJsonObj, uint32_t *size)
417 {
418     int adapterArraySize;
419 
420     if (cJsonObj == NULL || size == NULL) {
421         AUDIO_FUNC_LOGE("Invalid parameter!\n");
422 
423         return HDF_ERR_INVALID_PARAM;
424     }
425 
426     /* Follow the new adapterNum by the number of actual parses */
427     adapterArraySize = cJSON_GetArraySize(cJsonObj);
428     if (adapterArraySize <= 0) {
429         AUDIO_FUNC_LOGE("Failed to get JSON array size!\n");
430 
431         return HDF_FAILURE;
432     }
433     *size = (uint32_t)adapterArraySize;
434 
435     return HDF_SUCCESS;
436 }
437 
AudioAdapterParsePortGetDir(struct AudioPort * info,const cJSON * port)438 static int32_t AudioAdapterParsePortGetDir(struct AudioPort *info, const cJSON *port)
439 {
440     if (info == NULL || port == NULL) {
441         AUDIO_FUNC_LOGE("Invalid parameter!\n");
442         return HDF_ERR_INVALID_PARAM;
443     }
444     int32_t ret;
445     cJSON *portDir = NULL;
446 
447     portDir = cJSON_GetObjectItem(port, "dir");
448     if (portDir == NULL || portDir->valuestring == NULL) {
449         AUDIO_FUNC_LOGE("cJSON_GetObjectItem portDir failed!");
450         return HDF_FAILURE;
451     }
452     ret = AudioAdapterGetDir(portDir->valuestring);
453     if (ret == HDF_FAILURE) {
454         AUDIO_FUNC_LOGE("port dir error! ret = %{public}d", ret);
455         return ret;
456     }
457     info->dir = ret;
458     return HDF_SUCCESS;
459 }
460 
AudioAdapterParsePortGetID(struct AudioPort * info,const cJSON * port)461 static int32_t AudioAdapterParsePortGetID(struct AudioPort *info, const cJSON *port)
462 {
463     if (info == NULL || port == NULL) {
464         AUDIO_FUNC_LOGE("Invalid parameter!\n");
465         return HDF_ERR_INVALID_PARAM;
466     }
467     int32_t tmpId;
468     cJSON *portID = NULL;
469 
470     portID = cJSON_GetObjectItem(port, "id");
471     if (portID == NULL) {
472         AUDIO_FUNC_LOGE("cJSON_GetObjectItem portID failed!");
473         return HDF_FAILURE;
474     }
475     tmpId = portID->valueint;
476     if (tmpId < 0 || tmpId > SUPPORT_PORT_ID_MAX) {
477         AUDIO_FUNC_LOGE("portID error!\n");
478         return HDF_FAILURE;
479     }
480     info->portId = (uint32_t)tmpId;
481     return HDF_SUCCESS;
482 }
483 
AudioAdapterParsePortGetPortName(struct AudioPort * info,const cJSON * port)484 static int32_t AudioAdapterParsePortGetPortName(struct AudioPort *info, const cJSON *port)
485 {
486     if (info == NULL || port == NULL) {
487         AUDIO_FUNC_LOGE("Invalid parameter!\n");
488         return HDF_ERR_INVALID_PARAM;
489     }
490     int32_t ret;
491     cJSON *portName = NULL;
492 
493     portName = cJSON_GetObjectItem(port, "name");
494     if (portName == NULL || portName->valuestring == NULL) {
495         AUDIO_FUNC_LOGE("cJSON_GetObjectItem portName failed!");
496         return HDF_FAILURE;
497     }
498     ret = AudioAdapterCheckPortFlow(portName->valuestring);
499     if (ret != HDF_SUCCESS) {
500         AUDIO_FUNC_LOGE("Port name error!\n");
501         return ret;
502     }
503     info->portName = (char *)OsalMemCalloc(PORT_NAME_LEN);
504     if (info->portName == NULL) {
505         AUDIO_FUNC_LOGE("Out of memory\n");
506 
507         return HDF_ERR_MALLOC_FAIL;
508     }
509     ret = memcpy_s((void *)info->portName, PORT_NAME_LEN,
510                    portName->valuestring, strlen(portName->valuestring));
511     if (ret != EOK) {
512         AUDIO_FUNC_LOGE("memcpy_s port name fail");
513         return HDF_FAILURE;
514     }
515     return HDF_SUCCESS;
516 }
517 
AudioAdapterParsePort(struct AudioPort * info,const cJSON * port)518 static int32_t AudioAdapterParsePort(struct AudioPort *info, const cJSON *port)
519 {
520     int32_t ret;
521     if (info == NULL || port == NULL) {
522         AUDIO_FUNC_LOGE("Invalid parameter!\n");
523         return HDF_ERR_INVALID_PARAM;
524     }
525     ret = AudioAdapterParsePortGetDir(info, port);
526     if (ret != HDF_SUCCESS) {
527         AUDIO_FUNC_LOGE("AudioAdapterParsePortGetDir failed!\n");
528         return ret;
529     }
530     ret = AudioAdapterParsePortGetID(info, port);
531     if (ret != HDF_SUCCESS) {
532         AUDIO_FUNC_LOGE("AudioAdapterParsePortGetID failed!\n");
533         return ret;
534     }
535     ret = AudioAdapterParsePortGetPortName(info, port);
536     if (ret != HDF_SUCCESS) {
537         AUDIO_FUNC_LOGE("AudioAdapterParsePortGetPortName failed!\n");
538         return ret;
539     }
540     return HDF_SUCCESS;
541 }
542 
MatchAdapterType(const char * adapterName,uint32_t portId)543 enum AudioAdapterType MatchAdapterType(const char *adapterName, uint32_t portId)
544 {
545     if (adapterName == NULL) {
546         AUDIO_FUNC_LOGE("Invalid parameter!\n");
547 
548         return AUDIO_ADAPTER_MAX;
549     }
550 
551     if (strncmp(adapterName, PRIMARY, strlen(PRIMARY)) == 0) {
552         if (portId >= AUDIO_PRIMARY_ID_MIN && portId <= AUDIO_PRIMARY_ID_MAX) {
553             return AUDIO_ADAPTER_PRIMARY;
554         }
555         return AUDIO_ADAPTER_PRIMARY_EXT;
556     } else if (strcmp(adapterName, USB) == 0) {
557         return AUDIO_ADAPTER_USB;
558     } else if (strcmp(adapterName, A2DP) == 0) {
559         return AUDIO_ADAPTER_A2DP;
560     } else {
561         return AUDIO_ADAPTER_MAX;
562     }
563 }
564 
AudioAdapterCheckPortId(const char * adapterName,uint32_t portId)565 int32_t AudioAdapterCheckPortId(const char *adapterName, uint32_t portId)
566 {
567     if (adapterName == NULL) {
568         AUDIO_FUNC_LOGE("Invalid parameter!\n");
569         return HDF_ERR_INVALID_PARAM;
570     }
571 
572     enum AudioAdapterType adapterType = MatchAdapterType(adapterName, portId);
573     switch (adapterType) {
574         case AUDIO_ADAPTER_PRIMARY:
575             if (portId < AUDIO_PRIMARY_ID_MIN || portId > AUDIO_PRIMARY_ID_MAX) {
576                 AUDIO_FUNC_LOGE("portId is invalid!");
577                 return HDF_FAILURE;
578             }
579             break;
580         case AUDIO_ADAPTER_PRIMARY_EXT:
581             if (portId < AUDIO_PRIMARY_EXT_ID_MIN || portId > AUDIO_PRIMARY_EXT_ID_MAX) {
582                 AUDIO_FUNC_LOGE("portId is invalid!");
583                 return HDF_FAILURE;
584             }
585             break;
586         case AUDIO_ADAPTER_USB:
587             if (portId < AUDIO_USB_ID_MIN || portId > AUDIO_USB_ID_MAX) {
588                 AUDIO_FUNC_LOGE("portId is invalid!");
589                 return HDF_FAILURE;
590             }
591             break;
592         case AUDIO_ADAPTER_A2DP:
593             if (portId < AUDIO_A2DP_ID_MIN || portId > AUDIO_A2DP_ID_MAX) {
594                 AUDIO_FUNC_LOGE("portId is invalid!");
595                 return HDF_FAILURE;
596             }
597             break;
598         default:
599             AUDIO_FUNC_LOGE("An unsupported adapter type.");
600             return HDF_ERR_NOT_SUPPORT;
601     }
602 
603     return HDF_SUCCESS;
604 }
605 
AudioAdapterParsePorts(struct AudioAdapterDescriptor * desc,const cJSON * adapter)606 static int32_t AudioAdapterParsePorts(struct AudioAdapterDescriptor *desc, const cJSON *adapter)
607 {
608     uint32_t i;
609     int32_t ret, tmpNum;
610     cJSON *adapterPort = NULL;
611     uint32_t realSize = 0;
612     if (desc == NULL || adapter == NULL) {
613         AUDIO_FUNC_LOGE("Invalid parameter!\n");
614 
615         return HDF_ERR_INVALID_PARAM;
616     }
617     cJSON *adapterPortNum = cJSON_GetObjectItem(adapter, "portnum");
618     if (adapterPortNum == NULL) {
619         AUDIO_FUNC_LOGE("cJSON_GetObjectItem portnum failed!");
620         return HDF_FAILURE;
621     }
622     tmpNum = cJSON_GetNumberValue(adapterPortNum);
623     if (tmpNum <= 0 || tmpNum > SUPPORT_PORT_NUM_MAX) {
624         AUDIO_FUNC_LOGE("portnum error! tmpNum = %{public}d\n", tmpNum);
625 
626         return HDF_FAILURE;
627     }
628     desc->portNum = (uint32_t)tmpNum;
629 
630     cJSON *adapterPorts = cJSON_GetObjectItem(adapter, "port");
631     if (adapterPorts == NULL) {
632         return HDF_FAILURE;
633     }
634     ret = AudioAdaptersGetArraySize(adapterPorts, &realSize);
635     if (ret != HDF_SUCCESS || realSize != desc->portNum) {
636         AUDIO_FUNC_LOGE("realSize = %{public}u, portNum = %{public}u.\n", realSize, desc->portNum);
637         return HDF_FAILURE;
638     }
639 
640     desc->ports = (struct AudioPort *)OsalMemCalloc(desc->portNum * sizeof(struct AudioPort));
641     if (desc->ports == NULL) {
642         AUDIO_FUNC_LOGE("Out of memory!\n");
643 
644         return HDF_ERR_MALLOC_FAIL;
645     }
646     for (i = 0; i < desc->portNum; i++) {
647         adapterPort = cJSON_GetArrayItem(adapterPorts, i);
648         if (adapterPort != NULL) {
649             ret = AudioAdapterParsePort(&desc->ports[i], adapterPort);
650             if (ret != HDF_SUCCESS) {
651                 return ret;
652             }
653 
654             ret = AudioAdapterCheckPortId(desc->adapterName, desc->ports[i].portId);
655             if (ret != HDF_SUCCESS) {
656                 return ret;
657             }
658         }
659     }
660     return HDF_SUCCESS;
661 }
662 
AudioAdapterParseAdapter(struct AudioAdapterDescriptor * desc,const cJSON * adapter)663 static int32_t AudioAdapterParseAdapter(struct AudioAdapterDescriptor *desc,
664                                         const cJSON *adapter)
665 {
666     int32_t ret;
667 
668     if (desc == NULL || adapter == NULL) {
669         AUDIO_FUNC_LOGE("Invalid parameter!\n");
670 
671         return HDF_ERR_INVALID_PARAM;
672     }
673 
674     cJSON *adapterName = cJSON_GetObjectItem(adapter, "name");
675     if (adapterName == NULL || adapterName->valuestring == NULL) {
676         AUDIO_FUNC_LOGE("adapterName or adapterName->valuestring is null!");
677         return HDF_FAILURE;
678     }
679     ret = AudioAdapterCheckName(adapterName->valuestring);
680     if (ret != HDF_SUCCESS) {
681         AUDIO_FUNC_LOGE("The Adapter name is incorrect!\n");
682 
683         return ret;
684     }
685 
686     desc->adapterName = (char *)OsalMemCalloc(ADAPTER_NAME_LEN);
687     if (desc->adapterName == NULL) {
688         AUDIO_FUNC_LOGE("Out of memory!\n");
689 
690         return HDF_ERR_MALLOC_FAIL;
691     }
692     ret = memcpy_s((void *)desc->adapterName, ADAPTER_NAME_LEN,
693         adapterName->valuestring, strlen(adapterName->valuestring));
694     if (ret != EOK) {
695         AUDIO_FUNC_LOGE("memcpy_s adapter name fail!\n");
696 
697         return HDF_FAILURE;
698     }
699 
700     ret = AudioAdapterParsePorts(desc, adapter);
701     if (ret != HDF_SUCCESS) {
702         return ret;
703     }
704 
705     return HDF_SUCCESS;
706 }
707 
AudioAdaptersGetConfig(const char * fpath)708 static char *AudioAdaptersGetConfig(const char *fpath)
709 {
710     char *pJsonStr = NULL;
711 
712     if (fpath == NULL) {
713         /* The file path is bad or unreadable */
714         AUDIO_FUNC_LOGE("fpath is null!");
715         return NULL;
716     }
717     char pathBuf[PATH_MAX] = {'\0'};
718     if (realpath(fpath, pathBuf) == NULL) {
719         return NULL;
720     }
721     FILE *fp = fopen(pathBuf, "r");
722     if (fp == NULL) {
723         AUDIO_FUNC_LOGE("Can not open config file [ %{public}s ].\n", fpath);
724         return NULL;
725     }
726     if (fseek(fp, 0, SEEK_END) != HDF_SUCCESS) {
727         AUDIO_FUNC_LOGE("fseek fail!");
728         (void)fclose(fp);
729         return NULL;
730     }
731     int32_t jsonStrSize = ftell(fp);
732     if (jsonStrSize <= 0) {
733         (void)fclose(fp);
734         return NULL;
735     }
736     rewind(fp);
737     if (jsonStrSize > CONFIG_FILE_SIZE_MAX) {
738         AUDIO_FUNC_LOGE("The configuration file is too large to load!\n");
739         (void)fclose(fp);
740         return NULL;
741     }
742     pJsonStr = (char *)OsalMemCalloc((uint32_t)jsonStrSize + 1);
743     if (pJsonStr == NULL) {
744         AUDIO_FUNC_LOGE("alloc pJsonStr failed!");
745         (void)fclose(fp);
746         return NULL;
747     }
748     if (fread(pJsonStr, jsonStrSize, 1, fp) != 1) {
749         AUDIO_FUNC_LOGE("read to file fail!");
750         (void)fclose(fp);
751         AudioMemFree((void **)&pJsonStr);
752         return NULL;
753     }
754     (void)fclose(fp);
755     return pJsonStr;
756 }
757 
AudioAdaptersGetConfigToJsonObj(const char * fpath)758 cJSON *AudioAdaptersGetConfigToJsonObj(const char *fpath)
759 {
760     char *pJsonStr = AudioAdaptersGetConfig(fpath);
761     if (pJsonStr == NULL) {
762         AUDIO_FUNC_LOGE("AudioAdaptersGetConfig failed!");
763         return NULL;
764     }
765     cJSON *cJsonObj = cJSON_Parse(pJsonStr);
766     if (cJsonObj == NULL) {
767         AudioMemFree((void **)&pJsonStr);
768         return NULL;
769     }
770     AudioMemFree((void **)&pJsonStr);
771     cJSON *adapterNum = cJSON_GetObjectItem(cJsonObj, "adapterNum");
772     if (adapterNum == NULL) {
773         AUDIO_FUNC_LOGE("cJSON_GetObjectItem adapterNum failed!");
774         cJSON_Delete(cJsonObj);
775         return NULL;
776     }
777     g_adapterNum = adapterNum->valueint;
778     if (g_adapterNum <= 0 || g_adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
779         AUDIO_FUNC_LOGE("Adapter number error!\n");
780         cJSON_Delete(cJsonObj);
781         return NULL;
782     }
783     return cJsonObj;
784 }
785 
AudioAdaptersSetAdapter(struct AudioAdapterDescriptor ** descs,int32_t adapterNum,const cJSON * adaptersObj)786 static int32_t AudioAdaptersSetAdapter(struct AudioAdapterDescriptor **descs,
787     int32_t adapterNum, const cJSON *adaptersObj)
788 {
789     int32_t i, ret;
790     cJSON *adapterObj = NULL;
791 
792     if (descs == NULL || adaptersObj == NULL ||
793         adapterNum <= 0 || adapterNum > SUPPORT_ADAPTER_NUM_MAX) {
794         AUDIO_FUNC_LOGE("Invalid parameter!\n");
795 
796         return HDF_ERR_INVALID_PARAM;
797     }
798     if (*descs != NULL) {
799         /* Existing content is no longer assigned twice */
800         return HDF_SUCCESS;
801     }
802 
803     *descs = (struct AudioAdapterDescriptor *)OsalMemCalloc(
804         adapterNum * sizeof(struct AudioAdapterDescriptor));
805     if (*descs == NULL) {
806         AUDIO_FUNC_LOGE("alloc g_audioAdapterDescs failed");
807 
808         return HDF_ERR_MALLOC_FAIL;
809     }
810 
811     for (i = 0; i < adapterNum; i++) {
812         adapterObj = cJSON_GetArrayItem(adaptersObj, i);
813         if (adapterObj != NULL) {
814             ret = AudioAdapterParseAdapter(&(*descs)[i], adapterObj);
815             if (ret != HDF_SUCCESS) {
816                 AUDIO_FUNC_LOGE("AudioAdapterParseAdapter failed ret = %{public}d", ret);
817                 AudioAdapterReleaseDescs(*descs, adapterNum);
818                 *descs = NULL;
819 
820                 return HDF_FAILURE;
821             }
822         }
823     }
824 
825     return HDF_SUCCESS;
826 }
827 
AudioAdaptersNamesRepair(void)828 static void AudioAdaptersNamesRepair(void)
829 {
830     int i, realNum;
831 
832     if (g_audioAdapterOut == NULL ||
833         g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
834         return;
835     }
836 
837     realNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
838     for (i = 0; i < realNum; i++) {
839         if (g_adaptersName[i] == NULL) {
840             return;
841         }
842 
843         if (strcmp(g_audioAdapterOut[i].adapterName, g_audioAdapterDescs[i].adapterName)) {
844             /* Retrieve the location of the port name */
845             g_audioAdapterOut[i].adapterName = g_adaptersName[i];
846         }
847     }
848 }
849 
AudioPortsNamesRepair(void)850 static void AudioPortsNamesRepair(void)
851 {
852     int32_t i;
853     uint32_t j;
854     int32_t adapterNum;
855     uint32_t portNum;
856 
857     if (g_audioAdapterOut == NULL ||
858         g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
859         return;
860     }
861 
862     adapterNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
863     for (i = 0; i < adapterNum; i++) {
864         portNum = (g_audioAdapterOut[i].portNum < SUPPORT_PORT_NUM_MAX) ?
865             g_audioAdapterOut[i].portNum : SUPPORT_PORT_NUM_MAX;
866         for (j = 0; j < portNum; j++) {
867             if (g_portsName[i][j] == NULL) {
868                 return;
869             }
870             if (strcmp(g_audioAdapterOut[i].ports[j].portName, g_audioAdapterDescs[i].ports[j].portName)) {
871                 /* Retrieve the location of the sound card name */
872                 g_audioAdapterOut[i].ports[j].portName = g_portsName[i][j];
873             }
874         }
875     }
876 }
877 
AudioAdaptersNamesRecord(void)878 static void AudioAdaptersNamesRecord(void)
879 {
880     int i, currentNum;
881 
882     if (g_audioAdapterOut == NULL ||
883         g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
884         return;
885     }
886 
887     currentNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
888     for (i = 0; i < currentNum; i++) {
889         /* Record the location of the sound card name */
890         g_adaptersName[i] = g_audioAdapterOut[i].adapterName;
891     }
892 }
893 
AudioPortsNamesRecord(void)894 static void AudioPortsNamesRecord(void)
895 {
896     int32_t i;
897     uint32_t j;
898     int32_t adapterCurNum;
899     uint32_t portCurNum;
900 
901     if (g_audioAdapterOut == NULL || g_audioAdapterDescs == NULL || g_adapterNum <= 0) {
902         return;
903     }
904 
905     adapterCurNum = (g_adapterNum < SUPPORT_ADAPTER_NUM_MAX) ? g_adapterNum : SUPPORT_ADAPTER_NUM_MAX;
906     for (i = 0; i < adapterCurNum; i++) {
907         portCurNum = (g_audioAdapterOut[i].portNum < SUPPORT_PORT_NUM_MAX) ?
908             g_audioAdapterOut[i].portNum : SUPPORT_PORT_NUM_MAX;
909         for (j = 0; j < portCurNum; j++) {
910             /* Record the location of the port name */
911             g_portsName[i][j] = g_audioAdapterOut[i].ports[j].portName;
912         }
913     }
914 }
AudioAdaptersSetAdapterVar(cJSON * adaptersObj)915 int32_t AudioAdaptersSetAdapterVar(cJSON *adaptersObj)
916 {
917     if (adaptersObj == NULL) {
918         AUDIO_FUNC_LOGE("adaptersObj is NULL!");
919         return HDF_FAILURE;
920     }
921     if (AudioAdaptersSetAdapter(&g_audioAdapterDescs, g_adapterNum, adaptersObj) != HDF_SUCCESS) {
922         AUDIO_FUNC_LOGE("AudioAdaptersSetAdapter g_audioAdapterDescs is failed!");
923         return HDF_FAILURE;
924     }
925     if (AudioAdaptersSetAdapter(&g_audioAdapterOut, g_adapterNum, adaptersObj) != HDF_SUCCESS) {
926         /* g_audioAdapterOut failure also releases g_audioAdapterDescs */
927         AUDIO_FUNC_LOGE("AudioAdaptersSetAdapter g_audioAdapterOut is failed!");
928         AudioAdapterReleaseDescs(g_audioAdapterDescs, g_adapterNum);
929         ClearAdaptersAllName();
930         g_audioAdapterDescs = NULL;
931         return HDF_FAILURE;
932     }
933     return HDF_SUCCESS;
934 }
935 
AudioAdaptersForUser(struct AudioAdapterDescriptor ** descs,int * size)936 int32_t AudioAdaptersForUser(struct AudioAdapterDescriptor **descs, int *size)
937 {
938     uint32_t realSize = 0;
939     if (descs == NULL || size == NULL) {
940         AUDIO_FUNC_LOGE("param descs or size is null!");
941         return HDF_ERR_INVALID_PARAM;
942     }
943     if (g_audioAdapterDescs != NULL && g_audioAdapterOut != NULL &&
944         g_adapterNum > 0 && g_adapterNum <= SUPPORT_ADAPTER_NUM_MAX) {
945         AudioAdaptersNamesRepair();
946         AudioPortsNamesRepair();
947         /* Existing content is no longer assigned twice */
948         *descs = g_audioAdapterOut;
949         *size = g_adapterNum;
950         return HDF_SUCCESS;
951     }
952     cJSON *cJsonObj = AudioAdaptersGetConfigToJsonObj(AUDIO_ADAPTER_CONFIG);
953     if (cJsonObj == NULL) {
954         AUDIO_FUNC_LOGE("AudioAdaptersGetConfigToJsonObj failed!");
955         return HDF_FAILURE;
956     }
957     cJSON *adaptersObj = cJSON_GetObjectItem(cJsonObj, "adapters");
958     if (adaptersObj == NULL) {
959         AUDIO_FUNC_LOGE("cJSON_GetObjectItem adapters failed!");
960         cJSON_Delete(cJsonObj);
961         return HDF_FAILURE;
962     }
963     if (g_adapterNum > 0) {
964         if (AudioAdaptersGetArraySize(adaptersObj, &realSize) != HDF_SUCCESS || realSize != (uint32_t)g_adapterNum) {
965             AUDIO_FUNC_LOGE("realSize = %{public}d, adaptersNum = %{public}d.\n", realSize, g_adapterNum);
966             g_adapterNum = 0;
967             cJSON_Delete(cJsonObj);
968             return HDF_FAILURE;
969         }
970     }
971     if (AudioAdaptersSetAdapterVar(adaptersObj) != HDF_SUCCESS) {
972         AUDIO_FUNC_LOGE("AudioAdaptersSetAdapterVar is failed!");
973         g_adapterNum = 0;
974         cJSON_Delete(cJsonObj);
975         return HDF_FAILURE;
976     }
977     AudioAdaptersNamesRecord();
978     AudioPortsNamesRecord();
979     *descs = g_audioAdapterOut;
980     *size = g_adapterNum;
981     cJSON_Delete(cJsonObj);
982     return HDF_SUCCESS;
983 }
984 
ReleaseAudioManagerObjectComm(struct AudioManager * object)985 bool ReleaseAudioManagerObjectComm(struct AudioManager *object)
986 {
987     if (object == NULL) {
988         AUDIO_FUNC_LOGE("param object is null!");
989         return false;
990     }
991 
992     object->GetAllAdapters = NULL;
993     object->LoadAdapter = NULL;
994     object->UnloadAdapter = NULL;
995     object->ReleaseAudioManagerObject = NULL;
996 
997     if (g_audioAdapterDescs != NULL && g_audioAdapterOut != NULL &&
998         g_adapterNum > 0 && g_adapterNum <= SUPPORT_ADAPTER_NUM_MAX) {
999         AudioAdaptersNamesRepair();
1000         AudioPortsNamesRepair();
1001     }
1002 
1003     AudioAdapterReleaseDescs(g_audioAdapterDescs, g_adapterNum);
1004     AudioAdapterReleaseDescs(g_audioAdapterOut, g_adapterNum);
1005     g_audioAdapterDescs = NULL;
1006     g_audioAdapterOut = NULL;
1007     g_adapterNum = 0;
1008 
1009     return true;
1010 }
1011 
1012 static enum AudioFormat g_formatIdZero = AUDIO_FORMAT_PCM_16_BIT;
InitPortForCapabilitySub(struct AudioPort portIndex,struct AudioPortCapability * capabilityIndex)1013 int32_t InitPortForCapabilitySub(struct AudioPort portIndex, struct AudioPortCapability *capabilityIndex)
1014 {
1015     if (capabilityIndex == NULL) {
1016         AUDIO_FUNC_LOGE("capabilityIndex Is NULL");
1017         return HDF_FAILURE;
1018     }
1019     if (portIndex.portId == 0 || (portIndex.portId > 1 && portIndex.portId <= AUDIO_PRIMARY_ID_MAX)) {
1020         capabilityIndex->deviceId = PIN_OUT_SPEAKER;
1021         capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000;
1022     } else if (portIndex.portId == 1 ||
1023         (portIndex.portId >= AUDIO_USB_ID_MIN && portIndex.portId <= AUDIO_USB_ID_MAX)) {
1024         capabilityIndex->deviceId = PIN_OUT_HEADSET;
1025         capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000 | AUDIO_SAMPLE_RATE_MASK_8000;
1026     } else if (portIndex.portId >= AUDIO_PRIMARY_EXT_ID_MIN && portIndex.portId <= AUDIO_PRIMARY_EXT_ID_MAX) {
1027         capabilityIndex->deviceId = PIN_OUT_SPEAKER;
1028         capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000 | AUDIO_SAMPLE_RATE_MASK_24000;
1029     } else {
1030         AUDIO_FUNC_LOGE("The port ID not support!");
1031         return HDF_ERR_NOT_SUPPORT;
1032     }
1033     capabilityIndex->hardwareMode = true;
1034     capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
1035     capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
1036     capabilityIndex->deviceType = portIndex.dir;
1037     capabilityIndex->formatNum = 1;
1038     capabilityIndex->formats = &g_formatIdZero;
1039     capabilityIndex->subPortsNum = 1;
1040     capabilityIndex->subPorts = (struct AudioSubPortCapability *)OsalMemCalloc(
1041         capabilityIndex->subPortsNum * sizeof(struct AudioSubPortCapability));
1042     if (capabilityIndex->subPorts == NULL) {
1043         AUDIO_FUNC_LOGE("The pointer is null!");
1044         return HDF_FAILURE;
1045     }
1046     capabilityIndex->subPorts->portId = portIndex.portId;
1047     capabilityIndex->subPorts->desc = portIndex.portName;
1048     capabilityIndex->subPorts->mask = PORT_PASSTHROUGH_LPCM;
1049     return HDF_SUCCESS;
1050 }
1051 
FormatToBits(enum AudioFormat format,uint32_t * formatBits)1052 int32_t FormatToBits(enum AudioFormat format, uint32_t *formatBits)
1053 {
1054     if (formatBits == NULL) {
1055         AUDIO_FUNC_LOGE("param formatBits is null!");
1056         return HDF_FAILURE;
1057     }
1058     switch (format) {
1059         case AUDIO_FORMAT_PCM_32_BIT:
1060             *formatBits = BIT_NUM_32;
1061             return HDF_SUCCESS;
1062         case AUDIO_FORMAT_PCM_24_BIT:
1063             *formatBits = BIT_NUM_24;
1064             return HDF_SUCCESS;
1065         case AUDIO_FORMAT_PCM_16_BIT:
1066             *formatBits = BIT_NUM_16;
1067             return HDF_SUCCESS;
1068         case AUDIO_FORMAT_PCM_8_BIT:
1069             *formatBits = BIT_NUM_8;
1070             return HDF_SUCCESS;
1071         default:
1072             return HDF_ERR_NOT_SUPPORT;
1073     }
1074 }
1075 
BitsToFormat(enum AudioFormat * format,int32_t formatBits)1076 int32_t BitsToFormat(enum AudioFormat *format, int32_t formatBits)
1077 {
1078     if (format == NULL) {
1079         AUDIO_FUNC_LOGE("param format is null!");
1080         return HDF_FAILURE;
1081     }
1082     switch (formatBits) {
1083         case BIT_NUM_32:
1084             *format = AUDIO_FORMAT_PCM_32_BIT;
1085             return HDF_SUCCESS;
1086         case BIT_NUM_24:
1087             *format = AUDIO_FORMAT_PCM_24_BIT;
1088             return HDF_SUCCESS;
1089         case BIT_NUM_16:
1090             *format = AUDIO_FORMAT_PCM_16_BIT;
1091             return HDF_SUCCESS;
1092         case BIT_NUM_8:
1093             *format = AUDIO_FORMAT_PCM_8_BIT;
1094             return HDF_SUCCESS;
1095         default:
1096             return HDF_ERR_NOT_SUPPORT;
1097     }
1098 }
1099 
CheckAttrRoute(int32_t param)1100 int32_t CheckAttrRoute(int32_t param)
1101 {
1102     if (param < DEEP_BUFF || param > LOW_LATRNCY) {
1103         AUDIO_FUNC_LOGE("param is invalid!");
1104         return HDF_FAILURE;
1105     }
1106     return HDF_SUCCESS;
1107 }
1108 
CheckAttrChannel(uint32_t param)1109 int32_t CheckAttrChannel(uint32_t param)
1110 {
1111     if (param != 1 && param != 2) { // channel 1 and 2
1112         AUDIO_FUNC_LOGE("param is invalid!");
1113         return HDF_FAILURE;
1114     }
1115     return HDF_SUCCESS;
1116 }
1117 
TransferRoute(const char * value,int32_t * route)1118 int32_t TransferRoute(const char *value, int32_t *route)
1119 {
1120     if (value == NULL || route == NULL) {
1121         AUDIO_FUNC_LOGE("param value or route is null!");
1122         return HDF_FAILURE;
1123     }
1124     char *endptr = NULL;
1125     errno = 0;
1126     int64_t tempRoute = strtol(value, &endptr, DECIMAL_SYSTEM);
1127     if ((errno == ERANGE && (tempRoute == LONG_MAX || tempRoute == LONG_MIN)) || (errno != 0 && tempRoute == 0)) {
1128         AUDIO_FUNC_LOGE("TransferRoute failed!");
1129         return HDF_FAILURE;
1130     }
1131     int32_t ret = CheckAttrRoute(tempRoute);
1132     if (ret == 0) {
1133         *route = tempRoute;
1134     }
1135     return ret;
1136 }
1137 
TransferFormat(const char * value,int32_t * format)1138 int32_t TransferFormat(const char *value, int32_t *format)
1139 {
1140     if (value == NULL || format == NULL) {
1141         AUDIO_FUNC_LOGE("param value or format is null!");
1142         return HDF_FAILURE;
1143     }
1144     char *endptr = NULL;
1145     errno = 0;
1146     int64_t tempFormat = strtol(value, &endptr, DECIMAL_SYSTEM);
1147     if ((errno == ERANGE && (tempFormat == LONG_MAX || tempFormat == LONG_MIN)) || (errno != 0 && tempFormat == 0)) {
1148         return HDF_FAILURE;
1149     }
1150     enum AudioFormat audioFormat;
1151     int32_t ret = BitsToFormat(&audioFormat, tempFormat);
1152     if (ret == HDF_SUCCESS) {
1153         ret = CheckAttrFormat(audioFormat);
1154         if (ret == 0) {
1155             *format = audioFormat;
1156         }
1157     }
1158     return ret;
1159 }
1160 
TransferChannels(const char * value,uint32_t * channels)1161 int32_t TransferChannels(const char *value, uint32_t *channels)
1162 {
1163     if (value == NULL || channels == NULL) {
1164         AUDIO_FUNC_LOGE("param value or channels is null!");
1165         return HDF_FAILURE;
1166     }
1167     char *endptr = NULL;
1168     errno = 0;
1169     uint64_t tempChannels = strtoul(value, &endptr, DECIMAL_SYSTEM);
1170     if ((errno == ERANGE && (tempChannels == ULONG_MAX)) || (errno != 0 && tempChannels == 0)) {
1171         AUDIO_FUNC_LOGE("strtoul failed!");
1172         return HDF_FAILURE;
1173     }
1174     int32_t ret = CheckAttrChannel(tempChannels);
1175     if (ret == 0) {
1176         *channels = tempChannels;
1177     }
1178     return ret;
1179 }
1180 
TransferFrames(const char * value,uint64_t * frames)1181 int32_t TransferFrames(const char *value, uint64_t *frames)
1182 {
1183     if (value == NULL || frames == NULL) {
1184         AUDIO_FUNC_LOGE("param value or frames is null!");
1185         return HDF_FAILURE;
1186     }
1187     char *endptr = NULL;
1188     errno = 0;
1189     uint64_t tempFrames = strtoull(value, &endptr, 10);
1190     if ((errno == ERANGE && (tempFrames == ULLONG_MAX)) || (errno != 0 && tempFrames == 0)) {
1191         AUDIO_FUNC_LOGE("strtoull is failed!");
1192         return HDF_FAILURE;
1193     } else {
1194         *frames = tempFrames;
1195         return HDF_SUCCESS;
1196     }
1197 }
1198 
TransferSampleRate(const char * value,uint32_t * sampleRate)1199 int32_t TransferSampleRate(const char *value, uint32_t *sampleRate)
1200 {
1201     if (value == NULL || sampleRate == NULL) {
1202         AUDIO_FUNC_LOGE("param value or sampleRate is null!");
1203         return HDF_FAILURE;
1204     }
1205     char *endptr = NULL;
1206     errno = 0;
1207     uint64_t tempSampleRate = strtoul(value, &endptr, DECIMAL_SYSTEM);
1208     if ((errno == ERANGE && (tempSampleRate == ULONG_MAX)) || (errno != 0 && tempSampleRate == 0)) {
1209         AUDIO_FUNC_LOGE("strtoul is failed!");
1210         return HDF_FAILURE;
1211     }
1212     int32_t ret = CheckAttrSamplingRate(tempSampleRate);
1213     if (ret == 0) {
1214         *sampleRate = tempSampleRate;
1215     }
1216     return ret;
1217 }
1218 
KeyValueListToMap(const char * keyValueList,struct ParamValMap mParamValMap[],int32_t * count)1219 int32_t KeyValueListToMap(const char *keyValueList, struct ParamValMap mParamValMap[], int32_t *count)
1220 {
1221     if (keyValueList == NULL || mParamValMap == NULL || count == NULL) {
1222         AUDIO_FUNC_LOGE("param keyValueList or mParamValMap or count is null!");
1223         return HDF_FAILURE;
1224     }
1225     int i = 0;
1226     char *mParaMap[MAP_MAX];
1227     char buffer[KEY_VALUE_LIST_LEN] = {0};
1228     int32_t ret = sprintf_s(buffer, KEY_VALUE_LIST_LEN - 1, "%s", keyValueList);
1229     if (ret < 0) {
1230         AUDIO_FUNC_LOGE("sprintf_s failed!");
1231         return HDF_FAILURE;
1232     }
1233     char *tempBuf = buffer;
1234     char *outPtr = NULL;
1235     char *inPtr = NULL;
1236     while (i < MAP_MAX) {
1237         if ((mParaMap[i] = strtok_r(tempBuf, ";", &outPtr)) == NULL) {
1238             break;
1239         }
1240         tempBuf = mParaMap[i];
1241         if ((mParaMap[i] = strtok_r(tempBuf, "=", &inPtr)) != NULL) {
1242             ret = strncpy_s(mParamValMap[i].key, EXTPARAM_LEN - 1, mParaMap[i], strlen(mParaMap[i]) + 1);
1243             if (ret != 0) {
1244                 return HDF_FAILURE;
1245             }
1246             tempBuf = NULL;
1247         }
1248         if ((mParaMap[i] = strtok_r(tempBuf, "=", &inPtr)) != NULL) {
1249             ret = strncpy_s(mParamValMap[i].value, EXTPARAM_LEN - 1, mParaMap[i], strlen(mParaMap[i]) + 1);
1250             if (ret != 0) {
1251                 return HDF_FAILURE;
1252             }
1253             tempBuf = NULL;
1254         } else {
1255             AUDIO_FUNC_LOGE("Has no value!");
1256             return HDF_FAILURE;
1257         }
1258         tempBuf = NULL;
1259         i++;
1260     }
1261     *count = i;
1262     return HDF_SUCCESS;
1263 }
1264 
AddElementToList(char * keyValueList,int32_t listLenth,const char * key,void * value)1265 int32_t AddElementToList(char *keyValueList, int32_t listLenth, const char *key, void *value)
1266 {
1267     if (keyValueList == NULL || key == NULL || value == NULL) {
1268         AUDIO_FUNC_LOGE("param is null!");
1269         return HDF_FAILURE;
1270     }
1271     int32_t ret = HDF_FAILURE;
1272     char strValue[MAP_MAX] = { 0 };
1273     if (strcmp(key, AUDIO_ATTR_PARAM_ROUTE) == 0) {
1274         ret = sprintf_s(strValue, sizeof(strValue), "%s=%d;", key, *((int32_t *)value));
1275     } else if (strcmp(key, AUDIO_ATTR_PARAM_FORMAT) == 0) {
1276         uint32_t formatBits = 0;
1277         ret = FormatToBits((enum AudioFormat)(*((int32_t *)value)), &formatBits);
1278         if (ret == 0) {
1279             ret = sprintf_s(strValue, sizeof(strValue), "%s=%u;", key, formatBits);
1280         }
1281     } else if (strcmp(key, AUDIO_ATTR_PARAM_CHANNELS) == 0) {
1282         ret = sprintf_s(strValue, sizeof(strValue), "%s=%u;", key, *((uint32_t *)value));
1283     } else if (strcmp(key, AUDIO_ATTR_PARAM_FRAME_COUNT) == 0) {
1284         ret = sprintf_s(strValue, sizeof(strValue), "%s=%llu;", key, *((uint64_t *)value));
1285     } else if (strcmp(key, AUDIO_ATTR_PARAM_SAMPLING_RATE) == 0) {
1286         ret = sprintf_s(strValue, sizeof(strValue), "%s=%u", key, *((uint32_t *)value));
1287     } else {
1288         AUDIO_FUNC_LOGE("NO this key correspond value!");
1289         return HDF_FAILURE;
1290     }
1291     if (ret < 0) {
1292         AUDIO_FUNC_LOGE("sprintf_s failed!");
1293         return HDF_FAILURE;
1294     }
1295     ret = strncat_s(keyValueList, listLenth, strValue, strlen(strValue));
1296     if (ret != EOK) {
1297         AUDIO_FUNC_LOGE("strcat_s failed!");
1298         return HDF_FAILURE;
1299     }
1300     return HDF_SUCCESS;
1301 }
1302 
SetExtParam(const char * key,const char * value,struct ExtraParams * mExtraParams)1303 int32_t SetExtParam(const char *key, const char *value, struct ExtraParams *mExtraParams)
1304 {
1305     if (key == NULL || value == NULL || mExtraParams == NULL) {
1306         AUDIO_FUNC_LOGE("param key or value or mExtraParams is null!");
1307         return HDF_FAILURE;
1308     }
1309     int ret = HDF_FAILURE;
1310     if (strcmp(key, AUDIO_ATTR_PARAM_ROUTE) == 0) {
1311         int32_t route;
1312         if ((ret = TransferRoute(value, &route)) < 0) {
1313             AUDIO_FUNC_LOGE("TransferRoute failed ! ret = %{public}d\n", ret);
1314             return HDF_FAILURE;
1315         }
1316         mExtraParams->route = route;
1317     } else if (strcmp(key, AUDIO_ATTR_PARAM_FORMAT) == 0) {
1318         int32_t format = 0;
1319         if ((ret = TransferFormat(value, &format)) < 0) {
1320             AUDIO_FUNC_LOGE("TransferFormat failed ! ret = %{public}d\n", ret);
1321             return HDF_FAILURE;
1322         }
1323         mExtraParams->format = format;
1324     } else if (strcmp(key, AUDIO_ATTR_PARAM_CHANNELS) == 0) {
1325         uint32_t channels;
1326         if ((ret = TransferChannels(value, &channels)) < 0) {
1327             AUDIO_FUNC_LOGE("TransferChannels failed ! ret = %{public}d\n", ret);
1328             return HDF_FAILURE;
1329         }
1330         mExtraParams->channels = channels;
1331     } else if (strcmp(key, AUDIO_ATTR_PARAM_FRAME_COUNT) == 0) {
1332         uint64_t frames;
1333         if ((ret = TransferFrames(value, &frames)) < 0) {
1334             AUDIO_FUNC_LOGE("TransferFrames failed ! ret = %{public}d\n", ret);
1335             return HDF_FAILURE;
1336         }
1337         mExtraParams->frames = frames;
1338         mExtraParams->flag = true;
1339     } else if (strcmp(key, AUDIO_ATTR_PARAM_SAMPLING_RATE) == 0) {
1340         uint32_t sampleRate = 0;
1341         if ((ret = TransferSampleRate(value, &sampleRate)) < 0) {
1342             AUDIO_FUNC_LOGE("TransferSampleRate failed ! ret = %{public}d\n", ret);
1343             return HDF_FAILURE;
1344         }
1345         mExtraParams->sampleRate = sampleRate;
1346     } else {
1347         AUDIO_FUNC_LOGE("NO this key correspond value or value is invalid!");
1348         return HDF_FAILURE;
1349     }
1350     return ret;
1351 }
1352 
GetErrorReason(int reason,char * reasonDesc)1353 int32_t GetErrorReason(int reason, char *reasonDesc)
1354 {
1355     int32_t ret;
1356     if (reasonDesc == NULL) {
1357         AUDIO_FUNC_LOGE("param reasonDesc is null!");
1358         return HDF_FAILURE;
1359     }
1360     switch (reason) {
1361         case HDF_FAILURE:
1362             ret = snprintf_s(reasonDesc, ERROR_REASON_DESC_LEN - 1, strlen("NOT SUPPORT") + 1, "%s", "NOT SUPPORT");
1363             break;
1364         case HDF_ERR_NOT_SUPPORT:
1365             ret = snprintf_s(reasonDesc, ERROR_REASON_DESC_LEN - 1, strlen("BUFFER FULL") + 1, "%s", "BUFFER FULL");
1366             break;
1367         default:
1368             ret = snprintf_s(reasonDesc, ERROR_REASON_DESC_LEN - 1, strlen("UNKNOW") + 1, "%s", "UNKNOW");
1369             break;
1370     }
1371     if (ret < 0) {
1372         AUDIO_FUNC_LOGE("sprintf_s failed!");
1373         return HDF_FAILURE;
1374     }
1375     return HDF_SUCCESS;
1376 }
GetCurrentTime(char * currentTime)1377 int32_t GetCurrentTime(char *currentTime)
1378 {
1379     if (currentTime == NULL) {
1380         AUDIO_FUNC_LOGE("param currentTime is null!");
1381         return HDF_FAILURE;
1382     }
1383     // Get the current time
1384     char *week[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
1385     time_t timeSec;
1386     (void)time(&timeSec);
1387     struct tm *specificTime = localtime(&timeSec);
1388     if (specificTime == NULL) {
1389         AUDIO_FUNC_LOGE("localtime failed!");
1390         return HDF_FAILURE;
1391     }
1392     int32_t ret = sprintf_s(currentTime, ERROR_REASON_DESC_LEN - 1, "%d/%d/%d %s %d:%d:%d",
1393         (TIME_BASE_YEAR_1900 + specificTime->tm_year), (1 + specificTime->tm_mon), specificTime->tm_mday,
1394         week[specificTime->tm_wday], specificTime->tm_hour, specificTime->tm_min, specificTime->tm_sec);
1395     if (ret < 0) {
1396         AUDIO_FUNC_LOGE("sprintf_s failed!");
1397         return HDF_FAILURE;
1398     }
1399     return HDF_SUCCESS;
1400 }
1401 
AudioSetExtraParams(const char * keyValueList,int32_t * count,struct ExtraParams * mExtraParams,int32_t * sumOk)1402 int32_t AudioSetExtraParams(const char *keyValueList, int32_t *count,
1403     struct ExtraParams *mExtraParams, int32_t *sumOk)
1404 {
1405     if (keyValueList == NULL || count == NULL || mExtraParams == NULL || sumOk == NULL) {
1406         AUDIO_FUNC_LOGE("param keyValueList or count or mExtraParams or sumOk is null!");
1407         return AUDIO_HAL_ERR_INTERNAL;
1408     }
1409     struct ParamValMap mParamValMap[MAP_MAX];
1410     int32_t ret = KeyValueListToMap(keyValueList, mParamValMap, count);
1411     if (ret < 0) {
1412         AUDIO_FUNC_LOGE("Convert to map FAIL!");
1413         return AUDIO_HAL_ERR_INTERNAL;
1414     }
1415     int index = 0;
1416     mExtraParams->route = -1;
1417     mExtraParams->format = -1;
1418     mExtraParams->channels = 0;
1419     mExtraParams->frames = 0;
1420     mExtraParams->sampleRate = 0;
1421     mExtraParams->flag = false;
1422     while (index < *count) {
1423         ret = SetExtParam(mParamValMap[index].key, mParamValMap[index].value, mExtraParams);
1424         if (ret < 0) {
1425             return AUDIO_HAL_ERR_INTERNAL;
1426         } else {
1427             (*sumOk)++;
1428         }
1429         index++;
1430     }
1431     return AUDIO_HAL_SUCCESS;
1432 }
1433 
1434