#pragma once #include "../shape/Vector2.h" #include #include "EffectApplication.h" #include "EffectParameter.h" #include "BooleanParameter.h" typedef std::function& values, double sampleRate)> EffectApplicationType; class Effect { public: Effect(std::shared_ptr effectApplication, const std::vector& parameters); Effect(std::shared_ptr effectApplication, EffectParameter* parameter); Effect(EffectApplicationType application, const std::vector& parameters); Effect(EffectApplicationType application, EffectParameter* parameter); Vector2 apply(int index, Vector2 input, double volume = 0.0); void apply(); double getValue(int index); double getValue(); double getActualValue(int index); double getActualValue(); void setValue(int index, double value); void setValue(double value); int getPrecedence(); void setPrecedence(int precedence); void addListener(int index, juce::AudioProcessorParameter::Listener* listener); void removeListener(int index, juce::AudioProcessorParameter::Listener* listener); void markEnableable(bool enabled); juce::String getId(); juce::String getName(); void save(juce::XmlElement* xml); void load(juce::XmlElement* xml); EffectParameter* getParameter(juce::String id); void updateSampleRate(int sampleRate); std::vector parameters; BooleanParameter* enabled; private: juce::SpinLock listenerLock; std::vector actualValues; int precedence = -1; int sampleRate = 192000; EffectApplicationType application; std::shared_ptr effectApplication; void animateValues(double volume); float nextPhase(EffectParameter* parameter); };