• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "audio_pathselect.h"
17 #include "osal_mem.h"
18 #include "audio_uhdf_log.h"
19 
20 #define HDF_LOG_TAG HDF_AUDIO_HAL_IMPL
21 
22 #define SPEAKER     "Speaker"
23 #define HEADPHONES  "headphones"
24 #define MIC         "mic"
25 #define HS_MIC      "micHs"
26 #define JSON_UNPRINT 1
27 
28 static cJSON *g_cJsonObj = NULL;
29 
30 /* Depend on Audio_types.h : enum AudioCategory */
31 enum AudioCategoryPathSel {
32     PATH_USE_IN_MEDIA = 0,
33     PATH_USE_IN_COMMUNICATION,
34     PATH_USE_TYPE_MAX,
35 };
36 
37 enum AudioPortPinPathSel {
38     PATH_DEV_NONE        = 0x0u,       /* Invalid pin */
39     PATH_DEV_OUT_SPEAKER = 0x1u,       /* Speaker output pin */
40     PATH_DEV_OUT_HEADSET = 0x2u,       /* Wired headset pin for output */
41     PATH_DEV_OUT_LINEOUT = 0x4u,       /* Line-out pin */
42     PATH_DEV_OUT_HDMI    = 0x8u,       /* HDMI output pin */
43     PATH_DEV_MID         = 0x8000000u, /* Microphone input pin */
44     PATH_DEV_IN_MIC      = 0x8000001u, /* Microphone input pin */
45     PATH_DEV_IN_HS_MIC   = 0x8000002u, /* Wired headset microphone pin for input */
46     PATH_DEV_IN_LINEIN   = 0x8000004u, /* Line-in pin */
47     PATH_DEV_MAX,
48 };
49 
AudioPathSelGetConfToJsonObj()50 int32_t AudioPathSelGetConfToJsonObj()
51 {
52     FILE *fpJson = NULL;
53     char *pJsonStr = NULL;
54     if (g_cJsonObj != NULL) {
55         return HDF_SUCCESS;
56     }
57     fpJson = fopen(CJSONFILE_CONFIG_PATH, "r");
58     if (fpJson == NULL) {
59         AUDIO_FUNC_LOGE("audio_paths.json file fail!");
60         return HDF_FAILURE;
61     }
62     if (fseek(fpJson, 0, SEEK_END) != HDF_SUCCESS) {
63         AUDIO_FUNC_LOGE("fseek fail!");
64         (void)fclose(fpJson);
65         return HDF_FAILURE;
66     }
67     int32_t jsonStrSize = ftell(fpJson);
68     rewind(fpJson);
69     if (jsonStrSize <= 0) {
70         (void)fclose(fpJson);
71         return HDF_FAILURE;
72     }
73     pJsonStr = (char *)OsalMemCalloc(jsonStrSize + 1);
74     if (pJsonStr == NULL) {
75         (void)fclose(fpJson);
76         return HDF_FAILURE;
77     }
78     if (fread(pJsonStr, jsonStrSize, 1, fpJson) != 1) {
79         AUDIO_FUNC_LOGE("read to file fail!");
80         (void)fclose(fpJson);
81         fpJson = NULL;
82         AudioMemFree((void **)&pJsonStr);
83         return HDF_FAILURE;
84     }
85     (void)fclose(fpJson);
86     fpJson = NULL;
87 #ifndef JSON_UNPRINT
88     AUDIO_FUNC_LOGI("pJsonStr = %{public}s", pJsonStr);
89 #endif
90     g_cJsonObj = cJSON_Parse(pJsonStr);
91     if (g_cJsonObj == NULL) {
92         AUDIO_FUNC_LOGE("cJSON_GetErrorPtr() = %{public}s", cJSON_GetErrorPtr());
93         AudioMemFree((void **)&pJsonStr);
94         return HDF_FAILURE;
95     }
96     AudioMemFree((void **)&pJsonStr);
97     return HDF_SUCCESS;
98 }
99 
AudioPathSelGetDeviceType(enum AudioPortPin pins)100 static const char *AudioPathSelGetDeviceType(enum AudioPortPin pins)
101 {
102     if (pins < PATH_DEV_NONE || pins > PATH_DEV_MAX) {
103         return NULL;
104     }
105     switch (pins) {
106         case PATH_DEV_OUT_SPEAKER:
107             return SPEAKER;
108         case PATH_DEV_OUT_HEADSET:
109             return HEADPHONES;
110         case PATH_DEV_IN_MIC:
111             return MIC;
112         case PATH_DEV_IN_HS_MIC:
113             return HS_MIC;
114         default:
115             AUDIO_FUNC_LOGE("UseCase not support!");
116             break;
117     }
118     return NULL;
119 }
120 
AudioPathSelGetUseCase(enum AudioCategory type)121 static const char *AudioPathSelGetUseCase(enum AudioCategory type)
122 {
123     static const char *usecaseType[PATH_USE_TYPE_MAX + 1] = {
124         [PATH_USE_IN_MEDIA] = "deep-buffer-playback",
125         [PATH_USE_IN_COMMUNICATION] = "low-latency-playback",
126         [PATH_USE_TYPE_MAX] = "none",
127     };
128 
129     if (type < 0 || type > PATH_USE_TYPE_MAX) {
130         return NULL;
131     }
132     return usecaseType[type];
133 }
134 
AudioCJsonCardServiceItemCheck(cJSON * cJsonObj,const char * firstItem,const char * secondItem,const char * thirdItem)135 static int32_t AudioCJsonCardServiceItemCheck(cJSON *cJsonObj, const char *firstItem, const char *secondItem,
136                                               const char *thirdItem)
137 {
138     if (cJsonObj == NULL || firstItem == NULL || secondItem == NULL || thirdItem == NULL) {
139         AUDIO_FUNC_LOGE("cJsonObj or firstItem or secondItem or thirdItem is NULL!");
140         return HDF_FAILURE;
141     }
142     cJSON *cardNode = cJSON_GetObjectItem(cJsonObj, firstItem);
143     if (cardNode == NULL) {
144         AUDIO_FUNC_LOGE("failed to check item when firstItem[%{public}s] gets object!", firstItem);
145         return HDF_FAILURE;
146     }
147     cJSON *cardList = cardNode->child;
148     if (cardList == NULL) {
149         AUDIO_FUNC_LOGE("no child when firstItem[%{public}s] gets object!", firstItem);
150         return HDF_FAILURE;
151     }
152 
153     cJSON *pathNode = cJSON_GetObjectItem(cardList, secondItem);
154     if (pathNode == NULL) {
155         AUDIO_FUNC_LOGE("failed to check item when secondItem[%{public}s] gets object!", secondItem);
156         return HDF_ERR_NOT_SUPPORT;
157     }
158     cJSON *deviceNode = cJSON_GetObjectItem(cardList, thirdItem);
159     if (deviceNode == NULL) {
160         AUDIO_FUNC_LOGE("failed to check item when thirdItem[%{public}s] gets object!", thirdItem);
161         return HDF_ERR_NOT_SUPPORT;
162     }
163     return HDF_SUCCESS;
164 }
165 
AudioPathSelGetPlanRenderScene(struct AudioHwRenderParam * renderSceneParam)166 static int32_t AudioPathSelGetPlanRenderScene(struct AudioHwRenderParam *renderSceneParam)
167 {
168     AUDIO_FUNC_LOGI();
169     int32_t ret;
170     if (renderSceneParam == NULL) {
171         AUDIO_FUNC_LOGE("AudioPathSelGetPlanRenderScene param Is NULL");
172         return HDF_FAILURE;
173     }
174     char pathName[PATH_NAME_LEN] = {0};
175     enum AudioPortPin pins = renderSceneParam->renderMode.hwInfo.deviceDescript.pins;
176     if (pins >= PATH_DEV_MAX || pins < PATH_DEV_NONE) {
177         AUDIO_FUNC_LOGE("deviceDescript pins error!");
178         return HDF_FAILURE;
179     }
180     enum AudioCategory type = renderSceneParam->frameRenderMode.attrs.type;
181     const char *useCase = AudioPathSelGetUseCase(type);
182     const char *deviceType = AudioPathSelGetDeviceType(pins);
183     if (useCase == NULL || deviceType == NULL) {
184         AUDIO_FUNC_LOGE("pins or type not support!");
185         return HDF_FAILURE;
186     }
187     if (snprintf_s(pathName, sizeof(pathName), sizeof(pathName) - 1, "%s %s", useCase, deviceType) < 0) {
188         AUDIO_FUNC_LOGE("snprintf_s Invalid!");
189         return HDF_FAILURE;
190     }
191     ret = AudioCJsonCardServiceItemCheck(g_cJsonObj, renderSceneParam->renderMode.hwInfo.cardServiceName, pathName,
192                                          deviceType);
193     if (ret != HDF_SUCCESS) {
194         return ret;
195     }
196     ret = strncpy_s(renderSceneParam->renderMode.hwInfo.pathSelect.useCase,
197                     NAME_LEN, useCase, strlen(useCase) + 1);
198     if (ret != 0) {
199         AUDIO_FUNC_LOGE("strncpy_s failed!");
200         return HDF_FAILURE;
201     }
202     ret = strncpy_s(renderSceneParam->renderMode.hwInfo.pathSelect.deviceInfo.deviceType,
203                     NAME_LEN, deviceType, strlen(deviceType) + 1);
204     if (ret != 0) {
205         AUDIO_FUNC_LOGE("strncpy_s failed!");
206         return HDF_FAILURE;
207     }
208     return HDF_SUCCESS;
209 }
210 
AudioPathSelGetPlanCaptureScene(struct AudioHwCaptureParam * captureSceneParam)211 static int32_t AudioPathSelGetPlanCaptureScene(struct AudioHwCaptureParam *captureSceneParam)
212 {
213     AUDIO_FUNC_LOGI();
214     int32_t ret;
215     if (captureSceneParam == NULL) {
216         AUDIO_FUNC_LOGE("AudioPathSelGetPlanCaptureScene param Is NULL");
217         return HDF_FAILURE;
218     }
219     char pathName[PATH_NAME_LEN] = {0};
220     enum AudioPortPin pins = captureSceneParam->captureMode.hwInfo.deviceDescript.pins;
221     if (pins >= PATH_DEV_MAX || pins < PATH_DEV_MID) {
222         AUDIO_FUNC_LOGE("deviceDescript pins error!");
223         return HDF_FAILURE;
224     }
225     enum AudioCategory type = captureSceneParam->frameCaptureMode.attrs.type;
226     const char *useCase = AudioPathSelGetUseCase(type);
227     const char *deviceType = AudioPathSelGetDeviceType(pins);
228     if (useCase == NULL || deviceType == NULL) {
229         AUDIO_FUNC_LOGE("pins or type not support!");
230         return HDF_FAILURE;
231     }
232     if (snprintf_s(pathName, sizeof(pathName), sizeof(pathName) - 1, "%s %s", useCase, deviceType) < 0) {
233         AUDIO_FUNC_LOGE("snprintf_s failed!");
234         return HDF_FAILURE;
235     }
236     ret = AudioCJsonCardServiceItemCheck(g_cJsonObj, captureSceneParam->captureMode.hwInfo.cardServiceName, pathName,
237                                          deviceType);
238     if (ret != HDF_SUCCESS) {
239         return ret;
240     }
241     ret = strncpy_s(captureSceneParam->captureMode.hwInfo.pathSelect.useCase,
242                     NAME_LEN, useCase, strlen(useCase) + 1);
243     if (ret != 0) {
244         AUDIO_FUNC_LOGE("strncpy_s failed!");
245         return HDF_FAILURE;
246     }
247     ret = strncpy_s(captureSceneParam->captureMode.hwInfo.pathSelect.deviceInfo.deviceType,
248                     NAME_LEN, deviceType, strlen(deviceType) + 1);
249     if (ret != 0) {
250         AUDIO_FUNC_LOGE("strncpy_s failed!");
251         return HDF_FAILURE;
252     }
253     return HDF_SUCCESS;
254 }
255 
AudioCJsonParseGetSubItem(cJSON * cJsonObj,const char * firstItem,const char * secondItem,cJSON ** deviceList)256 static int32_t AudioCJsonParseGetSubItem(cJSON *cJsonObj, const char *firstItem, const char *secondItem,
257                                          cJSON **deviceList)
258 {
259     if (cJsonObj == NULL || firstItem == NULL || secondItem == NULL || deviceList == NULL) {
260         AUDIO_FUNC_LOGE("cJsonObj or firstItem or secondItem or deviceList is null");
261         return HDF_FAILURE;
262     }
263     cJSON *cardNode = cJSON_GetObjectItem(cJsonObj, firstItem);
264     if (cardNode == NULL) {
265         AUDIO_FUNC_LOGE("firstItem[%{public}s] Get Object Fail!", firstItem);
266         return HDF_FAILURE;
267     }
268 
269     cJSON *cardList = cardNode->child;
270     if (cardList == NULL) {
271         AUDIO_FUNC_LOGE("firstItem[%{public}s] no child!", firstItem);
272         return HDF_FAILURE;
273     }
274 
275     cJSON *deviceNode = cJSON_GetObjectItem(cardList, secondItem);
276     if (deviceNode == NULL) {
277         AUDIO_FUNC_LOGE("secondItem[%{public}s] Get Object Fail!", secondItem);
278         return HDF_FAILURE;
279     }
280     *deviceList = deviceNode->child;
281     if (*deviceList == NULL) {
282         AUDIO_FUNC_LOGE("deviceList is NULL!");
283         return HDF_FAILURE;
284     }
285     return HDF_SUCCESS;
286 }
287 
AudioCapturePathSelGetUsecaseDevice(struct AudioHwCaptureParam * captureParam,const char * pathName)288 static int32_t AudioCapturePathSelGetUsecaseDevice(struct AudioHwCaptureParam *captureParam, const char *pathName)
289 {
290     if (captureParam == NULL || pathName == NULL || g_cJsonObj == NULL) {
291         AUDIO_FUNC_LOGE("AudioCapturePathSelGetUsecaseDevice param Is NULL");
292         return HDF_FAILURE;
293     }
294     int32_t pathIndex = 0;
295     char *pathKey = NULL;
296     int32_t ret;
297 
298     cJSON *pathList = NULL;
299     ret = AudioCJsonParseGetSubItem(g_cJsonObj, captureParam->captureMode.hwInfo.cardServiceName, pathName, &pathList);
300     if (ret != HDF_SUCCESS) {
301         return ret;
302     }
303     while (pathList != NULL) {
304         cJSON *device = cJSON_GetObjectItem(pathList, "name");
305         if (device == NULL) {
306             AUDIO_FUNC_LOGE("Get Object Invalid!");
307             return HDF_FAILURE;
308         }
309         pathKey = device->valuestring;
310         if (pathKey == NULL) {
311             pathList = pathList->next;
312             continue;
313         }
314         device = cJSON_GetObjectItem(pathList, "value");
315         if (device == NULL) {
316             return HDF_FAILURE;
317         }
318         captureParam->captureMode.hwInfo.pathSelect.pathPlan[pathIndex].value = device->valueint;
319         ret = strncpy_s(captureParam->captureMode.hwInfo.pathSelect.pathPlan[pathIndex].pathPlanName,
320                         PATHPLAN_LEN, pathKey, strlen(pathKey) + 1);
321         if (ret != 0) {
322             AUDIO_FUNC_LOGE("strncpy_s failed!");
323             return HDF_FAILURE;
324         }
325         pathList = pathList->next;
326         pathIndex++;
327     }
328     if (pathIndex >= PATHPLAN_COUNT || pathIndex < 0) {
329         AUDIO_FUNC_LOGE("AudioCapturePathSel Get Object Fail!");
330         return HDF_FAILURE;
331     }
332     captureParam->captureMode.hwInfo.pathSelect.useCaseDeviceNum = pathIndex;
333     return HDF_SUCCESS;
334 }
335 
AudioCapturePathSelGetDeviceSplit(struct AudioHwCaptureParam * captureParam,cJSON * deviceList)336 static int32_t AudioCapturePathSelGetDeviceSplit(struct AudioHwCaptureParam *captureParam, cJSON *deviceList)
337 {
338     AUDIO_FUNC_LOGI();
339     int32_t decIndex = 0;
340     char *decKey = NULL;
341     int32_t decValue;
342     int32_t ret;
343     cJSON *devObj = NULL;
344     if (captureParam == NULL || deviceList == NULL) {
345         AUDIO_FUNC_LOGE("param Is NULL");
346         return HDF_FAILURE;
347     }
348     while (deviceList != NULL) {
349         devObj = cJSON_GetObjectItem(deviceList, "name");
350         if (devObj == NULL) {
351             AUDIO_FUNC_LOGE("Get Object Fail!");
352             return HDF_FAILURE;
353         }
354         decKey = devObj->valuestring;
355         if (decKey == NULL) {
356             deviceList = deviceList->next;
357             continue;
358         }
359         devObj = cJSON_GetObjectItem(deviceList, "value");
360         if (devObj == NULL) {
361             return HDF_FAILURE;
362         }
363         decValue = devObj->valueint;
364         captureParam->captureMode.hwInfo.pathSelect.deviceInfo.deviceSwitchs[decIndex].value = decValue;
365         ret = strncpy_s(captureParam->captureMode.hwInfo.pathSelect.deviceInfo.deviceSwitchs[decIndex].deviceSwitch,
366                         PATHPLAN_LEN, decKey, strlen(decKey) + 1);
367         if (ret != 0) {
368             AUDIO_FUNC_LOGE("strncpy_s failed!");
369             return HDF_FAILURE;
370         }
371         deviceList = deviceList->next;
372         decIndex++;
373     }
374     if (decIndex >= PATHPLAN_COUNT || decIndex < 0) {
375         AUDIO_FUNC_LOGE("Get Object Fail!");
376         return HDF_FAILURE;
377     }
378     captureParam->captureMode.hwInfo.pathSelect.deviceInfo.deviceNum = decIndex;
379     return HDF_SUCCESS;
380 }
381 
AudioCapturePathSelGetDevice(struct AudioHwCaptureParam * captureParam,const char * deviceType)382 static int32_t AudioCapturePathSelGetDevice(struct AudioHwCaptureParam *captureParam, const char *deviceType)
383 {
384     AUDIO_FUNC_LOGI();
385     if (captureParam == NULL || deviceType == NULL || g_cJsonObj == NULL) {
386         AUDIO_FUNC_LOGE("AudioCapturePathSelGetUsecaseDevice param Is NULL");
387         return HDF_FAILURE;
388     }
389 
390     cJSON *cardNode = cJSON_GetObjectItem(g_cJsonObj, captureParam->captureMode.hwInfo.cardServiceName);
391     if (cardNode == NULL) {
392         AUDIO_FUNC_LOGE("cardNode Get Object Fail cardServiceName = %{public}s !",
393             captureParam->captureMode.hwInfo.cardServiceName);
394         return HDF_FAILURE;
395     }
396     cJSON *cardList = cardNode->child;
397     if (cardList == NULL) {
398         AUDIO_FUNC_LOGE("AudioRenderPathSel Get cardList Fail!");
399         return HDF_FAILURE;
400     }
401 
402     cJSON *deviceNode = cJSON_GetObjectItem(cardList, deviceType);
403     if (deviceNode == NULL) {
404         AUDIO_FUNC_LOGE("Get deviceType Fail!");
405         return HDF_FAILURE;
406     }
407     cJSON *deviceList = deviceNode->child;
408     if (deviceList == NULL) {
409         AUDIO_FUNC_LOGE("Get deviceList Fail!");
410         return HDF_FAILURE;
411     }
412     if (AudioCapturePathSelGetDeviceSplit(captureParam, deviceList) < 0) {
413         AUDIO_FUNC_LOGE("AudioCapturePathSelGetDeviceSplit Fail!");
414         return HDF_FAILURE;
415     }
416     return HDF_SUCCESS;
417 }
418 
AudioPathSelGetPlanCapture(struct AudioHwCaptureParam * captureParam)419 static int32_t AudioPathSelGetPlanCapture(struct AudioHwCaptureParam *captureParam)
420 {
421     AUDIO_FUNC_LOGI();
422     int32_t ret;
423     if (captureParam == NULL) {
424         AUDIO_FUNC_LOGE("AudioPathSelGetPlanCapture param Is NULL");
425         return HDF_FAILURE;
426     }
427     char pathName[PATH_NAME_LEN] = {0};
428     enum AudioPortPin pins = captureParam->captureMode.hwInfo.deviceDescript.pins;
429     if (pins <= PATH_DEV_MID) {
430         AUDIO_FUNC_LOGE("deviceDescript pins error!");
431         return HDF_FAILURE;
432     }
433     enum AudioCategory type = captureParam->frameCaptureMode.attrs.type;
434     const char *useCase = AudioPathSelGetUseCase(type);
435     const char *deviceType = AudioPathSelGetDeviceType(pins);
436     if (useCase == NULL || deviceType == NULL) {
437         AUDIO_FUNC_LOGE("pins or type not support!");
438         return HDF_FAILURE;
439     }
440     ret = strncpy_s(captureParam->captureMode.hwInfo.pathSelect.useCase,
441                     NAME_LEN, useCase, strlen(useCase) + 1);
442     if (ret != 0) {
443         AUDIO_FUNC_LOGE("strncpy_s failed!");
444         return HDF_FAILURE;
445     }
446     ret = strncpy_s(captureParam->captureMode.hwInfo.pathSelect.deviceInfo.deviceType,
447                     NAME_LEN, deviceType, strlen(deviceType) + 1);
448     if (ret != 0) {
449         AUDIO_FUNC_LOGE("strncpy_s failed!");
450         return HDF_FAILURE;
451     }
452     if (snprintf_s(pathName, sizeof(pathName), sizeof(pathName) - 1, "%s %s", useCase, deviceType) < 0) {
453         AUDIO_FUNC_LOGE("snprintf_s failed!");
454         return HDF_FAILURE;
455     }
456     if (AudioCapturePathSelGetUsecaseDevice(captureParam, pathName) < 0) {
457         AUDIO_FUNC_LOGE("AudioCapturePathSelGetUsecaseDevice failed!");
458         return HDF_FAILURE;
459     }
460     if (AudioCapturePathSelGetDevice(captureParam, deviceType) < 0) {
461         AUDIO_FUNC_LOGE("AudioCapturePathSelGetDevice failed!");
462         return HDF_FAILURE;
463     }
464     return HDF_SUCCESS;
465 }
466 
AudioRenderPathSelGetUsecaseDevice(struct AudioHwRenderParam * renderParam,const char * pathName)467 static int32_t AudioRenderPathSelGetUsecaseDevice(struct AudioHwRenderParam *renderParam, const char *pathName)
468 {
469     if (renderParam == NULL || pathName == NULL || g_cJsonObj == NULL) {
470         AUDIO_FUNC_LOGE("AudioPathSelGetUsecaseDevice param Is NULL");
471         return HDF_FAILURE;
472     }
473     int32_t pathIndex = 0;
474     char *pathKey = NULL;
475     int32_t ret;
476 
477     cJSON *pathList = NULL;
478     ret = AudioCJsonParseGetSubItem(g_cJsonObj, renderParam->renderMode.hwInfo.cardServiceName, pathName, &pathList);
479     if (ret != HDF_SUCCESS) {
480         return ret;
481     }
482     while (pathList != NULL) {
483         cJSON *device = cJSON_GetObjectItem(pathList, "name");
484         if (device == NULL) {
485             AUDIO_FUNC_LOGE("Get Object Fail!");
486             return HDF_FAILURE;
487         }
488         pathKey = device->valuestring;
489         if (pathKey == NULL) {
490             pathList = pathList->next;
491             continue;
492         }
493         device = cJSON_GetObjectItem(pathList, "value");
494         if (device == NULL) {
495             return HDF_FAILURE;
496         }
497         renderParam->renderMode.hwInfo.pathSelect.pathPlan[pathIndex].value = device->valueint;
498         ret = strncpy_s(renderParam->renderMode.hwInfo.pathSelect.pathPlan[pathIndex].pathPlanName,
499                         PATHPLAN_LEN, pathKey, strlen(pathKey));
500         if (ret != 0) {
501             AUDIO_FUNC_LOGE("strncpy_s is Fail!");
502             return HDF_FAILURE;
503         }
504         pathList = pathList->next;
505         pathIndex++;
506     }
507     if (pathIndex >= PATHPLAN_COUNT || pathIndex < 0) {
508         AUDIO_FUNC_LOGE("AudioRenderPathSel Get Object Fail!");
509         return HDF_FAILURE;
510     }
511     renderParam->renderMode.hwInfo.pathSelect.useCaseDeviceNum = pathIndex;
512     return HDF_SUCCESS;
513 }
514 
AudioRenderPathSelGetDevice(struct AudioHwRenderParam * renderParam,const char * deviceType)515 static int32_t AudioRenderPathSelGetDevice(struct AudioHwRenderParam *renderParam, const char *deviceType)
516 {
517     if (renderParam == NULL || deviceType == NULL || g_cJsonObj == NULL) {
518         AUDIO_FUNC_LOGE("AudioPathSelGetDevice param Is NULL");
519         return HDF_FAILURE;
520     }
521     char *decKey = NULL;
522     int32_t decIndex = 0;
523     int32_t ret;
524 
525     cJSON *deviceList = NULL;
526     ret = AudioCJsonParseGetSubItem(g_cJsonObj, renderParam->renderMode.hwInfo.cardServiceName, deviceType,
527                                     &deviceList);
528     if (ret != HDF_SUCCESS) {
529         return ret;
530     }
531     while (deviceList != NULL) {
532         cJSON *device = cJSON_GetObjectItem(deviceList, "name");
533         if (device == NULL) {
534             AUDIO_FUNC_LOGE("Get Object Invalid!");
535             return HDF_FAILURE;
536         }
537         decKey = device->valuestring;
538         if (decKey == NULL) {
539             deviceList = deviceList->next;
540             continue;
541         }
542         device = cJSON_GetObjectItem(deviceList, "value");
543         if (device == NULL) {
544             return HDF_FAILURE;
545         }
546         renderParam->renderMode.hwInfo.pathSelect.deviceInfo.deviceSwitchs[decIndex].value = device->valueint;
547         ret = strncpy_s(renderParam->renderMode.hwInfo.pathSelect.deviceInfo.deviceSwitchs[decIndex].deviceSwitch,
548                         PATHPLAN_LEN, decKey, strlen(decKey) + 1);
549         if (ret != 0) {
550             AUDIO_FUNC_LOGE("strncpy_s is Fail!");
551             return HDF_FAILURE;
552         }
553         deviceList = deviceList->next;
554         decIndex++;
555     }
556     if (decIndex >= PATHPLAN_COUNT || decIndex < 0) {
557         AUDIO_FUNC_LOGE("Get Object Fail!");
558         return HDF_FAILURE;
559     }
560     renderParam->renderMode.hwInfo.pathSelect.deviceInfo.deviceNum = decIndex;
561     return HDF_SUCCESS;
562 }
563 
AudioPathSelGetPlanRender(struct AudioHwRenderParam * renderParam)564 static int32_t AudioPathSelGetPlanRender(struct AudioHwRenderParam *renderParam)
565 {
566     AUDIO_FUNC_LOGI();
567     int32_t ret;
568     if (renderParam == NULL) {
569         AUDIO_FUNC_LOGE("AudioPathSelGetPlanRender param Is NULL");
570         return HDF_FAILURE;
571     }
572     char pathName[PATH_NAME_LEN] = {0};
573     enum AudioPortPin pins = renderParam->renderMode.hwInfo.deviceDescript.pins;
574     if (pins >= PATH_DEV_MID) {
575         AUDIO_FUNC_LOGE("deviceDescript pins error!");
576         return HDF_FAILURE;
577     }
578     enum AudioCategory type = renderParam->frameRenderMode.attrs.type;
579     const char *useCase = AudioPathSelGetUseCase(type);
580     const char *deviceType = AudioPathSelGetDeviceType(pins);
581     if (useCase == NULL || deviceType == NULL) {
582         AUDIO_FUNC_LOGE("pins or type not support!");
583         return HDF_FAILURE;
584     }
585     ret = strncpy_s(renderParam->renderMode.hwInfo.pathSelect.useCase,
586                     NAME_LEN, useCase, strlen(useCase) + 1);
587     if (ret != 0) {
588         AUDIO_FUNC_LOGE("strncpy_s is Fail!");
589         return HDF_FAILURE;
590     }
591     ret = strncpy_s(renderParam->renderMode.hwInfo.pathSelect.deviceInfo.deviceType,
592                     NAME_LEN, deviceType, strlen(deviceType) + 1);
593     if (ret != 0) {
594         AUDIO_FUNC_LOGE("strncpy_s is Fail!");
595         return HDF_FAILURE;
596     }
597     if (snprintf_s(pathName, sizeof(pathName), sizeof(pathName) - 1, "%s %s", useCase, deviceType) < 0) {
598         AUDIO_FUNC_LOGE("snprintf_s failed!");
599         return HDF_FAILURE;
600     }
601     if (AudioRenderPathSelGetUsecaseDevice(renderParam, pathName) < 0) {
602         AUDIO_FUNC_LOGE("AudioRenderPathSelGetUsecaseDevice failed!");
603         return HDF_FAILURE;
604     }
605     if (AudioRenderPathSelGetDevice(renderParam, deviceType) < 0) {
606         AUDIO_FUNC_LOGE("AudioRenderPathSelGetDevice failed!");
607         return HDF_FAILURE;
608     }
609     return HDF_SUCCESS;
610 }
611 
AudioPathSelAnalysisJson(const AudioHandle adapterParam,enum AudioAdaptType adaptType)612 int32_t AudioPathSelAnalysisJson(const AudioHandle adapterParam, enum AudioAdaptType adaptType)
613 {
614     AUDIO_FUNC_LOGI();
615     if (adaptType < 0 || adapterParam == NULL) {
616         AUDIO_FUNC_LOGE("Param Invaild!");
617         return HDF_FAILURE;
618     }
619     struct AudioHwRenderParam *renderParam = NULL;
620     struct AudioHwCaptureParam *captureParam = NULL;
621     struct AudioHwRenderParam *renderSceneCheck = NULL;
622     struct AudioHwCaptureParam *captureScenceCheck = NULL;
623     switch (adaptType) {
624         case RENDER_PATH_SELECT:
625             renderParam = (struct AudioHwRenderParam *)adapterParam;
626             return (AudioPathSelGetPlanRender(renderParam));
627         case CAPTURE_PATH_SELECT:
628             captureParam = (struct AudioHwCaptureParam *)adapterParam;
629             return (AudioPathSelGetPlanCapture(captureParam));
630         /* Scene is supported */
631         case CHECKSCENE_PATH_SELECT:
632             renderSceneCheck = (struct AudioHwRenderParam *)adapterParam;
633             return (AudioPathSelGetPlanRenderScene(renderSceneCheck));
634         case CHECKSCENE_PATH_SELECT_CAPTURE:
635             captureScenceCheck = (struct AudioHwCaptureParam *)adapterParam;
636             return (AudioPathSelGetPlanCaptureScene(captureScenceCheck));
637         default:
638             AUDIO_FUNC_LOGE("Path select mode invalid");
639             break;
640     }
641     return HDF_FAILURE;
642 }
643 
644