11 #include "intrusive_ptr.h"
19 // Shared Reverb Properties
26 float ReflectionsGain
;
27 float ReflectionsDelay
;
29 float LateReverbDelay
;
30 float AirAbsorptionGainHF
;
31 float RoomRolloffFactor
;
34 // Additional EAX Reverb Properties
37 float ReflectionsPan
[3];
38 float LateReverbPan
[3];
42 float ModulationDepth
;
61 } Chorus
; /* Also Flanger */
106 float HighPassCutoff
;
119 int PhonemeACoarseTuning
;
120 int PhonemeBCoarseTuning
;
130 class effect_exception final
: public al::base_exception
{
132 [[gnu::format(printf
, 3, 4)]]
133 effect_exception(ALenum code
, const char *msg
, ...);
137 struct EffectVtable
{
138 void (*const setParami
)(EffectProps
*props
, ALenum param
, int val
);
139 void (*const setParamiv
)(EffectProps
*props
, ALenum param
, const int *vals
);
140 void (*const setParamf
)(EffectProps
*props
, ALenum param
, float val
);
141 void (*const setParamfv
)(EffectProps
*props
, ALenum param
, const float *vals
);
143 void (*const getParami
)(const EffectProps
*props
, ALenum param
, int *val
);
144 void (*const getParamiv
)(const EffectProps
*props
, ALenum param
, int *vals
);
145 void (*const getParamf
)(const EffectProps
*props
, ALenum param
, float *val
);
146 void (*const getParamfv
)(const EffectProps
*props
, ALenum param
, float *vals
);
149 #define DEFINE_ALEFFECT_VTABLE(T) \
150 const EffectVtable T##_vtable = { \
151 T##_setParami, T##_setParamiv, \
152 T##_setParamf, T##_setParamfv, \
153 T##_getParami, T##_getParamiv, \
154 T##_getParamf, T##_getParamfv, \
158 struct EffectTarget
{
160 RealMixParams
*RealOut
;
163 struct EffectState
: public al::intrusive_ref
<EffectState
> {
164 al::span
<FloatBufferLine
> mOutTarget
;
167 virtual ~EffectState() = default;
169 virtual void deviceUpdate(const ALCdevice
*device
) = 0;
170 virtual void setBuffer(const ALCdevice
* /*device*/, const BufferStorage
* /*buffer*/) { }
171 virtual void update(const ALCcontext
*context
, const ALeffectslot
*slot
, const EffectProps
*props
, const EffectTarget target
) = 0;
172 virtual void process(const size_t samplesToDo
, const al::span
<const FloatBufferLine
> samplesIn
, const al::span
<FloatBufferLine
> samplesOut
) = 0;
176 struct EffectStateFactory
{
177 virtual ~EffectStateFactory() = default;
179 virtual EffectState
*create() = 0;
180 virtual EffectProps
getDefaultProps() const noexcept
= 0;
181 virtual const EffectVtable
*getEffectVtable() const noexcept
= 0;
185 EffectStateFactory
*NullStateFactory_getFactory(void);
186 EffectStateFactory
*ReverbStateFactory_getFactory(void);
187 EffectStateFactory
*StdReverbStateFactory_getFactory(void);
188 EffectStateFactory
*AutowahStateFactory_getFactory(void);
189 EffectStateFactory
*ChorusStateFactory_getFactory(void);
190 EffectStateFactory
*CompressorStateFactory_getFactory(void);
191 EffectStateFactory
*DistortionStateFactory_getFactory(void);
192 EffectStateFactory
*EchoStateFactory_getFactory(void);
193 EffectStateFactory
*EqualizerStateFactory_getFactory(void);
194 EffectStateFactory
*FlangerStateFactory_getFactory(void);
195 EffectStateFactory
*FshifterStateFactory_getFactory(void);
196 EffectStateFactory
*ModulatorStateFactory_getFactory(void);
197 EffectStateFactory
*PshifterStateFactory_getFactory(void);
198 EffectStateFactory
* VmorpherStateFactory_getFactory(void);
200 EffectStateFactory
*DedicatedStateFactory_getFactory(void);
202 EffectStateFactory
*ConvolutionStateFactory_getFactory(void);
204 #endif /* EFFECTS_BASE_H */