183 lines
3.8 KiB
C++
183 lines
3.8 KiB
C++
// Copyright (c) 2008-2010 Raynaldo (Wildicv) Rivera, Joshua (Dark_Kilauea) Jones
|
|
// This file is part of the "cAudio Engine"
|
|
// For conditions of distribution and use, see copyright notice in cAudio.h
|
|
|
|
#include "../Headers/cFilter.h"
|
|
#include "../Headers/cLogger.h"
|
|
#include "../Headers/cUtils.h"
|
|
|
|
#ifdef CAUDIO_EFX_ENABLED
|
|
|
|
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;
|
|
};
|
|
}
|
|
};
|
|
|
|
#endif |