aboutsummaryrefslogtreecommitdiffstats
path: root/core/effectslot.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2021-12-17 17:13:59 -0800
committerChris Robinson <[email protected]>2021-12-17 17:13:59 -0800
commitd16b61dffb24cbe90e03e921684cb538cb23e181 (patch)
tree7e0a363ad68fd21a1f24dfdf08673cb7f6fdb771 /core/effectslot.h
parentfbc42aad7e70131655387c06092f8cbbc286c0db (diff)
Move the effects base and effectslot to core
Diffstat (limited to 'core/effectslot.h')
-rw-r--r--core/effectslot.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/core/effectslot.h b/core/effectslot.h
new file mode 100644
index 00000000..8b7b977c
--- /dev/null
+++ b/core/effectslot.h
@@ -0,0 +1,88 @@
+#ifndef CORE_EFFECTSLOT_H
+#define CORE_EFFECTSLOT_H
+
+#include <atomic>
+
+#include "almalloc.h"
+#include "device.h"
+#include "effects/base.h"
+#include "intrusive_ptr.h"
+
+struct EffectSlot;
+struct WetBuffer;
+
+using EffectSlotArray = al::FlexArray<EffectSlot*>;
+
+
+enum class EffectSlotType : unsigned char {
+ None,
+ Reverb,
+ Chorus,
+ Distortion,
+ Echo,
+ Flanger,
+ FrequencyShifter,
+ VocalMorpher,
+ PitchShifter,
+ RingModulator,
+ Autowah,
+ Compressor,
+ Equalizer,
+ EAXReverb,
+ DedicatedLFE,
+ DedicatedDialog,
+ Convolution
+};
+
+struct EffectSlotProps {
+ float Gain;
+ bool AuxSendAuto;
+ EffectSlot *Target;
+
+ EffectSlotType Type;
+ EffectProps Props;
+
+ al::intrusive_ptr<EffectState> State;
+
+ std::atomic<EffectSlotProps*> next;
+
+ DEF_NEWDEL(EffectSlotProps)
+};
+
+
+struct EffectSlot {
+ std::atomic<EffectSlotProps*> Update{nullptr};
+
+ /* Wet buffer configuration is ACN channel order with N3D scaling.
+ * Consequently, effects that only want to work with mono input can use
+ * channel 0 by itself. Effects that want multichannel can process the
+ * ambisonics signal and make a B-Format source pan.
+ */
+ MixParams Wet;
+
+ float Gain{1.0f};
+ bool AuxSendAuto{true};
+ EffectSlot *Target{nullptr};
+
+ EffectSlotType EffectType{EffectSlotType::None};
+ EffectProps mEffectProps{};
+ EffectState *mEffectState{nullptr};
+
+ float RoomRolloff{0.0f}; /* Added to the source's room rolloff, not multiplied. */
+ float DecayTime{0.0f};
+ float DecayLFRatio{0.0f};
+ float DecayHFRatio{0.0f};
+ bool DecayHFLimit{false};
+ float AirAbsorptionGainHF{1.0f};
+
+ /* Mixing buffer used by the Wet mix. */
+ WetBuffer *mWetBuffer{nullptr};
+
+ ~EffectSlot();
+
+ static EffectSlotArray *CreatePtrArray(size_t count) noexcept;
+
+ DISABLE_ALLOC()
+};
+
+#endif /* CORE_EFFECTSLOT_H */