1 /*
2 * Copyright (c) 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 #include "audio_manager_vdi.h"
16
17 #include <dlfcn.h>
18 #include <malloc.h>
19 #include "osal_mem.h"
20 #include <hdf_base.h>
21 #include "audio_uhdf_log.h"
22 #include "audio_adapter_vdi.h"
23 #include "audio_dfx_vdi.h"
24 #include "v4_0/iaudio_adapter.h"
25
26 #define HDF_LOG_TAG HDF_AUDIO_PRIMARY_IMPL
27 static int32_t THREAD_POOL_COUNT = 32;
28 static pthread_mutex_t g_managerMutex;
29
30 typedef struct IAudioManagerVdi* (*AudioManagerCreateIfInstanceVdi)(void);
31
32 struct AudioManagerPrivVdi {
33 struct IAudioManager interface;
34 void *handle;
35 AudioManagerCreateIfInstanceVdi managerFuncs;
36 struct IAudioManagerVdi *vdiManager;
37 struct AudioAdapterDescriptor descs[AUDIO_VDI_ADAPTER_NUM_MAX];
38 uint32_t descsCount;
39 struct AudioAdapterDescriptorVdi *vdiDescs;
40 uint32_t vdiDescsCount;
41 };
42
AudioManagerReleasePort(struct AudioPort ** ports,uint32_t portsLen)43 static void AudioManagerReleasePort(struct AudioPort **ports, uint32_t portsLen)
44 {
45 CHECK_NULL_PTR_RETURN(ports);
46
47 if (portsLen == 0 || portsLen > AUDIO_VDI_PORT_NUM_MAX) {
48 AUDIO_FUNC_LOGE("audio vdiManager portsLen is invalid");
49 return;
50 }
51
52 struct AudioPort *portsTmp = *ports;
53 for (uint32_t i = 0; i < portsLen; i++) {
54 OsalMemFree((void *)portsTmp[i].portName);
55 }
56 OsalMemFree((void *)portsTmp);
57 *ports = NULL;
58 }
59
AudioManagerReleaseVdiPort(struct AudioPortVdi ** vdiPorts,uint32_t portsLen)60 static void AudioManagerReleaseVdiPort(struct AudioPortVdi **vdiPorts, uint32_t portsLen)
61 {
62 CHECK_NULL_PTR_RETURN(vdiPorts);
63
64 if (portsLen == 0 || portsLen > AUDIO_VDI_PORT_NUM_MAX) {
65 AUDIO_FUNC_LOGE("audio vdiManager portsLen is invalid");
66 return;
67 }
68
69 struct AudioPortVdi *portsTmp = *vdiPorts;
70 for (uint32_t i = 0; i < portsLen; i++) {
71 OsalMemFree((void *)portsTmp[i].portName);
72 }
73 OsalMemFree((void *)portsTmp);
74 *vdiPorts = NULL;
75 }
76
AudioManagerReleaseDesc(struct AudioAdapterDescriptor * desc)77 static void AudioManagerReleaseDesc(struct AudioAdapterDescriptor *desc)
78 {
79 OsalMemFree((void *)desc->adapterName);
80 desc->adapterName = NULL;
81 if (desc->ports != NULL) {
82 AudioManagerReleasePort(&desc->ports, desc->portsLen);
83 desc->portsLen = 0;
84 }
85 }
86
AudioManagerReleaseVdiDesc(struct AudioAdapterDescriptorVdi * vdiDesc)87 static void AudioManagerReleaseVdiDesc(struct AudioAdapterDescriptorVdi *vdiDesc)
88 {
89 OsalMemFree((void *)vdiDesc->adapterName);
90 vdiDesc->adapterName = NULL;
91 if (vdiDesc->ports != NULL) {
92 AudioManagerReleaseVdiPort(&vdiDesc->ports, vdiDesc->portsLen);
93 vdiDesc->portsLen = 0;
94 }
95 #if defined CONFIG_USE_JEMALLOC_DFX_INTF
96 int err = mallopt(M_FLUSH_THREAD_CACHE, 0);
97 if (err != HDF_SUCCESS) {
98 AUDIO_FUNC_LOGE("%{public}s :release cache error, m_purge = %{public}d", __func__, err);
99 }
100 #endif
101 }
102
AudioManagerReleaseDescs(struct AudioAdapterDescriptor * descs,uint32_t descsCount)103 static void AudioManagerReleaseDescs(struct AudioAdapterDescriptor *descs, uint32_t descsCount)
104 {
105 if (descsCount == 0 || descsCount > AUDIO_VDI_PORT_NUM_MAX) {
106 AUDIO_FUNC_LOGE("audio vdiManager descsCount is invalid");
107 return;
108 }
109
110 for (uint32_t i = 0; i < descsCount; i++) {
111 AudioManagerReleaseDesc(&descs[i]);
112 }
113 }
114
AudioManagerPortToVdiPort(const struct AudioAdapterDescriptor * desc,struct AudioAdapterDescriptorVdi * vdiDesc)115 static int32_t AudioManagerPortToVdiPort(const struct AudioAdapterDescriptor *desc,
116 struct AudioAdapterDescriptorVdi *vdiDesc)
117 {
118 if (desc->portsLen == 0 || desc->portsLen > AUDIO_VDI_PORT_NUM_MAX) {
119 AUDIO_FUNC_LOGE("audio desc portsLen is invalid");
120 return HDF_ERR_NOT_SUPPORT;
121 }
122
123 struct AudioPortVdi *vdiPorts = (struct AudioPortVdi *)OsalMemCalloc(sizeof(*vdiPorts) * desc->portsLen);
124 if (vdiPorts == NULL) {
125 AUDIO_FUNC_LOGE("OsalMemCalloc AudioPortVdi fail");
126 return HDF_ERR_MALLOC_FAIL;
127 }
128
129 for (uint32_t i = 0; i < desc->portsLen; i++) {
130 vdiPorts[i].portName = strdup(desc->ports[i].portName);
131 if (vdiPorts[i].portName == NULL) {
132 vdiDesc->ports = vdiPorts;
133 vdiDesc->portsLen = desc->portsLen;
134 AUDIO_FUNC_LOGE("strdup fail, desc->ports[%{public}d].portName = %{public}s", i, desc->ports[i].portName);
135 return HDF_FAILURE;
136 }
137 vdiPorts[i].portId = desc->ports[i].portId;
138 vdiPorts[i].dir = (enum AudioPortDirectionVdi)desc->ports[i].dir;
139 }
140
141 vdiDesc->ports = vdiPorts;
142 vdiDesc->portsLen = desc->portsLen;
143
144 return HDF_SUCCESS;
145 }
146
AudioManagerVdiPortToPort(struct AudioAdapterDescriptorVdi * vdiDesc,struct AudioAdapterDescriptor * desc)147 static int32_t AudioManagerVdiPortToPort(struct AudioAdapterDescriptorVdi *vdiDesc, struct AudioAdapterDescriptor *desc)
148 {
149 if (vdiDesc->portsLen == 0 || vdiDesc->portsLen > AUDIO_VDI_PORT_NUM_MAX) {
150 AUDIO_FUNC_LOGE("audio vdiDesc portsLen is invalid");
151 return HDF_ERR_NOT_SUPPORT;
152 }
153
154 /* audio stub free ports */
155 struct AudioPort *ports = (struct AudioPort *)OsalMemCalloc(sizeof(*ports) * vdiDesc->portsLen);
156 if (ports == NULL) {
157 AUDIO_FUNC_LOGE("OsalMemCalloc AudioPort fail");
158 return HDF_ERR_MALLOC_FAIL;
159 }
160
161 for (uint32_t i = 0; i < vdiDesc->portsLen; i++) {
162 ports[i].portName = strdup(vdiDesc->ports[i].portName);
163 if (ports[i].portName == NULL) {
164 desc->ports = ports;
165 desc->portsLen = vdiDesc->portsLen;
166 AUDIO_FUNC_LOGE("strdup fail, vdiDesc->ports[%{public}d].portName = %{public}s",
167 i, vdiDesc->ports[i].portName);
168 return HDF_FAILURE;
169 }
170 ports[i].portId = vdiDesc->ports[i].portId;
171 ports[i].dir = (enum AudioPortDirection)vdiDesc->ports[i].dir;
172 }
173
174 desc->ports = ports;
175 desc->portsLen = vdiDesc->portsLen;
176
177 return HDF_SUCCESS;
178 }
179
AudioManagerDescToVdiDesc(const struct AudioAdapterDescriptor * desc,struct AudioAdapterDescriptorVdi * vdiDesc)180 static int32_t AudioManagerDescToVdiDesc(const struct AudioAdapterDescriptor *desc,
181 struct AudioAdapterDescriptorVdi *vdiDesc)
182 {
183 int32_t ret = AudioManagerPortToVdiPort(desc, vdiDesc);
184 if (ret != HDF_SUCCESS) {
185 AUDIO_FUNC_LOGE("audio vdiManager vdiPort fail");
186 return HDF_FAILURE;
187 }
188
189 vdiDesc->adapterName = strdup(desc->adapterName);
190 if (vdiDesc->adapterName == NULL) {
191 AUDIO_FUNC_LOGE("strdup fail, desc->adapterName = %{public}s", desc->adapterName);
192 return HDF_FAILURE;
193 }
194 AUDIO_FUNC_LOGI("audio vdiManager load adapterName=%{public}s", vdiDesc->adapterName);
195
196 return HDF_SUCCESS;
197 }
198
AudioManagerVdiDescsToDescs(struct AudioAdapterDescriptorVdi * vdiDescs,uint32_t vdiDescsCount,struct AudioAdapterDescriptor * descs,uint32_t * descsCount)199 static int32_t AudioManagerVdiDescsToDescs(struct AudioAdapterDescriptorVdi *vdiDescs, uint32_t vdiDescsCount,
200 struct AudioAdapterDescriptor *descs, uint32_t *descsCount)
201 {
202 if (vdiDescsCount == 0 || vdiDescsCount > AUDIO_VDI_ADAPTER_NUM_MAX) {
203 AUDIO_FUNC_LOGE("audio vdiDescsCount=%{public}d is error", vdiDescsCount);
204 return HDF_ERR_NOT_SUPPORT;
205 }
206
207 uint32_t count = (*descsCount <= (uint32_t)vdiDescsCount) ? (*descsCount) : (uint32_t)vdiDescsCount;
208 AUDIO_FUNC_LOGI("audio vdiManager all adapter count=%{public}u, vdiCount=%{public}d", count, vdiDescsCount);
209
210 for (uint32_t i = 0; i < count; i++) {
211 int32_t ret = AudioManagerVdiPortToPort(&vdiDescs[i], &descs[i]);
212 if (ret != HDF_SUCCESS) {
213 AUDIO_FUNC_LOGE("audio vdiManager port fail");
214 return HDF_FAILURE;
215 }
216 descs[i].adapterName = strdup(vdiDescs[i].adapterName); // audio stub free adapterName
217 if (descs[i].adapterName == NULL) {
218 AUDIO_FUNC_LOGE("strdup fail, descs[%{public}d].adapterName = %{public}s", i, descs[i].adapterName);
219 return HDF_FAILURE;
220 }
221 AUDIO_FUNC_LOGI("audio vdiManager get adapterName=%{public}s", descs[i].adapterName);
222 }
223
224 *descsCount = count;
225 return HDF_SUCCESS;
226 }
227
AudioManagerPrivVdiGetAllAdapters(struct AudioManagerPrivVdi * priv,struct AudioAdapterDescriptor * descs,uint32_t * descsLen)228 static int32_t AudioManagerPrivVdiGetAllAdapters(struct AudioManagerPrivVdi *priv,
229 struct AudioAdapterDescriptor *descs, uint32_t *descsLen)
230 {
231 if (*descsLen == 0 || *descsLen > AUDIO_VDI_ADAPTER_NUM_MAX) {
232 AUDIO_FUNC_LOGE("descsLen is invalid");
233 return HDF_FAILURE;
234 }
235 priv->vdiDescs = (struct AudioAdapterDescriptorVdi *)OsalMemCalloc(
236 sizeof(struct AudioAdapterDescriptorVdi) * (*descsLen));
237 if (priv->vdiDescs == NULL) {
238 AUDIO_FUNC_LOGE("null point");
239 return HDF_ERR_NOT_SUPPORT;
240 }
241
242 priv->vdiDescsCount = *descsLen;
243 int32_t id = SetTimer("Hdi:GetAllAdapters");
244 int32_t ret = priv->vdiManager->GetAllAdapters(priv->vdiManager, priv->vdiDescs, &priv->vdiDescsCount);
245 CancelTimer(id);
246 if (ret != HDF_SUCCESS) {
247 AUDIO_FUNC_LOGE("audio vdiManager call GetAllAdapters fail, ret=%{public}d", ret);
248 free(priv->vdiDescs);
249 priv->vdiDescs = NULL;
250 priv->vdiDescsCount = 0;
251 return HDF_FAILURE;
252 }
253
254 ret = AudioManagerVdiDescsToDescs(priv->vdiDescs, priv->vdiDescsCount, descs, descsLen);
255 if (ret != HDF_SUCCESS) {
256 AUDIO_FUNC_LOGE("audio vdiManager DescsVdi To Descs fail, ret=%{public}d", ret);
257 AudioManagerReleaseDescs(descs, *descsLen);
258 free(priv->vdiDescs);
259 priv->vdiDescs = NULL;
260 priv->vdiDescsCount = 0;
261 return HDF_FAILURE;
262 }
263
264 priv->descsCount = AUDIO_VDI_ADAPTER_NUM_MAX;
265 ret = AudioManagerVdiDescsToDescs(priv->vdiDescs, priv->vdiDescsCount, priv->descs, &priv->descsCount);
266 if (ret != HDF_SUCCESS) {
267 AUDIO_FUNC_LOGE("audio vdiManager DescsVdi To Descs fail, ret=%{public}d", ret);
268 AudioManagerReleaseDescs(descs, *descsLen);
269 AudioManagerReleaseDescs(priv->descs, priv->descsCount);
270 priv->descsCount = 0;
271 free(priv->vdiDescs);
272 priv->vdiDescs = NULL;
273 priv->vdiDescsCount = 0;
274 return HDF_FAILURE;
275 }
276 return HDF_SUCCESS;
277 }
278
AudioManagerVendorGetAllAdapters(struct IAudioManager * manager,struct AudioAdapterDescriptor * descs,uint32_t * descsLen)279 int32_t AudioManagerVendorGetAllAdapters(struct IAudioManager *manager,
280 struct AudioAdapterDescriptor *descs, uint32_t *descsLen)
281 {
282 AUDIO_FUNC_LOGD("enter to %{public}s", __func__);
283 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
284 CHECK_NULL_PTR_RETURN_VALUE(descs, HDF_ERR_INVALID_PARAM);
285 CHECK_NULL_PTR_RETURN_VALUE(descsLen, HDF_ERR_INVALID_PARAM);
286
287 pthread_mutex_lock(&g_managerMutex);
288 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
289 if (priv->vdiManager == NULL) {
290 AUDIO_FUNC_LOGE("audio vdiManager is null");
291 pthread_mutex_unlock(&g_managerMutex);
292 return HDF_ERR_INVALID_PARAM;
293 }
294
295 if (*descsLen > AUDIO_VDI_ADAPTER_NUM_MAX) {
296 AUDIO_FUNC_LOGE("audio adapter num demanded too large");
297 pthread_mutex_unlock(&g_managerMutex);
298 return HDF_ERR_INVALID_PARAM;
299 }
300 if (priv->vdiDescsCount != 0 && priv->vdiDescs != NULL && priv->vdiDescsCount >= *descsLen) {
301 int32_t ret = AudioManagerVdiDescsToDescs(priv->vdiDescs, priv->vdiDescsCount, descs, descsLen);
302 if (ret != HDF_SUCCESS) {
303 AUDIO_FUNC_LOGE("audio vdiManager DescsVdi To Descs fail, ret=%{public}d", ret);
304 AudioManagerReleaseDescs(descs, *descsLen);
305 pthread_mutex_unlock(&g_managerMutex);
306 return HDF_FAILURE;
307 }
308 pthread_mutex_unlock(&g_managerMutex);
309 return HDF_SUCCESS;
310 }
311
312 if (priv->vdiDescs != NULL) {
313 free(priv->vdiDescs);
314 priv->vdiDescs = NULL;
315 }
316
317 int32_t ret = AudioManagerPrivVdiGetAllAdapters(priv, descs, descsLen);
318 pthread_mutex_unlock(&g_managerMutex);
319 return ret;
320 }
321
AudioManagerVendorFindAdapterPos(struct IAudioManager * manager,const char * adapterName)322 static uint32_t AudioManagerVendorFindAdapterPos(struct IAudioManager *manager, const char *adapterName)
323 {
324 CHECK_NULL_PTR_RETURN_VALUE(adapterName, AUDIO_VDI_ADAPTER_NUM_MAX);
325 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
326 CHECK_NULL_PTR_RETURN_VALUE(priv->vdiManager, AUDIO_VDI_ADAPTER_NUM_MAX);
327
328 for (uint32_t descIndex = 0; descIndex < priv->descsCount; descIndex++) {
329 if (strcmp(adapterName, priv->descs[descIndex].adapterName) == 0) {
330 return descIndex;
331 }
332 }
333
334 AUDIO_FUNC_LOGI("can not find adapterName(%{public}s) pos", adapterName);
335 return AUDIO_VDI_ADAPTER_NUM_MAX;
336 }
337
VendorLoadAdapter(struct IAudioManagerVdi * vdiManager,struct AudioAdapterDescriptorVdi * vdiDesc,uint32_t descIndex)338 static struct IAudioAdapter* VendorLoadAdapter(struct IAudioManagerVdi *vdiManager,
339 struct AudioAdapterDescriptorVdi *vdiDesc, uint32_t descIndex)
340 {
341 int32_t ret = HDF_SUCCESS;
342 struct IAudioAdapterVdi *vdiAdapter = NULL;
343 int32_t id = SetTimer("Hdi:LoadAdapter");
344 HdfAudioStartTrace("Hdi:AudioManagerVendorLoadAdapter", 0);
345 ret = vdiManager->LoadAdapter(vdiManager, vdiDesc, &vdiAdapter);
346 HdfAudioFinishTrace();
347 CancelTimer(id);
348
349 if (ret != HDF_SUCCESS) {
350 AUDIO_FUNC_LOGE("audio vdiManager call LoadAdapter fail, ret=%{public}d", ret);
351 return NULL;
352 }
353
354 struct IAudioAdapter *adapter = AudioCreateAdapterVdi(descIndex, vdiAdapter, vdiDesc->adapterName);
355 if (adapter == NULL) {
356 AUDIO_FUNC_LOGE("audio vdiManager create adapter fail");
357 vdiManager->UnloadAdapter(vdiManager, vdiAdapter);
358 return NULL;
359 }
360 AudioManagerReleaseVdiDesc(vdiDesc);
361 return adapter;
362 }
363
AudioManagerVendorLoadAdapter(struct IAudioManager * manager,const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)364 int32_t AudioManagerVendorLoadAdapter(struct IAudioManager *manager, const struct AudioAdapterDescriptor *desc,
365 struct IAudioAdapter **adapter)
366 {
367 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
368 CHECK_NULL_PTR_RETURN_VALUE(desc, HDF_ERR_INVALID_PARAM);
369 CHECK_NULL_PTR_RETURN_VALUE(adapter, HDF_ERR_INVALID_PARAM);
370
371 pthread_mutex_lock(&g_managerMutex);
372 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
373 if (priv == NULL || priv->vdiManager == NULL || priv->vdiManager->LoadAdapter == NULL) {
374 pthread_mutex_unlock(&g_managerMutex);
375 return HDF_ERR_INVALID_PARAM;
376 }
377
378 uint32_t descIndex = AudioManagerVendorFindAdapterPos(manager, desc->adapterName);
379 if (descIndex >= AUDIO_VDI_ADAPTER_NUM_MAX) {
380 AUDIO_FUNC_LOGE("audio vdiManager find adapter pos");
381 pthread_mutex_unlock(&g_managerMutex);
382 return HDF_FAILURE;
383 }
384
385 int32_t ret = HDF_SUCCESS;
386 uint32_t count = AudioGetAdapterRefCntVdi(descIndex);
387 if (count > 0 && count != UINT_MAX) {
388 ret = AudioIncreaseAdapterRefVdi(descIndex, adapter);
389 pthread_mutex_unlock(&g_managerMutex);
390 return ret;
391 }
392
393 struct AudioAdapterDescriptorVdi vdiDesc = {0};
394 ret = AudioManagerDescToVdiDesc(desc, &vdiDesc);
395 if (ret != HDF_SUCCESS) {
396 AudioManagerReleaseVdiDesc(&vdiDesc);
397 AUDIO_FUNC_LOGE("audio vdiManager desc To vdiDesc fail, ret=%{public}d", ret);
398 pthread_mutex_unlock(&g_managerMutex);
399 return HDF_FAILURE;
400 }
401
402 *adapter = VendorLoadAdapter(priv->vdiManager, &vdiDesc, descIndex);
403 if (*adapter == NULL) {
404 pthread_mutex_unlock(&g_managerMutex);
405 return HDF_FAILURE;
406 }
407 pthread_mutex_unlock(&g_managerMutex);
408 AUDIO_FUNC_LOGD("audio vdiManager load vdiAdapter success");
409 return HDF_SUCCESS;
410 }
411
AudioManagerVendorUnloadAdapterLocked(struct IAudioManager * manager,const char * adapterName)412 static int32_t AudioManagerVendorUnloadAdapterLocked(struct IAudioManager *manager, const char *adapterName)
413 {
414 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
415 CHECK_NULL_PTR_RETURN_VALUE(adapterName, HDF_ERR_INVALID_PARAM);
416
417 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
418 if (priv == NULL || priv->vdiManager == NULL || priv->vdiManager->UnloadAdapter == NULL) {
419 return HDF_ERR_INVALID_PARAM;
420 }
421
422 uint32_t descIndex = AudioManagerVendorFindAdapterPos(manager, adapterName);
423 if (descIndex >= AUDIO_VDI_ADAPTER_NUM_MAX) {
424 AUDIO_FUNC_LOGE("AudioManagerVendorUnloadAdapter descIndex error");
425 return HDF_ERR_INVALID_PARAM;
426 }
427
428 struct IAudioAdapterVdi *vdiAdapter = AudioGetVdiAdapterByDescIndexVdi(descIndex);
429 if (vdiAdapter == NULL) {
430 AUDIO_FUNC_LOGW("audio vdiManager vdiAdapter had unloaded, index=%{public}d", descIndex);
431 return HDF_SUCCESS;
432 }
433
434 uint32_t count = AudioGetAdapterRefCntVdi(descIndex);
435 if (count > 1 && count != UINT_MAX) {
436 AudioDecreaseAdapterRefVdi(descIndex);
437 return HDF_SUCCESS;
438 }
439 AudioReleaseAdapterVdi(descIndex);
440 HdfAudioStartTrace("Hdi:AudioManagerVendorUnloadAdapter", 0);
441 priv->vdiManager->UnloadAdapter(priv->vdiManager, vdiAdapter);
442 HdfAudioFinishTrace();
443
444 AUDIO_FUNC_LOGI("audio vdiManager unload vdiAdapter success, adapterName=[%{public}s]", adapterName);
445 return HDF_SUCCESS;
446 }
447
AudioManagerVendorUnloadAdapter(struct IAudioManager * manager,const char * adapterName)448 static int32_t AudioManagerVendorUnloadAdapter(struct IAudioManager *manager, const char *adapterName)
449 {
450 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
451 CHECK_NULL_PTR_RETURN_VALUE(adapterName, HDF_ERR_INVALID_PARAM);
452
453 pthread_mutex_lock(&g_managerMutex);
454 int32_t ret = AudioManagerVendorUnloadAdapterLocked(manager, adapterName);
455 pthread_mutex_unlock(&g_managerMutex);
456 return ret;
457 }
458
ReleaseAudioManagerVendorObject(struct IAudioManager * manager)459 int32_t ReleaseAudioManagerVendorObject(struct IAudioManager *manager)
460 {
461 uint32_t descIndex;
462
463 if (manager == NULL) {
464 AUDIO_FUNC_LOGI("auido manager had released");
465 return HDF_SUCCESS;
466 }
467 pthread_mutex_lock(&g_managerMutex);
468 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
469 CHECK_NULL_PTR_RETURN_VALUE(priv, HDF_ERR_INVALID_PARAM);
470
471 for (descIndex = 0; descIndex < priv->descsCount; descIndex++) {
472 AudioEnforceClearAdapterRefCntVdi(descIndex);
473 int32_t ret = AudioManagerVendorUnloadAdapterLocked(manager, priv->descs[descIndex].adapterName);
474 if (ret != HDF_SUCCESS) {
475 AUDIO_FUNC_LOGW("audio unload adapter error, ret=%{pulbic}d, adaptername=%{pulbic}s", ret,
476 priv->descs[descIndex].adapterName);
477 }
478 }
479
480 if (priv->handle != NULL) {
481 dlclose(priv->handle);
482 priv->handle = NULL;
483 }
484
485 AudioManagerReleaseDescs(priv->descs, priv->descsCount);
486 OsalMemFree((void *)priv);
487 priv = NULL;
488 AUDIO_FUNC_LOGI("audio release vendor lib success");
489 pthread_mutex_unlock(&g_managerMutex);
490 return HDF_SUCCESS;
491 }
492
AudioManagerLoadVendorLib(struct AudioManagerPrivVdi * priv)493 static int32_t AudioManagerLoadVendorLib(struct AudioManagerPrivVdi *priv)
494 {
495 char *error = NULL;
496 const char *hdiAudioVendorLibPath = HDF_LIBRARY_FULL_PATH("libaudio_primary_impl");
497
498 priv->handle = dlopen(hdiAudioVendorLibPath, RTLD_LAZY);
499 if (priv->handle == NULL) {
500 error = dlerror();
501 AUDIO_FUNC_LOGE("audio vdiManager load path%{public}s, dlopen err=%{public}s", hdiAudioVendorLibPath, error);
502 return HDF_FAILURE;
503 }
504
505 (void)dlerror(); // clear existing error
506
507 priv->managerFuncs = dlsym(priv->handle, "AudioManagerCreateIfInstance");
508 if (priv->managerFuncs == NULL) {
509 error = dlerror();
510 AUDIO_FUNC_LOGE("dlsym AudioManagerCreateIfInstance err=%{public}s", error);
511 dlclose(priv->handle);
512 priv->handle = NULL;
513 return HDF_FAILURE;
514 }
515
516 AUDIO_FUNC_LOGI("audio load vendor lib success");
517 return HDF_SUCCESS;
518 }
519
AudioManagerCreateIfInstance(void)520 struct IAudioManager *AudioManagerCreateIfInstance(void)
521 {
522 AUDIO_FUNC_LOGI("audio vdiManager create instance");
523 SetMaxWorkThreadNum(THREAD_POOL_COUNT);
524 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)OsalMemCalloc(sizeof(*priv));
525 if (priv == NULL) {
526 AUDIO_FUNC_LOGE("OsalMemCalloc AudioManagerPrivVdi failed");
527 return NULL;
528 }
529
530 int32_t ret = AudioManagerLoadVendorLib(priv);
531 if (ret != HDF_SUCCESS) {
532 AUDIO_FUNC_LOGE("audio load lib failed ret=%{pulbic}d", ret);
533 OsalMemFree((void *)priv);
534 return NULL;
535 }
536
537 priv->vdiManager = (struct IAudioManagerVdi *)priv->managerFuncs();
538 if (priv->vdiManager == NULL) {
539 AUDIO_FUNC_LOGE("audio call vdi manager func failed");
540 OsalMemFree((void *)priv);
541 return NULL;
542 }
543
544 if (pthread_mutex_init(&g_managerMutex, NULL) != HDF_SUCCESS) {
545 AUDIO_FUNC_LOGE("init g_managerMutex failed.");
546 return NULL;
547 }
548
549 priv->interface.GetAllAdapters = AudioManagerVendorGetAllAdapters;
550 priv->interface.LoadAdapter = AudioManagerVendorLoadAdapter;
551 priv->interface.UnloadAdapter = AudioManagerVendorUnloadAdapter;
552 priv->interface.ReleaseAudioManagerObject = ReleaseAudioManagerVendorObject;
553
554 return &(priv->interface);
555 }
556
AudioManagerDestroyIfInstance(struct IAudioManager * manager)557 int32_t AudioManagerDestroyIfInstance(struct IAudioManager *manager)
558 {
559 int32_t ret = ReleaseAudioManagerVendorObject(manager);
560 pthread_mutex_destroy(&g_managerMutex);
561 return ret;
562 }