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