cFilter.cpp
00001
00002
00003
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