rlm@0: /** rlm@0: * OpenAL cross platform audio library rlm@0: * Copyright (C) 1999-2007 by authors. rlm@0: * This library is free software; you can redistribute it and/or rlm@0: * modify it under the terms of the GNU Library General Public rlm@0: * License as published by the Free Software Foundation; either rlm@0: * version 2 of the License, or (at your option) any later version. rlm@0: * rlm@0: * This library is distributed in the hope that it will be useful, rlm@0: * but WITHOUT ANY WARRANTY; without even the implied warranty of rlm@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU rlm@0: * Library General Public License for more details. rlm@0: * rlm@0: * You should have received a copy of the GNU Library General Public rlm@0: * License along with this library; if not, write to the rlm@0: * Free Software Foundation, Inc., 59 Temple Place - Suite 330, rlm@0: * Boston, MA 02111-1307, USA. rlm@0: * Or go to http://www.gnu.org/copyleft/lgpl.html rlm@0: */ rlm@0: rlm@0: #include "config.h" rlm@0: rlm@0: #include rlm@0: #include rlm@0: rlm@0: #include "AL/al.h" rlm@0: #include "AL/alc.h" rlm@0: #include "alMain.h" rlm@0: #include "alEffect.h" rlm@0: #include "alThunk.h" rlm@0: #include "alError.h" rlm@0: rlm@0: rlm@0: ALboolean DisabledEffects[MAX_EFFECTS]; rlm@0: rlm@0: rlm@0: static void InitEffectParams(ALeffect *effect, ALenum type); rlm@0: rlm@0: #define LookupEffect(m, k) ((ALeffect*)LookupUIntMapKey(&(m), (k))) rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALsizei i=0; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: if(n < 0 || IsBadWritePtr((void*)effects, n * sizeof(ALuint))) rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: else rlm@0: { rlm@0: ALCdevice *device = Context->Device; rlm@0: ALenum err; rlm@0: rlm@0: while(i < n) rlm@0: { rlm@0: ALeffect *effect = calloc(1, sizeof(ALeffect)); rlm@0: if(!effect) rlm@0: { rlm@0: alSetError(Context, AL_OUT_OF_MEMORY); rlm@0: alDeleteEffects(i, effects); rlm@0: break; rlm@0: } rlm@0: rlm@0: err = NewThunkEntry(&effect->effect); rlm@0: if(err == AL_NO_ERROR) rlm@0: err = InsertUIntMapEntry(&device->EffectMap, effect->effect, effect); rlm@0: if(err != AL_NO_ERROR) rlm@0: { rlm@0: FreeThunkEntry(effect->effect); rlm@0: memset(effect, 0, sizeof(ALeffect)); rlm@0: free(effect); rlm@0: rlm@0: alSetError(Context, err); rlm@0: alDeleteEffects(i, effects); rlm@0: break; rlm@0: } rlm@0: rlm@0: effects[i++] = effect->effect; rlm@0: InitEffectParams(effect, AL_EFFECT_NULL); rlm@0: } rlm@0: } rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, ALuint *effects) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *device; rlm@0: ALeffect *ALEffect; rlm@0: ALboolean Failed; rlm@0: ALsizei i; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Failed = AL_TRUE; rlm@0: device = Context->Device; rlm@0: if(n < 0) rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: else rlm@0: { rlm@0: Failed = AL_FALSE; rlm@0: // Check that all effects are valid rlm@0: for(i = 0;i < n;i++) rlm@0: { rlm@0: if(!effects[i]) rlm@0: continue; rlm@0: rlm@0: if(LookupEffect(device->EffectMap, effects[i]) == NULL) rlm@0: { rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: Failed = AL_TRUE; rlm@0: break; rlm@0: } rlm@0: } rlm@0: } rlm@0: rlm@0: if(!Failed) rlm@0: { rlm@0: // All effects are valid rlm@0: for(i = 0;i < n;i++) rlm@0: { rlm@0: // Recheck that the effect is valid, because there could be duplicated names rlm@0: if((ALEffect=LookupEffect(device->EffectMap, effects[i])) == NULL) rlm@0: continue; rlm@0: rlm@0: RemoveUIntMapKey(&device->EffectMap, ALEffect->effect); rlm@0: FreeThunkEntry(ALEffect->effect); rlm@0: rlm@0: memset(ALEffect, 0, sizeof(ALeffect)); rlm@0: free(ALEffect); rlm@0: } rlm@0: } rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALboolean result; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return AL_FALSE; rlm@0: rlm@0: result = ((!effect || LookupEffect(Context->Device->EffectMap, effect)) ? rlm@0: AL_TRUE : AL_FALSE); rlm@0: rlm@0: UnlockContext(Context); rlm@0: rlm@0: return result; rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *Device; rlm@0: ALeffect *ALEffect; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Device = Context->Device; rlm@0: if((ALEffect=LookupEffect(Device->EffectMap, effect)) != NULL) rlm@0: { rlm@0: if(param == AL_EFFECT_TYPE) rlm@0: { rlm@0: ALboolean isOk = (iValue == AL_EFFECT_NULL); rlm@0: ALint i; rlm@0: for(i = 0;!isOk && EffectList[i].val;i++) rlm@0: { rlm@0: if(iValue == EffectList[i].val && rlm@0: !DisabledEffects[EffectList[i].type]) rlm@0: isOk = AL_TRUE; rlm@0: } rlm@0: rlm@0: if(isOk) rlm@0: InitEffectParams(ALEffect, iValue); rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_EAXREVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_EAXREVERB_DECAY_HFLIMIT: rlm@0: if(iValue >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && rlm@0: iValue <= AL_EAXREVERB_MAX_DECAY_HFLIMIT) rlm@0: ALEffect->Params.Reverb.DecayHFLimit = iValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_REVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_REVERB_DECAY_HFLIMIT: rlm@0: if(iValue >= AL_REVERB_MIN_DECAY_HFLIMIT && rlm@0: iValue <= AL_REVERB_MAX_DECAY_HFLIMIT) rlm@0: ALEffect->Params.Reverb.DecayHFLimit = iValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_ECHO) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_RING_MODULATOR) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_RING_MODULATOR_FREQUENCY: rlm@0: if(iValue >= AL_RING_MODULATOR_MIN_FREQUENCY && rlm@0: iValue <= AL_RING_MODULATOR_MAX_FREQUENCY) rlm@0: ALEffect->Params.Modulator.Frequency = iValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_RING_MODULATOR_HIGHPASS_CUTOFF: rlm@0: if(iValue >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF && rlm@0: iValue <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF) rlm@0: ALEffect->Params.Modulator.HighPassCutoff = iValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_RING_MODULATOR_WAVEFORM: rlm@0: if(iValue >= AL_RING_MODULATOR_MIN_WAVEFORM && rlm@0: iValue <= AL_RING_MODULATOR_MAX_WAVEFORM) rlm@0: ALEffect->Params.Modulator.Waveform = iValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, ALint *piValues) rlm@0: { rlm@0: /* There are no multi-value int effect parameters */ rlm@0: alEffecti(effect, param, piValues[0]); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *Device; rlm@0: ALeffect *ALEffect; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Device = Context->Device; rlm@0: if((ALEffect=LookupEffect(Device->EffectMap, effect)) != NULL) rlm@0: { rlm@0: if(ALEffect->type == AL_EFFECT_EAXREVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_EAXREVERB_DENSITY: rlm@0: if(flValue >= AL_EAXREVERB_MIN_DENSITY && rlm@0: flValue <= AL_EAXREVERB_MAX_DENSITY) rlm@0: ALEffect->Params.Reverb.Density = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DIFFUSION: rlm@0: if(flValue >= AL_EAXREVERB_MIN_DIFFUSION && rlm@0: flValue <= AL_EAXREVERB_MAX_DIFFUSION) rlm@0: ALEffect->Params.Reverb.Diffusion = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_GAIN: rlm@0: if(flValue >= AL_EAXREVERB_MIN_GAIN && rlm@0: flValue <= AL_EAXREVERB_MAX_GAIN) rlm@0: ALEffect->Params.Reverb.Gain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_GAINHF: rlm@0: if(flValue >= AL_EAXREVERB_MIN_GAINHF && rlm@0: flValue <= AL_EAXREVERB_MAX_GAINHF) rlm@0: ALEffect->Params.Reverb.GainHF = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_GAINLF: rlm@0: if(flValue >= AL_EAXREVERB_MIN_GAINLF && rlm@0: flValue <= AL_EAXREVERB_MAX_GAINLF) rlm@0: ALEffect->Params.Reverb.GainLF = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DECAY_TIME: rlm@0: if(flValue >= AL_EAXREVERB_MIN_DECAY_TIME && rlm@0: flValue <= AL_EAXREVERB_MAX_DECAY_TIME) rlm@0: ALEffect->Params.Reverb.DecayTime = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DECAY_HFRATIO: rlm@0: if(flValue >= AL_EAXREVERB_MIN_DECAY_HFRATIO && rlm@0: flValue <= AL_EAXREVERB_MAX_DECAY_HFRATIO) rlm@0: ALEffect->Params.Reverb.DecayHFRatio = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DECAY_LFRATIO: rlm@0: if(flValue >= AL_EAXREVERB_MIN_DECAY_LFRATIO && rlm@0: flValue <= AL_EAXREVERB_MAX_DECAY_LFRATIO) rlm@0: ALEffect->Params.Reverb.DecayLFRatio = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_REFLECTIONS_GAIN: rlm@0: if(flValue >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN && rlm@0: flValue <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN) rlm@0: ALEffect->Params.Reverb.ReflectionsGain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_REFLECTIONS_DELAY: rlm@0: if(flValue >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY && rlm@0: flValue <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY) rlm@0: ALEffect->Params.Reverb.ReflectionsDelay = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_LATE_REVERB_GAIN: rlm@0: if(flValue >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN && rlm@0: flValue <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN) rlm@0: ALEffect->Params.Reverb.LateReverbGain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_LATE_REVERB_DELAY: rlm@0: if(flValue >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY && rlm@0: flValue <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY) rlm@0: ALEffect->Params.Reverb.LateReverbDelay = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: rlm@0: if(flValue >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF && rlm@0: flValue <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF) rlm@0: ALEffect->Params.Reverb.AirAbsorptionGainHF = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_ECHO_TIME: rlm@0: if(flValue >= AL_EAXREVERB_MIN_ECHO_TIME && rlm@0: flValue <= AL_EAXREVERB_MAX_ECHO_TIME) rlm@0: ALEffect->Params.Reverb.EchoTime = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_ECHO_DEPTH: rlm@0: if(flValue >= AL_EAXREVERB_MIN_ECHO_DEPTH && rlm@0: flValue <= AL_EAXREVERB_MAX_ECHO_DEPTH) rlm@0: ALEffect->Params.Reverb.EchoDepth = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_MODULATION_TIME: rlm@0: if(flValue >= AL_EAXREVERB_MIN_MODULATION_TIME && rlm@0: flValue <= AL_EAXREVERB_MAX_MODULATION_TIME) rlm@0: ALEffect->Params.Reverb.ModulationTime = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_MODULATION_DEPTH: rlm@0: if(flValue >= AL_EAXREVERB_MIN_MODULATION_DEPTH && rlm@0: flValue <= AL_EAXREVERB_MAX_MODULATION_DEPTH) rlm@0: ALEffect->Params.Reverb.ModulationDepth = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_HFREFERENCE: rlm@0: if(flValue >= AL_EAXREVERB_MIN_HFREFERENCE && rlm@0: flValue <= AL_EAXREVERB_MAX_HFREFERENCE) rlm@0: ALEffect->Params.Reverb.HFReference = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_LFREFERENCE: rlm@0: if(flValue >= AL_EAXREVERB_MIN_LFREFERENCE && rlm@0: flValue <= AL_EAXREVERB_MAX_LFREFERENCE) rlm@0: ALEffect->Params.Reverb.LFReference = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: rlm@0: if(flValue >= 0.0f && flValue <= 10.0f) rlm@0: ALEffect->Params.Reverb.RoomRolloffFactor = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_REVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_REVERB_DENSITY: rlm@0: if(flValue >= AL_REVERB_MIN_DENSITY && rlm@0: flValue <= AL_REVERB_MAX_DENSITY) rlm@0: ALEffect->Params.Reverb.Density = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_DIFFUSION: rlm@0: if(flValue >= AL_REVERB_MIN_DIFFUSION && rlm@0: flValue <= AL_REVERB_MAX_DIFFUSION) rlm@0: ALEffect->Params.Reverb.Diffusion = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_GAIN: rlm@0: if(flValue >= AL_REVERB_MIN_GAIN && rlm@0: flValue <= AL_REVERB_MAX_GAIN) rlm@0: ALEffect->Params.Reverb.Gain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_GAINHF: rlm@0: if(flValue >= AL_REVERB_MIN_GAINHF && rlm@0: flValue <= AL_REVERB_MAX_GAINHF) rlm@0: ALEffect->Params.Reverb.GainHF = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_DECAY_TIME: rlm@0: if(flValue >= AL_REVERB_MIN_DECAY_TIME && rlm@0: flValue <= AL_REVERB_MAX_DECAY_TIME) rlm@0: ALEffect->Params.Reverb.DecayTime = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_DECAY_HFRATIO: rlm@0: if(flValue >= AL_REVERB_MIN_DECAY_HFRATIO && rlm@0: flValue <= AL_REVERB_MAX_DECAY_HFRATIO) rlm@0: ALEffect->Params.Reverb.DecayHFRatio = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_REFLECTIONS_GAIN: rlm@0: if(flValue >= AL_REVERB_MIN_REFLECTIONS_GAIN && rlm@0: flValue <= AL_REVERB_MAX_REFLECTIONS_GAIN) rlm@0: ALEffect->Params.Reverb.ReflectionsGain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_REFLECTIONS_DELAY: rlm@0: if(flValue >= AL_REVERB_MIN_REFLECTIONS_DELAY && rlm@0: flValue <= AL_REVERB_MAX_REFLECTIONS_DELAY) rlm@0: ALEffect->Params.Reverb.ReflectionsDelay = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_LATE_REVERB_GAIN: rlm@0: if(flValue >= AL_REVERB_MIN_LATE_REVERB_GAIN && rlm@0: flValue <= AL_REVERB_MAX_LATE_REVERB_GAIN) rlm@0: ALEffect->Params.Reverb.LateReverbGain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_LATE_REVERB_DELAY: rlm@0: if(flValue >= AL_REVERB_MIN_LATE_REVERB_DELAY && rlm@0: flValue <= AL_REVERB_MAX_LATE_REVERB_DELAY) rlm@0: ALEffect->Params.Reverb.LateReverbDelay = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_AIR_ABSORPTION_GAINHF: rlm@0: if(flValue >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF && rlm@0: flValue <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF) rlm@0: ALEffect->Params.Reverb.AirAbsorptionGainHF = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_REVERB_ROOM_ROLLOFF_FACTOR: rlm@0: if(flValue >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR && rlm@0: flValue <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR) rlm@0: ALEffect->Params.Reverb.RoomRolloffFactor = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_ECHO) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_ECHO_DELAY: rlm@0: if(flValue >= AL_ECHO_MIN_DELAY && flValue <= AL_ECHO_MAX_DELAY) rlm@0: ALEffect->Params.Echo.Delay = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_ECHO_LRDELAY: rlm@0: if(flValue >= AL_ECHO_MIN_LRDELAY && flValue <= AL_ECHO_MAX_LRDELAY) rlm@0: ALEffect->Params.Echo.LRDelay = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_ECHO_DAMPING: rlm@0: if(flValue >= AL_ECHO_MIN_DAMPING && flValue <= AL_ECHO_MAX_DAMPING) rlm@0: ALEffect->Params.Echo.Damping = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_ECHO_FEEDBACK: rlm@0: if(flValue >= AL_ECHO_MIN_FEEDBACK && flValue <= AL_ECHO_MAX_FEEDBACK) rlm@0: ALEffect->Params.Echo.Feedback = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_ECHO_SPREAD: rlm@0: if(flValue >= AL_ECHO_MIN_SPREAD && flValue <= AL_ECHO_MAX_SPREAD) rlm@0: ALEffect->Params.Echo.Spread = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_RING_MODULATOR) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_RING_MODULATOR_FREQUENCY: rlm@0: if(flValue >= AL_RING_MODULATOR_MIN_FREQUENCY && rlm@0: flValue <= AL_RING_MODULATOR_MAX_FREQUENCY) rlm@0: ALEffect->Params.Modulator.Frequency = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: case AL_RING_MODULATOR_HIGHPASS_CUTOFF: rlm@0: if(flValue >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF && rlm@0: flValue <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF) rlm@0: ALEffect->Params.Modulator.HighPassCutoff = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT || rlm@0: ALEffect->type == AL_EFFECT_DEDICATED_DIALOGUE) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_DEDICATED_GAIN: rlm@0: if(flValue >= 0.0f && isfinite(flValue)) rlm@0: ALEffect->Params.Dedicated.Gain = flValue; rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, ALfloat *pflValues) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *Device; rlm@0: ALeffect *ALEffect; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Device = Context->Device; rlm@0: if((ALEffect=LookupEffect(Device->EffectMap, effect)) != NULL) rlm@0: { rlm@0: if(ALEffect->type == AL_EFFECT_EAXREVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_EAXREVERB_REFLECTIONS_PAN: rlm@0: if(isfinite(pflValues[0]) && isfinite(pflValues[1]) && isfinite(pflValues[2])) rlm@0: { rlm@0: ALEffect->Params.Reverb.ReflectionsPan[0] = pflValues[0]; rlm@0: ALEffect->Params.Reverb.ReflectionsPan[1] = pflValues[1]; rlm@0: ALEffect->Params.Reverb.ReflectionsPan[2] = pflValues[2]; rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: case AL_EAXREVERB_LATE_REVERB_PAN: rlm@0: if(isfinite(pflValues[0]) && isfinite(pflValues[1]) && isfinite(pflValues[2])) rlm@0: { rlm@0: ALEffect->Params.Reverb.LateReverbPan[0] = pflValues[0]; rlm@0: ALEffect->Params.Reverb.LateReverbPan[1] = pflValues[1]; rlm@0: ALEffect->Params.Reverb.LateReverbPan[2] = pflValues[2]; rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_VALUE); rlm@0: break; rlm@0: rlm@0: default: rlm@0: UnlockContext(Context); rlm@0: alEffectf(effect, param, pflValues[0]); rlm@0: return; rlm@0: } rlm@0: } rlm@0: else rlm@0: { rlm@0: UnlockContext(Context); rlm@0: alEffectf(effect, param, pflValues[0]); rlm@0: return; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *Device; rlm@0: ALeffect *ALEffect; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Device = Context->Device; rlm@0: if((ALEffect=LookupEffect(Device->EffectMap, effect)) != NULL) rlm@0: { rlm@0: if(param == AL_EFFECT_TYPE) rlm@0: { rlm@0: *piValue = ALEffect->type; rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_EAXREVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_EAXREVERB_DECAY_HFLIMIT: rlm@0: *piValue = ALEffect->Params.Reverb.DecayHFLimit; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_REVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_REVERB_DECAY_HFLIMIT: rlm@0: *piValue = ALEffect->Params.Reverb.DecayHFLimit; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_ECHO) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_RING_MODULATOR) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_RING_MODULATOR_FREQUENCY: rlm@0: *piValue = (ALint)ALEffect->Params.Modulator.Frequency; rlm@0: break; rlm@0: case AL_RING_MODULATOR_HIGHPASS_CUTOFF: rlm@0: *piValue = (ALint)ALEffect->Params.Modulator.HighPassCutoff; rlm@0: break; rlm@0: case AL_RING_MODULATOR_WAVEFORM: rlm@0: *piValue = ALEffect->Params.Modulator.Waveform; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues) rlm@0: { rlm@0: /* There are no multi-value int effect parameters */ rlm@0: alGetEffecti(effect, param, piValues); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *Device; rlm@0: ALeffect *ALEffect; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Device = Context->Device; rlm@0: if((ALEffect=LookupEffect(Device->EffectMap, effect)) != NULL) rlm@0: { rlm@0: if(ALEffect->type == AL_EFFECT_EAXREVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_EAXREVERB_DENSITY: rlm@0: *pflValue = ALEffect->Params.Reverb.Density; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DIFFUSION: rlm@0: *pflValue = ALEffect->Params.Reverb.Diffusion; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_GAIN: rlm@0: *pflValue = ALEffect->Params.Reverb.Gain; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_GAINHF: rlm@0: *pflValue = ALEffect->Params.Reverb.GainHF; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_GAINLF: rlm@0: *pflValue = ALEffect->Params.Reverb.GainLF; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DECAY_TIME: rlm@0: *pflValue = ALEffect->Params.Reverb.DecayTime; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DECAY_HFRATIO: rlm@0: *pflValue = ALEffect->Params.Reverb.DecayHFRatio; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_DECAY_LFRATIO: rlm@0: *pflValue = ALEffect->Params.Reverb.DecayLFRatio; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_REFLECTIONS_GAIN: rlm@0: *pflValue = ALEffect->Params.Reverb.ReflectionsGain; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_REFLECTIONS_DELAY: rlm@0: *pflValue = ALEffect->Params.Reverb.ReflectionsDelay; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_LATE_REVERB_GAIN: rlm@0: *pflValue = ALEffect->Params.Reverb.LateReverbGain; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_LATE_REVERB_DELAY: rlm@0: *pflValue = ALEffect->Params.Reverb.LateReverbDelay; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: rlm@0: *pflValue = ALEffect->Params.Reverb.AirAbsorptionGainHF; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_ECHO_TIME: rlm@0: *pflValue = ALEffect->Params.Reverb.EchoTime; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_ECHO_DEPTH: rlm@0: *pflValue = ALEffect->Params.Reverb.EchoDepth; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_MODULATION_TIME: rlm@0: *pflValue = ALEffect->Params.Reverb.ModulationTime; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_MODULATION_DEPTH: rlm@0: *pflValue = ALEffect->Params.Reverb.ModulationDepth; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_HFREFERENCE: rlm@0: *pflValue = ALEffect->Params.Reverb.HFReference; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_LFREFERENCE: rlm@0: *pflValue = ALEffect->Params.Reverb.LFReference; rlm@0: break; rlm@0: rlm@0: case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: rlm@0: *pflValue = ALEffect->Params.Reverb.RoomRolloffFactor; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_REVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_REVERB_DENSITY: rlm@0: *pflValue = ALEffect->Params.Reverb.Density; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_DIFFUSION: rlm@0: *pflValue = ALEffect->Params.Reverb.Diffusion; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_GAIN: rlm@0: *pflValue = ALEffect->Params.Reverb.Gain; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_GAINHF: rlm@0: *pflValue = ALEffect->Params.Reverb.GainHF; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_DECAY_TIME: rlm@0: *pflValue = ALEffect->Params.Reverb.DecayTime; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_DECAY_HFRATIO: rlm@0: *pflValue = ALEffect->Params.Reverb.DecayHFRatio; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_REFLECTIONS_GAIN: rlm@0: *pflValue = ALEffect->Params.Reverb.ReflectionsGain; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_REFLECTIONS_DELAY: rlm@0: *pflValue = ALEffect->Params.Reverb.ReflectionsDelay; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_LATE_REVERB_GAIN: rlm@0: *pflValue = ALEffect->Params.Reverb.LateReverbGain; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_LATE_REVERB_DELAY: rlm@0: *pflValue = ALEffect->Params.Reverb.LateReverbDelay; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_AIR_ABSORPTION_GAINHF: rlm@0: *pflValue = ALEffect->Params.Reverb.AirAbsorptionGainHF; rlm@0: break; rlm@0: rlm@0: case AL_REVERB_ROOM_ROLLOFF_FACTOR: rlm@0: *pflValue = ALEffect->Params.Reverb.RoomRolloffFactor; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_ECHO) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_ECHO_DELAY: rlm@0: *pflValue = ALEffect->Params.Echo.Delay; rlm@0: break; rlm@0: rlm@0: case AL_ECHO_LRDELAY: rlm@0: *pflValue = ALEffect->Params.Echo.LRDelay; rlm@0: break; rlm@0: rlm@0: case AL_ECHO_DAMPING: rlm@0: *pflValue = ALEffect->Params.Echo.Damping; rlm@0: break; rlm@0: rlm@0: case AL_ECHO_FEEDBACK: rlm@0: *pflValue = ALEffect->Params.Echo.Feedback; rlm@0: break; rlm@0: rlm@0: case AL_ECHO_SPREAD: rlm@0: *pflValue = ALEffect->Params.Echo.Spread; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_RING_MODULATOR) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_RING_MODULATOR_FREQUENCY: rlm@0: *pflValue = ALEffect->Params.Modulator.Frequency; rlm@0: break; rlm@0: case AL_RING_MODULATOR_HIGHPASS_CUTOFF: rlm@0: *pflValue = ALEffect->Params.Modulator.HighPassCutoff; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else if(ALEffect->type == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT || rlm@0: ALEffect->type == AL_EFFECT_DEDICATED_DIALOGUE) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_DEDICATED_GAIN: rlm@0: *pflValue = ALEffect->Params.Dedicated.Gain; rlm@0: break; rlm@0: rlm@0: default: rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: break; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_ENUM); rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues) rlm@0: { rlm@0: ALCcontext *Context; rlm@0: ALCdevice *Device; rlm@0: ALeffect *ALEffect; rlm@0: rlm@0: Context = GetLockedContext(); rlm@0: if(!Context) return; rlm@0: rlm@0: Device = Context->Device; rlm@0: if((ALEffect=LookupEffect(Device->EffectMap, effect)) != NULL) rlm@0: { rlm@0: if(ALEffect->type == AL_EFFECT_EAXREVERB) rlm@0: { rlm@0: switch(param) rlm@0: { rlm@0: case AL_EAXREVERB_REFLECTIONS_PAN: rlm@0: pflValues[0] = ALEffect->Params.Reverb.ReflectionsPan[0]; rlm@0: pflValues[1] = ALEffect->Params.Reverb.ReflectionsPan[1]; rlm@0: pflValues[2] = ALEffect->Params.Reverb.ReflectionsPan[2]; rlm@0: break; rlm@0: case AL_EAXREVERB_LATE_REVERB_PAN: rlm@0: pflValues[0] = ALEffect->Params.Reverb.LateReverbPan[0]; rlm@0: pflValues[1] = ALEffect->Params.Reverb.LateReverbPan[1]; rlm@0: pflValues[2] = ALEffect->Params.Reverb.LateReverbPan[2]; rlm@0: break; rlm@0: rlm@0: default: rlm@0: UnlockContext(Context); rlm@0: alGetEffectf(effect, param, pflValues); rlm@0: return; rlm@0: } rlm@0: } rlm@0: else rlm@0: { rlm@0: UnlockContext(Context); rlm@0: alGetEffectf(effect, param, pflValues); rlm@0: return; rlm@0: } rlm@0: } rlm@0: else rlm@0: alSetError(Context, AL_INVALID_NAME); rlm@0: rlm@0: UnlockContext(Context); rlm@0: } rlm@0: rlm@0: rlm@0: ALvoid ReleaseALEffects(ALCdevice *device) rlm@0: { rlm@0: ALsizei i; rlm@0: for(i = 0;i < device->EffectMap.size;i++) rlm@0: { rlm@0: ALeffect *temp = device->EffectMap.array[i].value; rlm@0: device->EffectMap.array[i].value = NULL; rlm@0: rlm@0: // Release effect structure rlm@0: FreeThunkEntry(temp->effect); rlm@0: memset(temp, 0, sizeof(ALeffect)); rlm@0: free(temp); rlm@0: } rlm@0: } rlm@0: rlm@0: rlm@0: static void InitEffectParams(ALeffect *effect, ALenum type) rlm@0: { rlm@0: effect->type = type; rlm@0: switch(type) rlm@0: { rlm@0: /* NOTE: Standard reverb and EAX reverb use the same defaults for the rlm@0: * shared parameters, and EAX's additional parameters default to rlm@0: * values assumed by standard reverb. rlm@0: */ rlm@0: case AL_EFFECT_EAXREVERB: rlm@0: case AL_EFFECT_REVERB: rlm@0: effect->Params.Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY; rlm@0: effect->Params.Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION; rlm@0: effect->Params.Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN; rlm@0: effect->Params.Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF; rlm@0: effect->Params.Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF; rlm@0: effect->Params.Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME; rlm@0: effect->Params.Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO; rlm@0: effect->Params.Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO; rlm@0: effect->Params.Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN; rlm@0: effect->Params.Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY; rlm@0: effect->Params.Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; rlm@0: effect->Params.Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; rlm@0: effect->Params.Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ; rlm@0: effect->Params.Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN; rlm@0: effect->Params.Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY; rlm@0: effect->Params.Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; rlm@0: effect->Params.Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; rlm@0: effect->Params.Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ; rlm@0: effect->Params.Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME; rlm@0: effect->Params.Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH; rlm@0: effect->Params.Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME; rlm@0: effect->Params.Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH; rlm@0: effect->Params.Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF; rlm@0: effect->Params.Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE; rlm@0: effect->Params.Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE; rlm@0: effect->Params.Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; rlm@0: effect->Params.Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT; rlm@0: break; rlm@0: case AL_EFFECT_ECHO: rlm@0: effect->Params.Echo.Delay = AL_ECHO_DEFAULT_DELAY; rlm@0: effect->Params.Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY; rlm@0: effect->Params.Echo.Damping = AL_ECHO_DEFAULT_DAMPING; rlm@0: effect->Params.Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK; rlm@0: effect->Params.Echo.Spread = AL_ECHO_DEFAULT_SPREAD; rlm@0: break; rlm@0: case AL_EFFECT_RING_MODULATOR: rlm@0: effect->Params.Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY; rlm@0: effect->Params.Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF; rlm@0: effect->Params.Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM; rlm@0: break; rlm@0: case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT: rlm@0: case AL_EFFECT_DEDICATED_DIALOGUE: rlm@0: effect->Params.Dedicated.Gain = 1.0f; rlm@0: break; rlm@0: } rlm@0: }