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