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