1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci#include <securec.h>
16094332d3Sopenharmony_ci#include <string.h>
17094332d3Sopenharmony_ci#include "effect_core.h"
18094332d3Sopenharmony_ci#include "effect_host_common.h"
19094332d3Sopenharmony_ci#include "v1_0/effect_types_vdi.h"
20094332d3Sopenharmony_ci#include "v1_0/effect_factory.h"
21094332d3Sopenharmony_ci#include "osal_mem.h"
22094332d3Sopenharmony_ci#include "parse_effect_config.h"
23094332d3Sopenharmony_ci#include "audio_uhdf_log.h"
24094332d3Sopenharmony_ci
25094332d3Sopenharmony_ci#define AUDIO_EFFECT_PLAFORM_CONFIG HDF_CONFIG_DIR"/audio_effect.json"
26094332d3Sopenharmony_ci#define AUDIO_EFFECT_PRODUCT_CONFIG HDF_CHIP_PROD_CONFIG_DIR"/audio_effect.json"
27094332d3Sopenharmony_ci#define HDF_LOG_TAG HDF_AUDIO_EFFECT
28094332d3Sopenharmony_cistruct ConfigDescriptor *g_cfgDescs = NULL;
29094332d3Sopenharmony_ci
30094332d3Sopenharmony_cistatic int32_t EffectModelIsSupplyEffectLibs(struct IEffectModel *self, bool *supply)
31094332d3Sopenharmony_ci{
32094332d3Sopenharmony_ci    if (self == NULL || supply == NULL) {
33094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invailid input params", __func__);
34094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
35094332d3Sopenharmony_ci    }
36094332d3Sopenharmony_ci
37094332d3Sopenharmony_ci    *supply = IsEffectLibExist();
38094332d3Sopenharmony_ci    return HDF_SUCCESS;
39094332d3Sopenharmony_ci}
40094332d3Sopenharmony_ci
41094332d3Sopenharmony_cistatic int32_t EffectModelGetAllEffectDescriptors(struct IEffectModel *self,
42094332d3Sopenharmony_ci                                                  struct EffectControllerDescriptor *descs, uint32_t *descsLen)
43094332d3Sopenharmony_ci{
44094332d3Sopenharmony_ci    HDF_LOGD("enter to %{public}s", __func__);
45094332d3Sopenharmony_ci    int32_t ret;
46094332d3Sopenharmony_ci    uint32_t i;
47094332d3Sopenharmony_ci    uint32_t descNum = 0;
48094332d3Sopenharmony_ci    struct EffectFactory *factLib = NULL;
49094332d3Sopenharmony_ci
50094332d3Sopenharmony_ci    if (self == NULL || descs == NULL || descsLen == NULL) {
51094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invailid input params", __func__);
52094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
53094332d3Sopenharmony_ci    }
54094332d3Sopenharmony_ci
55094332d3Sopenharmony_ci    if (g_cfgDescs == NULL) {
56094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: point is null!", __func__);
57094332d3Sopenharmony_ci        return HDF_FAILURE;
58094332d3Sopenharmony_ci    }
59094332d3Sopenharmony_ci    struct EffectControllerDescriptorVdi *descsVdi = (struct EffectControllerDescriptorVdi *)descs;
60094332d3Sopenharmony_ci    for (i = 0; i < g_cfgDescs->effectNum; i++) {
61094332d3Sopenharmony_ci        factLib = GetEffectLibFromList(g_cfgDescs->effectCfgDescs[i].library);
62094332d3Sopenharmony_ci        if (factLib == NULL) {
63094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: GetEffectLibFromList fail!", __func__);
64094332d3Sopenharmony_ci            continue;
65094332d3Sopenharmony_ci        }
66094332d3Sopenharmony_ci        ret = factLib->GetDescriptor(factLib, g_cfgDescs->effectCfgDescs[i].effectId, &descsVdi[descNum]);
67094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
68094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: GetDescriptor fail!", __func__);
69094332d3Sopenharmony_ci            continue;
70094332d3Sopenharmony_ci        }
71094332d3Sopenharmony_ci        descNum++;
72094332d3Sopenharmony_ci    }
73094332d3Sopenharmony_ci    *descsLen = descNum;
74094332d3Sopenharmony_ci    descs = (struct EffectControllerDescriptor *)descsVdi;
75094332d3Sopenharmony_ci    HDF_LOGD("%{public}s success", __func__);
76094332d3Sopenharmony_ci    return HDF_SUCCESS;
77094332d3Sopenharmony_ci}
78094332d3Sopenharmony_ci
79094332d3Sopenharmony_cistatic int32_t EffectModelGetEffectDescriptor(struct IEffectModel *self, const char *uuid,
80094332d3Sopenharmony_ci    struct EffectControllerDescriptor *desc)
81094332d3Sopenharmony_ci{
82094332d3Sopenharmony_ci    HDF_LOGD("enter to %{public}s", __func__);
83094332d3Sopenharmony_ci    uint32_t i;
84094332d3Sopenharmony_ci    struct EffectFactory *factLib = NULL;
85094332d3Sopenharmony_ci    if (self == NULL || uuid == NULL || desc == NULL) {
86094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invailid input params", __func__);
87094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
88094332d3Sopenharmony_ci    }
89094332d3Sopenharmony_ci    struct EffectControllerDescriptorVdi *descVdi = (struct EffectControllerDescriptorVdi *)desc;
90094332d3Sopenharmony_ci    for (i = 0; i < g_cfgDescs->effectNum; i++) {
91094332d3Sopenharmony_ci        if (strcmp(uuid, g_cfgDescs->effectCfgDescs[i].effectId) != 0) {
92094332d3Sopenharmony_ci            continue;
93094332d3Sopenharmony_ci        }
94094332d3Sopenharmony_ci
95094332d3Sopenharmony_ci        factLib = GetEffectLibFromList(g_cfgDescs->effectCfgDescs[i].library);
96094332d3Sopenharmony_ci        if (factLib == NULL) {
97094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: GetEffectLibFromList fail!", __func__);
98094332d3Sopenharmony_ci            return HDF_FAILURE;
99094332d3Sopenharmony_ci        }
100094332d3Sopenharmony_ci
101094332d3Sopenharmony_ci        if (factLib->GetDescriptor(factLib, uuid, descVdi) != HDF_SUCCESS) {
102094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: GetDescriptor fail!", __func__);
103094332d3Sopenharmony_ci            return HDF_FAILURE;
104094332d3Sopenharmony_ci        }
105094332d3Sopenharmony_ci        HDF_LOGD("%{public}s success", __func__);
106094332d3Sopenharmony_ci        return HDF_SUCCESS;
107094332d3Sopenharmony_ci    }
108094332d3Sopenharmony_ci    desc = (struct EffectControllerDescriptor *)descVdi;
109094332d3Sopenharmony_ci    HDF_LOGE("%{public}s fail!", __func__);
110094332d3Sopenharmony_ci    return HDF_FAILURE;
111094332d3Sopenharmony_ci}
112094332d3Sopenharmony_ci
113094332d3Sopenharmony_cistatic int32_t EffectModelCreateEffectController(struct IEffectModel *self, const struct EffectInfo *info,
114094332d3Sopenharmony_ci    struct IEffectControl **contoller, struct ControllerId *contollerId)
115094332d3Sopenharmony_ci{
116094332d3Sopenharmony_ci    if (self == NULL || info == NULL || contoller == NULL || contollerId == NULL) {
117094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invailid input params", __func__);
118094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
119094332d3Sopenharmony_ci    }
120094332d3Sopenharmony_ci
121094332d3Sopenharmony_ci    struct EffectFactory *lib = NULL;
122094332d3Sopenharmony_ci    struct ControllerManager *ctrlMgr = NULL;
123094332d3Sopenharmony_ci    struct IEffectControlVdi *ctrlOps = NULL;
124094332d3Sopenharmony_ci
125094332d3Sopenharmony_ci    lib = GetEffectLibFromList(info->libName);
126094332d3Sopenharmony_ci    CHECK_NULL_PTR_RETURN_VALUE(lib, HDF_FAILURE);
127094332d3Sopenharmony_ci    CHECK_NULL_PTR_RETURN_VALUE(lib->CreateController, HDF_FAILURE);
128094332d3Sopenharmony_ci
129094332d3Sopenharmony_ci    struct EffectInfoVdi *infoVdi = (struct EffectInfoVdi *)info;
130094332d3Sopenharmony_ci    lib->CreateController(lib, infoVdi, &ctrlOps);
131094332d3Sopenharmony_ci    CHECK_NULL_PTR_RETURN_VALUE(ctrlOps, HDF_FAILURE);
132094332d3Sopenharmony_ci
133094332d3Sopenharmony_ci    /* ctrlMgr mark it and using it in release process */
134094332d3Sopenharmony_ci    ctrlMgr = (struct ControllerManager *)OsalMemCalloc(sizeof(struct ControllerManager));
135094332d3Sopenharmony_ci    CHECK_NULL_PTR_RETURN_VALUE(ctrlMgr, HDF_FAILURE);
136094332d3Sopenharmony_ci
137094332d3Sopenharmony_ci    ctrlMgr->ctrlOps = ctrlOps;
138094332d3Sopenharmony_ci    ctrlMgr->effectId = strdup(info->effectId);
139094332d3Sopenharmony_ci    if (ctrlMgr->effectId == NULL) {
140094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strdup failed, info->effectId = %{public}s", __func__, info->effectId);
141094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr);
142094332d3Sopenharmony_ci        return HDF_FAILURE;
143094332d3Sopenharmony_ci    }
144094332d3Sopenharmony_ci    ctrlMgr->ctrlImpls.EffectProcess = EffectControlEffectProcess;
145094332d3Sopenharmony_ci    ctrlMgr->ctrlImpls.SendCommand = EffectControlSendCommand;
146094332d3Sopenharmony_ci    ctrlMgr->ctrlImpls.GetEffectDescriptor = EffectGetOwnDescriptor;
147094332d3Sopenharmony_ci    ctrlMgr->ctrlImpls.EffectReverse = EffectControlEffectReverse;
148094332d3Sopenharmony_ci    *contoller = &ctrlMgr->ctrlImpls;
149094332d3Sopenharmony_ci    if (RegisterControllerToList(ctrlMgr) != HDF_SUCCESS) {
150094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: register ctroller to list failed.", __func__);
151094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr->effectId);
152094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr);
153094332d3Sopenharmony_ci        *contoller = NULL;
154094332d3Sopenharmony_ci        return HDF_FAILURE;
155094332d3Sopenharmony_ci    }
156094332d3Sopenharmony_ci
157094332d3Sopenharmony_ci    // free after send reply
158094332d3Sopenharmony_ci    contollerId->libName = strdup(info->libName);
159094332d3Sopenharmony_ci    contollerId->effectId = strdup(info->effectId);
160094332d3Sopenharmony_ci    if (contollerId->libName == NULL || contollerId->effectId == NULL) {
161094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strdup failed, info->libName = %{public}s", __func__, info->libName);
162094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr->effectId);
163094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr);
164094332d3Sopenharmony_ci        *contoller = NULL;
165094332d3Sopenharmony_ci        return HDF_FAILURE;
166094332d3Sopenharmony_ci    }
167094332d3Sopenharmony_ci    return HDF_SUCCESS;
168094332d3Sopenharmony_ci}
169094332d3Sopenharmony_ci
170094332d3Sopenharmony_ciint32_t EffectModelDestroyEffectController(struct IEffectModel *self, const struct ControllerId *contollerId)
171094332d3Sopenharmony_ci{
172094332d3Sopenharmony_ci    if (self == NULL || contollerId == NULL) {
173094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invailid input params", __func__);
174094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
175094332d3Sopenharmony_ci    }
176094332d3Sopenharmony_ci    struct EffectFactory *lib = NULL;
177094332d3Sopenharmony_ci    struct ControllerManager *ctrlMgr = NULL;
178094332d3Sopenharmony_ci
179094332d3Sopenharmony_ci    lib = GetEffectLibFromList(contollerId->libName);
180094332d3Sopenharmony_ci    if (lib == NULL) {
181094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: not match any lib", __func__);
182094332d3Sopenharmony_ci        return HDF_FAILURE;
183094332d3Sopenharmony_ci    }
184094332d3Sopenharmony_ci
185094332d3Sopenharmony_ci    ctrlMgr = GetControllerFromList(contollerId->effectId);
186094332d3Sopenharmony_ci    if (ctrlMgr == NULL) {
187094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: controller manager not found", __func__);
188094332d3Sopenharmony_ci        return HDF_FAILURE;
189094332d3Sopenharmony_ci    }
190094332d3Sopenharmony_ci
191094332d3Sopenharmony_ci    if (ctrlMgr->ctrlOps == NULL) {
192094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: controller has no options", __func__);
193094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr);
194094332d3Sopenharmony_ci        ctrlMgr = NULL;
195094332d3Sopenharmony_ci        return HDF_FAILURE;
196094332d3Sopenharmony_ci    }
197094332d3Sopenharmony_ci
198094332d3Sopenharmony_ci    if (ctrlMgr->effectId != NULL) {
199094332d3Sopenharmony_ci        OsalMemFree(ctrlMgr->effectId);
200094332d3Sopenharmony_ci        ctrlMgr->effectId = NULL;
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci
203094332d3Sopenharmony_ci    /* call the lib destroy method,then free controller manager */
204094332d3Sopenharmony_ci    lib->DestroyController(lib, ctrlMgr->ctrlOps);
205094332d3Sopenharmony_ci    OsalMemFree(ctrlMgr);
206094332d3Sopenharmony_ci    ctrlMgr = NULL;
207094332d3Sopenharmony_ci
208094332d3Sopenharmony_ci    return HDF_SUCCESS;
209094332d3Sopenharmony_ci}
210094332d3Sopenharmony_ci
211094332d3Sopenharmony_cistatic int32_t RegLibraryInstByName(char *libPath)
212094332d3Sopenharmony_ci{
213094332d3Sopenharmony_ci    struct EffectFactory *factLib = NULL;
214094332d3Sopenharmony_ci    struct EffectFactory *(*GetFactoryLib)(void);
215094332d3Sopenharmony_ci    void *libHandle = NULL;
216094332d3Sopenharmony_ci    if (libPath == NULL) {
217094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid input param", __func__);
218094332d3Sopenharmony_ci        return HDF_FAILURE;
219094332d3Sopenharmony_ci    }
220094332d3Sopenharmony_ci
221094332d3Sopenharmony_ci    char pathBuf[PATH_MAX] = {'\0'};
222094332d3Sopenharmony_ci    if (realpath(libPath, pathBuf) == NULL) {
223094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: path conversion failed", __func__);
224094332d3Sopenharmony_ci        return HDF_FAILURE;
225094332d3Sopenharmony_ci    }
226094332d3Sopenharmony_ci
227094332d3Sopenharmony_ci    if (strncmp(HDF_LIBRARY_DIR, pathBuf, strlen(HDF_LIBRARY_DIR)) != 0) {
228094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: The file path is incorrect", __func__);
229094332d3Sopenharmony_ci        return HDF_FAILURE;
230094332d3Sopenharmony_ci    }
231094332d3Sopenharmony_ci
232094332d3Sopenharmony_ci    libHandle = dlopen(pathBuf, RTLD_LAZY);
233094332d3Sopenharmony_ci    if (libHandle == NULL) {
234094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: open so failed, reason:%{public}s", __func__, dlerror());
235094332d3Sopenharmony_ci        return HDF_FAILURE;
236094332d3Sopenharmony_ci    }
237094332d3Sopenharmony_ci
238094332d3Sopenharmony_ci    GetFactoryLib = dlsym(libHandle, "GetEffectoyFactoryLib");
239094332d3Sopenharmony_ci    factLib = GetFactoryLib();
240094332d3Sopenharmony_ci    if (factLib == NULL) {
241094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get fact lib failed %{public}s", __func__, dlerror());
242094332d3Sopenharmony_ci        dlclose(libHandle);
243094332d3Sopenharmony_ci        return HDF_FAILURE;
244094332d3Sopenharmony_ci    }
245094332d3Sopenharmony_ci
246094332d3Sopenharmony_ci    if (RegisterEffectLibToList(libHandle, factLib) != HDF_SUCCESS) {
247094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: register lib to list failed", __func__);
248094332d3Sopenharmony_ci        dlclose(libHandle);
249094332d3Sopenharmony_ci        return HDF_FAILURE;
250094332d3Sopenharmony_ci    }
251094332d3Sopenharmony_ci    return HDF_SUCCESS;
252094332d3Sopenharmony_ci}
253094332d3Sopenharmony_ci
254094332d3Sopenharmony_cistatic int32_t RegLibraryInst(struct LibraryConfigDescriptor **libCfgDescs, const uint32_t libNum)
255094332d3Sopenharmony_ci{
256094332d3Sopenharmony_ci    int32_t ret;
257094332d3Sopenharmony_ci    uint32_t i;
258094332d3Sopenharmony_ci    char path[PATH_MAX];
259094332d3Sopenharmony_ci    char pathBuf[PATH_MAX];
260094332d3Sopenharmony_ci    if (libCfgDescs == NULL || libNum == 0 || libNum > HDF_EFFECT_LIB_NUM_MAX) {
261094332d3Sopenharmony_ci        HDF_LOGE("Invalid parameter!");
262094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
263094332d3Sopenharmony_ci    }
264094332d3Sopenharmony_ci
265094332d3Sopenharmony_ci    for (i = 0; i < libNum; i++) {
266094332d3Sopenharmony_ci#if (defined(__aarch64__) || defined(__x86_64__))
267094332d3Sopenharmony_ciret = snprintf_s(path, PATH_MAX, PATH_MAX, "/vendor/lib64/%s.z.so", (*libCfgDescs)[i].libPath);
268094332d3Sopenharmony_ci#else
269094332d3Sopenharmony_ciret = snprintf_s(path, PATH_MAX, PATH_MAX, "/vendor/lib/%s.z.so", (*libCfgDescs)[i].libPath);
270094332d3Sopenharmony_ci#endif
271094332d3Sopenharmony_ci        if (ret < 0) {
272094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: get libPath failed", __func__);
273094332d3Sopenharmony_ci            continue;
274094332d3Sopenharmony_ci        }
275094332d3Sopenharmony_ci
276094332d3Sopenharmony_ci        if (realpath(path, pathBuf) == NULL) {
277094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: realpath is null! [%{public}d]", __func__, errno);
278094332d3Sopenharmony_ci            continue;
279094332d3Sopenharmony_ci        }
280094332d3Sopenharmony_ci
281094332d3Sopenharmony_ci        if (RegLibraryInstByName(path) != HDF_SUCCESS) {
282094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: regist library[%{private}s] failed", __func__, path);
283094332d3Sopenharmony_ci        }
284094332d3Sopenharmony_ci    }
285094332d3Sopenharmony_ci    return HDF_SUCCESS;
286094332d3Sopenharmony_ci}
287094332d3Sopenharmony_ci
288094332d3Sopenharmony_civoid ModelInit(void)
289094332d3Sopenharmony_ci{
290094332d3Sopenharmony_ci    FILE *file;
291094332d3Sopenharmony_ci    struct ConfigDescriptor *cfgDesc = NULL;
292094332d3Sopenharmony_ci    int32_t ret;
293094332d3Sopenharmony_ci    file = fopen(AUDIO_EFFECT_PRODUCT_CONFIG, "r");
294094332d3Sopenharmony_ci    if (file == NULL) {
295094332d3Sopenharmony_ci        ret = AudioEffectGetConfigDescriptor(AUDIO_EFFECT_PLAFORM_CONFIG, &cfgDesc);
296094332d3Sopenharmony_ci        HDF_LOGI("%{public}s: %{public}s!", __func__, AUDIO_EFFECT_PLAFORM_CONFIG);
297094332d3Sopenharmony_ci    } else {
298094332d3Sopenharmony_ci        ret = AudioEffectGetConfigDescriptor(AUDIO_EFFECT_PRODUCT_CONFIG, &cfgDesc);
299094332d3Sopenharmony_ci        HDF_LOGI("%{public}s: %{public}s!", __func__, AUDIO_EFFECT_PRODUCT_CONFIG);
300094332d3Sopenharmony_ci        (void)fclose(file);
301094332d3Sopenharmony_ci    }
302094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
303094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: AudioEffectGetConfigDescriptor fail!", __func__);
304094332d3Sopenharmony_ci        return;
305094332d3Sopenharmony_ci    }
306094332d3Sopenharmony_ci
307094332d3Sopenharmony_ci    if (cfgDesc == NULL || cfgDesc->effectCfgDescs == NULL || cfgDesc->libCfgDescs == NULL) {
308094332d3Sopenharmony_ci        HDF_LOGE("cfgDesc is null!");
309094332d3Sopenharmony_ci        return;
310094332d3Sopenharmony_ci    }
311094332d3Sopenharmony_ci
312094332d3Sopenharmony_ci    g_cfgDescs = cfgDesc;
313094332d3Sopenharmony_ci    if (RegLibraryInst(&(cfgDesc->libCfgDescs), cfgDesc->libNum) != HDF_SUCCESS) {
314094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: RegLibraryInst failed", __func__);
315094332d3Sopenharmony_ci        AudioEffectReleaseCfgDesc(cfgDesc);
316094332d3Sopenharmony_ci        return;
317094332d3Sopenharmony_ci    }
318094332d3Sopenharmony_ci
319094332d3Sopenharmony_ci    HDF_LOGD("%{public}s end!", __func__);
320094332d3Sopenharmony_ci}
321094332d3Sopenharmony_ci
322094332d3Sopenharmony_cistruct IEffectModel *EffectModelImplGetInstance(void)
323094332d3Sopenharmony_ci{
324094332d3Sopenharmony_ci    struct EffectModelService *service = (struct EffectModelService *)OsalMemCalloc(sizeof(struct EffectModelService));
325094332d3Sopenharmony_ci    if (service == NULL) {
326094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: malloc EffectModelService obj failed!", __func__);
327094332d3Sopenharmony_ci        return NULL;
328094332d3Sopenharmony_ci    }
329094332d3Sopenharmony_ci
330094332d3Sopenharmony_ci    ModelInit();
331094332d3Sopenharmony_ci    service->interface.IsSupplyEffectLibs = EffectModelIsSupplyEffectLibs;
332094332d3Sopenharmony_ci    service->interface.GetAllEffectDescriptors = EffectModelGetAllEffectDescriptors;
333094332d3Sopenharmony_ci    service->interface.CreateEffectController = EffectModelCreateEffectController;
334094332d3Sopenharmony_ci    service->interface.DestroyEffectController = EffectModelDestroyEffectController;
335094332d3Sopenharmony_ci    service->interface.GetEffectDescriptor = EffectModelGetEffectDescriptor;
336094332d3Sopenharmony_ci
337094332d3Sopenharmony_ci    return &service->interface;
338094332d3Sopenharmony_ci}
339094332d3Sopenharmony_ci
340094332d3Sopenharmony_civoid EffectModelImplRelease(struct IEffectModel *instance)
341094332d3Sopenharmony_ci{
342094332d3Sopenharmony_ci    if (instance == NULL) {
343094332d3Sopenharmony_ci        return;
344094332d3Sopenharmony_ci    }
345094332d3Sopenharmony_ci
346094332d3Sopenharmony_ci    AudioEffectReleaseCfgDesc(g_cfgDescs);
347094332d3Sopenharmony_ci    ReleaseLibFromList();
348094332d3Sopenharmony_ci    struct EffectModelService *service = CONTAINER_OF(instance, struct EffectModelService, interface);
349094332d3Sopenharmony_ci    if (service == NULL) {
350094332d3Sopenharmony_ci        return;
351094332d3Sopenharmony_ci    }
352094332d3Sopenharmony_ci    OsalMemFree(service);
353094332d3Sopenharmony_ci    service = NULL;
354094332d3Sopenharmony_ci}
355