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