Files
serumalt/Source/FXProcessor.h
T
biggy 4748bfe768 refactor(fx): give each FX slot independent DSP history
Replace the single shared array of 9 effect units with a 2D array
of kNumFxSlots × kNumEffectTypes, so each slot owns its own DSP
state. This prevents state bleed when the same effect type appears
in multiple slots and allows reordering without carrying over
internal history.

Track activeTypes to skip unchanged slots. Remove the dry buffer
since it was unused.
2026-09-09 14:32:58 +02:00

57 lines
1.8 KiB
C++

#pragma once
#include <JuceHeader.h>
#include "Params.h"
namespace serum
{
// ===========================================================================
// Base class for a stereo effect unit. Each unit processes a full-wet buffer.
// ===========================================================================
class FXUnit
{
public:
virtual ~FXUnit() = default;
virtual void prepare (double sampleRate, int maxBlockSize) = 0;
virtual void reset() = 0;
virtual void process (float* l, float* r, int numSamples, const float p[4]) = 0;
};
// ===========================================================================
// Snapshot of one FX slot.
// ===========================================================================
struct FxSlotParams
{
int type = (int) FxType::Off;
float mix = 0.0f;
float p[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
};
// ===========================================================================
// Reorderable effects rack. Slots are processed in list order; reordering is
// simply swapping FxSlotParams entries. Nine effect unit implementations are
// preconstructed per slot with independent DSP history.
// ===========================================================================
class FXProcessor
{
public:
FXProcessor();
~FXProcessor();
void prepare (double sampleRate, int maxBlockSize);
void reset();
void process (juce::AudioBuffer<float>& buffer, const FxSlotParams* slots, int numSlots);
static juce::String fxTypeName (int type);
private:
static constexpr int kNumEffectTypes = (int) FxType::Count - 1;
std::array<std::array<std::unique_ptr<FXUnit>, kNumEffectTypes>, kNumFxSlots> units;
std::array<int, kNumFxSlots> activeTypes {};
juce::AudioBuffer<float> wet;
};
} // namespace serum