Workaround a GCC 5 issue
[openal-soft.git] / alc / effects / base.h
blobdb38fc49c6335c07e3b9b9ccad8e9a5611ca916e
1 #ifndef EFFECTS_BASE_H
2 #define EFFECTS_BASE_H
4 #include <cstddef>
6 #include "alcmain.h"
7 #include "alexcpt.h"
8 #include "almalloc.h"
9 #include "alspan.h"
10 #include "atomic.h"
11 #include "intrusive_ptr.h"
13 struct ALeffectslot;
14 struct BufferStorage;
17 union EffectProps {
18 struct {
19 // Shared Reverb Properties
20 float Density;
21 float Diffusion;
22 float Gain;
23 float GainHF;
24 float DecayTime;
25 float DecayHFRatio;
26 float ReflectionsGain;
27 float ReflectionsDelay;
28 float LateReverbGain;
29 float LateReverbDelay;
30 float AirAbsorptionGainHF;
31 float RoomRolloffFactor;
32 bool DecayHFLimit;
34 // Additional EAX Reverb Properties
35 float GainLF;
36 float DecayLFRatio;
37 float ReflectionsPan[3];
38 float LateReverbPan[3];
39 float EchoTime;
40 float EchoDepth;
41 float ModulationTime;
42 float ModulationDepth;
43 float HFReference;
44 float LFReference;
45 } Reverb;
47 struct {
48 float AttackTime;
49 float ReleaseTime;
50 float Resonance;
51 float PeakGain;
52 } Autowah;
54 struct {
55 int Waveform;
56 int Phase;
57 float Rate;
58 float Depth;
59 float Feedback;
60 float Delay;
61 } Chorus; /* Also Flanger */
63 struct {
64 bool OnOff;
65 } Compressor;
67 struct {
68 float Edge;
69 float Gain;
70 float LowpassCutoff;
71 float EQCenter;
72 float EQBandwidth;
73 } Distortion;
75 struct {
76 float Delay;
77 float LRDelay;
79 float Damping;
80 float Feedback;
82 float Spread;
83 } Echo;
85 struct {
86 float LowCutoff;
87 float LowGain;
88 float Mid1Center;
89 float Mid1Gain;
90 float Mid1Width;
91 float Mid2Center;
92 float Mid2Gain;
93 float Mid2Width;
94 float HighCutoff;
95 float HighGain;
96 } Equalizer;
98 struct {
99 float Frequency;
100 int LeftDirection;
101 int RightDirection;
102 } Fshifter;
104 struct {
105 float Frequency;
106 float HighPassCutoff;
107 int Waveform;
108 } Modulator;
110 struct {
111 int CoarseTune;
112 int FineTune;
113 } Pshifter;
115 struct {
116 float Rate;
117 int PhonemeA;
118 int PhonemeB;
119 int PhonemeACoarseTuning;
120 int PhonemeBCoarseTuning;
121 int Waveform;
122 } Vmorpher;
124 struct {
125 float Gain;
126 } Dedicated;
130 class effect_exception final : public al::base_exception {
131 public:
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 {
159 MixParams *Main;
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 */