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 }