• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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