etlegacy-libs/openal/OpenAL32/Include/alAuxEffectSlot.h

186 lines
6.1 KiB
C
Raw Normal View History

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