• 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 <dlfcn.h>
17 #include <limits.h>
18 #include <unistd.h>
19 #include "hdf_base.h"
20 #include "hdf_types.h"
21 #include "osal_mem.h"
22 #include "securec.h"
23 #include "stub_collector.h"
24 #include "audio_adapter_info_common.h"
25 #include "audio_common.h"
26 #include "audio_uhdf_log.h"
27 #include "audio_internal.h"
28 
29 #define HDF_LOG_TAG AUDIO_HDI_IMPL
30 
31 BindServiceRenderPassthrough g_bindServiceRender = NULL;
32 InterfaceLibModeRenderPassthrough g_interfaceLibModeRender = NULL;
33 CloseServiceRenderPassthrough g_closeServiceRender = NULL;
34 
35 BindServiceCapturePassthrough g_bindServiceCapture = NULL;
36 InterfaceLibModeCapturePassthrough g_interfaceLibModeCapture = NULL;
37 CloseServiceCapturePassthrough 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_capturePassthroughPath = HDF_LIBRARY_FULL_PATH("libhdi_audio_capture");
45 static const char *g_renderPassthroughPath = HDF_LIBRARY_FULL_PATH("libhdi_audio_render");
46 
47 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
48 static const char *g_pathSelectPassthroughPath = HDF_LIBRARY_FULL_PATH("libhdi_idl_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 
AudioPassthroughGetBindServiceRender(void)58 BindServiceRenderPassthrough *AudioPassthroughGetBindServiceRender(void)
59 {
60     return &g_bindServiceRender;
61 }
62 
AudioPassthroughGetInterfaceLibModeRender(void)63 InterfaceLibModeRenderPassthrough *AudioPassthroughGetInterfaceLibModeRender(void)
64 {
65     return &g_interfaceLibModeRender;
66 }
67 
AudioPassthroughGetCloseServiceRender(void)68 CloseServiceRenderPassthrough *AudioPassthroughGetCloseServiceRender(void)
69 {
70     return &g_closeServiceRender;
71 }
72 
AudioPassthroughGetBindServiceCapture(void)73 BindServiceCapturePassthrough *AudioPassthroughGetBindServiceCapture(void)
74 {
75     return &g_bindServiceCapture;
76 }
77 
AudioPassthroughGetInterfaceLibModeCapture(void)78 InterfaceLibModeCapturePassthrough *AudioPassthroughGetInterfaceLibModeCapture(void)
79 {
80     return &g_interfaceLibModeCapture;
81 }
82 
AudioPassthroughGetCloseServiceCapture(void)83 CloseServiceCapturePassthrough *AudioPassthroughGetCloseServiceCapture(void)
84 {
85     return &g_closeServiceCapture;
86 }
87 
88 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
AudioPassthroughGetPathSelGetConfToJsonObj(void)89 PathSelGetConfToJsonObj *AudioPassthroughGetPathSelGetConfToJsonObj(void)
90 {
91     return &g_pathSelGetConfToJsonObj;
92 }
93 
AudioPassthroughGetPathSelAnalysisJson(void)94 PathSelAnalysisJson *AudioPassthroughGetPathSelAnalysisJson(void)
95 {
96     return &g_pathSelAnalysisJson;
97 }
98 #endif
99 
InitCapturePassthroughHandle(const char * capturePassthroughPath)100 static int32_t InitCapturePassthroughHandle(const char *capturePassthroughPath)
101 {
102     if (capturePassthroughPath == NULL) {
103         AUDIO_FUNC_LOGE("capturePassthroughPath is NULL");
104         return HDF_FAILURE;
105     }
106     char pathBuf[PATH_MAX] = {'\0'};
107     if (realpath(capturePassthroughPath, pathBuf) == NULL) {
108         return HDF_FAILURE;
109     }
110     if (g_ptrCaptureHandle == NULL) {
111         g_ptrCaptureHandle = dlopen(pathBuf, RTLD_LAZY);
112         if (g_ptrCaptureHandle == NULL) {
113             AUDIO_FUNC_LOGE("open lib capture so fail, reason:%{public}s", dlerror());
114             return HDF_FAILURE;
115         }
116         g_bindServiceCapture = dlsym(g_ptrCaptureHandle, "AudioBindServiceCapture");
117         g_interfaceLibModeCapture = dlsym(g_ptrCaptureHandle, "AudioInterfaceLibModeCapture");
118         g_closeServiceCapture = dlsym(g_ptrCaptureHandle, "AudioCloseServiceCapture");
119         if (g_bindServiceCapture == NULL || g_interfaceLibModeCapture == NULL || g_closeServiceCapture == NULL) {
120             AUDIO_FUNC_LOGE("lib capture so func not found!");
121             AudioDlClose(&g_ptrCaptureHandle);
122             return HDF_FAILURE;
123         }
124     }
125     return HDF_SUCCESS;
126 }
127 
InitRenderPassthroughHandle(const char * renderPassthroughPath)128 static int32_t InitRenderPassthroughHandle(const char *renderPassthroughPath)
129 {
130     if (renderPassthroughPath == NULL) {
131         AUDIO_FUNC_LOGE("renderPassthroughPath is NULL");
132         return HDF_FAILURE;
133     }
134     char pathBuf[PATH_MAX] = {'\0'};
135     if (realpath(renderPassthroughPath, pathBuf) == NULL) {
136         return HDF_FAILURE;
137     }
138     if (g_ptrRenderHandle == NULL) {
139         g_ptrRenderHandle = dlopen(pathBuf, RTLD_LAZY);
140         if (g_ptrRenderHandle == NULL) {
141             AUDIO_FUNC_LOGE("open lib render so fail, reason:%{public}s", dlerror());
142             return HDF_FAILURE;
143         }
144         g_bindServiceRender = dlsym(g_ptrRenderHandle, "AudioBindServiceRender");
145         g_interfaceLibModeRender = dlsym(g_ptrRenderHandle, "AudioInterfaceLibModeRender");
146         g_closeServiceRender = dlsym(g_ptrRenderHandle, "AudioCloseServiceRender");
147         if (g_bindServiceRender == NULL || g_interfaceLibModeRender == NULL || g_closeServiceRender == NULL) {
148             AUDIO_FUNC_LOGE("lib render so func not found!");
149             AudioDlClose(&g_ptrRenderHandle);
150             return HDF_FAILURE;
151         }
152     }
153     return HDF_SUCCESS;
154 }
155 
156 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
InitPathSelectPassthroughHandle(const char * pathSelectPassthroughPath)157 static int32_t InitPathSelectPassthroughHandle(const char *pathSelectPassthroughPath)
158 {
159     if (pathSelectPassthroughPath == NULL) {
160         AUDIO_FUNC_LOGE("pathSelectPassthroughPath is NULL");
161         return HDF_FAILURE;
162     }
163     char pathBuf[PATH_MAX] = {'\0'};
164     if (realpath(pathSelectPassthroughPath, pathBuf) == NULL) {
165         return HDF_FAILURE;
166     }
167     if (g_ptrPathSelHandle == NULL) {
168         g_ptrPathSelHandle = dlopen(pathBuf, RTLD_LAZY);
169         if (g_ptrPathSelHandle == NULL) {
170             AUDIO_FUNC_LOGE("open lib PathSelct so fail, reason:%{public}s", dlerror());
171             return HDF_FAILURE;
172         }
173         g_pathSelGetConfToJsonObj = dlsym(g_ptrPathSelHandle, "AudioPathSelGetConfToJsonObj");
174         g_pathSelAnalysisJson = dlsym(g_ptrPathSelHandle, "AudioPathSelAnalysisJson");
175         if (g_pathSelGetConfToJsonObj == NULL || g_pathSelAnalysisJson == NULL) {
176             AUDIO_FUNC_LOGE("lib PathSelct so func not found!");
177             AudioDlClose(&g_ptrPathSelHandle);
178             return HDF_FAILURE;
179         }
180     }
181     return HDF_SUCCESS;
182 }
183 #endif
184 
AudioManagerServiceGetFreeAdapterPos(struct IAudioManager * manager,const char * adapterName)185 static int32_t AudioManagerServiceGetFreeAdapterPos(struct IAudioManager *manager, const char *adapterName)
186 {
187     int32_t i;
188     if (manager == NULL || adapterName == NULL || strlen(adapterName) == 0) {
189         AUDIO_FUNC_LOGE("Invalid input param!");
190         return SUPPORT_ADAPTER_NUM_MAX;
191     }
192 
193     struct AudioHwManager *audioManagerSer = (struct AudioHwManager *)manager;
194     for (i = 0; i < SUPPORT_ADAPTER_NUM_MAX; i++) {
195         if (!strncmp(adapterName, audioManagerSer->adapterInfos[i].adapterName, ADAPTER_NAME_LEN)) {
196             AUDIO_FUNC_LOGE("adapterName(%{public}s) already load!", adapterName);
197             return SUPPORT_ADAPTER_NUM_MAX;
198         }
199     }
200 
201     for (i = 0; i < SUPPORT_ADAPTER_NUM_MAX; i++) {
202         if (strlen(audioManagerSer->adapterInfos[i].adapterName) == 0 &&
203             audioManagerSer->adapterInfos[i].adapterServicePtr == NULL) {
204             return i;
205         }
206     }
207 
208     AUDIO_FUNC_LOGE("no free pos!");
209     return SUPPORT_ADAPTER_NUM_MAX;
210 }
211 
AudioManagerServiceAddAdapter(struct IAudioManager * manager,struct IAudioAdapter * adapter,int32_t pos)212 static int32_t AudioManagerServiceAddAdapter(
213     struct IAudioManager *manager, struct IAudioAdapter *adapter, int32_t pos)
214 {
215     struct AudioHwManager *hwManager = (struct AudioHwManager *)manager;
216     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
217 
218     if (hwManager == NULL) {
219         AUDIO_FUNC_LOGE("audioManagerSer is null!");
220         return AUDIO_ERR_INVALID_PARAM;
221     }
222     if (hwAdapter == NULL) {
223         AUDIO_FUNC_LOGE("adapterName is null!");
224         return AUDIO_ERR_INVALID_PARAM;
225     }
226     if (pos >= SUPPORT_ADAPTER_NUM_MAX) {
227         AUDIO_FUNC_LOGE("pos out of range!");
228         return AUDIO_ERR_INVALID_PARAM;
229     }
230     int32_t ret = strncpy_s(hwManager->adapterInfos[pos].adapterName, ADAPTER_NAME_LEN,
231         hwAdapter->adapterDescriptor.adapterName, strlen(hwAdapter->adapterDescriptor.adapterName));
232     if (ret != 0) {
233         AUDIO_FUNC_LOGE("strncpy_s for adapterName failed!");
234         return AUDIO_ERR_INTERNAL;
235     }
236 
237     hwManager->adapterInfos[pos].adapterServicePtr = hwAdapter;
238     return AUDIO_SUCCESS;
239 }
240 
AudioManagerServiceFindAdapterPos(struct IAudioManager * manager,const char * adapterName)241 static uint32_t AudioManagerServiceFindAdapterPos(struct IAudioManager *manager, const char *adapterName)
242 {
243     uint32_t i;
244     if (manager == NULL || adapterName == NULL || strlen(adapterName) == 0) {
245         AUDIO_FUNC_LOGE("Invalid input param!");
246         return SUPPORT_ADAPTER_NUM_MAX;
247     }
248 
249     struct AudioHwManager *audioManagerSer = (struct AudioHwManager *)manager;
250     for (i = 0; i < SUPPORT_ADAPTER_NUM_MAX; i++) {
251         if (strncmp(adapterName, audioManagerSer->adapterInfos[i].adapterName, ADAPTER_NAME_LEN) == 0 &&
252             audioManagerSer->adapterInfos[i].adapterServicePtr != NULL) {
253             return i;
254         }
255     }
256 
257     AUDIO_FUNC_LOGE("can not find adapterName(%{public}s)!", adapterName);
258     return SUPPORT_ADAPTER_NUM_MAX;
259 }
260 
AudioManagerGetAllAdapters(struct IAudioManager * manager,struct AudioAdapterDescriptor * descs,uint32_t * size)261 int32_t AudioManagerGetAllAdapters(struct IAudioManager *manager, struct AudioAdapterDescriptor *descs, uint32_t *size)
262 {
263     AUDIO_FUNC_LOGI("enter!");
264     if (manager == NULL || descs == NULL || size == NULL) {
265         return AUDIO_ERR_INVALID_PARAM;
266     }
267     int32_t ret = AudioAdaptersForUser(descs, size);
268     if (ret < 0) {
269         AUDIO_FUNC_LOGE("AudioAdaptersForUser FAIL!");
270         return AUDIO_ERR_NOTREADY; // Failed to read sound card configuration file
271     }
272     if (g_capturePassthroughPath == NULL || g_renderPassthroughPath == NULL) {
273         AUDIO_FUNC_LOGE("sopath is error");
274         return AUDIO_ERR_INTERNAL;
275     }
276     ret = InitCapturePassthroughHandle(g_capturePassthroughPath);
277     if (ret < 0) {
278         AUDIO_FUNC_LOGE("InitCapturePassthroughHandle FAIL!");
279         return AUDIO_ERR_INTERNAL;
280     }
281     ret = InitRenderPassthroughHandle(g_renderPassthroughPath);
282     if (ret < 0) {
283         AUDIO_FUNC_LOGE("InitRenderPassthroughHandle FAIL!");
284         AudioDlClose(&g_ptrCaptureHandle);
285         return AUDIO_ERR_INTERNAL;
286     }
287 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
288     ret = InitPathSelectPassthroughHandle(g_pathSelectPassthroughPath);
289     if (ret < 0 || g_pathSelGetConfToJsonObj == NULL) {
290         AUDIO_FUNC_LOGE("InitPathSelectPassthroughHandle FAIL!");
291         AudioDlClose(&g_ptrRenderHandle);
292         AudioDlClose(&g_ptrCaptureHandle);
293         return AUDIO_ERR_INTERNAL;
294     }
295     ret = g_pathSelGetConfToJsonObj();
296     if (ret < 0) {
297         AUDIO_FUNC_LOGE("g_pathSelGetConfToJsonObj FAIL!");
298         AudioDlClose(&g_ptrRenderHandle);
299         AudioDlClose(&g_ptrCaptureHandle);
300         AudioDlClose(&g_ptrPathSelHandle);
301         return AUDIO_ERR_INTERNAL;
302     }
303 #endif
304     return AUDIO_SUCCESS;
305 }
306 
LoadAdapterImpl(const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)307 static int32_t LoadAdapterImpl(const struct AudioAdapterDescriptor *desc, struct IAudioAdapter **adapter)
308 {
309     if (desc == NULL || adapter == NULL) {
310         return AUDIO_ERR_INVALID_PARAM;
311     }
312     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)OsalMemCalloc(sizeof(struct AudioHwAdapter));
313     if (hwAdapter == NULL) {
314         AUDIO_FUNC_LOGE("OsalMemCalloc AudioHwAdapter failed");
315         return AUDIO_ERR_MALLOC_FAIL;
316     }
317 
318     hwAdapter->common.InitAllPorts = AudioAdapterInitAllPorts;
319     hwAdapter->common.CreateRender = AudioAdapterCreateRender;
320     hwAdapter->common.DestroyRender = AudioAdapterDestroyRender;
321     hwAdapter->common.CreateCapture = AudioAdapterCreateCapture;
322     hwAdapter->common.DestroyCapture = AudioAdapterDestroyCapture;
323     hwAdapter->common.GetPortCapability = AudioAdapterGetPortCapability;
324     hwAdapter->common.SetPassthroughMode = AudioAdapterSetPassthroughMode;
325     hwAdapter->common.GetPassthroughMode = AudioAdapterGetPassthroughMode;
326     hwAdapter->common.GetDeviceStatus = AudioAdapterGetDeviceStatus;
327     hwAdapter->adapterDescriptor = *desc;
328 
329     *adapter = &(hwAdapter->common);
330     return AUDIO_SUCCESS;
331 }
332 
LoadAdapterPrimary(const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)333 static int32_t LoadAdapterPrimary(const struct AudioAdapterDescriptor *desc, struct IAudioAdapter **adapter)
334 {
335     if (desc == NULL || adapter == NULL) {
336         AUDIO_FUNC_LOGE("primary desc or adapter is null");
337         return AUDIO_ERR_INVALID_PARAM;
338     }
339 
340     int32_t ret = LoadAdapterImpl(desc, adapter);
341     if (ret != AUDIO_SUCCESS) {
342         return ret;
343     }
344 
345     return AUDIO_SUCCESS;
346 }
347 
LoadAdapterUsb(const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)348 static int32_t LoadAdapterUsb(const struct AudioAdapterDescriptor *desc, struct IAudioAdapter **adapter)
349 {
350     if (desc == NULL || adapter == NULL) {
351         AUDIO_FUNC_LOGE("usb desc or adapter is null");
352         return AUDIO_ERR_INVALID_PARAM;
353     }
354 
355     int32_t ret = LoadAdapterImpl(desc, adapter);
356     if (ret != AUDIO_SUCCESS) {
357         return ret;
358     }
359 
360     return AUDIO_SUCCESS;
361 }
362 
LoadAdapterA2dp(const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)363 static int32_t LoadAdapterA2dp(const struct AudioAdapterDescriptor *desc, struct IAudioAdapter **adapter)
364 {
365     if (desc == NULL || adapter == NULL) {
366         return AUDIO_ERR_INVALID_PARAM;
367     }
368 
369     return AUDIO_ERR_NOT_SUPPORT;
370 }
371 
SelectAppropriateAdapter(enum AudioAdapterType adapterType,const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)372 static int32_t SelectAppropriateAdapter(
373     enum AudioAdapterType adapterType, const struct AudioAdapterDescriptor *desc, struct IAudioAdapter **adapter)
374 {
375     int32_t ret;
376 
377     if (desc == NULL || adapter == NULL) {
378         return AUDIO_ERR_INVALID_PARAM;
379     }
380     switch (adapterType) {
381         case AUDIO_ADAPTER_PRIMARY:
382         case AUDIO_ADAPTER_PRIMARY_EXT:
383             ret = LoadAdapterPrimary(desc, adapter);
384             if (ret != AUDIO_SUCCESS) {
385                 AUDIO_FUNC_LOGE("LoadAdapterPrimary failed.");
386                 return ret;
387             }
388             break;
389         case AUDIO_ADAPTER_USB:
390             ret = LoadAdapterUsb(desc, adapter);
391             if (ret != AUDIO_SUCCESS) {
392                 AUDIO_FUNC_LOGE("LoadAdapterUsb failed.");
393                 return ret;
394             }
395             break;
396         case AUDIO_ADAPTER_A2DP:
397             ret = LoadAdapterA2dp(desc, adapter);
398             if (ret != AUDIO_SUCCESS) {
399                 AUDIO_FUNC_LOGE("LoadAdapterA2dp failed.");
400                 return ret;
401             }
402             break;
403         default:
404             AUDIO_FUNC_LOGE("An unsupported Adapter.");
405             return AUDIO_ERR_NOT_SUPPORT;
406     }
407 
408     return AUDIO_SUCCESS;
409 }
410 
AudioManagerServiceRemvAdapter(struct IAudioManager * manager,uint32_t pos)411 static int32_t AudioManagerServiceRemvAdapter(struct IAudioManager *manager, uint32_t pos)
412 {
413     if (manager == NULL || pos >= SUPPORT_ADAPTER_NUM_MAX) {
414         AUDIO_FUNC_LOGE("Invalid input param!");
415         return AUDIO_ERR_INVALID_PARAM;
416     }
417 
418     struct AudioHwManager *audioManagerSer = (struct AudioHwManager *)manager;
419     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)audioManagerSer->adapterInfos[pos].adapterServicePtr;
420 
421     StubCollectorRemoveObject(IAUDIOADAPTER_INTERFACE_DESC, hwAdapter);
422 
423     if (hwAdapter == NULL) {
424         AUDIO_FUNC_LOGE("manager == NULL || hwAdapter == NULL");
425         return AUDIO_ERR_INVALID_PARAM;
426     }
427     if (hwAdapter->portCapabilitys != NULL) {
428         uint32_t portsLen = hwAdapter->adapterDescriptor.portsLen;
429         uint32_t i = 0;
430         while (i < portsLen) {
431             if (&hwAdapter->portCapabilitys[i] != NULL) {
432                 AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts);
433             }
434             i++;
435         }
436         AudioMemFree((void **)&hwAdapter->portCapabilitys);
437     }
438 
439     AudioMemFree((void **)&hwAdapter);
440     audioManagerSer->adapterInfos[pos].adapterServicePtr = NULL;
441 
442     (void)memset_s(audioManagerSer->adapterInfos[pos].adapterName, ADAPTER_NAME_LEN, 0, ADAPTER_NAME_LEN);
443 
444     return AUDIO_SUCCESS;
445 }
446 
AudioManagerLoadAdapter(struct IAudioManager * manager,const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)447 int32_t AudioManagerLoadAdapter(
448     struct IAudioManager *manager, const struct AudioAdapterDescriptor *desc, struct IAudioAdapter **adapter)
449 {
450     if (manager == NULL || desc == NULL || desc->adapterName == NULL || desc->ports == NULL || adapter == NULL) {
451         AUDIO_FUNC_LOGE("Invalid input param!");
452         return AUDIO_ERR_INVALID_PARAM;
453     }
454 
455     AUDIO_FUNC_LOGI("adapter name %{public}s", desc->adapterName);
456     int32_t index = AudioAdapterExist(desc->adapterName);
457     if (index < 0) {
458         AUDIO_FUNC_LOGE("not supported this adapter %{public}s", desc->adapterName);
459         return AUDIO_ERR_INVALID_PARAM;
460     }
461 
462     int32_t pos = AudioManagerServiceGetFreeAdapterPos(manager, desc->adapterName);
463     if (pos >= SUPPORT_ADAPTER_NUM_MAX) {
464         AUDIO_FUNC_LOGE("AudioManagerServiceGetFreeAdapterPos failed!");
465         return HDF_FAILURE;
466     }
467 
468     enum AudioAdapterType sndCardType = MatchAdapterType(desc->adapterName, desc->ports[0].portId);
469     int32_t ret = SelectAppropriateAdapter(sndCardType, &(AudioAdapterGetConfigDescs()[index]), adapter);
470     if (ret != AUDIO_SUCCESS) {
471         AUDIO_FUNC_LOGE("Load adapter failed.");
472         return ret;
473     }
474 
475     ret = AudioManagerServiceAddAdapter(manager, *adapter, pos);
476     if (ret != AUDIO_SUCCESS) {
477         AUDIO_FUNC_LOGE("Add adapter to list failed.");
478         AudioManagerServiceRemvAdapter(manager, pos);
479         return ret;
480     }
481 
482     return AUDIO_SUCCESS;
483 }
484 
AudioManagerUnloadAdapter(struct IAudioManager * manager,const char * adapterName)485 int32_t AudioManagerUnloadAdapter(struct IAudioManager *manager, const char *adapterName)
486 {
487     uint32_t pos = AudioManagerServiceFindAdapterPos(manager, adapterName);
488     if (pos >= SUPPORT_ADAPTER_NUM_MAX) {
489         AUDIO_FUNC_LOGE("AudioManagerServiceUnloadAdapter failed!");
490         return AUDIO_ERR_INVALID_PARAM;
491     }
492 
493     int ret = AudioManagerServiceRemvAdapter(manager, pos);
494     if (ret != AUDIO_SUCCESS) {
495         AUDIO_FUNC_LOGE("AudioManagerServiceRemvAdapter failed!");
496         return ret;
497     }
498 
499     AUDIO_FUNC_LOGI("AudioManagerUnloadAdapter success!");
500     return AUDIO_SUCCESS;
501 }
502 
ReleaseAudioManagerObject(struct IAudioManager * object)503 int32_t ReleaseAudioManagerObject(struct IAudioManager *object)
504 {
505     ReleaseAudioManagerObjectComm(object);
506     return AUDIO_SUCCESS;
507 }
508 
AudioManagerImplGetInstance(const char * serviceName)509 struct IAudioManager *AudioManagerImplGetInstance(const char *serviceName)
510 {
511     (void)serviceName;
512     struct AudioHwManager *service = (struct AudioHwManager *)OsalMemCalloc(sizeof(struct AudioHwManager));
513     if (service == NULL) {
514         AUDIO_FUNC_LOGE("OsalMemCalloc failed!");
515         return NULL;
516     }
517     service->interface.GetAllAdapters = AudioManagerGetAllAdapters;
518     service->interface.LoadAdapter = AudioManagerLoadAdapter;
519     service->interface.UnloadAdapter = AudioManagerUnloadAdapter;
520     service->interface.ReleaseAudioManagerObject = ReleaseAudioManagerObject;
521     return &(service->interface);
522 }
523 
AudioManagerImplRelease(struct IAudioManager * instance)524 void AudioManagerImplRelease(struct IAudioManager *instance)
525 {
526     ReleaseAudioManagerObject(instance);
527 }
528