cFilter.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/cFilter.h"
00006 #include "../Headers/cLogger.h"
00007 #include "../Headers/cUtils.h"
00008 
00009 #ifdef CAUDIO_EFX_ENABLED
00010 
00011 namespace cAudio
00012 {
00013         cFilter::cFilter(cEFXFunctions* oALFunctions) : EFX(oALFunctions), Type(EFT_NULL), 
00014                 Volume(1.0f), LowFreqVolume(1.0f), HighFreqVolume(1.0f), LastUpdated(0),
00015                 Valid(false), Filter(0)
00016         {
00017                 cAudioMutexBasicLock lock(Mutex);
00018                 if(EFX)
00019                         Valid = EFX->Supported;
00020 
00021                 if(Valid)
00022                 {
00023                         cAudioMutexBasicLock lock(EFX->Mutex);
00024                         EFX->alGenFilters(1, &Filter);
00025                         Valid = !CheckError();
00026                         if(!Valid)
00027                                 Filter = 0;
00028                 }
00029         }
00030 
00031         cFilter::~cFilter()
00032         {
00033                 cAudioMutexBasicLock lock(Mutex);
00034                 if(Filter && EFX && EFX->Supported)
00035                 {
00036                         cAudioMutexBasicLock lock(EFX->Mutex);
00037                         EFX->alDeleteFilters(1, &Filter);
00038                 }
00039         }
00040 
00041         const FilterTypes& cFilter::getType() const
00042         {
00043                 return Type;
00044         }
00045 
00046         void cFilter::setType(const FilterTypes& type)
00047         {
00048                 cAudioMutexBasicLock lock(Mutex);
00049                 Type = type;
00050                 UpdateFilter();
00051         }
00052 
00053         float cFilter::getVolume() const
00054         {
00055                 return Volume;
00056         }
00057 
00058         void cFilter::setVolume(const float& volume)
00059         {
00060                 cAudioMutexBasicLock lock(Mutex);
00061                 Volume = volume;
00062                 UpdateFilter();
00063         }
00064 
00065         float cFilter::getLowFrequencyVolume() const
00066         {
00067                 return LowFreqVolume;
00068         }
00069 
00070         void cFilter::setLowFrequencyVolume(const float& volumeLF)
00071         {
00072                 cAudioMutexBasicLock lock(Mutex);
00073                 LowFreqVolume = volumeLF;
00074                 UpdateFilter();
00075         }
00076 
00077         float cFilter::getHighFrequencyVolume() const
00078         {
00079                 return HighFreqVolume;
00080         }
00081 
00082         void cFilter::setHighFrequencyVolume(const float& volumeHF)
00083         {
00084                 cAudioMutexBasicLock lock(Mutex);
00085                 HighFreqVolume = volumeHF;
00086                 UpdateFilter();
00087         }
00088 
00089         unsigned int cFilter::getLastUpdated() const
00090         {
00091                 return LastUpdated;
00092         }
00093 
00094         bool cFilter::isValid() const
00095         {
00096                 return Valid;
00097         }
00098 
00099         ALuint cFilter::getOpenALFilter() const
00100         {
00101                 return Filter;
00102         }
00103 
00104         bool cFilter::UpdateFilter()
00105         {
00106                 ++LastUpdated;
00107 
00108                 ALenum alFilterType = ConvertFilterEnum(Type);
00109 
00110                 if(Filter && EFX && EFX->Supported)
00111                 {
00112                         cAudioMutexBasicLock lock(EFX->Mutex);
00113                         EFX->alFilteri(Filter, AL_FILTER_TYPE, alFilterType);
00114                         Valid = !CheckError();
00115                         if(!Valid)
00116                                 return false;
00117 
00118                         if(Type == EFT_LOWPASS)
00119                         {
00120                                 EFX->alFilterf(Filter, AL_LOWPASS_GAIN, Volume);
00121                                 EFX->alFilterf(Filter, AL_LOWPASS_GAINHF, HighFreqVolume);
00122                                 Valid = !CheckError();
00123                                 return Valid;
00124                         }
00125                         else if(Type == EFT_HIGHPASS)
00126                         {
00127                                 EFX->alFilterf(Filter, AL_HIGHPASS_GAIN, Volume);
00128                                 EFX->alFilterf(Filter, AL_HIGHPASS_GAINLF, LowFreqVolume);
00129                                 Valid = !CheckError();
00130                                 return Valid;
00131                         }
00132                         else if(Type == EFT_BANDPASS)
00133                         {
00134                                 EFX->alFilterf(Filter, AL_BANDPASS_GAIN, Volume);
00135                                 EFX->alFilterf(Filter, AL_BANDPASS_GAINLF, LowFreqVolume);
00136                                 EFX->alFilterf(Filter, AL_BANDPASS_GAINHF, HighFreqVolume);
00137                                 Valid = !CheckError();
00138                                 return Valid;
00139                         }
00140                         else
00141                         {
00142                                 return true;
00143                         }
00144                 }
00145                 return false;
00146         }
00147 
00148         bool cFilter::CheckError()
00149         {
00150                 int error = alGetError();
00151                 const char* errorString;
00152 
00153         if (error != AL_NO_ERROR)
00154         {
00155                         errorString = alGetString(error);
00156                         if(error == AL_OUT_OF_MEMORY)
00157                                 getLogger()->logCritical("Audio Filter", "OpenAL Error: %s.", errorString);
00158                         else
00159                                 getLogger()->logError("Audio Filter", "OpenAL Error: %s.", errorString);
00160                         return true;
00161         }
00162                 return false;
00163         }
00164 
00165         ALenum cFilter::ConvertFilterEnum(FilterTypes type)
00166         {
00167                 switch(type)
00168                 {
00169                 case EFT_NULL:
00170                         return AL_FILTER_NULL;
00171                 case EFT_LOWPASS:
00172                         return AL_FILTER_LOWPASS;
00173                 case EFT_HIGHPASS:
00174                         return AL_FILTER_HIGHPASS;
00175                 case EFT_BANDPASS:
00176                         return AL_FILTER_BANDPASS;
00177                 default:
00178                         return AL_FILTER_NULL;
00179                 };
00180         }
00181 };
00182 
00183 #endif
 All Classes Namespaces Functions Variables Enumerations

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