cEffect.cpp

00001 // Copyright (c) 2008-2010 Raynaldo (Wildicv) Rivera, Joshua (Dark_Kilauea) Jones
00002 // This file is part of the "cAudio Engine"
00003 // For conditions of distribution and use, see copyright notice in cAudio.h
00004 
00005 #include "../Headers/cEffect.h"
00006 #include "../Headers/cLogger.h"
00007 #include "../Headers/cUtils.h"
00008 
00009 #ifdef CAUDIO_EFX_ENABLED
00010 
00011 namespace cAudio
00012 {
00013         cEffect::cEffect(cEFXFunctions* oALFunctions) : EFX(oALFunctions), Type(EET_NULL),
00014                 Volume(1.0f), IgnoreAttenuation(false), LastUpdated(0), Valid(false), Filter(NULL),
00015                 Effect(0), EffectSlot(0)
00016         {
00017                 cAudioMutexBasicLock lock(Mutex);
00018                 if(EFX)
00019                 {
00020                         if(EFX->Supported)
00021                         {
00022                                 cAudioMutexBasicLock lock(EFX->Mutex);
00023 
00024                                 //Create Effect Slot
00025                                 EFX->alGenAuxiliaryEffectSlots(1, &EffectSlot);
00026                                 bool error = CheckError();
00027                                 if(error)
00028                                 {
00029                                         EffectSlot = 0;
00030                                         return;
00031                                 }
00032 
00033                                 //Create the effect object
00034                                 EFX->alGenEffects(1, &Effect);
00035                                 error = CheckError();
00036                                 if(error)
00037                                 {
00038                                         EFX->alDeleteAuxiliaryEffectSlots(1, &EffectSlot);
00039                                         EffectSlot = 0;
00040                                         Effect = 0;
00041                                         return;
00042                                 }
00043 
00044                                 //Bind the effect to the effect slot
00045                                 EFX->alAuxiliaryEffectSloti(EffectSlot, AL_EFFECTSLOT_EFFECT, Effect);
00046                                 error = CheckError();
00047                                 if(error)
00048                                 {
00049                                         EFX->alDeleteEffects(1, &Effect);
00050                                         EFX->alDeleteAuxiliaryEffectSlots(1, &EffectSlot);
00051                                         EffectSlot = 0;
00052                                         Effect = 0;
00053                                         return;
00054                                 }
00055 
00056                                 //Everything worked, effect is ready to use
00057                                 Valid = true;
00058                         }
00059                 }
00060         }
00061 
00062         cEffect::~cEffect()
00063         {
00064                 cAudioMutexBasicLock lock(Mutex);
00065                 if(EFX && EFX->Supported)
00066                 {
00067                         cAudioMutexBasicLock lock(EFX->Mutex);
00068                         EFX->alAuxiliaryEffectSloti(EffectSlot, AL_EFFECTSLOT_EFFECT, AL_EFFECT_NULL);
00069 
00070                         if(Effect)
00071                         {
00072                                 EFX->alDeleteEffects(1, &Effect);
00073                         }
00074 
00075                         if(EffectSlot)
00076                         {
00077                                 EFX->alDeleteAuxiliaryEffectSlots(1, &EffectSlot);
00078                         }
00079                 }
00080         }
00081 
00082         const EffectTypes& cEffect::getType() const
00083         {
00084                 return Type;
00085         }
00086 
00087         void cEffect::setType(const EffectTypes& type)
00088         {
00089                 cAudioMutexBasicLock lock(Mutex);
00090                 Type = type;
00091                 UpdateEffect();
00092         }
00093 
00094         const sEAXReverbParameters& cEffect::getEAXReverbParameters() const
00095         {
00096                 return EAXReverbParam;
00097         }
00098 
00099         void cEffect::setEAXReverbParameters(const sEAXReverbParameters& param)
00100         {
00101                 cAudioMutexBasicLock lock(Mutex);
00102                 EAXReverbParam = param;
00103                 UpdateEffect();
00104         }
00105 
00106         const sReverbParameters& cEffect::getReverbParameters() const
00107         {
00108                 return ReverbParam;
00109         }
00110 
00111         void cEffect::setReverbParameters(const sReverbParameters& param)
00112         {
00113                 cAudioMutexBasicLock lock(Mutex);
00114                 ReverbParam = param;
00115                 UpdateEffect();
00116         }
00117 
00118         const sChorusParameters& cEffect::getChorusParameters() const
00119         {
00120                 return ChorusParam;
00121         }
00122 
00123         void cEffect::setChorusParameters(const sChorusParameters& param)
00124         {
00125                 cAudioMutexBasicLock lock(Mutex);
00126                 ChorusParam = param;
00127                 UpdateEffect();
00128         }
00129 
00130         const sDistortionParameters& cEffect::getDistortionParameters() const
00131         {
00132                 return DistortionParam;
00133         }
00134 
00135         void cEffect::setDistortionParameters(const sDistortionParameters& param)
00136         {
00137                 cAudioMutexBasicLock lock(Mutex);
00138                 DistortionParam = param;
00139                 UpdateEffect();
00140         }
00141 
00142         const sEchoParameters& cEffect::getEchoParameters() const
00143         {
00144                 return EchoParam;
00145         }
00146 
00147         void cEffect::setEchoParameters(const sEchoParameters& param)
00148         {
00149                 cAudioMutexBasicLock lock(Mutex);
00150                 EchoParam = param;
00151                 UpdateEffect();
00152         }
00153 
00154         const sFlangerParameters& cEffect::getFlangerParameters() const
00155         {
00156                 return FlangerParam;
00157         }
00158 
00159         void cEffect::setFlangerParameters(const sFlangerParameters& param)
00160         {
00161                 cAudioMutexBasicLock lock(Mutex);
00162                 FlangerParam = param;
00163                 UpdateEffect();
00164         }
00165 
00166         const sFrequencyShiftParameters& cEffect::getFrequencyShiftParameters() const
00167         {
00168                 return FrequencyShiftParam;
00169         }
00170 
00171         void cEffect::setFrequencyShiftParameters(const sFrequencyShiftParameters& param)
00172         {
00173                 cAudioMutexBasicLock lock(Mutex);
00174                 FrequencyShiftParam = param;
00175                 UpdateEffect();
00176         }
00177 
00178         const sVocalMorpherParameters& cEffect::getVocalMorpherParameters() const
00179         {
00180                 return VocalMorpherParam;
00181         }
00182 
00183         void cEffect::setVocalMorpherParameters(const sVocalMorpherParameters& param)
00184         {
00185                 cAudioMutexBasicLock lock(Mutex);
00186                 VocalMorpherParam = param;
00187                 UpdateEffect();
00188         }
00189 
00190         const sPitchShifterParameters& cEffect::getPitchShifterParameters() const
00191         {
00192                 return PitchShifterParam;
00193         }
00194 
00195         void cEffect::setPitchShifterParameters(const sPitchShifterParameters& param)
00196         {
00197                 cAudioMutexBasicLock lock(Mutex);
00198                 PitchShifterParam = param;
00199                 UpdateEffect();
00200         }
00201 
00202         const sRingModulatorParameters& cEffect::getRingModulatorParameters() const
00203         {
00204                 return RingModulatorParam;
00205         }
00206 
00207         void cEffect::setRingModulatorParameters(const sRingModulatorParameters& param)
00208         {
00209                 cAudioMutexBasicLock lock(Mutex);
00210                 RingModulatorParam = param;
00211                 UpdateEffect();
00212         }
00213 
00214         const sAutowahParameters& cEffect::getAutowahParameters() const
00215         {
00216                 return AutowahParam;
00217         }
00218 
00219         void cEffect::setAutowahParameters(const sAutowahParameters& param)
00220         {
00221                 cAudioMutexBasicLock lock(Mutex);
00222                 AutowahParam = param;
00223                 UpdateEffect();
00224         }
00225 
00226         const sCompressorParameters& cEffect::getCompressorParameters() const
00227         {
00228                 return CompressorParam;
00229         }
00230 
00231         void cEffect::setCompressorParameters(const sCompressorParameters& param)
00232         {
00233                 cAudioMutexBasicLock lock(Mutex);
00234                 CompressorParam = param;
00235                 UpdateEffect();
00236         }
00237 
00238         const sEqualizerParameters& cEffect::getEqualizerParameters() const
00239         {
00240                 return EqualizerParam;
00241         }
00242 
00243         void cEffect::setEqualizerParameters(const sEqualizerParameters& param)
00244         {
00245                 cAudioMutexBasicLock lock(Mutex);
00246                 EqualizerParam = param;
00247                 UpdateEffect();
00248         }
00249 
00250         float cEffect::getMasterVolume() const
00251         {
00252                 return Volume;
00253         }
00254 
00255         void cEffect::setMasterVolume(const float& volume)
00256         {
00257                 cAudioMutexBasicLock lock(Mutex);
00258                 Volume = volume;
00259                 UpdateEffect();
00260         }
00261 
00262         bool cEffect::isIgnoringAttenuation() const
00263         {
00264                 return IgnoreAttenuation;
00265         }
00266 
00267         void cEffect::ignoreAttenuation(const bool& ignore)
00268         {
00269                 cAudioMutexBasicLock lock(Mutex);
00270                 IgnoreAttenuation = ignore;
00271                 UpdateEffect();
00272         }
00273 
00274         IFilter* cEffect::getFilter() const
00275         {
00276                 return Filter;
00277         }
00278 
00279         void cEffect::attachFilter(IFilter* filter)
00280         {
00281                 cAudioMutexBasicLock lock(Mutex);
00282                 Filter = filter;
00283 
00284                 if(Filter)
00285                         Filter->grab();
00286                 UpdateEffect();
00287         }
00288 
00289         void cEffect::removeFilter()
00290         {
00291                 cAudioMutexBasicLock lock(Mutex);
00292                 if(Filter)
00293                         Filter->drop();
00294                 Filter = NULL;
00295         }
00296 
00297         unsigned int cEffect::getLastUpdated() const
00298         {
00299                 return LastUpdated;
00300         }
00301 
00302         bool cEffect::isValid() const
00303         {
00304                 return Valid;
00305         }
00306 
00307         ALuint cEffect::getOpenALEffect() const
00308         {
00309                 return Effect;
00310         }
00311 
00312         ALuint cEffect::getOpenALEffectSlot() const
00313         {
00314                 return EffectSlot;
00315         }
00316 
00317         bool cEffect::UpdateEffect()
00318         {
00319                 ++LastUpdated;
00320 
00321                 ALenum alEffectType = ConvertEffectEnum(Type);
00322 
00323                 if(EFX && EFX->Supported && EffectSlot && Effect)
00324                 {
00325                         cAudioMutexBasicLock lock(EFX->Mutex);
00326                         EFX->alEffecti(Effect, AL_EFFECT_TYPE, alEffectType);
00327                         Valid = !CheckError();
00328                         if(!Valid)
00329                                 return false;
00330 
00331                         EFX->alAuxiliaryEffectSlotf(EffectSlot, AL_EFFECTSLOT_GAIN, Volume);
00332                         Valid = !CheckError();
00333                         if(!Valid)
00334                                 return false;
00335 
00336                         EFX->alAuxiliaryEffectSloti(EffectSlot, AL_EFFECTSLOT_AUXILIARY_SEND_AUTO, IgnoreAttenuation ? AL_TRUE : AL_FALSE);
00337                         Valid = !CheckError();
00338                         if(!Valid)
00339                                 return false;
00340 
00341                         if(Type == EET_EAX_REVERB)
00342                         {
00343                                 EFX->alEffectf(Effect, AL_EAXREVERB_DENSITY, EAXReverbParam.Density);
00344                                 EFX->alEffectf(Effect, AL_EAXREVERB_DIFFUSION, EAXReverbParam.Diffusion);
00345                                 EFX->alEffectf(Effect, AL_EAXREVERB_GAIN, EAXReverbParam.Gain);
00346                                 EFX->alEffectf(Effect, AL_EAXREVERB_GAINHF, EAXReverbParam.GainHF);
00347                                 EFX->alEffectf(Effect, AL_EAXREVERB_GAINLF, EAXReverbParam.GainLF);
00348                                 EFX->alEffectf(Effect, AL_EAXREVERB_DECAY_TIME, EAXReverbParam.DecayTime);
00349                                 EFX->alEffectf(Effect, AL_EAXREVERB_DECAY_HFRATIO, EAXReverbParam.DecayHFRatio);
00350                                 EFX->alEffectf(Effect, AL_EAXREVERB_DECAY_LFRATIO, EAXReverbParam.DecayLFRatio);
00351                                 EFX->alEffectf(Effect, AL_EAXREVERB_REFLECTIONS_GAIN, EAXReverbParam.ReflectionsGain);
00352                                 EFX->alEffectf(Effect, AL_EAXREVERB_REFLECTIONS_DELAY, EAXReverbParam.ReflectionsDelay);
00353                                 EFX->alEffectfv(Effect, AL_EAXREVERB_REFLECTIONS_PAN, &EAXReverbParam.ReflectionsPan.x);
00354                                 EFX->alEffectf(Effect, AL_EAXREVERB_LATE_REVERB_GAIN, EAXReverbParam.LateReverbGain);
00355                                 EFX->alEffectf(Effect, AL_EAXREVERB_LATE_REVERB_DELAY, EAXReverbParam.LateReverbDelay);
00356                                 EFX->alEffectfv(Effect, AL_EAXREVERB_LATE_REVERB_PAN, &EAXReverbParam.LateReverbPan.x);
00357                                 EFX->alEffectf(Effect, AL_EAXREVERB_ECHO_TIME, EAXReverbParam.EchoTime);
00358                                 EFX->alEffectf(Effect, AL_EAXREVERB_ECHO_DEPTH, EAXReverbParam.EchoDepth);
00359                                 EFX->alEffectf(Effect, AL_EAXREVERB_MODULATION_TIME, EAXReverbParam.ModulationTime);
00360                                 EFX->alEffectf(Effect, AL_EAXREVERB_MODULATION_DEPTH, EAXReverbParam.ModulationDepth);
00361                                 EFX->alEffectf(Effect, AL_EAXREVERB_HFREFERENCE, EAXReverbParam.HFReference);
00362                                 EFX->alEffectf(Effect, AL_EAXREVERB_LFREFERENCE, EAXReverbParam.LFReference);
00363                                 EFX->alEffectf(Effect, AL_EAXREVERB_ROOM_ROLLOFF_FACTOR, EAXReverbParam.RoomRolloffFactor);
00364                                 EFX->alEffectf(Effect, AL_EAXREVERB_AIR_ABSORPTION_GAINHF, EAXReverbParam.AirAbsorptionGainHF);
00365                                 EFX->alEffecti(Effect, AL_EAXREVERB_DECAY_HFLIMIT, EAXReverbParam.DecayHFLimit ? AL_TRUE : AL_FALSE);
00366                                 Valid = !CheckError();
00367                                 return Valid;
00368                         }
00369                         else if(Type == EET_REVERB)
00370                         {
00371                                 EFX->alEffectf(Effect, AL_REVERB_DENSITY, ReverbParam.Density);
00372                                 EFX->alEffectf(Effect, AL_REVERB_DIFFUSION, ReverbParam.Diffusion);
00373                                 EFX->alEffectf(Effect, AL_REVERB_GAIN, ReverbParam.Gain);
00374                                 EFX->alEffectf(Effect, AL_REVERB_GAINHF, ReverbParam.GainHF);
00375                                 EFX->alEffectf(Effect, AL_REVERB_DECAY_TIME, ReverbParam.DecayTime);
00376                                 EFX->alEffectf(Effect, AL_REVERB_DECAY_HFRATIO, ReverbParam.DecayHFRatio);
00377                                 EFX->alEffectf(Effect, AL_REVERB_REFLECTIONS_GAIN, ReverbParam.ReflectionsGain);
00378                                 EFX->alEffectf(Effect, AL_REVERB_REFLECTIONS_DELAY, ReverbParam.ReflectionsDelay);
00379                                 EFX->alEffectf(Effect, AL_REVERB_LATE_REVERB_GAIN, ReverbParam.LateReverbGain);
00380                                 EFX->alEffectf(Effect, AL_REVERB_LATE_REVERB_DELAY, ReverbParam.LateReverbDelay);
00381                                 EFX->alEffectf(Effect, AL_REVERB_ROOM_ROLLOFF_FACTOR, ReverbParam.RoomRolloffFactor);
00382                                 EFX->alEffectf(Effect, AL_REVERB_AIR_ABSORPTION_GAINHF, ReverbParam.AirAbsorptionGainHF);
00383                                 EFX->alEffecti(Effect, AL_REVERB_DECAY_HFLIMIT, ReverbParam.DecayHFLimit ? AL_TRUE : AL_FALSE);
00384                                 Valid = !CheckError();
00385                                 return Valid;
00386                         }
00387                         else if(Type == EET_CHORUS)
00388                         {
00389                                 ALenum waveform = AL_CHORUS_DEFAULT_WAVEFORM;
00390                                 switch(ChorusParam.Waveform)
00391                                 {
00392                                 case sChorusParameters::ECW_SINUSOID:
00393                                         waveform = AL_CHORUS_WAVEFORM_SINUSOID;
00394                                         break;
00395                                 case sChorusParameters::ECW_TRIANGLE:
00396                                         waveform = AL_CHORUS_WAVEFORM_TRIANGLE;
00397                                         break;
00398                                 default:
00399                                         waveform = AL_CHORUS_DEFAULT_WAVEFORM;
00400                                         break;
00401                                 };
00402                                 EFX->alEffecti(Effect, AL_CHORUS_WAVEFORM, waveform);
00403                                 EFX->alEffecti(Effect, AL_CHORUS_PHASE, ChorusParam.Phase);
00404                                 EFX->alEffectf(Effect, AL_CHORUS_RATE, ChorusParam.Rate);
00405                                 EFX->alEffectf(Effect, AL_CHORUS_DEPTH, ChorusParam.Depth);
00406                                 EFX->alEffectf(Effect, AL_CHORUS_FEEDBACK, ChorusParam.Feedback);
00407                                 EFX->alEffectf(Effect, AL_CHORUS_DELAY, ChorusParam.Delay);
00408                                 Valid = !CheckError();
00409                                 return Valid;
00410                         }
00411                         else if(Type == EET_DISTORTION)
00412                         {
00413                                 EFX->alEffectf(Effect, AL_DISTORTION_EDGE, DistortionParam.Edge);
00414                                 EFX->alEffectf(Effect, AL_DISTORTION_GAIN, DistortionParam.Gain);
00415                                 EFX->alEffectf(Effect, AL_DISTORTION_LOWPASS_CUTOFF, DistortionParam.LowpassCutoff);
00416                                 EFX->alEffectf(Effect, AL_DISTORTION_EQCENTER, DistortionParam.EqCenter);
00417                                 EFX->alEffectf(Effect, AL_DISTORTION_EQBANDWIDTH, DistortionParam.EqBandwidth);
00418                                 Valid = !CheckError();
00419                                 return Valid;
00420                         }
00421                         else if(Type == EET_ECHO)
00422                         {
00423                                 EFX->alEffectf(Effect, AL_ECHO_DELAY, EchoParam.Delay);
00424                                 EFX->alEffectf(Effect, AL_ECHO_LRDELAY, EchoParam.LRDelay);
00425                                 EFX->alEffectf(Effect, AL_ECHO_DAMPING, EchoParam.Damping);
00426                                 EFX->alEffectf(Effect, AL_ECHO_FEEDBACK, EchoParam.Feedback);
00427                                 EFX->alEffectf(Effect, AL_ECHO_SPREAD, EchoParam.Spread);
00428                                 Valid = !CheckError();
00429                                 return Valid;
00430                         }
00431                         else if(Type == EET_FLANGER)
00432                         {
00433                                 ALenum waveform = AL_FLANGER_DEFAULT_WAVEFORM;
00434                                 switch(FlangerParam.Waveform)
00435                                 {
00436                                 case sFlangerParameters::EFW_SINUSOID:
00437                                         waveform = AL_FLANGER_WAVEFORM_SINUSOID;
00438                                         break;
00439                                 case sFlangerParameters::EFW_TRIANGLE:
00440                                         waveform = AL_FLANGER_WAVEFORM_SINUSOID;
00441                                         break;
00442                                 default:
00443                                         waveform = AL_FLANGER_DEFAULT_WAVEFORM;
00444                                         break;
00445                                 };
00446                                 EFX->alEffecti(Effect, AL_FLANGER_WAVEFORM, waveform);
00447                                 EFX->alEffecti(Effect, AL_FLANGER_PHASE, FlangerParam.Phase);
00448                                 EFX->alEffectf(Effect, AL_FLANGER_RATE, FlangerParam.Rate);
00449                                 EFX->alEffectf(Effect, AL_FLANGER_DEPTH, FlangerParam.Depth);
00450                                 EFX->alEffectf(Effect, AL_FLANGER_FEEDBACK, FlangerParam.Feedback);
00451                                 EFX->alEffectf(Effect, AL_FLANGER_DELAY, FlangerParam.Delay);
00452                                 Valid = !CheckError();
00453                                 return Valid;
00454                         }
00455                         else if(Type == EET_FREQUENCY_SHIFTER)
00456                         {
00457                                 ALenum shiftleft = ConvertFrequencyShiftEnum(FrequencyShiftParam.Left);
00458                                 ALenum shiftright = ConvertFrequencyShiftEnum(FrequencyShiftParam.Right);
00459                                 EFX->alEffectf(Effect, AL_FREQUENCY_SHIFTER_FREQUENCY, FrequencyShiftParam.Frequency);
00460                                 EFX->alEffecti(Effect, AL_FREQUENCY_SHIFTER_LEFT_DIRECTION, shiftleft);
00461                                 EFX->alEffecti(Effect, AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION, shiftright);
00462                                 Valid = !CheckError();
00463                                 return Valid;
00464                         }
00465                         else if(Type == EET_VOCAL_MORPHER)
00466                         {
00467                                 ALenum pA = ConvertVocalMorphPhonemeEnum(VocalMorpherParam.PhonemeA);
00468                                 ALenum pB = ConvertVocalMorphPhonemeEnum(VocalMorpherParam.PhonemeB);
00469 
00470                                 ALenum waveform = AL_VOCAL_MORPHER_DEFAULT_WAVEFORM;
00471                                 switch(VocalMorpherParam.Waveform)
00472                                 {
00473                                 case sVocalMorpherParameters::EMW_SINUSOID:
00474                                         waveform = AL_VOCAL_MORPHER_WAVEFORM_SINUSOID;
00475                                         break;
00476                                 case sVocalMorpherParameters::EMW_TRIANGLE:
00477                                         waveform = AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE;
00478                                         break;
00479                                 case sVocalMorpherParameters::EMW_SAW:
00480                                         waveform = AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH;
00481                                         break;
00482                                 default:
00483                                         waveform = AL_VOCAL_MORPHER_DEFAULT_WAVEFORM;
00484                                         break;
00485                                 };
00486 
00487                                 EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEA, pA);
00488                                 EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEB, pB);
00489                                 EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING, VocalMorpherParam.PhonemeACoarseTune);
00490                                 EFX->alEffecti(Effect, AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING, VocalMorpherParam.PhonemeBCoarseTune);
00491                                 EFX->alEffecti(Effect, AL_VOCAL_MORPHER_WAVEFORM, waveform);
00492                                 EFX->alEffectf(Effect, AL_VOCAL_MORPHER_RATE, VocalMorpherParam.Rate);
00493                                 Valid = !CheckError();
00494                                 return Valid;
00495                         }
00496                         else if(Type == EET_PITCH_SHIFTER)
00497                         {
00498                                 EFX->alEffecti(Effect, AL_PITCH_SHIFTER_COARSE_TUNE, PitchShifterParam.CoarseTune);
00499                                 EFX->alEffecti(Effect, AL_PITCH_SHIFTER_FINE_TUNE, PitchShifterParam.FineTune);
00500                                 Valid = !CheckError();
00501                                 return Valid;
00502                         }
00503                         else if(Type == EET_RING_MODULATOR)
00504                         {
00505                                 ALenum waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
00506                                 switch(RingModulatorParam.Waveform)
00507                                 {
00508                                 case sRingModulatorParameters::EMW_SINUSOID:
00509                                         waveform = AL_RING_MODULATOR_SINUSOID;
00510                                         break;
00511                                 case sRingModulatorParameters::EMW_SAW:
00512                                         waveform = AL_RING_MODULATOR_SAWTOOTH;
00513                                         break;
00514                                 case sRingModulatorParameters::EMW_SQUARE:
00515                                         waveform = AL_RING_MODULATOR_SQUARE;
00516                                         break;
00517                                 default:
00518                                         waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
00519                                         break;
00520                                 };
00521 
00522                                 EFX->alEffectf(Effect, AL_RING_MODULATOR_FREQUENCY, RingModulatorParam.Frequency);
00523                                 EFX->alEffectf(Effect, AL_RING_MODULATOR_HIGHPASS_CUTOFF, RingModulatorParam.HighPassCutoff);
00524                                 EFX->alEffecti(Effect, AL_RING_MODULATOR_WAVEFORM, waveform);
00525                                 Valid = !CheckError();
00526                                 return Valid;
00527                         }
00528                         else if(Type == EET_AUTOWAH)
00529                         {
00530                                 EFX->alEffectf(Effect, AL_AUTOWAH_ATTACK_TIME, AutowahParam.AttackTime);
00531                                 EFX->alEffectf(Effect, AL_AUTOWAH_RELEASE_TIME, AutowahParam.ReleaseTime);
00532                                 EFX->alEffectf(Effect, AL_AUTOWAH_RESONANCE, AutowahParam.Resonance);
00533                                 EFX->alEffectf(Effect, AL_AUTOWAH_PEAK_GAIN, AutowahParam.PeakGain);
00534                                 Valid = !CheckError();
00535                                 return Valid;
00536                         }
00537                         else if(Type == EET_COMPRESSOR)
00538                         {
00539                                 EFX->alEffecti(Effect, AL_COMPRESSOR_ONOFF, CompressorParam.Active ? AL_TRUE : AL_FALSE);
00540                                 Valid = !CheckError();
00541                                 return Valid;
00542                         }
00543                         else if(Type == EET_EQUALIZER)
00544                         {
00545                                 EFX->alEffectf(Effect, AL_EQUALIZER_LOW_GAIN, EqualizerParam.LowGain);
00546                                 EFX->alEffectf(Effect, AL_EQUALIZER_LOW_CUTOFF, EqualizerParam.LowCutoff);
00547                                 EFX->alEffectf(Effect, AL_EQUALIZER_MID1_GAIN, EqualizerParam.Mid1Gain);
00548                                 EFX->alEffectf(Effect, AL_EQUALIZER_MID1_CENTER, EqualizerParam.Mid1Center);
00549                                 EFX->alEffectf(Effect, AL_EQUALIZER_MID1_WIDTH, EqualizerParam.Mid1Width);
00550                                 EFX->alEffectf(Effect, AL_EQUALIZER_MID2_GAIN, EqualizerParam.Mid2Gain);
00551                                 EFX->alEffectf(Effect, AL_EQUALIZER_MID2_CENTER, EqualizerParam.Mid2Center);
00552                                 EFX->alEffectf(Effect, AL_EQUALIZER_MID2_WIDTH, EqualizerParam.Mid2Width);
00553                                 EFX->alEffectf(Effect, AL_EQUALIZER_HIGH_GAIN, EqualizerParam.HighGain);
00554                                 EFX->alEffectf(Effect, AL_EQUALIZER_HIGH_CUTOFF, EqualizerParam.HighCutoff);
00555                                 Valid = !CheckError();
00556                                 return Valid;
00557                         }
00558                         else
00559                         {
00560                                 return true;
00561                         }
00562                 }
00563                 return false;
00564         }
00565 
00566         bool cEffect::CheckError()
00567         {
00568                 int error = alGetError();
00569                 const char* errorString;
00570 
00571         if (error != AL_NO_ERROR)
00572         {
00573                         errorString = alGetString(error);
00574                         if(error == AL_OUT_OF_MEMORY)
00575                                 getLogger()->logCritical("Audio Effect", "OpenAL Error: %s.", errorString);
00576                         else
00577                                 getLogger()->logError("Audio Effect", "OpenAL Error: %s.", errorString);
00578                         return true;
00579         }
00580                 return false;
00581         }
00582 
00583         ALenum cEffect::ConvertEffectEnum(EffectTypes type)
00584         {
00585                 switch(type)
00586                 {
00587                 case EET_NULL:
00588                         return AL_EFFECT_NULL;
00589                 case EET_EAX_REVERB:
00590                         return AL_EFFECT_EAXREVERB;
00591                 case EET_REVERB:
00592                         return AL_EFFECT_REVERB;
00593                 case EET_CHORUS:
00594                         return AL_EFFECT_CHORUS;
00595                 case EET_DISTORTION:
00596                         return AL_EFFECT_DISTORTION;
00597                 case EET_ECHO:
00598                         return AL_EFFECT_ECHO;
00599                 case EET_FLANGER:
00600                         return AL_EFFECT_FLANGER;
00601                 case EET_FREQUENCY_SHIFTER:
00602                         return AL_EFFECT_FREQUENCY_SHIFTER;
00603                 case EET_VOCAL_MORPHER:
00604                         return AL_EFFECT_VOCAL_MORPHER;
00605                 case EET_PITCH_SHIFTER:
00606                         return AL_EFFECT_PITCH_SHIFTER;
00607                 case EET_RING_MODULATOR:
00608                         return AL_EFFECT_RING_MODULATOR;
00609                 case EET_AUTOWAH:
00610                         return AL_EFFECT_AUTOWAH;
00611                 case EET_COMPRESSOR:
00612                         return AL_EFFECT_COMPRESSOR;
00613                 case EET_EQUALIZER:
00614                         return AL_EFFECT_EQUALIZER;
00615                 default:
00616                         return AL_EFFECT_NULL;
00617                 };
00618         }
00619 
00620         ALenum cEffect::ConvertFrequencyShiftEnum(sFrequencyShiftParameters::ShiftDirection shift)
00621         {
00622                 switch(shift)
00623                 {
00624                 case sFrequencyShiftParameters::ESD_DOWN:
00625                         return AL_FREQUENCY_SHIFTER_DIRECTION_DOWN;
00626                 case sFrequencyShiftParameters::ESD_UP:
00627                         return AL_FREQUENCY_SHIFTER_DIRECTION_UP;
00628                 case sFrequencyShiftParameters::ESD_OFF:
00629                         return AL_FREQUENCY_SHIFTER_DIRECTION_OFF;
00630                 default:
00631                         return AL_FREQUENCY_SHIFTER_DIRECTION_DOWN;
00632                 };
00633         }
00634 
00635         ALenum cEffect::ConvertVocalMorphPhonemeEnum(sVocalMorpherParameters::MorpherPhoneme phoneme)
00636         {
00637                 switch(phoneme)
00638                 {
00639                 case sVocalMorpherParameters::EMP_A:
00640                         return AL_VOCAL_MORPHER_PHONEME_A;
00641                 case sVocalMorpherParameters::EMP_E:
00642                         return AL_VOCAL_MORPHER_PHONEME_E;
00643                 case sVocalMorpherParameters::EMP_I:
00644                         return AL_VOCAL_MORPHER_PHONEME_I;
00645                 case sVocalMorpherParameters::EMP_O:
00646                         return AL_VOCAL_MORPHER_PHONEME_O;
00647                 case sVocalMorpherParameters::EMP_U:
00648                         return AL_VOCAL_MORPHER_PHONEME_U;
00649                 case sVocalMorpherParameters::EMP_AA:
00650                         return AL_VOCAL_MORPHER_PHONEME_AA;
00651                 case sVocalMorpherParameters::EMP_AE:
00652                         return AL_VOCAL_MORPHER_PHONEME_AE;
00653                 case sVocalMorpherParameters::EMP_AH:
00654                         return AL_VOCAL_MORPHER_PHONEME_AH;
00655                 case sVocalMorpherParameters::EMP_AO:
00656                         return AL_VOCAL_MORPHER_PHONEME_AO;
00657                 case sVocalMorpherParameters::EMP_EH:
00658                         return AL_VOCAL_MORPHER_PHONEME_EH;
00659                 case sVocalMorpherParameters::EMP_ER:
00660                         return AL_VOCAL_MORPHER_PHONEME_ER;
00661                 case sVocalMorpherParameters::EMP_IH:
00662                         return AL_VOCAL_MORPHER_PHONEME_IH;
00663                 case sVocalMorpherParameters::EMP_IY:
00664                         return AL_VOCAL_MORPHER_PHONEME_IY;
00665                 case sVocalMorpherParameters::EMP_UH:
00666                         return AL_VOCAL_MORPHER_PHONEME_UH;
00667                 case sVocalMorpherParameters::EMP_UW:
00668                         return AL_VOCAL_MORPHER_PHONEME_UW;
00669                 case sVocalMorpherParameters::EMP_B:
00670                         return AL_VOCAL_MORPHER_PHONEME_B;
00671                 case sVocalMorpherParameters::EMP_D:
00672                         return AL_VOCAL_MORPHER_PHONEME_D;
00673                 case sVocalMorpherParameters::EMP_F:
00674                         return AL_VOCAL_MORPHER_PHONEME_F;
00675                 case sVocalMorpherParameters::EMP_G:
00676                         return AL_VOCAL_MORPHER_PHONEME_G;
00677                 case sVocalMorpherParameters::EMP_J:
00678                         return AL_VOCAL_MORPHER_PHONEME_J;
00679                 case sVocalMorpherParameters::EMP_K:
00680                         return AL_VOCAL_MORPHER_PHONEME_K;
00681                 case sVocalMorpherParameters::EMP_L:
00682                         return AL_VOCAL_MORPHER_PHONEME_L;
00683                 case sVocalMorpherParameters::EMP_M:
00684                         return AL_VOCAL_MORPHER_PHONEME_M;
00685                 case sVocalMorpherParameters::EMP_N:
00686                         return AL_VOCAL_MORPHER_PHONEME_N;
00687                 case sVocalMorpherParameters::EMP_P:
00688                         return AL_VOCAL_MORPHER_PHONEME_P;
00689                 case sVocalMorpherParameters::EMP_R:
00690                         return AL_VOCAL_MORPHER_PHONEME_R;
00691                 case sVocalMorpherParameters::EMP_S:
00692                         return AL_VOCAL_MORPHER_PHONEME_S;
00693                 case sVocalMorpherParameters::EMP_T:
00694                         return AL_VOCAL_MORPHER_PHONEME_T;
00695                 case sVocalMorpherParameters::EMP_V:
00696                         return AL_VOCAL_MORPHER_PHONEME_V;
00697                 case sVocalMorpherParameters::EMP_Z:
00698                         return AL_VOCAL_MORPHER_PHONEME_Z;
00699                 default:
00700                         return AL_VOCAL_MORPHER_DEFAULT_PHONEMEA;
00701                 };
00702         }
00703 };
00704 
00705 #endif
 All Classes Namespaces Functions Variables Enumerations

Generated on Sat Feb 20 22:55:08 2010 for cAudio by  doxygen 1.6.2