AuroraOpenALSoft/OpenAL32/Include/alAuxEffectSlot.h

87 lines
2.6 KiB
C
Raw Normal View History

#ifndef _AL_AUXEFFECTSLOT_H_
#define _AL_AUXEFFECTSLOT_H_
2012-09-14 09:42:36 +00:00
#include "alMain.h"
#include "alEffect.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct ALeffectState ALeffectState;
typedef struct ALeffectslot ALeffectslot;
struct ALeffectStateVtable {
ALvoid (*const Destroy)(ALeffectState *State);
ALboolean (*const DeviceUpdate)(ALeffectState *State, ALCdevice *Device);
ALvoid (*const Update)(ALeffectState *State, ALCdevice *Device, const ALeffectslot *Slot);
ALvoid (*const Process)(ALeffectState *State, ALuint SamplesToDo, const ALfloat *RESTRICT SamplesIn, ALfloat (*RESTRICT SamplesOut)[BUFFERSIZE]);
};
struct ALeffectState {
const struct ALeffectStateVtable *vtbl;
};
#define DEFINE_ALEFFECTSTATE_VTABLE(T) \
static const struct ALeffectStateVtable T##_ALeffectState_vtable = { \
T##_Destroy, \
T##_DeviceUpdate, \
T##_Update, \
T##_Process \
}
#define SET_VTABLE1(T1, obj) ((obj)->vtbl = &(T1##_vtable))
#define SET_VTABLE2(T1, T2, obj) do { \
STATIC_CAST(T2, (obj))->vtbl = &(T1##_##T2##_vtable); \
/*SET_VTABLE1(T1, obj);*/ \
} while(0)
2012-09-14 09:42:36 +00:00
struct ALeffectslot
{
ALeffect effect;
volatile ALfloat Gain;
volatile ALboolean AuxSendAuto;
2007-12-18 23:47:24 +00:00
volatile ALenum NeedsUpdate;
ALeffectState *EffectState;
Implement AL_EFFECT_REVERB Here is a quick description of how the reverb effect works: +--->---+*(4) | V new sample +-----+---+---+ | |extra|ltr|ref| <- +*(1) +-----+---+---+ (3,5)*| |*(2) +-->| V out sample 1) Apply master reverb gain to incoming sample and place it at the head of the buffer. The master reverb gainhf was already applied when the source was initially mixed. 2) Copy the delayed reflection sample to an output sample and apply the reflection gain. 3) Apply the late reverb gain to the late reverb sample 4) Copy the end of the buffer, applying a decay gain and the decay hf ratio, and add to the late reverb. 5) Copy the late reverb sample, adding to the output sample. Then the head and sampling points are shifted forward, and done again for each new sample. The extra buffer length is determined by the Reverb Density property. A value of 0 gives a length of 0.1 seconds (long, with fairly distinct echos) , and 1 gives 0.075 seconds (short, indistinct echos). The decay gain is calculated such that after a number of loops to satisfy the Decay Time, a sample will be 1/32768th as powerful (virtually insignificant to the resulting output, and only getting further reduced). It is calculated as: DecayGain = pow(1.0f/32768.0f, 1.0/(DecayTime/ExtraLength)); Things to note: Reverb Diffusion is not currently handled, nor is Decay HF Limit. Decay HF Ratios above 1 probably give incorrect results. Also, this method likely sucks, but it's the best I can come up with before release. :)
2008-01-19 05:25:40 +00:00
ALIGN(16) ALfloat WetBuffer[1][BUFFERSIZE];
2010-08-15 21:52:12 +00:00
ALfloat ClickRemoval[1];
ALfloat PendingClicks[1];
2010-08-15 21:52:12 +00:00
RefCount ref;
/* Self ID */
ALuint id;
};
ALenum InitEffectSlot(ALeffectslot *slot);
2008-01-16 00:22:39 +00:00
ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context);
ALeffectState *NoneCreate(void);
ALeffectState *ReverbCreate(void);
ALeffectState *EchoCreate(void);
ALeffectState *ModulatorCreate(void);
ALeffectState *DedicatedCreate(void);
ALeffectState *ChorusCreate(void);
ALeffectState *FlangerCreate(void);
ALeffectState *EqualizerCreate(void);
ALeffectState *DistortionCreate(void);
#define ALeffectState_Destroy(a) ((a)->vtbl->Destroy((a)))
#define ALeffectState_DeviceUpdate(a,b) ((a)->vtbl->DeviceUpdate((a),(b)))
#define ALeffectState_Update(a,b,c) ((a)->vtbl->Update((a),(b),(c)))
#define ALeffectState_Process(a,b,c,d) ((a)->vtbl->Process((a),(b),(c),(d)))
ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *effect);
#ifdef __cplusplus
}
#endif
#endif