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