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