Torque3D/Engine/lib/openal-soft/OpenAL32/Include/alAuxEffectSlot.h

184 lines
6 KiB
C
Raw Normal View History

2016-10-22 09:22:33 +10:00
#ifndef _AL_AUXEFFECTSLOT_H_
#define _AL_AUXEFFECTSLOT_H_
#include "alMain.h"
#include "alEffect.h"
2018-05-09 20:48:18 +10:00
#include "atomic.h"
2016-10-22 09:22:33 +10:00
#include "align.h"
#ifdef __cplusplus
extern "C" {
#endif
struct ALeffectStateVtable;
struct ALeffectslot;
typedef struct ALeffectState {
RefCount Ref;
const struct ALeffectStateVtable *vtbl;
ALfloat (*OutBuffer)[BUFFERSIZE];
2018-05-09 20:48:18 +10:00
ALsizei OutChannels;
2016-10-22 09:22:33 +10:00
} ALeffectState;
void ALeffectState_Construct(ALeffectState *state);
void ALeffectState_Destruct(ALeffectState *state);
struct ALeffectStateVtable {
void (*const Destruct)(ALeffectState *state);
ALboolean (*const deviceUpdate)(ALeffectState *state, ALCdevice *device);
2018-05-09 20:48:18 +10:00
void (*const update)(ALeffectState *state, const ALCcontext *context, const struct ALeffectslot *slot, const union ALeffectProps *props);
void (*const process)(ALeffectState *state, ALsizei samplesToDo, const ALfloat (*restrict samplesIn)[BUFFERSIZE], ALfloat (*restrict samplesOut)[BUFFERSIZE], ALsizei numChannels);
2016-10-22 09:22:33 +10:00
void (*const Delete)(void *ptr);
};
2018-05-09 20:48:18 +10:00
/* Small hack to use a pointer-to-array types as a normal argument type.
* Shouldn't be used directly.
*/
typedef ALfloat ALfloatBUFFERSIZE[BUFFERSIZE];
2016-10-22 09:22:33 +10:00
#define DEFINE_ALEFFECTSTATE_VTABLE(T) \
DECLARE_THUNK(T, ALeffectState, void, Destruct) \
DECLARE_THUNK1(T, ALeffectState, ALboolean, deviceUpdate, ALCdevice*) \
2018-05-09 20:48:18 +10:00
DECLARE_THUNK3(T, ALeffectState, void, update, const ALCcontext*, const ALeffectslot*, const ALeffectProps*) \
DECLARE_THUNK4(T, ALeffectState, void, process, ALsizei, const ALfloatBUFFERSIZE*restrict, ALfloatBUFFERSIZE*restrict, ALsizei) \
2016-10-22 09:22:33 +10:00
static void T##_ALeffectState_Delete(void *ptr) \
{ return T##_Delete(STATIC_UPCAST(T, ALeffectState, (ALeffectState*)ptr)); } \
\
static const struct ALeffectStateVtable T##_ALeffectState_vtable = { \
T##_ALeffectState_Destruct, \
\
T##_ALeffectState_deviceUpdate, \
T##_ALeffectState_update, \
T##_ALeffectState_process, \
\
T##_ALeffectState_Delete, \
}
2018-05-09 20:48:18 +10:00
struct EffectStateFactoryVtable;
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
typedef struct EffectStateFactory {
const struct EffectStateFactoryVtable *vtab;
} EffectStateFactory;
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
struct EffectStateFactoryVtable {
ALeffectState *(*const create)(EffectStateFactory *factory);
2016-10-22 09:22:33 +10:00
};
2018-05-09 20:48:18 +10:00
#define EffectStateFactory_create(x) ((x)->vtab->create((x)))
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
#define DEFINE_EFFECTSTATEFACTORY_VTABLE(T) \
DECLARE_THUNK(T, EffectStateFactory, ALeffectState*, create) \
2016-10-22 09:22:33 +10:00
\
2018-05-09 20:48:18 +10:00
static const struct EffectStateFactoryVtable T##_EffectStateFactory_vtable = { \
T##_EffectStateFactory_create, \
2016-10-22 09:22:33 +10:00
}
#define MAX_EFFECT_CHANNELS (4)
2018-05-09 20:48:18 +10:00
struct ALeffectslotArray {
ALsizei count;
struct ALeffectslot *slot[];
};
2016-10-22 09:22:33 +10:00
struct ALeffectslotProps {
2018-05-09 20:48:18 +10:00
ALfloat Gain;
ALboolean AuxSendAuto;
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
ALenum Type;
2016-10-22 09:22:33 +10:00
ALeffectProps Props;
2018-05-09 20:48:18 +10:00
ALeffectState *State;
2016-10-22 09:22:33 +10:00
ATOMIC(struct ALeffectslotProps*) next;
};
typedef struct ALeffectslot {
ALfloat Gain;
ALboolean AuxSendAuto;
struct {
ALenum Type;
ALeffectProps Props;
ALeffectState *State;
} Effect;
2018-05-09 20:48:18 +10:00
ATOMIC_FLAG PropsClean;
2016-10-22 09:22:33 +10:00
RefCount ref;
ATOMIC(struct ALeffectslotProps*) Update;
struct {
ALfloat Gain;
ALboolean AuxSendAuto;
ALenum EffectType;
2018-05-09 20:48:18 +10:00
ALeffectProps EffectProps;
2016-10-22 09:22:33 +10:00
ALeffectState *EffectState;
ALfloat RoomRolloff; /* Added to the source's room rolloff, not multiplied. */
ALfloat DecayTime;
2018-05-09 20:48:18 +10:00
ALfloat DecayLFRatio;
ALfloat DecayHFRatio;
ALboolean DecayHFLimit;
2016-10-22 09:22:33 +10:00
ALfloat AirAbsorptionGainHF;
} Params;
/* Self ID */
ALuint id;
2018-05-09 20:48:18 +10:00
ALsizei NumChannels;
2016-10-22 09:22:33 +10:00
BFChannelConfig ChanMap[MAX_EFFECT_CHANNELS];
/* Wet buffer configuration is ACN channel order with N3D scaling:
* * Channel 0 is the unattenuated mono signal.
2018-05-09 20:48:18 +10:00
* * Channel 1 is OpenAL -X * sqrt(3)
* * Channel 2 is OpenAL Y * sqrt(3)
* * Channel 3 is OpenAL -Z * sqrt(3)
2016-10-22 09:22:33 +10:00
* Consequently, effects that only want to work with mono input can use
* channel 0 by itself. Effects that want multichannel can process the
* ambisonics signal and make a B-Format pan (ComputeFirstOrderGains) for
* first-order device output (FOAOut).
*/
alignas(16) ALfloat WetBuffer[MAX_EFFECT_CHANNELS][BUFFERSIZE];
} ALeffectslot;
ALenum InitEffectSlot(ALeffectslot *slot);
void DeinitEffectSlot(ALeffectslot *slot);
2018-05-09 20:48:18 +10:00
void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context);
2016-10-22 09:22:33 +10:00
void UpdateAllEffectSlotProps(ALCcontext *context);
ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context);
2018-05-09 20:48:18 +10:00
EffectStateFactory *NullStateFactory_getFactory(void);
EffectStateFactory *ReverbStateFactory_getFactory(void);
EffectStateFactory *ChorusStateFactory_getFactory(void);
EffectStateFactory *CompressorStateFactory_getFactory(void);
EffectStateFactory *DistortionStateFactory_getFactory(void);
EffectStateFactory *EchoStateFactory_getFactory(void);
EffectStateFactory *EqualizerStateFactory_getFactory(void);
EffectStateFactory *FlangerStateFactory_getFactory(void);
EffectStateFactory *ModulatorStateFactory_getFactory(void);
EffectStateFactory *PshifterStateFactory_getFactory(void);
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
EffectStateFactory *DedicatedStateFactory_getFactory(void);
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect);
2016-10-22 09:22:33 +10:00
2018-05-09 20:48:18 +10:00
void ALeffectState_DecRef(ALeffectState *state);
2016-10-22 09:22:33 +10:00
#ifdef __cplusplus
}
#endif
#endif