175 lines
3.6 KiB
C++
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;
|
||
|
};
|
||
|
}
|
||
|
};
|