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