Files
InstaLPEQ/Source/FIREngine.h
hariel1985 2c440d8deb v1.1.2: More FIR latency options, lower default
FIR quality selector now offers 6 choices:
512 (~6ms), 1024 (~12ms), 2048 (~23ms), 4096 (~46ms), 8192 (~93ms), 16384 (~186ms)
Default changed to 2048 (~23ms) for lower latency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 10:54:57 +01:00

47 sor
1.3 KiB
C++

#pragma once
#include <JuceHeader.h>
#include "EQBand.h"
class FIREngine : private juce::Thread
{
public:
static constexpr int defaultFFTOrder = 11; // 2048 taps
static constexpr int maxBands = 8;
FIREngine();
~FIREngine() override;
void start (double sampleRate);
void stop();
// Called from GUI thread
void setBands (const std::vector<EQBand>& newBands);
void setFFTOrder (int order);
// Called from audio thread — returns new FIR if available, nullptr otherwise
std::unique_ptr<juce::AudioBuffer<float>> getNewFIR();
// Get magnitude response in dB for display (thread-safe copy)
std::vector<float> getMagnitudeResponseDb() const;
int getFIRLength() const { return 1 << fftOrder.load(); }
int getLatencySamples() const { return getFIRLength() / 2; }
private:
void run() override;
juce::AudioBuffer<float> generateFIR (const std::vector<EQBand>& bands, double sr, int order);
std::atomic<double> sampleRate { 44100.0 };
std::atomic<int> fftOrder { defaultFFTOrder };
std::atomic<bool> needsUpdate { true };
std::vector<EQBand> currentBands;
mutable juce::SpinLock bandLock;
std::unique_ptr<juce::AudioBuffer<float>> pendingFIR;
juce::SpinLock firLock;
std::vector<float> magnitudeDb;
mutable juce::SpinLock magLock;
};