Move the effects base and effectslot to core

master
Chris Robinson 2021-12-17 17:13:59 -08:00
parent fbc42aad7e
commit d16b61dffb
22 changed files with 232 additions and 225 deletions

View File

@ -678,6 +678,9 @@ set(CORE_OBJS
core/devformat.h
core/device.cpp
core/device.h
core/effects/base.h
core/effectslot.cpp
core/effectslot.h
core/except.cpp
core/except.h
core/filters/biquad.h
@ -792,8 +795,6 @@ set(ALC_OBJS
alc/context.h
alc/device.cpp
alc/device.h
alc/effectslot.cpp
alc/effectslot.h
alc/effects/base.h
alc/effects/autowah.cpp
alc/effects/chorus.cpp

View File

@ -9,10 +9,10 @@
#include "AL/efx.h"
#include "alc/device.h"
#include "alc/effectslot.h"
#include "alc/effects/base.h"
#include "almalloc.h"
#include "atomic.h"
#include "core/effectslot.h"
#include "intrusive_ptr.h"
#include "vector.h"

View File

@ -68,8 +68,6 @@
#include "albit.h"
#include "albyte.h"
#include "alconfig.h"
#include "alc/context.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "aloptional.h"
@ -77,6 +75,7 @@
#include "alstring.h"
#include "alu.h"
#include "atomic.h"
#include "context.h"
#include "core/ambidefs.h"
#include "core/bformatdec.h"
#include "core/bs2b.h"
@ -84,6 +83,7 @@
#include "core/cpu_caps.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/except.h"
#include "core/helpers.h"
#include "core/mastering.h"

View File

@ -56,6 +56,8 @@
#include "core/cpu_caps.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effects/base.h"
#include "core/effectslot.h"
#include "core/filters/biquad.h"
#include "core/filters/nfc.h"
#include "core/fpu_ctrl.h"
@ -68,8 +70,6 @@
#include "core/uhjfilter.h"
#include "core/voice.h"
#include "core/voice_change.h"
#include "effects/base.h"
#include "effectslot.h"
#include "intrusive_ptr.h"
#include "math_defs.h"
#include "opthelpers.h"

View File

@ -21,11 +21,11 @@
#include "alc/alu.h"
#include "core/async_event.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/logging.h"
#include "core/voice.h"
#include "core/voice_change.h"
#include "device.h"
#include "effectslot.h"
#include "ringbuffer.h"
#include "vecmat.h"

View File

@ -27,7 +27,6 @@
#include <utility>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -36,6 +35,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "intrusive_ptr.h"
#include "math_defs.h"

View File

@ -1,206 +1,7 @@
#ifndef EFFECTS_BASE_H
#define EFFECTS_BASE_H
#include <stddef.h>
#include "albyte.h"
#include "almalloc.h"
#include "alspan.h"
#include "atomic.h"
#include "core/bufferline.h"
#include "intrusive_ptr.h"
struct BufferStorage;
struct ContextBase;
struct DeviceBase;
struct EffectSlot;
struct MixParams;
struct RealMixParams;
/** Target gain for the reverb decay feedback reaching the decay time. */
constexpr float ReverbDecayGain{0.001f}; /* -60 dB */
constexpr float ReverbMaxReflectionsDelay{0.3f};
constexpr float ReverbMaxLateReverbDelay{0.1f};
enum class ChorusWaveform {
Sinusoid,
Triangle
};
constexpr float ChorusMaxDelay{0.016f};
constexpr float FlangerMaxDelay{0.004f};
constexpr float EchoMaxDelay{0.207f};
constexpr float EchoMaxLRDelay{0.404f};
enum class FShifterDirection {
Down,
Up,
Off
};
enum class ModulatorWaveform {
Sinusoid,
Sawtooth,
Square
};
enum class VMorpherPhenome {
A, E, I, O, U,
AA, AE, AH, AO, EH, ER, IH, IY, UH, UW,
B, D, F, G, J, K, L, M, N, P, R, S, T, V, Z
};
enum class VMorpherWaveform {
Sinusoid,
Triangle,
Sawtooth
};
union EffectProps {
struct {
// Shared Reverb Properties
float Density;
float Diffusion;
float Gain;
float GainHF;
float DecayTime;
float DecayHFRatio;
float ReflectionsGain;
float ReflectionsDelay;
float LateReverbGain;
float LateReverbDelay;
float AirAbsorptionGainHF;
float RoomRolloffFactor;
bool DecayHFLimit;
// Additional EAX Reverb Properties
float GainLF;
float DecayLFRatio;
float ReflectionsPan[3];
float LateReverbPan[3];
float EchoTime;
float EchoDepth;
float ModulationTime;
float ModulationDepth;
float HFReference;
float LFReference;
} Reverb;
struct {
float AttackTime;
float ReleaseTime;
float Resonance;
float PeakGain;
} Autowah;
struct {
ChorusWaveform Waveform;
int Phase;
float Rate;
float Depth;
float Feedback;
float Delay;
} Chorus; /* Also Flanger */
struct {
bool OnOff;
} Compressor;
struct {
float Edge;
float Gain;
float LowpassCutoff;
float EQCenter;
float EQBandwidth;
} Distortion;
struct {
float Delay;
float LRDelay;
float Damping;
float Feedback;
float Spread;
} Echo;
struct {
float LowCutoff;
float LowGain;
float Mid1Center;
float Mid1Gain;
float Mid1Width;
float Mid2Center;
float Mid2Gain;
float Mid2Width;
float HighCutoff;
float HighGain;
} Equalizer;
struct {
float Frequency;
FShifterDirection LeftDirection;
FShifterDirection RightDirection;
} Fshifter;
struct {
float Frequency;
float HighPassCutoff;
ModulatorWaveform Waveform;
} Modulator;
struct {
int CoarseTune;
int FineTune;
} Pshifter;
struct {
float Rate;
VMorpherPhenome PhonemeA;
VMorpherPhenome PhonemeB;
int PhonemeACoarseTuning;
int PhonemeBCoarseTuning;
VMorpherWaveform Waveform;
} Vmorpher;
struct {
float Gain;
} Dedicated;
};
struct EffectTarget {
MixParams *Main;
RealMixParams *RealOut;
};
struct EffectState : public al::intrusive_ref<EffectState> {
struct Buffer {
const BufferStorage *storage;
al::span<const al::byte> samples;
};
al::span<FloatBufferLine> mOutTarget;
virtual ~EffectState() = default;
virtual void deviceUpdate(const DeviceBase *device, const Buffer &buffer) = 0;
virtual void update(const ContextBase *context, const EffectSlot *slot,
const EffectProps *props, const EffectTarget target) = 0;
virtual void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn,
const al::span<FloatBufferLine> samplesOut) = 0;
};
struct EffectStateFactory {
virtual ~EffectStateFactory() = default;
virtual al::intrusive_ptr<EffectState> create() = 0;
};
#include "core/effects/base.h"
EffectStateFactory *NullStateFactory_getFactory(void);

View File

@ -27,7 +27,6 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -35,6 +34,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "core/mixer/defs.h"
#include "core/resampler_limits.h"

View File

@ -38,7 +38,6 @@
#include <utility>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -46,6 +45,7 @@
#include "core/bufferline.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "core/mixer/defs.h"
#include "intrusive_ptr.h"

View File

@ -19,7 +19,6 @@
#include "albyte.h"
#include "alcomplex.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -30,6 +29,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/filters/splitter.h"
#include "core/fmt_traits.h"
#include "core/mixer.h"

View File

@ -26,12 +26,12 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alspan.h"
#include "core/bufferline.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "intrusive_ptr.h"

View File

@ -26,7 +26,6 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -34,6 +33,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/filters/biquad.h"
#include "core/mixer.h"
#include "core/mixer/defs.h"

View File

@ -27,7 +27,6 @@
#include <tuple>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -35,6 +34,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/filters/biquad.h"
#include "core/mixer.h"
#include "intrusive_ptr.h"

View File

@ -28,7 +28,6 @@
#include <utility>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alspan.h"
#include "core/ambidefs.h"
@ -36,6 +35,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/filters/biquad.h"
#include "core/mixer.h"
#include "intrusive_ptr.h"

View File

@ -28,7 +28,6 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "alcomplex.h"
#include "almalloc.h"
#include "alnumeric.h"
@ -37,6 +36,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "core/mixer/defs.h"
#include "intrusive_ptr.h"

View File

@ -26,7 +26,6 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -35,6 +34,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/filters/biquad.h"
#include "core/mixer.h"
#include "intrusive_ptr.h"

View File

@ -28,7 +28,6 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "alcomplex.h"
#include "almalloc.h"
#include "alnumeric.h"
@ -36,6 +35,7 @@
#include "core/bufferline.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "core/mixer/defs.h"
#include "intrusive_ptr.h"

View File

@ -29,7 +29,6 @@
#include <stdint.h>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -38,6 +37,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/filters/biquad.h"
#include "core/filters/splitter.h"
#include "core/mixer.h"

View File

@ -39,7 +39,6 @@
#include <iterator>
#include "alc/effects/base.h"
#include "alc/effectslot.h"
#include "almalloc.h"
#include "alnumeric.h"
#include "alspan.h"
@ -48,6 +47,7 @@
#include "core/context.h"
#include "core/devformat.h"
#include "core/device.h"
#include "core/effectslot.h"
#include "core/mixer.h"
#include "intrusive_ptr.h"
#include "math_defs.h"

205
core/effects/base.h Normal file
View File

@ -0,0 +1,205 @@
#ifndef CORE_EFFECTS_BASE_H
#define CORE_EFFECTS_BASE_H
#include <stddef.h>
#include "albyte.h"
#include "almalloc.h"
#include "alspan.h"
#include "atomic.h"
#include "core/bufferline.h"
#include "intrusive_ptr.h"
struct BufferStorage;
struct ContextBase;
struct DeviceBase;
struct EffectSlot;
struct MixParams;
struct RealMixParams;
/** Target gain for the reverb decay feedback reaching the decay time. */
constexpr float ReverbDecayGain{0.001f}; /* -60 dB */
constexpr float ReverbMaxReflectionsDelay{0.3f};
constexpr float ReverbMaxLateReverbDelay{0.1f};
enum class ChorusWaveform {
Sinusoid,
Triangle
};
constexpr float ChorusMaxDelay{0.016f};
constexpr float FlangerMaxDelay{0.004f};
constexpr float EchoMaxDelay{0.207f};
constexpr float EchoMaxLRDelay{0.404f};
enum class FShifterDirection {
Down,
Up,
Off
};
enum class ModulatorWaveform {
Sinusoid,
Sawtooth,
Square
};
enum class VMorpherPhenome {
A, E, I, O, U,
AA, AE, AH, AO, EH, ER, IH, IY, UH, UW,
B, D, F, G, J, K, L, M, N, P, R, S, T, V, Z
};
enum class VMorpherWaveform {
Sinusoid,
Triangle,
Sawtooth
};
union EffectProps {
struct {
// Shared Reverb Properties
float Density;
float Diffusion;
float Gain;
float GainHF;
float DecayTime;
float DecayHFRatio;
float ReflectionsGain;
float ReflectionsDelay;
float LateReverbGain;
float LateReverbDelay;
float AirAbsorptionGainHF;
float RoomRolloffFactor;
bool DecayHFLimit;
// Additional EAX Reverb Properties
float GainLF;
float DecayLFRatio;
float ReflectionsPan[3];
float LateReverbPan[3];
float EchoTime;
float EchoDepth;
float ModulationTime;
float ModulationDepth;
float HFReference;
float LFReference;
} Reverb;
struct {
float AttackTime;
float ReleaseTime;
float Resonance;
float PeakGain;
} Autowah;
struct {
ChorusWaveform Waveform;
int Phase;
float Rate;
float Depth;
float Feedback;
float Delay;
} Chorus; /* Also Flanger */
struct {
bool OnOff;
} Compressor;
struct {
float Edge;
float Gain;
float LowpassCutoff;
float EQCenter;
float EQBandwidth;
} Distortion;
struct {
float Delay;
float LRDelay;
float Damping;
float Feedback;
float Spread;
} Echo;
struct {
float LowCutoff;
float LowGain;
float Mid1Center;
float Mid1Gain;
float Mid1Width;
float Mid2Center;
float Mid2Gain;
float Mid2Width;
float HighCutoff;
float HighGain;
} Equalizer;
struct {
float Frequency;
FShifterDirection LeftDirection;
FShifterDirection RightDirection;
} Fshifter;
struct {
float Frequency;
float HighPassCutoff;
ModulatorWaveform Waveform;
} Modulator;
struct {
int CoarseTune;
int FineTune;
} Pshifter;
struct {
float Rate;
VMorpherPhenome PhonemeA;
VMorpherPhenome PhonemeB;
int PhonemeACoarseTuning;
int PhonemeBCoarseTuning;
VMorpherWaveform Waveform;
} Vmorpher;
struct {
float Gain;
} Dedicated;
};
struct EffectTarget {
MixParams *Main;
RealMixParams *RealOut;
};
struct EffectState : public al::intrusive_ref<EffectState> {
struct Buffer {
const BufferStorage *storage;
al::span<const al::byte> samples;
};
al::span<FloatBufferLine> mOutTarget;
virtual ~EffectState() = default;
virtual void deviceUpdate(const DeviceBase *device, const Buffer &buffer) = 0;
virtual void update(const ContextBase *context, const EffectSlot *slot,
const EffectProps *props, const EffectTarget target) = 0;
virtual void process(const size_t samplesToDo, const al::span<const FloatBufferLine> samplesIn,
const al::span<FloatBufferLine> samplesOut) = 0;
};
struct EffectStateFactory {
virtual ~EffectStateFactory() = default;
virtual al::intrusive_ptr<EffectState> create() = 0;
};
#endif /* CORE_EFFECTS_BASE_H */

View File

@ -1,10 +1,10 @@
#ifndef EFFECTSLOT_H
#define EFFECTSLOT_H
#ifndef CORE_EFFECTSLOT_H
#define CORE_EFFECTSLOT_H
#include <atomic>
#include "almalloc.h"
#include "core/device.h"
#include "device.h"
#include "effects/base.h"
#include "intrusive_ptr.h"
@ -85,4 +85,4 @@ struct EffectSlot {
DISABLE_ALLOC()
};
#endif /* EFFECTSLOT_H */
#endif /* CORE_EFFECTSLOT_H */