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