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.
57 lines
1.8 KiB
C++
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
|