cAudioEffects.cpp

00001 // Copyright (c) 2008-2010 Raynaldo (Wildicv) Rivera, Joshua (Dark_Kilauea) Jones
00002 // This file is part of the "cAudio Engine"
00003 // For conditions of distribution and use, see copyright notice in cAudio.h
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 //Number of effect slots to try to create
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                 //Count the number of effect slots this device supports (limits the max number of effects available)
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                 //Check what effects are supported
00516                 ALuint Effect;
00517                 EFXInterface.alGenEffects(1, &Effect);
00518                 if (alGetError() == AL_NO_ERROR)
00519                 {
00520                         SupportedEffects[EET_NULL] = true;
00521 
00522                         // Try setting Effect Type to known Effects
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                 // Delete Effect
00564                 EFXInterface.alDeleteEffects(1, &Effect);
00565 
00566                 // Generate a Filter to use to determine what Filter Types are supported
00567                 ALuint Filter;
00568                 EFXInterface.alGenFilters(1, &Filter);
00569                 if (alGetError() == AL_NO_ERROR)
00570                 {
00571                         SupportedFilters[EFT_NULL] = true;
00572 
00573                         // Try setting the Filter type to known Filters
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                 // Delete Filter
00585                 EFXInterface.alDeleteFilters(1, &Filter);
00586 
00587                 //Cleanup the slots we created
00588                 while(count > 0)
00589                 {
00590                         EFXInterface.alDeleteAuxiliaryEffectSlots(1, &effectSlots[--count]);
00591                 }
00592         }
00593 }
00594 
00595 };
00596 
00597 #endif
 All Classes Namespaces Functions Variables Enumerations

Generated on Sat Feb 20 22:55:08 2010 for cAudio by  doxygen 1.6.2