Update effect sliders when DAW changes parameter

pull/170/head
James Ball 2023-07-18 18:28:09 +01:00
rodzic e22897d8d0
commit 28f8626dbc
7 zmienionych plików z 48 dodań i 16 usunięć

Wyświetl plik

@ -92,7 +92,7 @@ public:
[this](int index, Vector2 input, const std::vector<double>& values, double sampleRate) {
threshold = values[0];
return input;
}, std::vector<EffectParameter>(1, { "Threshold", "threshold", 3.0, 0.0, 3.0 })
}, std::vector<EffectParameter>(1, { "Threshold", "threshold", 1.0, 0.0, 1.0 })
);
std::shared_ptr<Effect> focalLength = std::make_shared<Effect>(

Wyświetl plik

@ -53,6 +53,18 @@ void Effect::setPrecedence(int precedence) {
this->precedence = precedence;
}
void Effect::addListener(int index, juce::AudioProcessorParameter::Listener* listener) {
juce::SpinLock::ScopedLockType lock(listenerLock);
parameters[index].addListener(listener);
enabled.addListener(listener);
}
void Effect::removeListener(int index, juce::AudioProcessorParameter::Listener* listener) {
juce::SpinLock::ScopedLockType lock(listenerLock);
parameters[index].removeListener(listener);
enabled.removeListener(listener);
}
juce::String Effect::getId() {
return parameters[0].id;
}

Wyświetl plik

@ -21,6 +21,8 @@ public:
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);
juce::String getId();
juce::String getName();
@ -29,6 +31,7 @@ public:
private:
juce::SpinLock listenerLock;
std::vector<double> smoothValues;
double frequency = 1.0;
int precedence = -1;

Wyświetl plik

