00001
00002
00003
00004
00005 #include "../Headers/cAudioEffects.h"
00006 #include "../Headers/cFilter.h"
00007 #include "../Headers/cEffect.h"
00008 #include "../Headers/cUtils.h"
00009
00010 #ifdef CAUDIO_EFX_ENABLED
00011
00012
00013 #define EFFECT_SLOTS_TO_TEST 256
00014
00015 namespace cAudio
00016 {
00017
00018 cAudioEffects::cAudioEffects() : MaxEffectsSupported(0)
00019 {
00020 for(int i=0; i<EET_COUNT; ++i)
00021 SupportedEffects[i] = false;
00022
00023 for(int i=0; i<EFT_COUNT; ++i)
00024 SupportedFilters[i] = false;
00025 }
00026
00027 cAudioEffects::~cAudioEffects()
00028 {
00029
00030 }
00031
00032 IEffect* cAudioEffects::createEffect()
00033 {
00034 cAudioMutexBasicLock lock(Mutex);
00035 IEffect* effect = new cEffect(&EFXInterface);
00036
00037 if(effect && effect->isValid())
00038 return effect;
00039
00040 return NULL;
00041 }
00042
00043 IFilter* cAudioEffects::createFilter()
00044 {
00045 cAudioMutexBasicLock lock(Mutex);
00046 IFilter* filter = new cFilter(&EFXInterface);
00047
00048 if(filter && filter->isValid())
00049 return filter;
00050
00051 return NULL;
00052 }
00053
00054 unsigned int cAudioEffects::getMaxEffectsSupported() const
00055 {
00056 return MaxEffectsSupported;
00057 }
00058
00059 bool cAudioEffects::isEffectSupported(const EffectTypes& type) const
00060 {
00061 return SupportedEffects[type];
00062 }
00063
00064 bool cAudioEffects::isFilterSupported(const FilterTypes& type) const
00065 {
00066 return SupportedFilters[type];
00067 }
00068
00069 bool cAudioEffects::addEAXReverbEffectPreset(const char* name, const sEAXReverbParameters& setting)
00070 {
00071 cAudioMutexBasicLock lock(Mutex);
00072 std::string safeName = safeCStr(name);
00073 EAXReverbPresets[safeName] = setting;
00074 return true;
00075 }
00076
00077 bool cAudioEffects::addReverbEffectPreset(const char* name, const sReverbParameters& setting)
00078 {
00079 cAudioMutexBasicLock lock(Mutex);
00080 std::string safeName = safeCStr(name);
00081 ReverbPresets[safeName] = setting;
00082 return true;
00083 }
00084
00085 bool cAudioEffects::addChorusEffectPreset(const char* name, const sChorusParameters& setting)
00086 {
00087 cAudioMutexBasicLock lock(Mutex);
00088 std::string safeName = safeCStr(name);
00089 ChorusPresets[safeName] = setting;
00090 return true;
00091 }
00092
00093 bool cAudioEffects::addDistortionEffectPreset(const char* name, const sDistortionParameters& setting)
00094 {
00095 cAudioMutexBasicLock lock(Mutex);
00096 std::string safeName = safeCStr(name);
00097 DistortionPresets[safeName] = setting;
00098 return true;
00099 }
00100
00101 bool cAudioEffects::addEchoEffectPreset(const char* name, const sEchoParameters& setting)
00102 {
00103 cAudioMutexBasicLock lock(Mutex);
00104 std::string safeName = safeCStr(name);
00105 EchoPresets[safeName] = setting;
00106 return true;
00107 }
00108
00109 bool cAudioEffects::addFlangerEffectPreset(const char* name, const sFlangerParameters& setting)
00110 {
00111 cAudioMutexBasicLock lock(Mutex);
00112 std::string safeName = safeCStr(name);
00113 FlangerPresets[safeName] = setting;
00114 return true;
00115 }
00116
00117 bool cAudioEffects::addFrequencyShiftEffectPreset(const char* name, const sFrequencyShiftParameters& setting)
00118 {
00119 cAudioMutexBasicLock lock(Mutex);
00120 std::string safeName = safeCStr(name);
00121 FrequencyShiftPresets[safeName] = setting;
00122 return true;
00123 }
00124
00125 bool cAudioEffects::addVocalMorpherEffectPreset(const char* name, const sVocalMorpherParameters& setting)
00126 {
00127 cAudioMutexBasicLock lock(Mutex);
00128 std::string safeName = safeCStr(name);
00129 VocalMorpherPresets[safeName] = setting;
00130 return true;
00131 }
00132
00133 bool cAudioEffects::addPitchShifterEffectPreset(const char* name, const sPitchShifterParameters& setting)
00134 {
00135 cAudioMutexBasicLock lock(Mutex);
00136 std::string safeName = safeCStr(name);
00137 PitchShifterPresets[safeName] = setting;
00138 return true;
00139 }
00140
00141 bool cAudioEffects::addRingModulatorEffectPreset(const char* name, const sRingModulatorParameters& setting)
00142 {
00143 cAudioMutexBasicLock lock(Mutex);
00144 std::string safeName = safeCStr(name);
00145 RingModulatorPresets[safeName] = setting;
00146 return true;
00147 }
00148
00149 bool cAudioEffects::addAutowahEffectPreset(const char* name, const sAutowahParameters& setting)
00150 {
00151 cAudioMutexBasicLock lock(Mutex);
00152 std::string safeName = safeCStr(name);
00153 AutowahPresets[safeName] = setting;
00154 return true;
00155 }
00156
00157 bool cAudioEffects::addCompressorEffectPreset(const char* name, const sCompressorParameters& setting)
00158 {
00159 cAudioMutexBasicLock lock(Mutex);
00160 std::string safeName = safeCStr(name);
00161 CompressorPresets[safeName] = setting;
00162 return true;
00163 }
00164
00165 bool cAudioEffects::addEqualizerEffectPreset(const char* name, const sEqualizerParameters& setting)
00166 {
00167 cAudioMutexBasicLock lock(Mutex);
00168 std::string safeName = safeCStr(name);
00169 EqualizerPresets[safeName] = setting;
00170 return true;
00171 }
00172
00173 sEAXReverbParameters cAudioEffects::getEAXReverbEffectPreset(const char* name)
00174 {
00175 cAudioMutexBasicLock lock(Mutex);
00176 std::string safeName = safeCStr(name);
00177 std::map<std::string, sEAXReverbParameters>::iterator it = EAXReverbPresets.find(safeName);
00178 if(it != EAXReverbPresets.end())
00179 {
00180 return it->second;
00181 }
00182 return sEAXReverbParameters();
00183 }
00184
00185 sReverbParameters cAudioEffects::getReverbEffectPreset(const char* name)
00186 {
00187 cAudioMutexBasicLock lock(Mutex);
00188 std::string safeName = safeCStr(name);
00189 std::map<std::string, sReverbParameters>::iterator it = ReverbPresets.find(safeName);
00190 if(it != ReverbPresets.end())
00191 {
00192 return it->second;
00193 }
00194 return sReverbParameters();
00195 }
00196
00197 sChorusParameters cAudioEffects::getChorusEffectPreset(const char* name)
00198 {
00199 cAudioMutexBasicLock lock(Mutex);
00200 std::string safeName = safeCStr(name);
00201 std::map<std::string, sChorusParameters>::iterator it = ChorusPresets.find(safeName);
00202 if(it != ChorusPresets.end())
00203 {
00204 return it->second;
00205 }
00206 return sChorusParameters();
00207 }
00208
00209 sDistortionParameters cAudioEffects::getDistortionEffectPreset(const char* name)
00210 {
00211 cAudioMutexBasicLock lock(Mutex);
00212 std::string safeName = safeCStr(name);
00213 std::map<std::string, sDistortionParameters>::iterator it = DistortionPresets.find(safeName);
00214 if(it != DistortionPresets.end())
00215 {
00216 return it->second;
00217 }
00218 return sDistortionParameters();
00219 }
00220
00221 sEchoParameters cAudioEffects::getEchoEffectPreset(const char* name)
00222 {
00223 cAudioMutexBasicLock lock(Mutex);
00224 std::string safeName = safeCStr(name);
00225 std::map<std::string, sEchoParameters>::iterator it = EchoPresets.find(safeName);
00226 if(it != EchoPresets.end())
00227 {
00228 return it->second;
00229 }
00230 return sEchoParameters();
00231 }
00232
00233 sFlangerParameters cAudioEffects::getFlangerEffectPreset(const char* name)
00234 {
00235 cAudioMutexBasicLock lock(Mutex);
00236 std::string safeName = safeCStr(name);
00237 std::map<std::string, sFlangerParameters>::iterator it = FlangerPresets.find(safeName);
00238 if(it != FlangerPresets.end())
00239 {
00240 return it->second;
00241 }
00242 return sFlangerParameters();
00243 }
00244
00245 sFrequencyShiftParameters cAudioEffects::getFrequencyShiftEffectPreset(const char* name)
00246 {
00247 cAudioMutexBasicLock lock(Mutex);
00248 std::string safeName = safeCStr(name);
00249 std::map<std::string, sFrequencyShiftParameters>::iterator it = FrequencyShiftPresets.find(safeName);
00250 if(it != FrequencyShiftPresets.end())
00251 {
00252 return it->second;
00253 }
00254 return sFrequencyShiftParameters();
00255 }
00256
00257 sVocalMorpherParameters cAudioEffects::getVocalMorpherEffectPreset(const char* name)
00258 {
00259 cAudioMutexBasicLock lock(Mutex);
00260 std::string safeName = safeCStr(name);
00261 std::map<std::string, sVocalMorpherParameters>::iterator it = VocalMorpherPresets.find(safeName);
00262 if(it != VocalMorpherPresets.end())
00263 {
00264 return it->second;
00265 }
00266 return sVocalMorpherParameters();
00267 }
00268
00269 sPitchShifterParameters cAudioEffects::getPitchShifterEffectPreset(const char* name)
00270 {
00271 cAudioMutexBasicLock lock(Mutex);
00272 std::string safeName = safeCStr(name);
00273 std::map<std::string, sPitchShifterParameters>::iterator it = PitchShifterPresets.find(safeName);
00274 if(it != PitchShifterPresets.end())
00275 {
00276 return it->second;
00277 }
00278 return sPitchShifterParameters();
00279 }
00280
00281 sRingModulatorParameters cAudioEffects::getRingModulatorEffectPreset(const char* name)
00282 {
00283 cAudioMutexBasicLock lock(Mutex);
00284 std::string safeName = safeCStr(name);
00285 std::map<std::string, sRingModulatorParameters>::iterator it = RingModulatorPresets.find(safeName);
00286 if(it != RingModulatorPresets.end())
00287 {
00288 return it->second;
00289 }
00290 return sRingModulatorParameters();
00291 }
00292
00293 sAutowahParameters cAudioEffects::getAutowahEffectPreset(const char* name)
00294 {
00295 cAudioMutexBasicLock lock(Mutex);
00296 std::string safeName = safeCStr(name);
00297 std::map<std::string, sAutowahParameters>::iterator it = AutowahPresets.find(safeName);
00298 if(it != AutowahPresets.end())
00299 {
00300 return it->second;
00301 }
00302 return sAutowahParameters();
00303 }
00304
00305 sCompressorParameters cAudioEffects::getCompressorEffectPreset(const char* name)
00306 {
00307 cAudioMutexBasicLock lock(Mutex);
00308 std::string safeName = safeCStr(name);
00309 std::map<std::string, sCompressorParameters>::iterator it = CompressorPresets.find(safeName);
00310 if(it != CompressorPresets.end())
00311 {
00312 return it->second;
00313 }
00314 return sCompressorParameters();
00315 }
00316
00317 sEqualizerParameters cAudioEffects::getEqualizerEffectPreset(const char* name)
00318 {
00319 cAudioMutexBasicLock lock(Mutex);
00320 std::string safeName = safeCStr(name);
00321 std::map<std::string, sEqualizerParameters>::iterator it = EqualizerPresets.find(safeName);
00322 if(it != EqualizerPresets.end())
00323 {
00324 return it->second;
00325 }
00326 return sEqualizerParameters();
00327 }
00328
00329 void cAudioEffects::removeEffectPreset(const EffectTypes& type, const char* name)
00330 {
00331 cAudioMutexBasicLock lock(Mutex);
00332 std::string safeName = safeCStr(name);
00333 switch(type)
00334 {
00335 case EET_EAX_REVERB:
00336 EAXReverbPresets.erase(safeName);
00337 break;
00338 case EET_REVERB:
00339 ReverbPresets.erase(safeName);
00340 break;
00341 case EET_CHORUS:
00342 ChorusPresets.erase(safeName);
00343 break;
00344 case EET_DISTORTION:
00345 DistortionPresets.erase(safeName);
00346 break;
00347 case EET_ECHO:
00348 EchoPresets.erase(safeName);
00349 break;
00350 case EET_FLANGER:
00351 FlangerPresets.erase(safeName);
00352 break;
00353 case EET_FREQUENCY_SHIFTER:
00354 FrequencyShiftPresets.erase(safeName);
00355 break;
00356 case EET_VOCAL_MORPHER:
00357 VocalMorpherPresets.erase(safeName);
00358 break;
00359 case EET_PITCH_SHIFTER:
00360 PitchShifterPresets.erase(safeName);
00361 break;
00362 case EET_RING_MODULATOR:
00363 RingModulatorPresets.erase(safeName);
00364 break;
00365 case EET_AUTOWAH:
00366 AutowahPresets.erase(safeName);
00367 break;
00368 case EET_COMPRESSOR:
00369 CompressorPresets.erase(safeName);
00370 break;
00371 case EET_EQUALIZER:
00372 EqualizerPresets.erase(safeName);
00373 break;
00374 default:
00375 break;
00376 }
00377 }
00378
00379 bool cAudioEffects::isEffectPresetRegistered(const EffectTypes& type, const char* name)
00380 {
00381 cAudioMutexBasicLock lock(Mutex);
00382 std::string safeName = safeCStr(name);
00383 switch(type)
00384 {
00385 case EET_EAX_REVERB:
00386 return (EAXReverbPresets.find(safeName) != EAXReverbPresets.end());
00387 break;
00388 case EET_REVERB:
00389 return (ReverbPresets.find(safeName) != ReverbPresets.end());
00390 break;
00391 case EET_CHORUS:
00392 return (ChorusPresets.find(safeName) != ChorusPresets.end());
00393 break;
00394 case EET_DISTORTION:
00395 return (DistortionPresets.find(safeName) != DistortionPresets.end());
00396 break;
00397 case EET_ECHO:
00398 return (EchoPresets.find(safeName) != EchoPresets.end());
00399 break;
00400 case EET_FLANGER:
00401 return (FlangerPresets.find(safeName) != FlangerPresets.end());
00402 break;
00403 case EET_FREQUENCY_SHIFTER:
00404 return (FrequencyShiftPresets.find(safeName) != FrequencyShiftPresets.end());
00405 break;
00406 case EET_VOCAL_MORPHER:
00407 return (VocalMorpherPresets.find(safeName) != VocalMorpherPresets.end());
00408 break;
00409 case EET_PITCH_SHIFTER:
00410 return (PitchShifterPresets.find(safeName) != PitchShifterPresets.end());
00411 break;
00412 case EET_RING_MODULATOR:
00413 return (RingModulatorPresets.find(safeName) != RingModulatorPresets.end());
00414 break;
00415 case EET_AUTOWAH:
00416 return (AutowahPresets.find(safeName) != AutowahPresets.end());
00417 break;
00418 case EET_COMPRESSOR:
00419 return (CompressorPresets.find(safeName) != CompressorPresets.end());
00420 break;
00421 case EET_EQUALIZER:
00422 return (EqualizerPresets.find(safeName) != EqualizerPresets.end());
00423 break;
00424 default:
00425 return false;
00426 break;
00427 }
00428 }
00429
00430 void cAudioEffects::removeAllEffectPresets(const EffectTypes& type)
00431 {
00432 switch(type)
00433 {
00434 case EET_EAX_REVERB:
00435 EAXReverbPresets.clear();
00436 break;
00437 case EET_REVERB:
00438 ReverbPresets.clear();
00439 break;
00440 case EET_CHORUS:
00441 ChorusPresets.clear();
00442 break;
00443 case EET_DISTORTION:
00444 DistortionPresets.clear();
00445 break;
00446 case EET_ECHO:
00447 EchoPresets.clear();
00448 break;
00449 case EET_FLANGER:
00450 FlangerPresets.clear();
00451 break;
00452 case EET_FREQUENCY_SHIFTER:
00453 FrequencyShiftPresets.clear();
00454 break;
00455 case EET_VOCAL_MORPHER:
00456 VocalMorpherPresets.clear();
00457 break;
00458 case EET_PITCH_SHIFTER:
00459 PitchShifterPresets.clear();
00460 break;
00461 case EET_RING_MODULATOR:
00462 RingModulatorPresets.clear();
00463 break;
00464 case EET_AUTOWAH:
00465 AutowahPresets.clear();
00466 break;
00467 case EET_COMPRESSOR:
00468 CompressorPresets.clear();
00469 break;
00470 case EET_EQUALIZER:
00471 EqualizerPresets.clear();
00472 break;
00473 default:
00474 EAXReverbPresets.clear();
00475 ReverbPresets.clear();
00476 ChorusPresets.clear();
00477 DistortionPresets.clear();
00478 EchoPresets.clear();
00479 FlangerPresets.clear();
00480 FrequencyShiftPresets.clear();
00481 VocalMorpherPresets.clear();
00482 PitchShifterPresets.clear();
00483 RingModulatorPresets.clear();
00484 AutowahPresets.clear();
00485 CompressorPresets.clear();
00486 EqualizerPresets.clear();
00487 break;
00488 }
00489 }
00490
00491 cEFXFunctions* cAudioEffects::getEFXInterface()
00492 {
00493 return &EFXInterface;
00494 }
00495
00496 void cAudioEffects::checkEFXSupportDetails()
00497 {
00498 cAudioMutexBasicLock lock(Mutex);
00499 if(EFXInterface.Supported)
00500 {
00501 cAudioMutexBasicLock lock(EFXInterface.Mutex);
00502
00503
00504 unsigned int count = 0;
00505 ALuint effectSlots[EFFECT_SLOTS_TO_TEST];
00506 for(count=0; count<EFFECT_SLOTS_TO_TEST; ++count)
00507 {
00508 EFXInterface.alGenAuxiliaryEffectSlots(1, &effectSlots[count]);
00509 if(alGetError() != AL_NO_ERROR)
00510 break;
00511 }
00512
00513 MaxEffectsSupported = count;
00514
00515
00516 ALuint Effect;
00517 EFXInterface.alGenEffects(1, &Effect);
00518 if (alGetError() == AL_NO_ERROR)
00519 {
00520 SupportedEffects[EET_NULL] = true;
00521
00522
00523 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB);
00524 SupportedEffects[EET_REVERB] = (alGetError() == AL_NO_ERROR);
00525
00526 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_EAXREVERB);
00527 SupportedEffects[EET_EAX_REVERB] = (alGetError() == AL_NO_ERROR);
00528
00529 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_CHORUS);
00530 SupportedEffects[EET_CHORUS] = (alGetError() == AL_NO_ERROR);
00531
00532 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_DISTORTION);
00533 SupportedEffects[EET_DISTORTION] = (alGetError() == AL_NO_ERROR);
00534
00535 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_ECHO);
00536 SupportedEffects[EET_ECHO] = (alGetError() == AL_NO_ERROR);
00537
00538 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_FLANGER);
00539 SupportedEffects[EET_FLANGER] = (alGetError() == AL_NO_ERROR);
00540
00541 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_FREQUENCY_SHIFTER);
00542 SupportedEffects[EET_FREQUENCY_SHIFTER] = (alGetError() == AL_NO_ERROR);
00543
00544 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_VOCAL_MORPHER);
00545 SupportedEffects[EET_VOCAL_MORPHER] = (alGetError() == AL_NO_ERROR);
00546
00547 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_PITCH_SHIFTER);
00548 SupportedEffects[EET_PITCH_SHIFTER] = (alGetError() == AL_NO_ERROR);
00549
00550 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_RING_MODULATOR);
00551 SupportedEffects[EET_RING_MODULATOR] = (alGetError() == AL_NO_ERROR);
00552
00553 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_AUTOWAH);
00554 SupportedEffects[EET_AUTOWAH] = (alGetError() == AL_NO_ERROR);
00555
00556 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_COMPRESSOR);
00557 SupportedEffects[EET_COMPRESSOR] = (alGetError() == AL_NO_ERROR);
00558
00559 EFXInterface.alEffecti(Effect, AL_EFFECT_TYPE, AL_EFFECT_EQUALIZER);
00560 SupportedEffects[EET_EQUALIZER] = (alGetError() == AL_NO_ERROR);
00561 }
00562
00563
00564 EFXInterface.alDeleteEffects(1, &Effect);
00565
00566
00567 ALuint Filter;
00568 EFXInterface.alGenFilters(1, &Filter);
00569 if (alGetError() == AL_NO_ERROR)
00570 {
00571 SupportedFilters[EFT_NULL] = true;
00572
00573
00574 EFXInterface.alFilteri(Filter, AL_FILTER_TYPE, AL_FILTER_LOWPASS);
00575 SupportedFilters[EFT_LOWPASS] = (alGetError() == AL_NO_ERROR);
00576
00577 EFXInterface.alFilteri(Filter, AL_FILTER_TYPE, AL_FILTER_HIGHPASS);
00578 SupportedFilters[EFT_HIGHPASS] = (alGetError() == AL_NO_ERROR);
00579
00580 EFXInterface.alFilteri(Filter, AL_FILTER_TYPE, AL_FILTER_BANDPASS);
00581 SupportedFilters[EFT_BANDPASS] = (alGetError() == AL_NO_ERROR);
00582 }
00583
00584
00585 EFXInterface.alDeleteFilters(1, &Filter);
00586
00587
00588 while(count > 0)
00589 {
00590 EFXInterface.alDeleteAuxiliaryEffectSlots(1, &effectSlots[--count]);
00591 }
00592 }
00593 }
00594
00595 };
00596
00597 #endif