caudio/Source/cEffect.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

697 lines
21 KiB
C++

#include "../Headers/cEffect.h"
#include "../Headers/cLogger.h"
#include "../Headers/cUtils.h"
namespace cAudio
{
cEffect::cEffect(cEFXFunctions* oALFunctions) : EFX(oALFunctions), Type(EET_NULL),
Volume(1.0f), IgnoreAttenuation(false), LastUpdated(0), Valid(false), Filter(NULL),
Effect(0), EffectSlot(0)
{
cAudioMutexBasicLock lock(Mutex);
if(EFX)
{
if(EFX->Supported)
{
cAudioMutexBasicLock lock(EFX->Mutex);
//Create Effect Slot
EFX->alGenAuxiliaryEffectSlots(1, &EffectSlot);
bool error = CheckError();
if(error)
{
EffectSlot = 0;
return;
}
//Create the effect object
EFX->alGenEffects(1, &Effect);
error = CheckError();
if(error)
{
EFX->alDeleteAuxiliaryEffectSlots(1, &EffectSlot);
EffectSlot = 0;
Effect = 0;
return;
}
//Bind the effect to the effect slot
EFX->alAuxiliaryEffectSloti(EffectSlot, AL_EFFECTSLOT_EFFECT, Effect);
error = CheckError();
if(error)
{
EFX->alDeleteEffects(1, &Effect);
EFX->alDeleteAuxiliaryEffectSlots(1, &EffectSlot);
EffectSlot = 0;
Effect = 0;
return;
}
//Everything worked, effect is ready to use
Valid = true;
}
}
}
cEffect::~cEffect()
{
cAudioMutexBasicLock lock(Mutex);
if(EFX && EFX->Supported)
{
cAudioMutexBasicLock lock(EFX->Mutex);
EFX->alAuxiliaryEffectSloti(EffectSlot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL);
if(Effect)
{
EFX->alDeleteEffects(1, &Effect);
}
if(EffectSlot)
{
EFX->alDeleteAuxiliaryEffectSlots(1, &EffectSlot);
}
}
}
const EffectTypes& cEffect::getType() const
{
return Type;
}
void cEffect::setType(const EffectTypes& type)
{
cAudioMutexBasicLock lock(Mutex);
Type = type;
UpdateEffect();
}
const sEAXReverbParameters& cEffect::getEAXReverbParameters() const
{
return EAXReverbParam;
}
void cEffect::setEAXReverbParameters(const sEAXReverbParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
EAXReverbParam = param;
UpdateEffect();
}
const sReverbParameters& cEffect::getReverbParameters() const
{
return ReverbParam;
}
void cEffect::setReverbParameters(const sReverbParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
ReverbParam = param;
UpdateEffect();
}
const sChorusParameters& cEffect::getChorusParameters() const
{
return ChorusParam;
}
void cEffect::setChorusParameters(const sChorusParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
ChorusParam = param;
UpdateEffect();
}
const sDistortionParameters& cEffect::getDistortionParameters() const
{
return DistortionParam;
}
void cEffect::setDistortionParameters(const sDistortionParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
DistortionParam = param;
UpdateEffect();
}
const sEchoParameters& cEffect::getEchoParameters() const
{
return EchoParam;
}
void cEffect::setEchoParameters(const sEchoParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
EchoParam = param;
UpdateEffect();
}
const sFlangerParameters& cEffect::getFlangerParameters() const
{
return FlangerParam;
}
void cEffect::setFlangerParameters(const sFlangerParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
FlangerParam = param;
UpdateEffect();
}
const sFrequencyShiftParameters& cEffect::getFrequencyShiftParameters() const
{
return FrequencyShiftParam;
}
void cEffect::setFrequencyShiftParameters(const sFrequencyShiftParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
FrequencyShiftParam = param;
UpdateEffect();
}
const sVocalMorpherParameters& cEffect::getVocalMorpherParameters() const
{
return VocalMorpherParam;
}
void cEffect::setVocalMorpherParameters(const sVocalMorpherParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
VocalMorpherParam = param;
UpdateEffect();
}
const sPitchShifterParameters& cEffect::getPitchShifterParameters() const
{
return PitchShifterParam;
}
void cEffect::setPitchShifterParameters(const sPitchShifterParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
PitchShifterParam = param;
UpdateEffect();
}
const sRingModulatorParameters& cEffect::getRingModulatorParameters() const
{
return RingModulatorParam;
}
void cEffect::setRingModulatorParameters(const sRingModulatorParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
RingModulatorParam = param;
UpdateEffect();
}
const sAutowahParameters& cEffect::getAutowahParameters() const
{
return AutowahParam;
}
void cEffect::setAutowahParameters(const sAutowahParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
AutowahParam = param;
UpdateEffect();
}
const sCompressorParameters& cEffect::getCompressorParameters() const
{
return CompressorParam;
}
void cEffect::setCompressorParameters(const sCompressorParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
CompressorParam = param;
UpdateEffect();
}
const sEqualizerParameters& cEffect::getEqualizerParameters() const
{
return EqualizerParam;
}
void cEffect::setEqualizerParameters(const sEqualizerParameters& param)
{
cAudioMutexBasicLock lock(Mutex);
EqualizerParam = param;
UpdateEffect();
}
float cEffect::getMasterVolume() const
{
return Volume;
}
void cEffect::setMasterVolume(const float& volume)
{
cAudioMutexBasicLock lock(Mutex);
Volume = volume;
UpdateEffect();
}
bool cEffect::isIgnoringAttenuation() const
{
return IgnoreAttenuation;
}
void cEffect::ignoreAttenuation(const bool& ignore)
{
cAudioMutexBasicLock lock(Mutex);
IgnoreAttenuation = ignore;
UpdateEffect();
}
IFilter* cEffect::getFilter() const
{
return Filter;
}
void cEffect::attachFilter(IFilter* filter)
{
cAudioMutexBasicLock lock(Mutex);
Filter = filter;
if(Filter)
Filter->grab();
UpdateEffect();
}
void cEffect::removeFilter()
{
cAudioMutexBasicLock lock(Mutex);
if(Filter)
Filter->drop();
Filter = NULL;
}
unsigned int cEffect::getLastUpdated() const
{
return LastUpdated;
}
bool cEffect::isValid() const
{
return Valid;
}
ALuint cEffect::getOpenALEffect() const
{
return Effect;
}
ALuint cEffect::getOpenALEffectSlot() const
{
return EffectSlot;
}
bool cEffect::UpdateEffect()
{
++LastUpdated;
ALenum alEffectType = ConvertEffectEnum(Type);
if(EFX && EFX->Supported && EffectSlot && Effect)
{
cAudioMutexBasicLock lock(EFX->Mutex);
EFX->alEffecti(Effect, AL_EFFECT_TYPE, alEffectType);
Valid = !CheckError();
if(!Valid)
return false;
EFX->alAuxiliaryEffectSlotf(EffectSlot, AL_EFFECTSLOT_GAIN, Volume);
Valid = !CheckError();
if(!Valid)
return false;
EFX->alAuxiliaryEffectSloti(EffectSlot, AL_EFFECTSLOT_AUXILIARY_SEND_AUTO, IgnoreAttenuation ? AL_TRUE : AL_FALSE);
Valid = !CheckError();
if(!Valid)
return false;
if(Type == EET_EAX_REVERB)
{
EFX->alEffectf(Effect, AL_EAXREVERB_DENSITY, EAXReverbParam.Density);
EFX->alEffectf(Effect, AL_EAXREVERB_DIFFUSION, EAXReverbParam.Diffusion);
EFX->alEffectf(Effect, AL_EAXREVERB_GAIN, EAXReverbParam.Gain);
EFX->alEffectf(Effect, AL_EAXREVERB_GAINHF, EAXReverbParam.GainHF);
EFX->alEffectf(Effect, AL_EAXREVERB_GAINLF, EAXReverbParam.GainLF);
EFX->alEffectf(Effect, AL_EAXREVERB_DECAY_TIME, EAXReverbParam.DecayTime);
EFX->alEffectf(Effect, AL_EAXREVERB_DECAY_HFRATIO, EAXReverbParam.DecayHFRatio);
EFX->alEffectf(Effect, AL_EAXREVERB_DECAY_LFRATIO, EAXReverbParam.DecayLFRatio);
EFX->alEffectf(Effect, AL_EAXREVERB_REFLECTIONS_GAIN, EAXReverbParam.ReflectionsGain);
EFX->alEffectf(Effect, AL_EAXREVERB_REFLECTIONS_DELAY, EAXReverbParam.ReflectionsDelay);
EFX->alEffectfv(Effect, AL_EAXREVERB_REFLECTIONS_PAN, &EAXReverbParam.ReflectionsPan.x);
EFX->alEffectf(Effect, AL_EAXREVERB_LATE_REVERB_GAIN, EAXReverbParam.LateReverbGain);
EFX->alEffectf(Effect, AL_EAXREVERB_LATE_REVERB_DELAY, EAXReverbParam.LateReverbDelay);
EFX->alEffectfv(Effect, AL_EAXREVERB_LATE_REVERB_PAN, &EAXReverbParam.LateReverbPan.x);
EFX->alEffectf(Effect, AL_EAXREVERB_ECHO_TIME, EAXReverbParam.EchoTime);
EFX->alEffectf(Effect, AL_EAXREVERB_ECHO_DEPTH, EAXReverbParam.EchoDepth);
EFX->alEffectf(Effect, AL_EAXREVERB_MODULATION_TIME, EAXReverbParam.ModulationTime);
EFX->alEffectf(Effect, AL_EAXREVERB_MODULATION_DEPTH, EAXReverbParam.ModulationDepth);
EFX->alEffectf(Effect, AL_EAXREVERB_HFREFERENCE, EAXReverbParam.HFReference);
EFX->alEffectf(Effect, AL_EAXREVERB_LFREFERENCE, EAXReverbParam.LFReference);
EFX->alEffectf(Effect, AL_EAXREVERB_ROOM_ROLLOFF_FACTOR, EAXReverbParam.RoomRolloffFactor);
EFX->alEffectf(Effect, AL_EAXREVERB_AIR_ABSORPTION_GAINHF, EAXReverbParam.AirAbsorptionGainHF);
EFX->alEffecti(Effect, AL_EAXREVERB_DECAY_HFLIMIT, EAXReverbParam.DecayHFLimit ? AL_TRUE : AL_FALSE);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_REVERB)
{
EFX->alEffectf(Effect, AL_REVERB_DENSITY, ReverbParam.Density);
EFX->alEffectf(Effect, AL_REVERB_DIFFUSION, ReverbParam.Diffusion);
EFX->alEffectf(Effect, AL_REVERB_GAIN, ReverbParam.Gain);
EFX->alEffectf(Effect, AL_REVERB_GAINHF, ReverbParam.GainHF);
EFX->alEffectf(Effect, AL_REVERB_DECAY_TIME, ReverbParam.DecayTime);
EFX->alEffectf(Effect, AL_REVERB_DECAY_HFRATIO, ReverbParam.DecayHFRatio);
EFX->alEffectf(Effect, AL_REVERB_REFLECTIONS_GAIN, ReverbParam.ReflectionsGain);
EFX->alEffectf(Effect, AL_REVERB_REFLECTIONS_DELAY, ReverbParam.ReflectionsDelay);
EFX->alEffectf(Effect, AL_REVERB_LATE_REVERB_GAIN, ReverbParam.LateReverbGain);
EFX->alEffectf(Effect, AL_REVERB_LATE_REVERB_DELAY, ReverbParam.LateReverbDelay);
EFX->alEffectf(Effect, AL_REVERB_ROOM_ROLLOFF_FACTOR, ReverbParam.RoomRolloffFactor);
EFX->alEffectf(Effect, AL_REVERB_AIR_ABSORPTION_GAINHF, ReverbParam.AirAbsorptionGainHF);
EFX->alEffecti(Effect, AL_REVERB_DECAY_HFLIMIT, ReverbParam.DecayHFLimit ? AL_TRUE : AL_FALSE);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_CHORUS)
{
ALenum waveform = AL_CHORUS_DEFAULT_WAVEFORM;
switch(ChorusParam.Waveform)
{
case sChorusParameters::ECW_SINUSOID:
waveform = AL_CHORUS_WAVEFORM_SINUSOID;
break;
case sChorusParameters::ECW_TRIANGLE:
waveform = AL_CHORUS_WAVEFORM_TRIANGLE;
break;
default:
waveform = AL_CHORUS_DEFAULT_WAVEFORM;
break;
};
EFX->alEffecti(Effect, AL_CHORUS_WAVEFORM, waveform);
EFX->alEffecti(Effect, AL_CHORUS_PHASE, ChorusParam.Phase);
EFX->alEffectf(Effect, AL_CHORUS_RATE, ChorusParam.Rate);
EFX->alEffectf(Effect, AL_CHORUS_DEPTH, ChorusParam.Depth);
EFX->alEffectf(Effect, AL_CHORUS_FEEDBACK, ChorusParam.Feedback);
EFX->alEffectf(Effect, AL_CHORUS_DELAY, ChorusParam.Delay);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_DISTORTION)
{
EFX->alEffectf(Effect, AL_DISTORTION_EDGE, DistortionParam.Edge);
EFX->alEffectf(Effect, AL_DISTORTION_GAIN, DistortionParam.Gain);
EFX->alEffectf(Effect, AL_DISTORTION_LOWPASS_CUTOFF, DistortionParam.LowpassCutoff);
EFX->alEffectf(Effect, AL_DISTORTION_EQCENTER, DistortionParam.EqCenter);
EFX->alEffectf(Effect, AL_DISTORTION_EQBANDWIDTH, DistortionParam.EqBandwidth);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_ECHO)
{
EFX->alEffectf(Effect, AL_ECHO_DELAY, EchoParam.Delay);
EFX->alEffectf(Effect, AL_ECHO_LRDELAY, EchoParam.LRDelay);
EFX->alEffectf(Effect, AL_ECHO_DAMPING, EchoParam.Damping);
EFX->alEffectf(Effect, AL_ECHO_FEEDBACK, EchoParam.Feedback);
EFX->alEffectf(Effect, AL_ECHO_SPREAD, EchoParam.Spread);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_FLANGER)
{
ALenum waveform = AL_FLANGER_DEFAULT_WAVEFORM;
switch(FlangerParam.Waveform)
{
case sFlangerParameters::EFW_SINUSOID:
waveform = AL_FLANGER_WAVEFORM_SINUSOID;
break;
case sFlangerParameters::EFW_TRIANGLE:
waveform = AL_FLANGER_WAVEFORM_SINUSOID;
break;
default:
waveform = AL_FLANGER_DEFAULT_WAVEFORM;
break;
};
EFX->alEffecti(Effect, AL_FLANGER_WAVEFORM, waveform);
EFX->alEffecti(Effect, AL_FLANGER_PHASE, FlangerParam.Phase);
EFX->alEffectf(Effect, AL_FLANGER_RATE, FlangerParam.Rate);
EFX->alEffectf(Effect, AL_FLANGER_DEPTH, FlangerParam.Depth);
EFX->alEffectf(Effect, AL_FLANGER_FEEDBACK, FlangerParam.Feedback);
EFX->alEffectf(Effect, AL_FLANGER_DELAY, FlangerParam.Delay);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_FREQUENCY_SHIFTER)
{
ALenum shiftleft = ConvertFrequencyShiftEnum(FrequencyShiftParam.Left);
ALenum shiftright = ConvertFrequencyShiftEnum(FrequencyShiftParam.Right);
EFX->alEffectf(Effect, AL_FREQUENCY_SHIFTER_FREQUENCY, FrequencyShiftParam.Frequency);
EFX->alEffecti(Effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, shiftleft);
EFX->alEffecti(Effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, shiftright);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_VOCAL_MORPHER)
{
ALenum pA = ConvertVocalMorphPhonemeEnum(VocalMorpherParam.PhonemeA);
ALenum pB = ConvertVocalMorphPhonemeEnum(VocalMorpherParam.PhonemeB);
ALenum waveform = AL_VOCAL_MORPHER_DEFAULT_WAVEFORM;
switch(VocalMorpherParam.Waveform)
{
case sVocalMorpherParameters::EMW_SINUSOID:
waveform = AL_VOCAL_MORPHER_WAVEFORM_SINUSOID;
break;
case sVocalMorpherParameters::EMW_TRIANGLE:
waveform = AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE;
break;
case sVocalMorpherParameters::EMW_SAW:
waveform = AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH;
break;
default:
waveform = AL_VOCAL_MORPHER_DEFAULT_WAVEFORM;
break;
};
EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEA, pA);
EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEB, pB);
EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING, VocalMorpherParam.PhonemeACoarseTune);
EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING, VocalMorpherParam.PhonemeBCoarseTune);
EFX->alEffecti(Effect, AL_VOCAL_MORPHER_WAVEFORM, waveform);
EFX->alEffectf(Effect, AL_VOCAL_MORPHER_RATE, VocalMorpherParam.Rate);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_PITCH_SHIFTER)
{
EFX->alEffecti(Effect, AL_PITCH_SHIFTER_COARSE_TUNE, PitchShifterParam.CoarseTune);
EFX->alEffecti(Effect, AL_PITCH_SHIFTER_FINE_TUNE, PitchShifterParam.FineTune);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_RING_MODULATOR)
{
ALenum waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
switch(RingModulatorParam.Waveform)
{
case sRingModulatorParameters::EMW_SINUSOID:
waveform = AL_RING_MODULATOR_SINUSOID;
break;
case sRingModulatorParameters::EMW_SAW:
waveform = AL_RING_MODULATOR_SAWTOOTH;
break;
case sRingModulatorParameters::EMW_SQUARE:
waveform = AL_RING_MODULATOR_SQUARE;
break;
default:
waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
break;
};
EFX->alEffectf(Effect, AL_RING_MODULATOR_FREQUENCY, RingModulatorParam.Frequency);
EFX->alEffectf(Effect, AL_RING_MODULATOR_HIGHPASS_CUTOFF, RingModulatorParam.HighPassCutoff);
EFX->alEffecti(Effect, AL_RING_MODULATOR_WAVEFORM, waveform);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_AUTOWAH)
{
EFX->alEffectf(Effect, AL_AUTOWAH_ATTACK_TIME, AutowahParam.AttackTime);
EFX->alEffectf(Effect, AL_AUTOWAH_RELEASE_TIME, AutowahParam.ReleaseTime);
EFX->alEffectf(Effect, AL_AUTOWAH_RESONANCE, AutowahParam.Resonance);
EFX->alEffectf(Effect, AL_AUTOWAH_PEAK_GAIN, AutowahParam.PeakGain);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_COMPRESSOR)
{
EFX->alEffecti(Effect, AL_COMPRESSOR_ONOFF, CompressorParam.Active ? AL_TRUE : AL_FALSE);
Valid = !CheckError();
return Valid;
}
else if(Type == EET_EQUALIZER)
{
EFX->alEffectf(Effect, AL_EQUALIZER_LOW_GAIN, EqualizerParam.LowGain);
EFX->alEffectf(Effect, AL_EQUALIZER_LOW_CUTOFF, EqualizerParam.LowCutoff);
EFX->alEffectf(Effect, AL_EQUALIZER_MID1_GAIN, EqualizerParam.Mid1Gain);
EFX->alEffectf(Effect, AL_EQUALIZER_MID1_CENTER, EqualizerParam.Mid1Center);
EFX->alEffectf(Effect, AL_EQUALIZER_MID1_WIDTH, EqualizerParam.Mid1Width);
EFX->alEffectf(Effect, AL_EQUALIZER_MID2_GAIN, EqualizerParam.Mid2Gain);
EFX->alEffectf(Effect, AL_EQUALIZER_MID2_CENTER, EqualizerParam.Mid2Center);
EFX->alEffectf(Effect, AL_EQUALIZER_MID2_WIDTH, EqualizerParam.Mid2Width);
EFX->alEffectf(Effect, AL_EQUALIZER_HIGH_GAIN, EqualizerParam.HighGain);
EFX->alEffectf(Effect, AL_EQUALIZER_HIGH_CUTOFF, EqualizerParam.HighCutoff);
Valid = !CheckError();
return Valid;
}
else
{
return true;
}
}
return false;
}
bool cEffect::CheckError()
{
int error = alGetError();
const char* errorString;
if (error != AL_NO_ERROR)
{
errorString = alGetString(error);
if(error == AL_OUT_OF_MEMORY)
getLogger()->logCritical("Audio Effect", "OpenAL Error: %s.", errorString);
else
getLogger()->logError("Audio Effect", "OpenAL Error: %s.", errorString);
return true;
}
return false;
}
ALenum cEffect::ConvertEffectEnum(EffectTypes type)
{
switch(type)
{
case EET_NULL:
return AL_EFFECT_NULL;
case EET_EAX_REVERB:
return AL_EFFECT_EAXREVERB;
case EET_REVERB:
return AL_EFFECT_REVERB;
case EET_CHORUS:
return AL_EFFECT_CHORUS;
case EET_DISTORTION:
return AL_EFFECT_DISTORTION;
case EET_ECHO:
return AL_EFFECT_ECHO;
case EET_FLANGER:
return AL_EFFECT_FLANGER;
case EET_FREQUENCY_SHIFTER:
return AL_EFFECT_FREQUENCY_SHIFTER;
case EET_VOCAL_MORPHER:
return AL_EFFECT_VOCAL_MORPHER;
case EET_PITCH_SHIFTER:
return AL_EFFECT_PITCH_SHIFTER;
case EET_RING_MODULATOR:
return AL_EFFECT_RING_MODULATOR;
case EET_AUTOWAH:
return AL_EFFECT_AUTOWAH;
case EET_COMPRESSOR:
return AL_EFFECT_COMPRESSOR;
case EET_EQUALIZER:
return AL_EFFECT_EQUALIZER;
default:
return AL_EFFECT_NULL;
};
}
ALenum cEffect::ConvertFrequencyShiftEnum(sFrequencyShiftParameters::ShiftDirection shift)
{
switch(shift)
{
case sFrequencyShiftParameters::ESD_DOWN:
return AL_FREQUENCY_SHIFTER_DIRECTION_DOWN;
case sFrequencyShiftParameters::ESD_UP:
return AL_FREQUENCY_SHIFTER_DIRECTION_UP;
case sFrequencyShiftParameters::ESD_OFF:
return AL_FREQUENCY_SHIFTER_DIRECTION_OFF;
default:
return AL_FREQUENCY_SHIFTER_DIRECTION_DOWN;
};
}
ALenum cEffect::ConvertVocalMorphPhonemeEnum(sVocalMorpherParameters::MorpherPhoneme phoneme)
{
switch(phoneme)
{
case sVocalMorpherParameters::EMP_A:
return AL_VOCAL_MORPHER_PHONEME_A;
case sVocalMorpherParameters::EMP_E:
return AL_VOCAL_MORPHER_PHONEME_E;
case sVocalMorpherParameters::EMP_I:
return AL_VOCAL_MORPHER_PHONEME_I;
case sVocalMorpherParameters::EMP_O:
return AL_VOCAL_MORPHER_PHONEME_O;
case sVocalMorpherParameters::EMP_U:
return AL_VOCAL_MORPHER_PHONEME_U;
case sVocalMorpherParameters::EMP_AA:
return AL_VOCAL_MORPHER_PHONEME_AA;
case sVocalMorpherParameters::EMP_AE:
return AL_VOCAL_MORPHER_PHONEME_AE;
case sVocalMorpherParameters::EMP_AH:
return AL_VOCAL_MORPHER_PHONEME_AH;
case sVocalMorpherParameters::EMP_AO:
return AL_VOCAL_MORPHER_PHONEME_AO;
case sVocalMorpherParameters::EMP_EH:
return AL_VOCAL_MORPHER_PHONEME_EH;
case sVocalMorpherParameters::EMP_ER:
return AL_VOCAL_MORPHER_PHONEME_ER;
case sVocalMorpherParameters::EMP_IH:
return AL_VOCAL_MORPHER_PHONEME_IH;
case sVocalMorpherParameters::EMP_IY:
return AL_VOCAL_MORPHER_PHONEME_IY;
case sVocalMorpherParameters::EMP_UH:
return AL_VOCAL_MORPHER_PHONEME_UH;
case sVocalMorpherParameters::EMP_UW:
return AL_VOCAL_MORPHER_PHONEME_UW;
case sVocalMorpherParameters::EMP_B:
return AL_VOCAL_MORPHER_PHONEME_B;
case sVocalMorpherParameters::EMP_D:
return AL_VOCAL_MORPHER_PHONEME_D;
case sVocalMorpherParameters::EMP_F:
return AL_VOCAL_MORPHER_PHONEME_F;
case sVocalMorpherParameters::EMP_G:
return AL_VOCAL_MORPHER_PHONEME_G;
case sVocalMorpherParameters::EMP_J:
return AL_VOCAL_MORPHER_PHONEME_J;
case sVocalMorpherParameters::EMP_K:
return AL_VOCAL_MORPHER_PHONEME_K;
case sVocalMorpherParameters::EMP_L:
return AL_VOCAL_MORPHER_PHONEME_L;
case sVocalMorpherParameters::EMP_M:
return AL_VOCAL_MORPHER_PHONEME_M;
case sVocalMorpherParameters::EMP_N:
return AL_VOCAL_MORPHER_PHONEME_N;
case sVocalMorpherParameters::EMP_P:
return AL_VOCAL_MORPHER_PHONEME_P;
case sVocalMorpherParameters::EMP_R:
return AL_VOCAL_MORPHER_PHONEME_R;
case sVocalMorpherParameters::EMP_S:
return AL_VOCAL_MORPHER_PHONEME_S;
case sVocalMorpherParameters::EMP_T:
return AL_VOCAL_MORPHER_PHONEME_T;
case sVocalMorpherParameters::EMP_V:
return AL_VOCAL_MORPHER_PHONEME_V;
case sVocalMorpherParameters::EMP_Z:
return AL_VOCAL_MORPHER_PHONEME_Z;
default:
return AL_VOCAL_MORPHER_DEFAULT_PHONEMEA;
};
}
};