#pragma once #include "DelayEngine.h" #include namespace ParameterIDs { inline constexpr const char* feedback = "feedback"; inline constexpr const char* locut = "locut"; inline constexpr const char* hicut = "hicut"; inline constexpr const char* time = "time"; inline constexpr const char* timeSync = "timeSync"; inline constexpr const char* drywet = "drywet"; inline constexpr const char* sync = "sync"; inline constexpr const char* mode = "mode"; inline constexpr const char* doubleTap = "double"; inline constexpr const char* center = "center"; inline constexpr const char* autopan = "autopan"; inline constexpr const char* panDepth = "pandepth"; inline constexpr const char* bypass = "bypass"; } class MindballAudioProcessor : public juce::AudioProcessor { public: MindballAudioProcessor(); ~MindballAudioProcessor() override = default; juce::AudioProcessorValueTreeState apvts; void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; bool isBusesLayoutSupported (const BusesLayout& layouts) const override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; const juce::String getName() const override; bool acceptsMidi() const override; bool producesMidi() const override; double getTailLengthSeconds() const override; int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; float getDryMeterL() const { return dryMeterL.load (std::memory_order_relaxed); } float getDryMeterR() const { return dryMeterR.load (std::memory_order_relaxed); } float getWetMeterL() const { return wetMeterL.load (std::memory_order_relaxed); } float getWetMeterR() const { return wetMeterR.load (std::memory_order_relaxed); } private: static juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout(); static constexpr double maxDelaySeconds = 16.0; mindball::DelayEngine engine; bool wasBypassed = false; juce::AudioBuffer wetScratch; float meterDryL = 0.0f, meterDryR = 0.0f; float meterWetL = 0.0f, meterWetR = 0.0f; float meterDecay = 0.0f; std::atomic dryMeterL { 0.0f }, dryMeterR { 0.0f }; std::atomic wetMeterL { 0.0f }, wetMeterR { 0.0f }; };