00001
00002
00003
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
00025 EFX->alGenAuxiliaryEffectSlots(1, &EffectSlot);
00026 bool error = CheckError();
00027 if(error)
00028 {
00029 EffectSlot = 0;
00030 return;
00031 }
00032
00033
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
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
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