]> git.tdb.fi Git - ext/openal.git/blob - core/effects/base.h
Import OpenAL Soft 1.23.1 sources
[ext/openal.git] / core / effects / base.h
1 #ifndef CORE_EFFECTS_BASE_H
2 #define CORE_EFFECTS_BASE_H
3
4 #include <stddef.h>
5
6 #include "albyte.h"
7 #include "almalloc.h"
8 #include "alspan.h"
9 #include "atomic.h"
10 #include "core/bufferline.h"
11 #include "intrusive_ptr.h"
12
13 struct BufferStorage;
14 struct ContextBase;
15 struct DeviceBase;
16 struct EffectSlot;
17 struct MixParams;
18 struct RealMixParams;
19
20
21 /** Target gain for the reverb decay feedback reaching the decay time. */
22 constexpr float ReverbDecayGain{0.001f}; /* -60 dB */
23
24 constexpr float ReverbMaxReflectionsDelay{0.3f};
25 constexpr float ReverbMaxLateReverbDelay{0.1f};
26
27 enum class ChorusWaveform {
28     Sinusoid,
29     Triangle
30 };
31
32 constexpr float ChorusMaxDelay{0.016f};
33 constexpr float FlangerMaxDelay{0.004f};
34
35 constexpr float EchoMaxDelay{0.207f};
36 constexpr float EchoMaxLRDelay{0.404f};
37
38 enum class FShifterDirection {
39     Down,
40     Up,
41     Off
42 };
43
44 enum class ModulatorWaveform {
45     Sinusoid,
46     Sawtooth,
47     Square
48 };
49
50 enum class VMorpherPhenome {
51     A, E, I, O, U,
52     AA, AE, AH, AO, EH, ER, IH, IY, UH, UW,
53     B, D, F, G, J, K, L, M, N, P, R, S, T, V, Z
54 };
55
56 enum class VMorpherWaveform {
57     Sinusoid,
58     Triangle,
59     Sawtooth
60 };
61
62 union EffectProps {
63     struct {
64         float Density;
65         float Diffusion;
66         float Gain;
67         float GainHF;
68         float GainLF;
69         float DecayTime;
70         float DecayHFRatio;
71         float DecayLFRatio;
72         float ReflectionsGain;
73         float ReflectionsDelay;
74         float ReflectionsPan[3];
75         float LateReverbGain;
76         float LateReverbDelay;
77         float LateReverbPan[3];
78         float EchoTime;
79         float EchoDepth;
80         float ModulationTime;
81         float ModulationDepth;
82         float AirAbsorptionGainHF;
83         float HFReference;
84         float LFReference;
85         float RoomRolloffFactor;
86         bool DecayHFLimit;
87     } Reverb;
88
89     struct {
90         float AttackTime;
91         float ReleaseTime;
92         float Resonance;
93         float PeakGain;
94     } Autowah;
95
96     struct {
97         ChorusWaveform Waveform;
98         int Phase;
99         float Rate;
100         float Depth;
101         float Feedback;
102         float Delay;
103     } Chorus; /* Also Flanger */
104
105     struct {
106         bool OnOff;
107     } Compressor;
108
109     struct {
110         float Edge;
111         float Gain;
112         float LowpassCutoff;
113         float EQCenter;
114         float EQBandwidth;
115     } Distortion;
116
117     struct {
118         float Delay;
119         float LRDelay;
120
121         float Damping;
122         float Feedback;
123
124         float Spread;
125     } Echo;
126
127     struct {
128         float LowCutoff;
129         float LowGain;
130         float Mid1Center;
131         float Mid1Gain;
132         float Mid1Width;
133         float Mid2Center;
134         float Mid2Gain;
135         float Mid2Width;
136         float HighCutoff;
137         float HighGain;
138     } Equalizer;
139
140     struct {
141         float Frequency;
142         FShifterDirection LeftDirection;
143         FShifterDirection RightDirection;
144     } Fshifter;
145
146     struct {
147         float Frequency;
148         float HighPassCutoff;
149         ModulatorWaveform Waveform;
150     } Modulator;
151
152     struct {
153         int CoarseTune;
154         int FineTune;
155     } Pshifter;
156
157     struct {
158         float Rate;
159         VMorpherPhenome PhonemeA;
160         VMorpherPhenome PhonemeB;
161         int PhonemeACoarseTuning;
162         int PhonemeBCoarseTuning;
163         VMorpherWaveform Waveform;
164     } Vmorpher;
165
166     struct {
167         float Gain;
168     } Dedicated;
169 };
170
171
172 struct EffectTarget {
173     MixParams *Main;
174     RealMixParams *RealOut;
175 };
176
177 struct EffectState : public al::intrusive_ref<EffectState> {
178     al::span<FloatBufferLine> mOutTarget;
179
180
181     virtual ~EffectState() = default;
182
183     virtual void deviceUpdate(const DeviceBase *device, const BufferStorage *buffer) = 0;
184     virtual void update(const ContextBase *context, const EffectSlot *slot,
185         const EffectProps *props, const EffectTarget target) = 0;
186     virtual void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn,
187         const al::span<FloatBufferLine> samplesOut) = 0;
188 };
189
190
191 struct EffectStateFactory {
192     virtual ~EffectStateFactory() = default;
193
194     virtual al::intrusive_ptr<EffectState> create() = 0;
195 };
196
197 #endif /* CORE_EFFECTS_BASE_H */