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 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 ret = vdiManager->LoadAdapter(vdiManager, vdiDesc, &vdiAdapter);
345 HdfAudioFinishTrace();
346 CancelTimer(id);
347
348 if (ret != HDF_SUCCESS) {
349 AUDIO_FUNC_LOGE("audio vdiManager call LoadAdapter fail, ret=%{public}d", ret);
350 return NULL;
351 }
352
353 struct IAudioAdapter *adapter = AudioCreateAdapterVdi(descIndex, vdiAdapter, vdiDesc->adapterName);
354 if (adapter == NULL) {
355 AUDIO_FUNC_LOGE("audio vdiManager create adapter fail");
356 vdiManager->UnloadAdapter(vdiManager, vdiAdapter);
357 return NULL;
358 }
359 AudioManagerReleaseVdiDesc(vdiDesc);
360 return adapter;
361 }
362
AudioManagerVendorLoadAdapter(struct IAudioManager * manager,const struct AudioAdapterDescriptor * desc,struct IAudioAdapter ** adapter)363 int32_t AudioManagerVendorLoadAdapter(struct IAudioManager *manager, const struct AudioAdapterDescriptor *desc,
364 struct IAudioAdapter **adapter)
365 {
366 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
367 CHECK_NULL_PTR_RETURN_VALUE(desc, HDF_ERR_INVALID_PARAM);
368 CHECK_NULL_PTR_RETURN_VALUE(adapter, HDF_ERR_INVALID_PARAM);
369
370 pthread_mutex_lock(&g_managerMutex);
371 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
372 if (priv == NULL || priv->vdiManager == NULL || priv->vdiManager->LoadAdapter == NULL) {
373 pthread_mutex_unlock(&g_managerMutex);
374 return HDF_ERR_INVALID_PARAM;
375 }
376
377 uint32_t descIndex = AudioManagerVendorFindAdapterPos(manager, desc->adapterName);
378 if (descIndex >= AUDIO_VDI_ADAPTER_NUM_MAX) {
379 AUDIO_FUNC_LOGE("audio vdiManager find adapter pos");
380 pthread_mutex_unlock(&g_managerMutex);
381 return HDF_FAILURE;
382 }
383
384 int32_t ret = HDF_SUCCESS;
385 uint32_t count = AudioGetAdapterRefCntVdi(descIndex);
386 if (count > 0 && count != UINT_MAX) {
387 ret = AudioIncreaseAdapterRefVdi(descIndex, adapter);
388 pthread_mutex_unlock(&g_managerMutex);
389 return ret;
390 }
391
392 struct AudioAdapterDescriptorVdi vdiDesc = {0};
393 ret = AudioManagerDescToVdiDesc(desc, &vdiDesc);
394 if (ret != HDF_SUCCESS) {
395 AudioManagerReleaseVdiDesc(&vdiDesc);
396 AUDIO_FUNC_LOGE("audio vdiManager desc To vdiDesc fail, ret=%{public}d", ret);
397 pthread_mutex_unlock(&g_managerMutex);
398 return HDF_FAILURE;
399 }
400
401 *adapter = VendorLoadAdapter(priv->vdiManager, &vdiDesc, descIndex);
402 if (*adapter == NULL) {
403 pthread_mutex_unlock(&g_managerMutex);
404 return HDF_FAILURE;
405 }
406 pthread_mutex_unlock(&g_managerMutex);
407 AUDIO_FUNC_LOGD("audio vdiManager load vdiAdapter success");
408 return HDF_SUCCESS;
409 }
410
AudioManagerVendorUnloadAdapterSafety(struct IAudioManager * manager,const char * adapterName)411 static int32_t AudioManagerVendorUnloadAdapterSafety(struct IAudioManager *manager, const char *adapterName)
412 {
413 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
414 CHECK_NULL_PTR_RETURN_VALUE(adapterName, HDF_ERR_INVALID_PARAM);
415
416 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
417 if (priv == NULL || priv->vdiManager == NULL || priv->vdiManager->UnloadAdapter == NULL) {
418 return HDF_ERR_INVALID_PARAM;
419 }
420
421 uint32_t descIndex = AudioManagerVendorFindAdapterPos(manager, adapterName);
422 if (descIndex >= AUDIO_VDI_ADAPTER_NUM_MAX) {
423 AUDIO_FUNC_LOGE("AudioManagerVendorUnloadAdapter descIndex error");
424 return HDF_ERR_INVALID_PARAM;
425 }
426
427 struct IAudioAdapterVdi *vdiAdapter = AudioGetVdiAdapterByDescIndexVdi(descIndex);
428 if (vdiAdapter == NULL) {
429 AUDIO_FUNC_LOGW("audio vdiManager vdiAdapter had unloaded, index=%{public}d", descIndex);
430 return HDF_SUCCESS;
431 }
432
433 uint32_t count = AudioGetAdapterRefCntVdi(descIndex);
434 if (count > 1 && count != UINT_MAX) {
435 AudioDecreaseAdapterRefVdi(descIndex);
436 return HDF_SUCCESS;
437 }
438 HdfAudioStartTrace("Hdi:AudioManagerVendorUnloadAdapter", 0);
439 priv->vdiManager->UnloadAdapter(priv->vdiManager, vdiAdapter);
440 HdfAudioFinishTrace();
441 AudioReleaseAdapterVdi(descIndex);
442 AUDIO_FUNC_LOGD("audio vdiManager unload vdiAdapter success");
443 return HDF_SUCCESS;
444 }
445
AudioManagerVendorUnloadAdapter(struct IAudioManager * manager,const char * adapterName)446 static int32_t AudioManagerVendorUnloadAdapter(struct IAudioManager *manager, const char *adapterName)
447 {
448 CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM);
449 CHECK_NULL_PTR_RETURN_VALUE(adapterName, HDF_ERR_INVALID_PARAM);
450
451 pthread_mutex_lock(&g_managerMutex);
452 int32_t ret = AudioManagerVendorUnloadAdapterSafety(manager, adapterName);
453 pthread_mutex_unlock(&g_managerMutex);
454 return ret;
455 }
456
ReleaseAudioManagerVendorObject(struct IAudioManager * manager)457 int32_t ReleaseAudioManagerVendorObject(struct IAudioManager *manager)
458 {
459 uint32_t descIndex;
460
461 if (manager == NULL) {
462 AUDIO_FUNC_LOGI("auido manager had released");
463 return HDF_SUCCESS;
464 }
465 pthread_mutex_lock(&g_managerMutex);
466 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)manager;
467 CHECK_NULL_PTR_RETURN_VALUE(priv, HDF_ERR_INVALID_PARAM);
468
469 for (descIndex = 0; descIndex < priv->descsCount; descIndex++) {
470 AudioEnforceClearAdapterRefCntVdi(descIndex);
471 int32_t ret = AudioManagerVendorUnloadAdapterSafety(manager, priv->descs[descIndex].adapterName);
472 if (ret != HDF_SUCCESS) {
473 AUDIO_FUNC_LOGW("audio unload adapter error, ret=%{pulbic}d, adaptername=%{pulbic}s", ret,
474 priv->descs[descIndex].adapterName);
475 }
476 }
477
478 if (priv->handle != NULL) {
479 dlclose(priv->handle);
480 priv->handle = NULL;
481 }
482
483 AudioManagerReleaseDescs(priv->descs, priv->descsCount);
484 AUDIO_FUNC_LOGI("audio release vendor lib success");
485 OsalMemFree((void *)priv);
486 priv = NULL;
487 pthread_mutex_unlock(&g_managerMutex);
488 return HDF_SUCCESS;
489 }
490
AudioManagerLoadVendorLib(struct AudioManagerPrivVdi * priv)491 static int32_t AudioManagerLoadVendorLib(struct AudioManagerPrivVdi *priv)
492 {
493 char *error = NULL;
494 const char *hdiAudioVendorLibPath = HDF_LIBRARY_FULL_PATH("libaudio_primary_impl");
495
496 priv->handle = dlopen(hdiAudioVendorLibPath, RTLD_LAZY);
497 if (priv->handle == NULL) {
498 error = dlerror();
499 AUDIO_FUNC_LOGE("audio vdiManager load path%{public}s, dlopen err=%{public}s", hdiAudioVendorLibPath, error);
500 return HDF_FAILURE;
501 }
502
503 (void)dlerror(); // clear existing error
504
505 priv->managerFuncs = dlsym(priv->handle, "AudioManagerCreateIfInstance");
506 if (priv->managerFuncs == NULL) {
507 error = dlerror();
508 AUDIO_FUNC_LOGE("dlsym AudioManagerCreateIfInstance err=%{public}s", error);
509 dlclose(priv->handle);
510 priv->handle = NULL;
511 return HDF_FAILURE;
512 }
513
514 AUDIO_FUNC_LOGD("audio load vendor lib success");
515 return HDF_SUCCESS;
516 }
517
AudioManagerCreateIfInstance(void)518 struct IAudioManager *AudioManagerCreateIfInstance(void)
519 {
520 AUDIO_FUNC_LOGD("audio vdiManager create instance");
521
522 struct AudioManagerPrivVdi *priv = (struct AudioManagerPrivVdi *)OsalMemCalloc(sizeof(*priv));
523 if (priv == NULL) {
524 AUDIO_FUNC_LOGE("OsalMemCalloc AudioManagerPrivVdi failed");
525 return NULL;
526 }
527
528 int32_t ret = AudioManagerLoadVendorLib(priv);
529 if (ret != HDF_SUCCESS) {
530 AUDIO_FUNC_LOGE("audio load lib failed ret=%{pulbic}d", ret);
531 OsalMemFree((void *)priv);
532 return NULL;
533 }
534
535 priv->vdiManager = (struct IAudioManagerVdi *)priv->managerFuncs();
536 if (priv->vdiManager == NULL) {
537 AUDIO_FUNC_LOGE("audio call vdi manager func failed");
538 OsalMemFree((void *)priv);
539 return NULL;
540 }
541
542 if (pthread_mutex_init(&g_managerMutex, NULL) != HDF_SUCCESS) {
543 AUDIO_FUNC_LOGE("init g_managerMutex failed.");
544 return NULL;
545 }
546 if (InitAdapterMutex() != HDF_SUCCESS) {
547 AUDIO_FUNC_LOGE("init g_adapterMutex failed.");
548 pthread_mutex_destroy(&g_managerMutex);
549 return NULL;
550 }
551
552 priv->interface.GetAllAdapters = AudioManagerVendorGetAllAdapters;
553 priv->interface.LoadAdapter = AudioManagerVendorLoadAdapter;
554 priv->interface.UnloadAdapter = AudioManagerVendorUnloadAdapter;
555 priv->interface.ReleaseAudioManagerObject = ReleaseAudioManagerVendorObject;
556
557 return &(priv->interface);
558 }
559
AudioManagerDestroyIfInstance(struct IAudioManager * manager)560 int32_t AudioManagerDestroyIfInstance(struct IAudioManager *manager)
561 {
562 int32_t ret = ReleaseAudioManagerVendorObject(manager);
563 pthread_mutex_destroy(&g_managerMutex);
564 DeinitAdapterMutex();
565 return ret;
566 }