• 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 
16 #include <cstdlib>
17 #include <cstdio>
18 #include <cstring>
19 #include <cstdint>
20 #include <cassert>
21 #include <cstddef>
22 #include <map>
23 #include <memory>
24 #include <vector>
25 #include <set>
26 
27 #include "audio_effect_chain_adapter.h"
28 #include "audio_effect_chain_manager.h"
29 #include "audio_log.h"
30 #include "audio_errors.h"
31 #include "audio_effect.h"
32 
33 #define DEVICE_FLAG
34 
35 using namespace OHOS::AudioStandard;
36 
EffectChainManagerCreate(char * sceneType,BufferAttr * bufferAttr)37 int32_t EffectChainManagerCreate(char *sceneType, BufferAttr *bufferAttr)
38 {
39     AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
40     CHECK_AND_RETURN_RET_LOG(audioEffectChainManager != nullptr, ERR_INVALID_HANDLE, "null audioEffectChainManager");
41     std::string sceneTypeString = "";
42     if (sceneType) {
43         sceneTypeString = sceneType;
44     }
45     if (audioEffectChainManager->CreateAudioEffectChain(sceneTypeString, bufferAttr) != SUCCESS) {
46         return ERROR;
47     }
48     return SUCCESS;
49 }
50 
EffectChainManagerProcess(char * sceneType,BufferAttr * bufferAttr)51 int32_t EffectChainManagerProcess(char *sceneType, BufferAttr *bufferAttr)
52 {
53     AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
54     CHECK_AND_RETURN_RET_LOG(audioEffectChainManager != nullptr, ERR_INVALID_HANDLE, "null audioEffectChainManager");
55     std::string sceneTypeString = "";
56     if (sceneType) {
57         sceneTypeString = sceneType;
58     }
59     if (audioEffectChainManager->ApplyAudioEffectChain(sceneTypeString, bufferAttr) != SUCCESS) {
60         return ERROR;
61     }
62     return SUCCESS;
63 }
64 
EffectChainManagerGetFrameLen()65 int32_t EffectChainManagerGetFrameLen()
66 {
67     AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
68     CHECK_AND_RETURN_RET_LOG(audioEffectChainManager != nullptr, DEFAULT_FRAMELEN, "null audioEffectChainManager");
69     return audioEffectChainManager->GetFrameLen();
70 }
71 
EffectChainManagerExist(const char * sceneType,const char * effectMode)72 bool EffectChainManagerExist(const char *sceneType, const char *effectMode)
73 {
74     AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
75     CHECK_AND_RETURN_RET_LOG(audioEffectChainManager != nullptr, false, "null audioEffectChainManager");
76     std::string sceneTypeString = "";
77     if (sceneType) {
78         sceneTypeString = sceneType;
79     }
80     std::string effectModeString = "";
81     if (effectMode) {
82         effectModeString = effectMode;
83     }
84     return audioEffectChainManager->ExistAudioEffectChain(sceneTypeString, effectModeString);
85 }
86 
IgnoreEffectChangeProcess(bool ignored)87 void IgnoreEffectChangeProcess(bool ignored)
88 {
89     AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
90     CHECK_AND_RETURN_LOG(audioEffectChainManager != nullptr, "null audioEffectChainManager");
91     audioEffectChainManager->IgnoreEffectChain(ignored);
92 }
93 
94 namespace OHOS {
95 namespace AudioStandard {
96 
AudioEffectChain(std::string scene)97 AudioEffectChain::AudioEffectChain(std::string scene)
98 {
99     sceneType = scene;
100     effectMode = AUDIO_SUPPORTED_SCENE_MODES.find(EFFECT_DEFAULT)->second;
101     audioBufIn.frameLength = 0;
102     audioBufOut.frameLength = 0;
103     ioBufferConfig.inputCfg.samplingRate = DEFAULT_SAMPLE_RATE;
104     ioBufferConfig.inputCfg.channels = DEFAULT_NUM_CHANNEL;
105     ioBufferConfig.inputCfg.format = DATA_FORMAT_F32;
106     ioBufferConfig.outputCfg.samplingRate = DEFAULT_SAMPLE_RATE;
107     ioBufferConfig.outputCfg.channels = DEFAULT_NUM_CHANNEL;
108     ioBufferConfig.outputCfg.format = DATA_FORMAT_F32;
109     isEffectIgnored = false;
110 }
111 
~AudioEffectChain()112 AudioEffectChain::~AudioEffectChain()
113 {
114     std::lock_guard<std::mutex> lock(reloadMutex);
115     ReleaseEffectChain();
116 }
117 
Dump()118 void AudioEffectChain::Dump()
119 {
120     std::lock_guard<std::mutex> lock(reloadMutex);
121     for (AudioEffectHandle handle: standByEffectHandles) {
122         AUDIO_INFO_LOG("Dump standByEffectHandle for [%{public}s], handle address is %{public}p", sceneType.c_str(),
123             handle);
124     }
125 }
126 
GetEffectMode()127 std::string AudioEffectChain::GetEffectMode()
128 {
129     return effectMode;
130 }
131 
SetEffectMode(std::string mode)132 void AudioEffectChain::SetEffectMode(std::string mode)
133 {
134     effectMode = mode;
135 }
136 
137 template <typename T>
GetKeyFromValue(const std::unordered_map<T,std::string> & map,const std::string & value)138 int32_t GetKeyFromValue(const std::unordered_map<T, std::string> &map, const std::string &value)
139 {
140     for (auto it = map.begin(); it != map.end(); ++it) {
141         if (it->second == value) {
142             return it->first;
143         }
144     }
145     return -1;
146 }
147 
ReleaseEffectChain()148 void AudioEffectChain::ReleaseEffectChain()
149 {
150     for (uint32_t i = 0; i < standByEffectHandles.size() && i < libHandles.size(); ++i) {
151         if (!libHandles[i]) {
152             continue;
153         }
154         if (!standByEffectHandles[i]) {
155             continue;
156         }
157         if (!libHandles[i]->releaseEffect) {
158             continue;
159         }
160         libHandles[i]->releaseEffect(standByEffectHandles[i]);
161     }
162     standByEffectHandles.clear();
163     libHandles.clear();
164 }
165 
AddEffectHandleBegin()166 void AudioEffectChain::AddEffectHandleBegin()
167 {
168     reloadMutex.lock();
169     ReleaseEffectChain();
170 }
171 
AddEffectHandle(AudioEffectHandle handle,AudioEffectLibrary * libHandle)172 void AudioEffectChain::AddEffectHandle(AudioEffectHandle handle, AudioEffectLibrary *libHandle)
173 {
174     int32_t ret;
175     int32_t replyData = 0;
176     AudioEffectTransInfo cmdInfo = {sizeof(AudioEffectConfig), &ioBufferConfig};
177     AudioEffectTransInfo replyInfo = {sizeof(int32_t), &replyData};
178     ret = (*handle)->command(handle, EFFECT_CMD_INIT, &cmdInfo, &replyInfo);
179     if (ret != 0) {
180         AUDIO_ERR_LOG("[%{public}s] with mode [%{public}s], either one of libs EFFECT_CMD_INIT fail",
181             sceneType.c_str(), effectMode.c_str());
182         return;
183     }
184     ret = (*handle)->command(handle, EFFECT_CMD_ENABLE, &cmdInfo, &replyInfo);
185     if (ret != 0) {
186         AUDIO_ERR_LOG("[%{public}s] with mode [%{public}s], either one of libs EFFECT_CMD_ENABLE fail",
187             sceneType.c_str(), effectMode.c_str());
188         return;
189     }
190     ret = (*handle)->command(handle, EFFECT_CMD_SET_CONFIG, &cmdInfo, &replyInfo);
191     if (ret != 0) {
192         AUDIO_ERR_LOG("[%{public}s] with mode [%{public}s], either one of libs EFFECT_CMD_SET_CONFIG fail",
193             sceneType.c_str(), effectMode.c_str());
194         return;
195     }
196     // Set param
197     AudioEffectParam *effectParam = new AudioEffectParam[sizeof(AudioEffectParam) +
198         NUM_SET_EFFECT_PARAM * sizeof(int32_t)];
199     effectParam->status = 0;
200     effectParam->paramSize = sizeof(int32_t);
201     effectParam->valueSize = 0;
202     int32_t *data = &(effectParam->data[0]);
203     *data++ = EFFECT_SET_PARAM;
204     *data++ = GetKeyFromValue(AUDIO_SUPPORTED_SCENE_TYPES, sceneType);
205     *data++ = GetKeyFromValue(AUDIO_SUPPORTED_SCENE_MODES, effectMode);
206     cmdInfo = {sizeof(AudioEffectParam) + sizeof(int32_t) * NUM_SET_EFFECT_PARAM, effectParam};
207     ret = (*handle)->command(handle, EFFECT_CMD_SET_PARAM, &cmdInfo, &replyInfo);
208     delete[] effectParam;
209     if (ret != 0) {
210         AUDIO_ERR_LOG("[%{public}s] with mode [%{public}s], either one of libs EFFECT_CMD_SET_PARAM fail",
211             sceneType.c_str(), effectMode.c_str());
212         return;
213     }
214     standByEffectHandles.emplace_back(handle);
215     libHandles.emplace_back(libHandle);
216 }
217 
AddEffectHandleEnd()218 void AudioEffectChain::AddEffectHandleEnd()
219 {
220     reloadMutex.unlock();
221 }
222 
SetEffectChain(std::vector<AudioEffectHandle> & effHandles,std::vector<AudioEffectLibrary * > & libHandles)223 void AudioEffectChain::SetEffectChain(std::vector<AudioEffectHandle> &effHandles,
224     std::vector<AudioEffectLibrary *> &libHandles)
225 {
226     std::lock_guard<std::mutex> lock(reloadMutex);
227     AddEffectHandleBegin();
228     for (uint32_t i = 0; i < effHandles.size(); i++) {
229         AddEffectHandle(effHandles[i], libHandles[i]);
230     }
231 }
232 
233 
CopyBuffer(const float * bufIn,float * bufOut,uint32_t totalLen)234 void CopyBuffer(const float *bufIn, float *bufOut, uint32_t totalLen)
235 {
236     for (uint32_t i = 0; i < totalLen; ++i) {
237         bufOut[i] = bufIn[i];
238     }
239 }
240 
ApplyEffectChain(float * bufIn,float * bufOut,uint32_t frameLen)241 void AudioEffectChain::ApplyEffectChain(float *bufIn, float *bufOut, uint32_t frameLen)
242 {
243     if (IsEmptyEffectHandles()) {
244         CopyBuffer(bufIn, bufOut, frameLen * ioBufferConfig.outputCfg.channels);
245         return;
246     }
247 
248     audioBufIn.frameLength = frameLen;
249     audioBufOut.frameLength = frameLen;
250     int32_t count = 0;
251     {
252         std::lock_guard<std::mutex> lock(reloadMutex);
253         for (AudioEffectHandle handle: standByEffectHandles) {
254             if (count % FACTOR_TWO == 0) {
255                 audioBufIn.raw = bufIn;
256                 audioBufOut.raw = bufOut;
257             } else {
258                 audioBufOut.raw = bufIn;
259                 audioBufIn.raw = bufOut;
260             }
261             int32_t ret = (*handle)->process(handle, &audioBufIn, &audioBufOut);
262             if (ret != 0) {
263                 AUDIO_ERR_LOG("[%{public}s] with mode [%{public}s], either one of libs process fail",
264                     sceneType.c_str(), effectMode.c_str());
265                 continue;
266             }
267             count++;
268         }
269     }
270 
271     if (count % FACTOR_TWO == 0) {
272         CopyBuffer(bufIn, bufOut, frameLen * ioBufferConfig.outputCfg.channels);
273     }
274 }
275 
SetIOBufferConfig(bool isInput,uint32_t samplingRate,uint32_t channels)276 void AudioEffectChain::SetIOBufferConfig(bool isInput, uint32_t samplingRate, uint32_t channels)
277 {
278     if (isInput) {
279         ioBufferConfig.inputCfg.samplingRate = samplingRate;
280         ioBufferConfig.inputCfg.channels = channels;
281     } else {
282         ioBufferConfig.outputCfg.samplingRate = samplingRate;
283         ioBufferConfig.outputCfg.channels = channels;
284     }
285 }
286 
IsEmptyEffectHandles()287 bool AudioEffectChain::IsEmptyEffectHandles()
288 {
289     std::lock_guard<std::mutex> lock(reloadMutex);
290     return isEffectIgnored || standByEffectHandles.size() == 0;
291 }
292 
IgnoreEffect(bool ignored)293 void AudioEffectChain::IgnoreEffect(bool ignored)
294 {
295     std::lock_guard<std::mutex> lock(reloadMutex);
296     isEffectIgnored = ignored;
297 }
298 
FindEffectLib(const std::string & effect,const std::vector<std::unique_ptr<AudioEffectLibEntry>> & effectLibraryList,AudioEffectLibEntry ** libEntry,std::string & libName)299 int32_t FindEffectLib(const std::string &effect,
300     const std::vector<std::unique_ptr<AudioEffectLibEntry>> &effectLibraryList,
301     AudioEffectLibEntry **libEntry, std::string &libName)
302 {
303     for (const std::unique_ptr<AudioEffectLibEntry> &lib : effectLibraryList) {
304         if (lib->libraryName == effect) {
305             libName = lib->libraryName;
306             *libEntry = lib.get();
307             return SUCCESS;
308         }
309     }
310     return ERROR;
311 }
312 
CheckValidEffectLibEntry(AudioEffectLibEntry * libEntry,const std::string & effect,const std::string & libName)313 int32_t CheckValidEffectLibEntry(AudioEffectLibEntry *libEntry, const std::string &effect, const std::string &libName)
314 {
315     if (!libEntry) {
316         AUDIO_ERR_LOG("Effect [%{public}s] in lib [%{public}s] is nullptr", effect.c_str(), libName.c_str());
317         return ERROR;
318     }
319     if (!libEntry->audioEffectLibHandle) {
320         AUDIO_ERR_LOG("AudioEffectLibHandle of Effect [%{public}s] in lib [%{public}s] is nullptr",
321                       effect.c_str(), libName.c_str());
322         return ERROR;
323     }
324     if (!libEntry->audioEffectLibHandle->createEffect) {
325         AUDIO_ERR_LOG("CreateEffect function of Effect [%{public}s] in lib [%{public}s] is nullptr",
326                       effect.c_str(), libName.c_str());
327         return ERROR;
328     }
329     if (!libEntry->audioEffectLibHandle->releaseEffect) {
330         AUDIO_ERR_LOG("ReleaseEffect function of Effect [%{public}s] in lib [%{public}s] is nullptr",
331                       effect.c_str(), libName.c_str());
332         return ERROR;
333     }
334     return SUCCESS;
335 }
336 
AudioEffectChainManager()337 AudioEffectChainManager::AudioEffectChainManager()
338 {
339     EffectToLibraryEntryMap_.clear();
340     EffectToLibraryNameMap_.clear();
341     EffectChainToEffectsMap_.clear();
342     SceneTypeAndModeToEffectChainNameMap_.clear();
343     SceneTypeToEffectChainMap_.clear();
344     frameLen_ = DEFAULT_FRAMELEN;
345     deviceType_ = DEVICE_TYPE_SPEAKER;
346     deviceSink_ = DEFAULT_DEVICE_SINK;
347     isInitialized_ = false;
348 }
349 
~AudioEffectChainManager()350 AudioEffectChainManager::~AudioEffectChainManager()
351 {
352     for (auto effChain = SceneTypeToEffectChainMap_.begin(); effChain != SceneTypeToEffectChainMap_.end(); ++effChain) {
353         effChain->second->ReleaseEffectChain();
354     }
355 }
356 
GetInstance()357 AudioEffectChainManager *AudioEffectChainManager::GetInstance()
358 {
359     static AudioEffectChainManager audioEffectChainManager;
360     return &audioEffectChainManager;
361 }
362 
SetOutputDeviceSink(int32_t device,std::string & sinkName)363 int32_t AudioEffectChainManager::SetOutputDeviceSink(int32_t device, std::string &sinkName)
364 {
365     if (!isInitialized_) {
366         deviceType_ = (DeviceType)device;
367         deviceSink_ = sinkName;
368         AUDIO_INFO_LOG("AudioEffectChainManager has not beed initialized yet");
369         return SUCCESS;
370     }
371 
372     if (deviceType_ == (DeviceType)device) {
373         return SUCCESS;
374     }
375 
376     AUDIO_INFO_LOG("Set deviceType to [%{public}d] and corresponding sink is [%{public}s]", device, sinkName.c_str());
377     deviceType_ = (DeviceType)device;
378     deviceSink_ = sinkName;
379 
380 #ifdef DEVICE_FLAG
381     for (auto scene = AUDIO_SUPPORTED_SCENE_TYPES.begin(); scene != AUDIO_SUPPORTED_SCENE_TYPES.end();
382         ++scene) {
383         std::string sceneType = scene->second;
384         if (!SceneTypeToEffectChainMap_.count(sceneType)) {
385             AUDIO_ERR_LOG("Set effect chain for [%{public}s] but it does not exist", sceneType.c_str());
386             continue;
387         }
388         AUDIO_INFO_LOG("Set effect chain for scene name %{public}s", sceneType.c_str());
389         auto *audioEffectChain = SceneTypeToEffectChainMap_[sceneType];
390         if (SetAudioEffectChain(sceneType, audioEffectChain->GetEffectMode()) != SUCCESS) {
391             AUDIO_ERR_LOG("Fail to set effect chain for [%{public}s]", sceneType.c_str());
392             continue;
393         }
394     }
395 #endif
396     return SUCCESS;
397 }
398 
GetDeviceTypeName()399 std::string AudioEffectChainManager::GetDeviceTypeName()
400 {
401     std::string name = "";
402     auto device = SUPPORTED_DEVICE_TYPE.find(deviceType_);
403     if (device != SUPPORTED_DEVICE_TYPE.end()) {
404         name = device->second;
405     }
406     return name;
407 }
408 
SetFrameLen(int32_t frameLength)409 int32_t AudioEffectChainManager::SetFrameLen(int32_t frameLength)
410 {
411     frameLen_ = frameLength;
412     return SUCCESS;
413 }
414 
GetFrameLen()415 int32_t AudioEffectChainManager::GetFrameLen()
416 {
417     return frameLen_;
418 }
419 
420 // Boot initialize
InitAudioEffectChainManager(std::vector<EffectChain> & effectChains,std::unordered_map<std::string,std::string> & map,std::vector<std::unique_ptr<AudioEffectLibEntry>> & effectLibraryList)421 void AudioEffectChainManager::InitAudioEffectChainManager(std::vector<EffectChain> &effectChains,
422     std::unordered_map<std::string, std::string> &map,
423     std::vector<std::unique_ptr<AudioEffectLibEntry>> &effectLibraryList)
424 {
425     std::set<std::string> effectSet;
426     for (EffectChain efc: effectChains) {
427         for (std::string effect: efc.apply) {
428             effectSet.insert(effect);
429         }
430     }
431 
432     // Construct EffectToLibraryEntryMap that stores libEntry for each effect name
433     AudioEffectLibEntry *libEntry = nullptr;
434     std::string libName;
435     for (std::string effect: effectSet) {
436         int32_t ret = FindEffectLib(effect, effectLibraryList, &libEntry, libName);
437         if (ret == ERROR) {
438             AUDIO_ERR_LOG("Couldn't find libEntry of effect %{public}s", effect.c_str());
439             continue;
440         }
441         ret = CheckValidEffectLibEntry(libEntry, effect, libName);
442         if (ret == ERROR) {
443             AUDIO_ERR_LOG("Invalid libEntry of effect %{public}s", effect.c_str());
444             continue;
445         }
446         EffectToLibraryEntryMap_[effect] = libEntry;
447         EffectToLibraryNameMap_[effect] = libName;
448     }
449 
450     // Construct EffectChainToEffectsMap that stores all effect names of each effect chain
451     for (EffectChain efc: effectChains) {
452         std::string key = efc.name;
453         std::vector <std::string> effects;
454         for (std::string effectName: efc.apply) {
455             effects.emplace_back(effectName);
456         }
457         EffectChainToEffectsMap_[key] = effects;
458     }
459 
460     // Constrcut SceneTypeAndModeToEffectChainNameMap that stores effectMode associated with the effectChainName
461     for (auto item = map.begin(); item != map.end(); ++item) {
462         SceneTypeAndModeToEffectChainNameMap_[item->first] = item->second;
463     }
464 
465     isInitialized_ = true;
466     AUDIO_INFO_LOG("EffectToLibraryEntryMap size %{public}zu", EffectToLibraryEntryMap_.size());
467     AUDIO_DEBUG_LOG("EffectChainToEffectsMap size %{public}zu", EffectChainToEffectsMap_.size());
468     AUDIO_DEBUG_LOG("SceneTypeAndModeToEffectChainNameMap size %{public}zu",
469         SceneTypeAndModeToEffectChainNameMap_.size());
470 }
471 
CreateAudioEffectChain(std::string sceneType,BufferAttr * bufferAttr)472 int32_t AudioEffectChainManager::CreateAudioEffectChain(std::string sceneType, BufferAttr *bufferAttr)
473 {
474     CHECK_AND_RETURN_RET_LOG(isInitialized_, ERROR, "AudioEffectChainManager has not been initialized");
475     CHECK_AND_RETURN_RET_LOG(sceneType != "", ERROR, "null sceneType");
476 
477     AudioEffectChain *audioEffectChain;
478     if (SceneTypeToEffectChainMap_.count(sceneType)) {
479         return SUCCESS;
480     } else {
481         audioEffectChain = new AudioEffectChain(sceneType);
482         SceneTypeToEffectChainMap_[sceneType] = audioEffectChain;
483     }
484 
485     std::string effectMode = AUDIO_SUPPORTED_SCENE_MODES.find(EFFECT_DEFAULT)->second;
486     if (SetAudioEffectChain(sceneType, effectMode) != SUCCESS) {
487         return ERROR;
488     }
489     return SUCCESS;
490 }
491 
SetAudioEffectChain(std::string sceneType,std::string effectMode)492 int32_t AudioEffectChainManager::SetAudioEffectChain(std::string sceneType, std::string effectMode)
493 {
494     if (!SceneTypeToEffectChainMap_.count(sceneType)) {
495         AUDIO_ERR_LOG("SceneType [%{public}s] does not exist, failed to set", sceneType.c_str());
496         return ERROR;
497     }
498     AudioEffectChain *audioEffectChain = SceneTypeToEffectChainMap_[sceneType];
499 
500     std::string effectChain;
501     std::string effectChainKey = sceneType + "_&_" + effectMode + "_&_" + GetDeviceTypeName();
502     std::string effectNone = AUDIO_SUPPORTED_SCENE_MODES.find(EFFECT_NONE)->second;
503     if (!SceneTypeAndModeToEffectChainNameMap_.count(effectChainKey)) {
504         AUDIO_ERR_LOG("EffectChain key [%{public}s] does not exist, auto set to %{public}s",
505             effectChainKey.c_str(), effectNone.c_str());
506         effectChain = effectNone;
507     } else {
508         effectChain = SceneTypeAndModeToEffectChainNameMap_[effectChainKey];
509     }
510 
511     if (effectChain != effectNone && !EffectChainToEffectsMap_.count(effectChain)) {
512         AUDIO_ERR_LOG("EffectChain name [%{public}s] does not exist, auto set to %{public}s",
513             effectChain.c_str(), effectNone.c_str());
514         effectChain = effectNone;
515     }
516 
517     audioEffectChain->SetEffectMode(effectMode);
518     audioEffectChain->AddEffectHandleBegin();
519     for (std::string effect: EffectChainToEffectsMap_[effectChain]) {
520         AudioEffectHandle handle = nullptr;
521         AudioEffectDescriptor descriptor;
522         descriptor.libraryName = EffectToLibraryNameMap_[effect];
523         descriptor.effectName = effect;
524         int32_t ret = EffectToLibraryEntryMap_[effect]->audioEffectLibHandle->createEffect(descriptor, &handle);
525         if (ret != 0) {
526             AUDIO_ERR_LOG("EffectToLibraryEntryMap[%{public}s] createEffect fail", effect.c_str());
527             continue;
528         }
529         audioEffectChain->AddEffectHandle(handle, EffectToLibraryEntryMap_[effect]->audioEffectLibHandle);
530     }
531     audioEffectChain->AddEffectHandleEnd();
532 
533     if (audioEffectChain->IsEmptyEffectHandles()) {
534         AUDIO_ERR_LOG("Effectchain is empty, copy bufIn to bufOut like EFFECT_NONE mode");
535     }
536 
537     return SUCCESS;
538 }
539 
ExistAudioEffectChain(std::string sceneType,std::string effectMode)540 bool AudioEffectChainManager::ExistAudioEffectChain(std::string sceneType, std::string effectMode)
541 {
542     CHECK_AND_RETURN_RET_LOG(isInitialized_, false, "AudioEffectChainManager has not been initialized");
543     CHECK_AND_RETURN_RET_LOG(sceneType != "", false, "null sceneType");
544     CHECK_AND_RETURN_RET_LOG(GetDeviceTypeName() != "", false, "null deviceType");
545 
546 #ifndef DEVICE_FLAG
547     if (deviceType_ != DEVICE_TYPE_SPEAKER) {
548         return false;
549     }
550 #endif
551 
552     std::string effectChainKey = sceneType + "_&_" + effectMode + "_&_" + GetDeviceTypeName();
553     if (!SceneTypeAndModeToEffectChainNameMap_.count(effectChainKey)) {
554         return false;
555     }
556     // if the effectChain exist, see if it is empty
557     auto *audioEffectChain = SceneTypeToEffectChainMap_[sceneType];
558     CHECK_AND_RETURN_RET_LOG(audioEffectChain != nullptr, false, "null SceneTypeToEffectChainMap_[%{public}s]",
559         sceneType.c_str());
560     return !audioEffectChain->IsEmptyEffectHandles();
561 }
562 
ApplyAudioEffectChain(std::string sceneType,BufferAttr * bufferAttr)563 int32_t AudioEffectChainManager::ApplyAudioEffectChain(std::string sceneType, BufferAttr *bufferAttr)
564 {
565 #ifdef DEVICE_FLAG
566     if (!SceneTypeToEffectChainMap_.count(sceneType)) {
567         CopyBuffer(bufferAttr->bufIn, bufferAttr->bufOut, bufferAttr->frameLen * bufferAttr->numChanIn);
568         return ERROR;
569     }
570 #else
571     if (deviceType_ != DEVICE_TYPE_SPEAKER || !SceneTypeToEffectChainMap_.count(sceneType)) {
572         CopyBuffer(bufferAttr->bufIn, bufferAttr->bufOut, bufferAttr->frameLen * bufferAttr->numChanIn);
573         return SUCCESS;
574     }
575 #endif
576 
577     auto *audioEffectChain = SceneTypeToEffectChainMap_[sceneType];
578     audioEffectChain->ApplyEffectChain(bufferAttr->bufIn, bufferAttr->bufOut, bufferAttr->frameLen);
579 
580     return SUCCESS;
581 }
582 
Dump()583 void AudioEffectChainManager::Dump()
584 {
585     AUDIO_INFO_LOG("Dump START");
586     for (auto item = SceneTypeToEffectChainMap_.begin(); item != SceneTypeToEffectChainMap_.end(); ++item) {
587         AudioEffectChain *audioEffectChain = item->second;
588         audioEffectChain->Dump();
589     }
590 }
591 
IgnoreEffectChain(bool ignored)592 void AudioEffectChainManager::IgnoreEffectChain(bool ignored)
593 {
594     for (auto item = SceneTypeToEffectChainMap_.begin(); item != SceneTypeToEffectChainMap_.end(); ++item) {
595         AudioEffectChain *audioEffectChain = item->second;
596         audioEffectChain->IgnoreEffect(ignored);
597     }
598 }
599 
600 }
601 }
602