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