5 #include "cAudioEffects.h"
10 #if CAUDIO_EFX_ENABLED == 1
13 #define EFFECT_SLOTS_TO_TEST 256
17 cAudioEffects::cAudioEffects() : MaxEffectsSupported(0)
19 for(
int i=0; i<EET_COUNT; ++i)
20 SupportedEffects[i] =
false;
22 for(
int i=0; i<EFT_COUNT; ++i)
23 SupportedFilters[i] =
false;
26 cAudioEffects::~cAudioEffects()
31 IEffect* cAudioEffects::createEffect()
33 cAudioMutexBasicLock lock(Mutex);
34 IEffect* effect = CAUDIO_NEW cEffect(&EFXInterface);
36 if(effect && effect->isValid())
42 IFilter* cAudioEffects::createFilter()
44 cAudioMutexBasicLock lock(Mutex);
45 IFilter* filter = CAUDIO_NEW cFilter(&EFXInterface);
47 if(filter && filter->isValid())
53 unsigned int cAudioEffects::getMaxEffectsSupported()
const
55 return MaxEffectsSupported;
58 bool cAudioEffects::isEffectSupported(
const EffectTypes& type)
const
60 return SupportedEffects[type];
63 bool cAudioEffects::isFilterSupported(
const FilterTypes& type)
const
65 return SupportedFilters[type];
68 bool cAudioEffects::addEAXReverbEffectPreset(
const char* name,
const sEAXReverbParameters& setting)
70 cAudioMutexBasicLock lock(Mutex);
71 cAudioString safeName = fromUTF8(name);
72 EAXReverbPresets[safeName] = setting;
76 bool cAudioEffects::addReverbEffectPreset(
const char* name,
const sReverbParameters& setting)
78 cAudioMutexBasicLock lock(Mutex);
79 cAudioString safeName = fromUTF8(name);
80 ReverbPresets[safeName] = setting;
84 bool cAudioEffects::addChorusEffectPreset(
const char* name,
const sChorusParameters& setting)
86 cAudioMutexBasicLock lock(Mutex);
87 cAudioString safeName = fromUTF8(name);
88 ChorusPresets[safeName] = setting;
92 bool cAudioEffects::addDistortionEffectPreset(
const char* name,
const sDistortionParameters& setting)
94 cAudioMutexBasicLock lock(Mutex);
95 cAudioString safeName = fromUTF8(name);
96 DistortionPresets[safeName] = setting;
100 bool cAudioEffects::addEchoEffectPreset(
const char* name,
const sEchoParameters& setting)
102 cAudioMutexBasicLock lock(Mutex);
103 cAudioString safeName = fromUTF8(name);
104 EchoPresets[safeName] = setting;
108 bool cAudioEffects::addFlangerEffectPreset(
const char* name,
const sFlangerParameters& setting)
110 cAudioMutexBasicLock lock(Mutex);
111 cAudioString safeName = fromUTF8(name);
112 FlangerPresets[safeName] = setting;
116 bool cAudioEffects::addFrequencyShiftEffectPreset(
const char* name,
const sFrequencyShiftParameters& setting)
118 cAudioMutexBasicLock lock(Mutex);
119 cAudioString safeName = fromUTF8(name);
120 FrequencyShiftPresets[safeName] = setting;
124 bool cAudioEffects::addVocalMorpherEffectPreset(
const char* name,
const sVocalMorpherParameters& setting)
126 cAudioMutexBasicLock lock(Mutex);
127 cAudioString safeName = fromUTF8(name);
128 VocalMorpherPresets[safeName] = setting;
132 bool cAudioEffects::addPitchShifterEffectPreset(
const char* name,
const sPitchShifterParameters& setting)
134 cAudioMutexBasicLock lock(Mutex);
135 cAudioString safeName = fromUTF8(name);
136 PitchShifterPresets[safeName] = setting;
140 bool cAudioEffects::addRingModulatorEffectPreset(
const char* name,
const sRingModulatorParameters& setting)
142 cAudioMutexBasicLock lock(Mutex);
143 cAudioString safeName = fromUTF8(name);
144 RingModulatorPresets[safeName] = setting;
148 bool cAudioEffects::addAutowahEffectPreset(
const char* name,
const sAutowahParameters& setting)
150 cAudioMutexBasicLock lock(Mutex);
151 cAudioString safeName = fromUTF8(name);
152 AutowahPresets[safeName] = setting;
156 bool cAudioEffects::addCompressorEffectPreset(
const char* name,
const sCompressorParameters& setting)
158 cAudioMutexBasicLock lock(Mutex);
159 cAudioString safeName = fromUTF8(name);
160 CompressorPresets[safeName] = setting;
164 bool cAudioEffects::addEqualizerEffectPreset(
const char* name,
const sEqualizerParameters& setting)
166 cAudioMutexBasicLock lock(Mutex);
167 cAudioString safeName = fromUTF8(name);
168 EqualizerPresets[safeName] = setting;
172 sEAXReverbParameters cAudioEffects::getEAXReverbEffectPreset(
const char* name)
174 cAudioMutexBasicLock lock(Mutex);
175 cAudioString safeName = fromUTF8(name);
176 cAudioMap<cAudioString, sEAXReverbParameters>::Type::iterator it = EAXReverbPresets.find(safeName);
177 if(it != EAXReverbPresets.end())
181 return sEAXReverbParameters();
184 sReverbParameters cAudioEffects::getReverbEffectPreset(
const char* name)
186 cAudioMutexBasicLock lock(Mutex);
187 cAudioString safeName = fromUTF8(name);
188 cAudioMap<cAudioString, sReverbParameters>::Type::iterator it = ReverbPresets.find(safeName);
189 if(it != ReverbPresets.end())
193 return sReverbParameters();
196 sChorusParameters cAudioEffects::getChorusEffectPreset(
const char* name)
198 cAudioMutexBasicLock lock(Mutex);
199 cAudioString safeName = fromUTF8(name);
200 cAudioMap<cAudioString, sChorusParameters>::Type::iterator it = ChorusPresets.find(safeName);
201 if(it != ChorusPresets.end())
205 return sChorusParameters();
208 sDistortionParameters cAudioEffects::getDistortionEffectPreset(
const char* name)
210 cAudioMutexBasicLock lock(Mutex);
211 cAudioString safeName = fromUTF8(name);
212 cAudioMap<cAudioString, sDistortionParameters>::Type::iterator it = DistortionPresets.find(safeName);
213 if(it != DistortionPresets.end())
217 return sDistortionParameters();
220 sEchoParameters cAudioEffects::getEchoEffectPreset(
const char* name)
222 cAudioMutexBasicLock lock(Mutex);
223 cAudioString safeName = fromUTF8(name);
224 cAudioMap<cAudioString, sEchoParameters>::Type::iterator it = EchoPresets.find(safeName);
225 if(it != EchoPresets.end())
229 return sEchoParameters();
232 sFlangerParameters cAudioEffects::getFlangerEffectPreset(
const char* name)
234 cAudioMutexBasicLock lock(Mutex);
235 cAudioString safeName = fromUTF8(name);
236 cAudioMap<cAudioString, sFlangerParameters>::Type::iterator it = FlangerPresets.find(safeName);
237 if(it != FlangerPresets.end())
241 return sFlangerParameters();
244 sFrequencyShiftParameters cAudioEffects::getFrequencyShiftEffectPreset(
const char* name)
246 cAudioMutexBasicLock lock(Mutex);
247 cAudioString safeName = fromUTF8(name);
248 cAudioMap<cAudioString, sFrequencyShiftParameters>::Type::iterator it = FrequencyShiftPresets.find(safeName);
249 if(it != FrequencyShiftPresets.end())
253 return sFrequencyShiftParameters();
256 sVocalMorpherParameters cAudioEffects::getVocalMorpherEffectPreset(
const char* name)
258 cAudioMutexBasicLock lock(Mutex);
259 cAudioString safeName = fromUTF8(name);
260 cAudioMap<cAudioString, sVocalMorpherParameters>::Type::iterator it = VocalMorpherPresets.find(safeName);
261 if(it != VocalMorpherPresets.end())
265 return sVocalMorpherParameters();
268 sPitchShifterParameters cAudioEffects::getPitchShifterEffectPreset(
const char* name)
270 cAudioMutexBasicLock lock(Mutex);
271 cAudioString safeName = fromUTF8(name);
272 cAudioMap<cAudioString, sPitchShifterParameters>::Type::iterator it = PitchShifterPresets.find(safeName);
273 if(it != PitchShifterPresets.end())
277 return sPitchShifterParameters();
280 sRingModulatorParameters cAudioEffects::getRingModulatorEffectPreset(
const char* name)
282 cAudioMutexBasicLock lock(Mutex);
283 cAudioString safeName = fromUTF8(name);
284 cAudioMap<cAudioString, sRingModulatorParameters>::Type::iterator it = RingModulatorPresets.find(safeName);
285 if(it != RingModulatorPresets.end())
289 return sRingModulatorParameters();
292 sAutowahParameters cAudioEffects::getAutowahEffectPreset(
const char* name)
294 cAudioMutexBasicLock lock(Mutex);
295 cAudioString safeName = fromUTF8(name);
296 cAudioMap<cAudioString, sAutowahParameters>::Type::iterator it = AutowahPresets.find(safeName);
297 if(it != AutowahPresets.end())
301 return sAutowahParameters();
304 sCompressorParameters cAudioEffects::getCompressorEffectPreset(
const char* name)
306 cAudioMutexBasicLock lock(Mutex);
307 cAudioString safeName = fromUTF8(name);
308 cAudioMap<cAudioString, sCompressorParameters>::Type::iterator it = CompressorPresets.find(safeName);
309 if(it != CompressorPresets.end())
313 return sCompressorParameters();
316 sEqualizerParameters cAudioEffects::getEqualizerEffectPreset(
const char* name)
318 cAudioMutexBasicLock lock(Mutex);
319 cAudioString safeName = fromUTF8(name);
320 cAudioMap<cAudioString, sEqualizerParameters>::Type::iterator it = EqualizerPresets.find(safeName);
321 if(it != EqualizerPresets.end())
325 return sEqualizerParameters();
328 void cAudioEffects::removeEffectPreset(
const EffectTypes& type,
const char* name)
330 cAudioMutexBasicLock lock(Mutex);
331 cAudioString safeName = fromUTF8(name);
335 EAXReverbPresets.erase(safeName);
338 ReverbPresets.erase(safeName);
341 ChorusPresets.erase(safeName);
344 DistortionPresets.erase(safeName);
347 EchoPresets.erase(safeName);
350 FlangerPresets.erase(safeName);
352 case EET_FREQUENCY_SHIFTER:
353 FrequencyShiftPresets.erase(safeName);
355 case EET_VOCAL_MORPHER:
356 VocalMorpherPresets.erase(safeName);
358 case EET_PITCH_SHIFTER:
359 PitchShifterPresets.erase(safeName);
361 case EET_RING_MODULATOR:
362 RingModulatorPresets.erase(safeName);
365 AutowahPresets.erase(safeName);
368 CompressorPresets.erase(safeName);
371 EqualizerPresets.erase(safeName);
378 bool cAudioEffects::isEffectPresetRegistered(
const EffectTypes& type,
const char* name)
380 cAudioMutexBasicLock lock(Mutex);
381 cAudioString safeName = fromUTF8(name);
385 return (EAXReverbPresets.find(safeName) != EAXReverbPresets.end());
388 return (ReverbPresets.find(safeName) != ReverbPresets.end());
391 return (ChorusPresets.find(safeName) != ChorusPresets.end());
394 return (DistortionPresets.find(safeName) != DistortionPresets.end());
397 return (EchoPresets.find(safeName) != EchoPresets.end());
400 return (FlangerPresets.find(safeName) != FlangerPresets.end());
402 case EET_FREQUENCY_SHIFTER:
403 return (FrequencyShiftPresets.find(safeName) != FrequencyShiftPresets.end());
405 case EET_VOCAL_MORPHER:
406 return (VocalMorpherPresets.find(safeName) != VocalMorpherPresets.end());
408 case EET_PITCH_SHIFTER:
409 return (PitchShifterPresets.find(safeName) != PitchShifterPresets.end());
411 case EET_RING_MODULATOR:
412 return (RingModulatorPresets.find(safeName) != RingModulatorPresets.end());
415 return (AutowahPresets.find(safeName) != AutowahPresets.end());
418 return (CompressorPresets.find(safeName) != CompressorPresets.end());
421 return (EqualizerPresets.find(safeName) != EqualizerPresets.end());
429 void cAudioEffects::removeAllEffectPresets(
const EffectTypes& type)
434 EAXReverbPresets.clear();
437 ReverbPresets.clear();
440 ChorusPresets.clear();
443 DistortionPresets.clear();
449 FlangerPresets.clear();
451 case EET_FREQUENCY_SHIFTER:
452 FrequencyShiftPresets.clear();
454 case EET_VOCAL_MORPHER:
455 VocalMorpherPresets.clear();
457 case EET_PITCH_SHIFTER:
458 PitchShifterPresets.clear();
460 case EET_RING_MODULATOR:
461 RingModulatorPresets.clear();
464 AutowahPresets.clear();
467 CompressorPresets.clear();
470 EqualizerPresets.clear();
473 EAXReverbPresets.clear();
474 ReverbPresets.clear();
475 ChorusPresets.clear();
476 DistortionPresets.clear();
478 FlangerPresets.clear();
479 FrequencyShiftPresets.clear();
480 VocalMorpherPresets.clear();
481 PitchShifterPresets.clear();
482 RingModulatorPresets.clear();
483 AutowahPresets.clear();
484 CompressorPresets.clear();
485 EqualizerPresets.clear();
490 cEFXFunctions* cAudioEffects::getEFXInterface()
492 return &EFXInterface;
495 void cAudioEffects::checkEFXSupportDetails()
497 cAudioMutexBasicLock lock(Mutex);
498 if(EFXInterface.Supported)
500 cAudioMutexBasicLock lock(EFXInterface.Mutex);
503 unsigned int count = 0;
504 ALuint effectSlots[EFFECT_SLOTS_TO_TEST];
505 for(count=0; count<EFFECT_SLOTS_TO_TEST; ++count)
507 EFXInterface.alGenAuxiliaryEffectSlots(1, &effectSlots[count]);
508 if(alGetError() != AL_NO_ERROR)
512 MaxEffectsSupported = count;
516 EFXInterface.alGenEffects(1, &Effect);
517 if (alGetError() == AL_NO_ERROR)
519 SupportedEffects[EET_NULL] =
true;
522 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB);
523 SupportedEffects[EET_REVERB] = (alGetError() == AL_NO_ERROR);
525 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_EAXREVERB);
526 SupportedEffects[EET_EAX_REVERB] = (alGetError() == AL_NO_ERROR);
528 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_CHORUS);
529 SupportedEffects[EET_CHORUS] = (alGetError() == AL_NO_ERROR);
531 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_DISTORTION);
532 SupportedEffects[EET_DISTORTION] = (alGetError() == AL_NO_ERROR);
534 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_ECHO);
535 SupportedEffects[EET_ECHO] = (alGetError() == AL_NO_ERROR);
537 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_FLANGER);
538 SupportedEffects[EET_FLANGER] = (alGetError() == AL_NO_ERROR);
540 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_FREQUENCY_SHIFTER);
541 SupportedEffects[EET_FREQUENCY_SHIFTER] = (alGetError() == AL_NO_ERROR);
543 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_VOCAL_MORPHER);
544 SupportedEffects[EET_VOCAL_MORPHER] = (alGetError() == AL_NO_ERROR);
546 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_PITCH_SHIFTER);
547 SupportedEffects[EET_PITCH_SHIFTER] = (alGetError() == AL_NO_ERROR);
549 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_RING_MODULATOR);
550 SupportedEffects[EET_RING_MODULATOR] = (alGetError() == AL_NO_ERROR);
552 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_AUTOWAH);
553 SupportedEffects[EET_AUTOWAH] = (alGetError() == AL_NO_ERROR);
555 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_COMPRESSOR);
556 SupportedEffects[EET_COMPRESSOR] = (alGetError() == AL_NO_ERROR);
558 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_EQUALIZER);
559 SupportedEffects[EET_EQUALIZER] = (alGetError() == AL_NO_ERROR);
563 EFXInterface.alDeleteEffects(1, &Effect);
567 EFXInterface.alGenFilters(1, &Filter);
568 if (alGetError() == AL_NO_ERROR)
570 SupportedFilters[EFT_NULL] =
true;
573 EFXInterface.alFilteri(Filter, AL_FILTER_TYPE, AL_FILTER_LOWPASS);
574 SupportedFilters[EFT_LOWPASS] = (alGetError() == AL_NO_ERROR);
576 EFXInterface.alFilteri(Filter, AL_FILTER_TYPE, AL_FILTER_HIGHPASS);
577 SupportedFilters[EFT_HIGHPASS] = (alGetError() == AL_NO_ERROR);
579 EFXInterface.alFilteri(Filter, AL_FILTER_TYPE, AL_FILTER_BANDPASS);
580 SupportedFilters[EFT_BANDPASS] = (alGetError() == AL_NO_ERROR);
584 EFXInterface.alDeleteFilters(1, &Filter);
589 EFXInterface.alDeleteAuxiliaryEffectSlots(1, &effectSlots[--count]);