1 /*
2 * Copyright (c) 2021-2023 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_manager.h"
17 #include <limits.h>
18 #include "osal_mem.h"
19 #include "audio_adapter_info_common.h"
20 #include "audio_interface_lib_capture.h"
21 #include "audio_interface_lib_render.h"
22 #include "audio_uhdf_log.h"
23
24 #define HDF_LOG_TAG HDF_AUDIO_HAL_IMPL
25
26 static struct AudioManager g_audioManagerFuncs = {0};
27 static bool g_audioAdapterAddrMgrFlag = false;
28 struct AudioAdapterDescriptor *g_localAddrAudioAdapterOut = NULL; // add for Fuzz
29 int g_localAdapterNum = 0; // add for Fuzz
30
31 BindServiceRenderSo g_bindServiceRender = NULL;
32 InterfaceLibModeRenderSo g_interfaceLibModeRender = NULL;
33 CloseServiceRenderSo g_closeServiceRender = NULL;
34
35 BindServiceCaptureSo g_bindServiceCapture = NULL;
36 InterfaceLibModeCaptureSo g_interfaceLibModeCapture = NULL;
37 CloseServiceCaptureSo g_closeServiceCapture = NULL;
38
39 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
40 PathSelGetConfToJsonObj g_pathSelGetConfToJsonObj = NULL;
41 PathSelAnalysisJson g_pathSelAnalysisJson = NULL;
42 #endif
43
44 static const char *g_captureSoPath = HDF_LIBRARY_FULL_PATH("libhdi_audio_interface_lib_capture");
45 static const char *g_renderSoPath = HDF_LIBRARY_FULL_PATH("libhdi_audio_interface_lib_render");
46
47 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
48 static const char *g_pathSelectSoPath = HDF_LIBRARY_FULL_PATH("libhdi_audio_path_select");
49 #endif
50
51 static void *g_ptrCaptureHandle = NULL;
52 static void *g_ptrRenderHandle = NULL;
53
54 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
55 static void *g_ptrPathSelHandle = NULL;
56 #endif
57
AudioSoGetBindServiceRender(void)58 BindServiceRenderSo *AudioSoGetBindServiceRender(void)
59 {
60 return &g_bindServiceRender;
61 }
62
AudioSoGetInterfaceLibModeRender(void)63 InterfaceLibModeRenderSo *AudioSoGetInterfaceLibModeRender(void)
64 {
65 return &g_interfaceLibModeRender;
66 }
67
AudioSoGetCloseServiceRender(void)68 CloseServiceRenderSo *AudioSoGetCloseServiceRender(void)
69 {
70 return &g_closeServiceRender;
71 }
72
AudioSoGetBindServiceCapture(void)73 BindServiceCaptureSo *AudioSoGetBindServiceCapture(void)
74 {
75 return &g_bindServiceCapture;
76 }
77
AudioSoGetInterfaceLibModeCapture(void)78 InterfaceLibModeCaptureSo *AudioSoGetInterfaceLibModeCapture(void)
79 {
80 return &g_interfaceLibModeCapture;
81 }
82
AudioSoGetCloseServiceCapture(void)83 CloseServiceCaptureSo *AudioSoGetCloseServiceCapture(void)
84 {
85 return &g_closeServiceCapture;
86 }
87
88
89 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
AudioSoGetPathSelGetConfToJsonObj(void)90 PathSelGetConfToJsonObj *AudioSoGetPathSelGetConfToJsonObj(void)
91 {
92 return &g_pathSelGetConfToJsonObj;
93 }
94
AudioSoGetPathSelAnalysisJson(void)95 PathSelAnalysisJson *AudioSoGetPathSelAnalysisJson(void)
96 {
97 return &g_pathSelAnalysisJson;
98 }
99 #endif
100
InitCaptureSoHandle(const char * captureSoPath)101 static int32_t InitCaptureSoHandle(const char *captureSoPath)
102 {
103 if (captureSoPath == NULL) {
104 AUDIO_FUNC_LOGE("captureSoPath is NULL");
105 return HDF_FAILURE;
106 }
107 char pathBuf[PATH_MAX] = {'\0'};
108 if (realpath(captureSoPath, pathBuf) == NULL) {
109 return HDF_FAILURE;
110 }
111 if (g_ptrCaptureHandle == NULL) {
112 g_ptrCaptureHandle = dlopen(pathBuf, RTLD_LAZY);
113 if (g_ptrCaptureHandle == NULL) {
114 AUDIO_FUNC_LOGE("open lib capture so fail, reason:%{public}s", dlerror());
115 return HDF_FAILURE;
116 }
117 g_bindServiceCapture = dlsym(g_ptrCaptureHandle, "AudioBindServiceCapture");
118 g_interfaceLibModeCapture = dlsym(g_ptrCaptureHandle, "AudioInterfaceLibModeCapture");
119 g_closeServiceCapture = dlsym(g_ptrCaptureHandle, "AudioCloseServiceCapture");
120 if (g_bindServiceCapture == NULL || g_interfaceLibModeCapture == NULL || g_closeServiceCapture == NULL) {
121 AUDIO_FUNC_LOGE("lib capture so func not found!");
122 AudioDlClose(&g_ptrCaptureHandle);
123 return HDF_FAILURE;
124 }
125 }
126 return HDF_SUCCESS;
127 }
128
InitRenderSoHandle(const char * renderSoPath)129 static int32_t InitRenderSoHandle(const char *renderSoPath)
130 {
131 if (renderSoPath == NULL) {
132 AUDIO_FUNC_LOGE("renderSoPath is NULL");
133 return HDF_FAILURE;
134 }
135 char pathBuf[PATH_MAX] = {'\0'};
136 if (realpath(renderSoPath, pathBuf) == NULL) {
137 return HDF_FAILURE;
138 }
139 if (g_ptrRenderHandle == NULL) {
140 g_ptrRenderHandle = dlopen(pathBuf, RTLD_LAZY);
141 if (g_ptrRenderHandle == NULL) {
142 AUDIO_FUNC_LOGE("open lib render so fail, reason:%{public}s", dlerror());
143 return HDF_FAILURE;
144 }
145 g_bindServiceRender = dlsym(g_ptrRenderHandle, "AudioBindServiceRender");
146 g_interfaceLibModeRender = dlsym(g_ptrRenderHandle, "AudioInterfaceLibModeRender");
147 g_closeServiceRender = dlsym(g_ptrRenderHandle, "AudioCloseServiceRender");
148 if (g_bindServiceRender == NULL || g_interfaceLibModeRender == NULL || g_closeServiceRender == NULL) {
149 AUDIO_FUNC_LOGE("lib render so func not found!");
150 AudioDlClose(&g_ptrRenderHandle);
151 return HDF_FAILURE;
152 }
153 }
154 return HDF_SUCCESS;
155 }
156
157 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
InitPathSelectSoHandle(const char * pathSelectSoPath)158 static int32_t InitPathSelectSoHandle(const char *pathSelectSoPath)
159 {
160 if (pathSelectSoPath == NULL) {
161 AUDIO_FUNC_LOGE("pathSelectSoPath is NULL");
162 return HDF_FAILURE;
163 }
164 char pathBuf[PATH_MAX] = {'\0'};
165 if (realpath(pathSelectSoPath, pathBuf) == NULL) {
166 return HDF_FAILURE;
167 }
168 if (g_ptrPathSelHandle == NULL) {
169 g_ptrPathSelHandle = dlopen(pathBuf, RTLD_LAZY);
170 if (g_ptrPathSelHandle == NULL) {
171 AUDIO_FUNC_LOGE("open lib PathSelct so fail, reason:%s", dlerror());
172 return HDF_FAILURE;
173 }
174 g_pathSelGetConfToJsonObj = dlsym(g_ptrPathSelHandle, "AudioPathSelGetConfToJsonObj");
175 g_pathSelAnalysisJson = dlsym(g_ptrPathSelHandle, "AudioPathSelAnalysisJson");
176 if (g_pathSelGetConfToJsonObj == NULL || g_pathSelAnalysisJson == NULL) {
177 AUDIO_FUNC_LOGE("lib PathSelct so func not found!");
178 AudioDlClose(&g_ptrPathSelHandle);
179 return HDF_FAILURE;
180 }
181 }
182 return HDF_SUCCESS;
183 }
184 #endif
185
AudioManagerGetAllAdapters(struct AudioManager * manager,struct AudioAdapterDescriptor ** descs,int * size)186 int32_t AudioManagerGetAllAdapters(struct AudioManager *manager,
187 struct AudioAdapterDescriptor **descs, int *size)
188 {
189 AUDIO_FUNC_LOGI();
190 if (manager == NULL || descs == NULL || size == NULL) {
191 AUDIO_FUNC_LOGE("param manager or descs or size is null!");
192 return AUDIO_HAL_ERR_INVALID_PARAM;
193 }
194 int32_t ret = AudioAdaptersForUser(descs, size);
195 if (ret < 0) {
196 AUDIO_FUNC_LOGE("AudioAdaptersForUser FAIL! ret = %{public}d", ret);
197 return AUDIO_HAL_ERR_NOTREADY; // Failed to read sound card configuration file
198 }
199 if (g_captureSoPath == NULL || g_renderSoPath == NULL) {
200 AUDIO_FUNC_LOGE("sopath is error");
201 return AUDIO_HAL_ERR_INTERNAL;
202 }
203 if (*descs != NULL && size != NULL && (*size) > 0) {
204 g_localAddrAudioAdapterOut = *descs;
205 g_localAdapterNum = *size;
206 } else {
207 AUDIO_FUNC_LOGE("Get AudioAdapterDescriptor Failed");
208 return AUDIO_HAL_ERR_INVALID_OBJECT;
209 }
210 ret = InitCaptureSoHandle(g_captureSoPath);
211 if (ret < 0) {
212 AUDIO_FUNC_LOGE("InitCaptureSoHandle FAIL!");
213 return AUDIO_HAL_ERR_INTERNAL;
214 }
215 ret = InitRenderSoHandle(g_renderSoPath);
216 if (ret < 0) {
217 AUDIO_FUNC_LOGE("InitRenderSoHandle FAIL!");
218 AudioDlClose(&g_ptrCaptureHandle);
219 return AUDIO_HAL_ERR_INTERNAL;
220 }
221 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
222 ret = InitPathSelectSoHandle(g_pathSelectSoPath);
223 if (ret < 0 || g_pathSelGetConfToJsonObj == NULL) {
224 AUDIO_FUNC_LOGE("InitPathSelectSoHandle FAIL!");
225 AudioDlClose(&g_ptrRenderHandle);
226 AudioDlClose(&g_ptrCaptureHandle);
227 return AUDIO_HAL_ERR_INTERNAL;
228 }
229 ret = g_pathSelGetConfToJsonObj();
230 if (ret < 0) {
231 AUDIO_FUNC_LOGE("g_pathSelGetConfToJsonObj FAIL!");
232 AudioDlClose(&g_ptrRenderHandle);
233 AudioDlClose(&g_ptrCaptureHandle);
234 AudioDlClose(&g_ptrPathSelHandle);
235 return AUDIO_HAL_ERR_INTERNAL;
236 }
237 #endif
238 return AUDIO_HAL_SUCCESS;
239 }
240
LoadAdapterPrimary(const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)241 static int32_t LoadAdapterPrimary(const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter)
242 {
243 if (desc == NULL || adapter == NULL) {
244 AUDIO_FUNC_LOGE("param desc or adapter is null!");
245 return AUDIO_HAL_ERR_INVALID_PARAM;
246 }
247 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)OsalMemCalloc(sizeof(*hwAdapter));
248 if (hwAdapter == NULL) {
249 AUDIO_FUNC_LOGE("alloc AudioHwAdapter failed");
250 return AUDIO_HAL_ERR_MALLOC_FAIL;
251 }
252 hwAdapter->common.InitAllPorts = AudioAdapterInitAllPorts;
253 hwAdapter->common.CreateRender = AudioAdapterCreateRender;
254 hwAdapter->common.DestroyRender = AudioAdapterDestroyRender;
255 hwAdapter->common.CreateCapture = AudioAdapterCreateCapture;
256 hwAdapter->common.DestroyCapture = AudioAdapterDestroyCapture;
257 hwAdapter->common.GetPortCapability = AudioAdapterGetPortCapability;
258 hwAdapter->common.SetPassthroughMode = AudioAdapterSetPassthroughMode;
259 hwAdapter->common.GetPassthroughMode = AudioAdapterGetPassthroughMode;
260 hwAdapter->common.SetMicMute = AudioAdapterSetMicMute;
261 hwAdapter->common.GetMicMute = AudioAdapterGetMicMute;
262 hwAdapter->common.SetVoiceVolume = AudioAdapterSetVoiceVolume;
263 hwAdapter->common.UpdateAudioRoute = AudioAdapterUpdateAudioRoute;
264 hwAdapter->common.ReleaseAudioRoute = AudioAdapterReleaseAudioRoute;
265 hwAdapter->common.SetExtraParams = AudioAdapterSetExtraParams;
266 hwAdapter->common.GetExtraParams = AudioAdapterGetExtraParams;
267 hwAdapter->adapterDescriptor = *desc;
268 hwAdapter->adapterMgrRenderFlag = 0; // The adapterMgrRenderFlag init is zero
269 hwAdapter->adapterMgrCaptureFlag = 0; // The adapterMgrCaptureFlag init is zero
270 int32_t ret = AudioAddAdapterAddrToList((AudioHandle)(&hwAdapter->common), desc);
271 if (ret < 0) { // add for Fuzz
272 AUDIO_FUNC_LOGE("AudioAdapterAddrGet check Failed");
273 AudioMemFree((void **)&hwAdapter);
274 return ret;
275 }
276 *adapter = &hwAdapter->common;
277
278 return AUDIO_HAL_SUCCESS;
279 }
280
LoadAdapterUsb(const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)281 static int32_t LoadAdapterUsb(const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter)
282 {
283 if (desc == NULL || adapter == NULL) {
284 AUDIO_FUNC_LOGE("param attrs or adapter is null!");
285 return AUDIO_HAL_ERR_INVALID_PARAM;
286 }
287 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)OsalMemCalloc(sizeof(*hwAdapter));
288 if (hwAdapter == NULL) {
289 AUDIO_FUNC_LOGE("alloc AudioHwAdapter failed");
290 return AUDIO_HAL_ERR_MALLOC_FAIL;
291 }
292 hwAdapter->common.InitAllPorts = AudioAdapterInitAllPorts;
293 hwAdapter->common.CreateRender = AudioAdapterCreateRender;
294 hwAdapter->common.DestroyRender = AudioAdapterDestroyRender;
295 hwAdapter->common.CreateCapture = AudioAdapterCreateCapture;
296 hwAdapter->common.DestroyCapture = AudioAdapterDestroyCapture;
297 hwAdapter->common.GetPortCapability = AudioAdapterGetPortCapability;
298 hwAdapter->common.SetPassthroughMode = AudioAdapterSetPassthroughMode;
299 hwAdapter->common.GetPassthroughMode = AudioAdapterGetPassthroughMode;
300 hwAdapter->common.UpdateAudioRoute = AudioAdapterUpdateAudioRoute;
301 hwAdapter->common.ReleaseAudioRoute = AudioAdapterReleaseAudioRoute;
302 hwAdapter->adapterDescriptor = *desc;
303 hwAdapter->adapterMgrRenderFlag = 0; // The adapterMgrRenderFlag init is zero
304 hwAdapter->adapterMgrCaptureFlag = 0; // The adapterMgrCaptureFlag init is zero
305 int32_t ret = AudioAddAdapterAddrToList((AudioHandle)(&hwAdapter->common), desc);
306 if (ret < 0) { // add for Fuzz
307 AUDIO_FUNC_LOGE("AudioAdapterAddrGet check Failed");
308 AudioMemFree((void **)&hwAdapter);
309 return ret;
310 }
311 *adapter = &hwAdapter->common;
312
313 return AUDIO_HAL_SUCCESS;
314 }
315
LoadAdapterA2dp(const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)316 static int32_t LoadAdapterA2dp(const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter)
317 {
318 if (desc == NULL || adapter == NULL) {
319 return AUDIO_HAL_ERR_INVALID_PARAM;
320 }
321
322 return AUDIO_HAL_SUCCESS;
323 }
324
SelectAppropriateAdapter(enum AudioAdapterType adapterType,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)325 static int32_t SelectAppropriateAdapter(enum AudioAdapterType adapterType,
326 const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter)
327 {
328 int32_t ret;
329
330 if (desc == NULL || adapter == NULL) {
331 AUDIO_FUNC_LOGE("param desc or adapter is null!");
332 return AUDIO_HAL_ERR_INVALID_PARAM;
333 }
334 switch (adapterType) {
335 case AUDIO_ADAPTER_PRIMARY:
336 case AUDIO_ADAPTER_PRIMARY_EXT:
337 ret = LoadAdapterPrimary(desc, adapter);
338 if (ret != AUDIO_HAL_SUCCESS) {
339 AUDIO_FUNC_LOGE("LoadAdapterPrimary failed. ret = %{public}d", ret);
340 return ret;
341 }
342 break;
343 case AUDIO_ADAPTER_USB:
344 ret = LoadAdapterUsb(desc, adapter);
345 if (ret != AUDIO_HAL_SUCCESS) {
346 AUDIO_FUNC_LOGE("LoadAdapterUsb failed.ret = %{public}d", ret);
347 return ret;
348 }
349 AUDIO_FUNC_LOGE("Can't LoadAdapterUsb.");
350 break;
351 case AUDIO_ADAPTER_A2DP:
352 ret = LoadAdapterA2dp(desc, adapter);
353 if (ret != AUDIO_HAL_SUCCESS) {
354 AUDIO_FUNC_LOGE("LoadAdapterA2dp failed.");
355 return ret;
356 }
357 break;
358 default:
359 AUDIO_FUNC_LOGE("An unsupported Adapter.");
360 return AUDIO_HAL_ERR_NOT_SUPPORT;
361 }
362
363 return AUDIO_HAL_SUCCESS;
364 }
365
AudioManagerLoadAdapter(struct AudioManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)366 int32_t AudioManagerLoadAdapter(struct AudioManager *manager, const struct AudioAdapterDescriptor *desc,
367 struct AudioAdapter **adapter)
368 {
369 AUDIO_FUNC_LOGI();
370 if (manager == NULL || desc == NULL || desc->adapterName == NULL || desc->ports == NULL || adapter == NULL) {
371 AUDIO_FUNC_LOGE("param is null!");
372 return AUDIO_HAL_ERR_INVALID_PARAM;
373 }
374 bool descFlag = false;
375 if (g_localAdapterNum <= 0 || g_localAdapterNum > SUPPORT_ADAPTER_NUM_MAX) {
376 AUDIO_FUNC_LOGE("g_localAdapterNum is invalid!");
377 return AUDIO_HAL_ERR_INTERNAL;
378 }
379 if (g_localAddrAudioAdapterOut != NULL) {
380 for (int index = 0; index < g_localAdapterNum; index++) {
381 if (&g_localAddrAudioAdapterOut[index] == desc) {
382 descFlag = true;
383 break;
384 }
385 }
386 if (!descFlag) {
387 AUDIO_FUNC_LOGE("The desc address passed in is invalid");
388 return AUDIO_HAL_ERR_INVALID_OBJECT;
389 }
390 }
391 AUDIO_FUNC_LOGI("adapter name %{public}s", desc->adapterName);
392 if (AudioAdapterExist(desc->adapterName)) {
393 AUDIO_FUNC_LOGE("not supported this adapter %{public}s", desc->adapterName);
394 return AUDIO_HAL_ERR_INVALID_PARAM;
395 }
396
397 enum AudioAdapterType sndCardType = MatchAdapterType(desc->adapterName, desc->ports[0].portId);
398 int32_t ret = SelectAppropriateAdapter(sndCardType, desc, adapter);
399 if (ret != AUDIO_HAL_SUCCESS) {
400 AUDIO_FUNC_LOGE("Load adapter failed. ret = %{public}d\n", ret);
401 return ret;
402 }
403
404 return AUDIO_HAL_SUCCESS;
405 }
406
AudioManagerUnloadAdapter(struct AudioManager * manager,struct AudioAdapter * adapter)407 void AudioManagerUnloadAdapter(struct AudioManager *manager, struct AudioAdapter *adapter)
408 {
409 int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
410 if (ret < 0) {
411 AUDIO_FUNC_LOGE("The adapter address passed in is invalid! ret = %{public}d", ret);
412 return;
413 }
414 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
415 if (manager == NULL || hwAdapter == NULL) {
416 return;
417 }
418 if (hwAdapter->portCapabilitys != NULL) {
419 uint32_t portNum = hwAdapter->adapterDescriptor.portNum;
420 uint32_t i = 0;
421 while (i < portNum) {
422 if (&hwAdapter->portCapabilitys[i] != NULL) {
423 AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts);
424 }
425 i++;
426 }
427 AudioMemFree((void **)&hwAdapter->portCapabilitys);
428 }
429 if (AudioDelAdapterAddrFromList((AudioHandle)adapter)) {
430 AUDIO_FUNC_LOGE("adapter or render not in MgrList");
431 }
432 AudioMemFree((void **)&adapter);
433 }
434
ReleaseAudioManagerObject(struct AudioManager * object)435 bool ReleaseAudioManagerObject(struct AudioManager *object)
436 {
437 if (object != (&g_audioManagerFuncs) || object == NULL) {
438 return false;
439 }
440 ReleaseAudioManagerObjectComm(object);
441 g_audioAdapterAddrMgrFlag = false;
442 return true;
443 }
444
AudioMgrConstruct(struct AudioManager * audioMgr)445 static void AudioMgrConstruct(struct AudioManager *audioMgr)
446 {
447 if (audioMgr == NULL) {
448 AUDIO_FUNC_LOGE("Input pointer is null!");
449 return;
450 }
451 audioMgr->GetAllAdapters = AudioManagerGetAllAdapters;
452 audioMgr->LoadAdapter = AudioManagerLoadAdapter;
453 audioMgr->UnloadAdapter = AudioManagerUnloadAdapter;
454 audioMgr->ReleaseAudioManagerObject = ReleaseAudioManagerObject;
455 }
456
GetAudioManagerFuncs(void)457 struct AudioManager *GetAudioManagerFuncs(void)
458 {
459 if (!g_audioAdapterAddrMgrFlag) {
460 AudioAdapterAddrMgrInit(); // memset for Fuzz
461 AudioMgrConstruct(&g_audioManagerFuncs);
462 g_audioAdapterAddrMgrFlag = true;
463 }
464 return &g_audioManagerFuncs;
465 }
466