diff options
author | Chris Robinson <[email protected]> | 2008-11-16 00:29:49 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2008-11-16 00:29:49 -0800 |
commit | c0ccd31a3e5294ffa6f138ff755177cd9bad6a4b (patch) | |
tree | ea66f6c89ba033ff16cfbca970ef6ed056a7e770 /OpenAL32/alAuxEffectSlot.c | |
parent | d72b132c57145bd6cd4c531fe0a8c65b348c2c29 (diff) |
Implement a new reverb effect
Code created and graciously provided by Christopher Fitzgerald
Diffstat (limited to 'OpenAL32/alAuxEffectSlot.c')
-rw-r--r-- | OpenAL32/alAuxEffectSlot.c | 51 |
1 files changed, 9 insertions, 42 deletions
diff --git a/OpenAL32/alAuxEffectSlot.c b/OpenAL32/alAuxEffectSlot.c index 235d1b8d..dd524f02 100644 --- a/OpenAL32/alAuxEffectSlot.c +++ b/OpenAL32/alAuxEffectSlot.c @@ -29,6 +29,7 @@ #include "alAuxEffectSlot.h" #include "alThunk.h" #include "alError.h" +#include "alReverb.h" static ALvoid InitializeEffect(ALCcontext *Context, ALeffectslot *ALEffectSlot, ALeffect *effect); @@ -148,7 +149,7 @@ ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots) *list = (*list)->next; ALTHUNK_REMOVEENTRY(ALAuxiliaryEffectSlot->effectslot); - free(ALAuxiliaryEffectSlot->ReverbBuffer); + VerbDestroy(ALAuxiliaryEffectSlot->ReverbState); memset(ALAuxiliaryEffectSlot, 0, sizeof(ALeffectslot)); free(ALAuxiliaryEffectSlot); @@ -467,54 +468,20 @@ ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, A static ALvoid InitializeEffect(ALCcontext *Context, ALeffectslot *ALEffectSlot, ALeffect *effect) { - ALfloat *ptr = NULL; - if(!effect) { memset(&ALEffectSlot->effect, 0, sizeof(ALEffectSlot->effect)); - goto done; + VerbDestroy(ALEffectSlot->ReverbState); + ALEffectSlot->ReverbState = NULL; + return; } - if(effect->type == AL_EFFECT_REVERB) { - ALuint size; - ALfloat reverbwait; - - reverbwait = (1.0f-effect->Reverb.Density)*(0.1f-0.075f) + 0.075f; - - size = (ALuint)((ALfloat)Context->Frequency * - (effect->Reverb.ReflectionsDelay + - effect->Reverb.LateReverbDelay + - reverbwait)) + 1; - - ptr = calloc(size, sizeof(ALfloat)); - if(!ptr) - { - alSetError(AL_OUT_OF_MEMORY); - return; - } - if(ALEffectSlot->ReverbBuffer) - memcpy(ptr, ALEffectSlot->ReverbBuffer, min(size, ALEffectSlot->ReverbLength)*sizeof(ALfloat)); - ALEffectSlot->ReverbLength = size; - ALEffectSlot->ReverbPos %= size; - ALEffectSlot->ReverbReflectPos = (ALuint)(ALEffectSlot->ReverbLength - - ((ALfloat)Context->Frequency * - effect->Reverb.ReflectionsDelay) + - ALEffectSlot->ReverbPos) % - ALEffectSlot->ReverbLength; - ALEffectSlot->ReverbLatePos = (ALuint)(ALEffectSlot->ReverbLength - - ((ALfloat)Context->Frequency * - (effect->Reverb.LateReverbDelay + - effect->Reverb.ReflectionsDelay)) + - ALEffectSlot->ReverbPos) % - ALEffectSlot->ReverbLength; - ALEffectSlot->ReverbDecayGain = pow(1.0/32768.0, 1.0/(effect->Reverb.DecayTime/reverbwait)); + if(!ALEffectSlot->ReverbState) + ALEffectSlot->ReverbState = VerbCreate(Context); + VerbUpdate(Context, ALEffectSlot, effect); } - memcpy(&ALEffectSlot->effect, effect, sizeof(*effect)); -done: - free(ALEffectSlot->ReverbBuffer); - ALEffectSlot->ReverbBuffer = ptr; } @@ -531,7 +498,7 @@ ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context) Context->AuxiliaryEffectSlot = Context->AuxiliaryEffectSlot->next; // Release effectslot structure - free(temp->ReverbBuffer); + VerbDestroy(temp->ReverbState); ALTHUNK_REMOVEENTRY(temp->effectslot); memset(temp, 0, sizeof(ALeffectslot)); |