// 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/cEffect.h" #include "../Headers/cLogger.h" #include "../Headers/cUtils.h" #ifdef CAUDIO_EFX_ENABLED 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; }; } }; #endif