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