2007-12-18 01:43:19 +00:00
|
|
|
#ifndef _AL_AUXEFFECTSLOT_H_
|
|
|
|
#define _AL_AUXEFFECTSLOT_H_
|
|
|
|
|
2007-12-18 22:22:59 +00:00
|
|
|
#include "alEffect.h"
|
2007-12-18 01:43:19 +00:00
|
|
|
#include "AL/al.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define AL_EFFECTSLOT_EFFECT 0x0001
|
|
|
|
#define AL_EFFECTSLOT_GAIN 0x0002
|
|
|
|
#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO 0x0003
|
|
|
|
|
|
|
|
#define AL_EFFECTSLOT_NULL 0x0000
|
|
|
|
|
2008-01-16 00:01:27 +00:00
|
|
|
typedef struct ALeffectslot
|
2007-12-18 01:43:19 +00:00
|
|
|
{
|
2007-12-18 22:22:59 +00:00
|
|
|
ALeffect effect;
|
|
|
|
|
2007-12-18 23:47:24 +00:00
|
|
|
ALfloat Gain;
|
2007-12-19 01:41:44 +00:00
|
|
|
ALboolean AuxSendAuto;
|
2007-12-18 23:47:24 +00:00
|
|
|
|
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
|
|
|
ALfloat *ReverbBuffer;
|
|
|
|
// in frames!
|
|
|
|
ALuint ReverbLength;
|
|
|
|
ALuint ReverbPos;
|
|
|
|
ALuint ReverbReflectPos;
|
|
|
|
ALuint ReverbLatePos;
|
|
|
|
ALfloat ReverbDecayGain;
|
|
|
|
ALfloat LastDecaySample;
|
|
|
|
|
2008-01-16 21:20:09 +00:00
|
|
|
ALuint refcount;
|
|
|
|
|
2007-12-18 01:43:19 +00:00
|
|
|
// Index to itself
|
|
|
|
ALuint effectslot;
|
|
|
|
|
2008-01-16 00:01:27 +00:00
|
|
|
struct ALeffectslot *next;
|
2007-12-18 01:43:19 +00:00
|
|
|
} ALeffectslot;
|
|
|
|
|
|
|
|
AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
|
|
|
|
AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
|
|
|
|
AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot);
|
|
|
|
|
|
|
|
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue);
|
|
|
|
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
|
|
|
|
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue);
|
|
|
|
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
|
|
|
|
|
|
|
|
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue);
|
|
|
|
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
|
|
|
|
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue);
|
|
|
|
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
|
|
|
|
|
2008-01-16 00:22:39 +00:00
|
|
|
ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context);
|
2007-12-18 01:43:19 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|