caudio/Source/cFilter.cpp
Joshua Jones 30e5b4a99e Added support for all OpenAL Audio Effects. Access can be gotten through the main audio manager using the AudioEffects interface. IEffect provides access to effect parameters and allows for binding to cAudio sources. IFilter provides access to filters that can be attached to sources and effects.
Added conversion functions from our audio format enum to OpenAL's in preparation for supporting more formats.
Reorganized cAudio defines, made it easier to access some compile time parameters.
Fixed a bug where a source could not be played again after it reached the end of its audio stream.
Added better checking for sources.  IsValid() should provide a more useful indication of whether a source is usable.
Added error checking and logging to cAudioCapture.
Prevented initializing of cAudioManager until shutdown() has been called.
Added a tutorial for Audio Effects.
Added a footsteps sound for showing off Audio Effects.
Moved the default compile location for the main library to lib/.  The msvc project will copy the cAudio.dll to bin/win32-visual/
2010-01-11 00:39:08 +00:00

175 lines
3.6 KiB
C++

#include "../Headers/cFilter.h"
#include "../Headers/cLogger.h"
#include "../Headers/cUtils.h"
namespace cAudio
{
cFilter::cFilter(cEFXFunctions* oALFunctions) : EFX(oALFunctions), Type(EFT_NULL),
Volume(1.0f), LowFreqVolume(1.0f), HighFreqVolume(1.0f), LastUpdated(0),
Valid(false), Filter(0)
{
cAudioMutexBasicLock lock(Mutex);
if(EFX)
Valid = EFX->Supported;
if(Valid)
{
cAudioMutexBasicLock lock(EFX->Mutex);
EFX->alGenFilters(1, &Filter);
Valid = !CheckError();
if(!Valid)
Filter = 0;
}
}
cFilter::~cFilter()
{
cAudioMutexBasicLock lock(Mutex);
if(Filter && EFX && EFX->Supported)
{
cAudioMutexBasicLock lock(EFX->Mutex);
EFX->alDeleteFilters(1, &Filter);
}
}
const FilterTypes& cFilter::getType() const
{
return Type;
}
void cFilter::setType(const FilterTypes& type)
{
cAudioMutexBasicLock lock(Mutex);
Type = type;
UpdateFilter();
}
float cFilter::getVolume() const
{
return Volume;
}
void cFilter::setVolume(const float& volume)
{
cAudioMutexBasicLock lock(Mutex);
Volume = volume;
UpdateFilter();
}
float cFilter::getLowFrequencyVolume() const
{
return LowFreqVolume;
}
void cFilter::setLowFrequencyVolume(const float& volumeLF)
{
cAudioMutexBasicLock lock(Mutex);
LowFreqVolume = volumeLF;
UpdateFilter();
}
float cFilter::getHighFrequencyVolume() const
{
return HighFreqVolume;
}
void cFilter::setHighFrequencyVolume(const float& volumeHF)
{
cAudioMutexBasicLock lock(Mutex);
HighFreqVolume = volumeHF;
UpdateFilter();
}
unsigned int cFilter::getLastUpdated() const
{
return LastUpdated;
}
bool cFilter::isValid() const
{
return Valid;
}
ALuint cFilter::getOpenALFilter() const
{
return Filter;
}
bool cFilter::UpdateFilter()
{
++LastUpdated;
ALenum alFilterType = ConvertFilterEnum(Type);
if(Filter && EFX && EFX->Supported)
{
cAudioMutexBasicLock lock(EFX->Mutex);
EFX->alFilteri(Filter, AL_FILTER_TYPE, alFilterType);
Valid = !CheckError();
if(!Valid)
return false;
if(Type == EFT_LOWPASS)
{
EFX->alFilterf(Filter, AL_LOWPASS_GAIN, Volume);
EFX->alFilterf(Filter, AL_LOWPASS_GAINHF, HighFreqVolume);
Valid = !CheckError();
return Valid;
}
else if(Type == EFT_HIGHPASS)
{
EFX->alFilterf(Filter, AL_HIGHPASS_GAIN, Volume);
EFX->alFilterf(Filter, AL_HIGHPASS_GAINLF, LowFreqVolume);
Valid = !CheckError();
return Valid;
}
else if(Type == EFT_BANDPASS)
{
EFX->alFilterf(Filter, AL_BANDPASS_GAIN, Volume);
EFX->alFilterf(Filter, AL_BANDPASS_GAINLF, LowFreqVolume);
EFX->alFilterf(Filter, AL_BANDPASS_GAINHF, HighFreqVolume);
Valid = !CheckError();
return Valid;
}
else
{
return true;
}
}
return false;
}
bool cFilter::CheckError()
{
int error = alGetError();
const char* errorString;
if (error != AL_NO_ERROR)
{
errorString = alGetString(error);
if(error == AL_OUT_OF_MEMORY)
getLogger()->logCritical("Audio Filter", "OpenAL Error: %s.", errorString);
else
getLogger()->logError("Audio Filter", "OpenAL Error: %s.", errorString);
return true;
}
return false;
}
ALenum cFilter::ConvertFilterEnum(FilterTypes type)
{
switch(type)
{
case EFT_NULL:
return AL_FILTER_NULL;
case EFT_LOWPASS:
return AL_FILTER_LOWPASS;
case EFT_HIGHPASS:
return AL_FILTER_HIGHPASS;
case EFT_BANDPASS:
return AL_FILTER_BANDPASS;
default:
return AL_FILTER_NULL;
};
}
};