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