@ -1,7 +1,10 @@
#include "EffectComponent.h"
EffectComponent::EffectComponent(Effect& effect, int index) : effect(effect), index(index) {
componentSetup();
addAndMakeVisible(slider);
addAndMakeVisible(selected);
effect.addListener(index, this);
setupComponent();
}
EffectComponent::EffectComponent(Effect& effect, int index, bool checkboxVisible) : EffectComponent(effect, index) {
@ -14,10 +17,7 @@ EffectComponent::EffectComponent(Effect& effect, bool checkboxVisible) : EffectC
setCheckboxVisible(checkboxVisible);
}
void EffectComponent::componentSetup() {
addAndMakeVisible(slider);
addAndMakeVisible(selected);
void EffectComponent::setupComponent() {
EffectParameter& parameter = effect.parameters[index];
slider.setRange(parameter.min, parameter.max, parameter.step);
@ -26,7 +26,7 @@ void EffectComponent::componentSetup() {
slider.setSliderStyle(juce::Slider::LinearHorizontal);
slider.setTextBoxStyle(juce::Slider::TextBoxRight, false, 90, slider.getTextBoxHeight());
selected.setToggleState(false, juce::dontSendNotification);
selected.setToggleState(effect.enabled.getValue(), juce::dontSendNotification);
min.textBox.setValue(parameter.min, juce::dontSendNotification);
max.textBox.setValue(parameter.max, juce::dontSendNotification);
@ -59,7 +59,9 @@ void EffectComponent::componentSetup() {
}
EffectComponent::~EffectComponent() {}
EffectComponent::~EffectComponent() {
effect.removeListener(index, this);
}
void EffectComponent::resized() {
auto sliderRight = getWidth() - 160;
@ -97,6 +99,16 @@ void EffectComponent::mouseDown(const juce::MouseEvent& event) {
}
}
void EffectComponent::parameterValueChanged(int parameterIndex, float newValue) {
triggerAsyncUpdate();
}
void EffectComponent::parameterGestureChanged(int parameterIndex, bool gestureIsStarting) {}
void EffectComponent::handleAsyncUpdate() {
setupComponent();
}
void EffectComponent::setComponent(std::shared_ptr<juce::Component> component) {
this->component = component;
addAndMakeVisible(component.get());

Wyświetl plik

@ -5,7 +5,7 @@
#include "LabelledTextBox.h"
class EffectComponent : public juce::Component {
class EffectComponent : public juce::Component, public juce::AudioProcessorParameter::Listener, juce::AsyncUpdater {
public:
EffectComponent(Effect& effect, int index);
EffectComponent(Effect& effect, int index, bool checkboxVisible);
@ -16,6 +16,9 @@ public:
void resized() override;
void paint(juce::Graphics& g) override;
void mouseDown(const juce::MouseEvent& event) override;
void parameterValueChanged(int parameterIndex, float newValue) override;
void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override;
void handleAsyncUpdate() override;
void setCheckboxVisible(bool visible);
void setComponent(std::shared_ptr<juce::Component> component);
@ -26,7 +29,7 @@ public:
juce::ToggleButton selected;
private:
void componentSetup();
void setupComponent();
bool checkboxVisible = true;
juce::Rectangle<int> textBounds;
std::shared_ptr<juce::Component> component;

Wyświetl plik

@ -14,8 +14,6 @@ EffectsListComponent::EffectsListComponent(DraggableListBox& lb, AudioEffectList
};
if (i == 0) {
bool isSelected = effect->enabled.getValue();
effectComponent->selected.setToggleState(isSelected, juce::dontSendNotification);
effectComponent->selected.onClick = [this, weakEffectComponent] {
if (auto effectComponent = weakEffectComponent.lock()) {
auto data = (AudioEffectListBoxItemData&)modelData;

Wyświetl plik

@ -11,8 +11,9 @@ VolumeComponent::VolumeComponent(OscirenderAudioProcessor& p) : audioProcessor(p
volumeSlider.setColour(juce::Slider::ColourIds::backgroundColourId, juce::Colours::transparentWhite);
volumeSlider.setColour(juce::Slider::ColourIds::trackColourId, juce::Colours::transparentWhite);
volumeSlider.setOpaque(false);
volumeSlider.setRange(0, 2, 0.001);
volumeSlider.setValue(1);
auto& volumeParam = audioProcessor.volumeEffect->parameters[0];
volumeSlider.setRange(volumeParam.min, volumeParam.max, volumeParam.step);
volumeSlider.setValue(volumeParam.getValueUnnormalised());
volumeSlider.setLookAndFeel(&thumbRadiusLookAndFeel);
volumeSlider.setColour(juce::Slider::ColourIds::thumbColourId, juce::Colours::black);
@ -22,8 +23,9 @@ VolumeComponent::VolumeComponent(OscirenderAudioProcessor& p) : audioProcessor(p
thresholdSlider.setColour(juce::Slider::ColourIds::backgroundColourId, juce::Colours::transparentWhite);
thresholdSlider.setColour(juce::Slider::ColourIds::trackColourId, juce::Colours::transparentWhite);
thresholdSlider.setOpaque(false);
thresholdSlider.setRange(0, 1, 0.001);
thresholdSlider.setValue(1);
auto& thresholdParam = audioProcessor.thresholdEffect->parameters[0];
thresholdSlider.setRange(thresholdParam.min, thresholdParam.max, thresholdParam.step);
thresholdSlider.setValue(thresholdParam.getValueUnnormalised());
thresholdSlider.setLookAndFeel(&thresholdLookAndFeel);
thresholdSlider.setColour(juce::Slider::ColourIds::thumbColourId, juce::Colours::black);
@ -85,6 +87,8 @@ void VolumeComponent::paint(juce::Graphics& g) {
void VolumeComponent::timerCallback() {
repaint();
volumeSlider.setValue(audioProcessor.volumeEffect->getValue(), juce::NotificationType::dontSendNotification);
thresholdSlider.setValue(audioProcessor.thresholdEffect->getValue(), juce::NotificationType::dontSendNotification);
}
void VolumeComponent::run() {