From 208c7923dcc2bbd9038e322cc0544bf09967c0ba Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Mon, 16 Apr 2018 14:06:33 +0100 Subject: [PATCH] Fixed some bugs in GenericAudioProcessorEditor --- .../juce_LegacyAudioParameter.cpp | 37 ++++++------ .../processors/juce_AudioProcessorParameter.h | 1 + .../juce_GenericAudioProcessorEditor.cpp | 59 ++++++++++++------- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp b/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp index aa0c5d6c2a..b744f569e8 100644 --- a/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp +++ b/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp @@ -42,26 +42,28 @@ class LegacyAudioParameter : public AudioProcessorParameter { public: LegacyAudioParameter (AudioProcessor& audioProcessorToUse, int audioParameterIndex) - : audioProcessor (audioProcessorToUse), idx (audioParameterIndex) { - jassert (idx < audioProcessor.getNumParameters()); + processor = &audioProcessorToUse; + + parameterIndex = audioParameterIndex; + jassert (parameterIndex < processor->getNumParameters()); } //============================================================================== - float getValue() const override { return audioProcessor.getParameter (idx); } - void setValue (float newValue) override { audioProcessor.setParameter (idx, newValue); } - float getDefaultValue() const override { return audioProcessor.getParameterDefaultValue (idx); } - String getName (int maxLen) const override { return audioProcessor.getParameterName (idx, maxLen); } - String getLabel() const override { return audioProcessor.getParameterLabel (idx); } - int getNumSteps() const override { return audioProcessor.getParameterNumSteps (idx); } - bool isDiscrete() const override { return audioProcessor.isParameterDiscrete (idx); } + float getValue() const override { return processor->getParameter (parameterIndex); } + void setValue (float newValue) override { processor->setParameter (parameterIndex, newValue); } + float getDefaultValue() const override { return processor->getParameterDefaultValue (parameterIndex); } + String getName (int maxLen) const override { return processor->getParameterName (parameterIndex, maxLen); } + String getLabel() const override { return processor->getParameterLabel (parameterIndex); } + int getNumSteps() const override { return processor->getParameterNumSteps (parameterIndex); } + bool isDiscrete() const override { return processor->isParameterDiscrete (parameterIndex); } bool isBoolean() const override { return false; } - bool isOrientationInverted() const override { return audioProcessor.isParameterOrientationInverted (idx); } - bool isAutomatable() const override { return audioProcessor.isParameterAutomatable (idx); } - bool isMetaParameter() const override { return audioProcessor.isMetaParameter (idx); } - Category getCategory() const override { return audioProcessor.getParameterCategory (idx); } - String getCurrentValueAsText() const override { return audioProcessor.getParameterText (idx); } - String getParamID() const { return audioProcessor.getParameterID (idx); } + bool isOrientationInverted() const override { return processor->isParameterOrientationInverted (parameterIndex); } + bool isAutomatable() const override { return processor->isParameterAutomatable (parameterIndex); } + bool isMetaParameter() const override { return processor->isMetaParameter (parameterIndex); } + Category getCategory() const override { return processor->getParameterCategory (parameterIndex); } + String getCurrentValueAsText() const override { return processor->getParameterText (parameterIndex); } + String getParamID() const { return processor->getParameterID (parameterIndex); } //============================================================================== float getValueForText (const String&) const override @@ -88,7 +90,7 @@ public: { if (auto* legacy = dynamic_cast (param)) { - return legacy->idx; + return legacy->parameterIndex; } else { @@ -119,9 +121,6 @@ public: return String (param->getParameterIndex()); } -private: - AudioProcessor& audioProcessor; - int idx; }; //============================================================================== diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h b/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h index 98fd08ad82..276ba3dc80 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h @@ -287,6 +287,7 @@ public: private: //============================================================================== friend class AudioProcessor; + friend class LegacyAudioParameter; AudioProcessor* processor = nullptr; int parameterIndex = -1; CriticalSection listenerLock; diff --git a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp index 953c8dbead..dd25024ba5 100644 --- a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp @@ -28,20 +28,27 @@ namespace juce { class ParameterListener : private AudioProcessorParameter::Listener, + private AudioProcessorListener, private Timer { public: - ParameterListener (AudioProcessorParameter& param) - : parameter (param) + ParameterListener (AudioProcessor& p, AudioProcessorParameter& param) + : processor (p), parameter (param) { - parameter.addListener (this); + if (LegacyAudioParameter::isLegacy (¶meter)) + processor.addListener (this); + else + parameter.addListener (this); startTimer (100); } virtual ~ParameterListener() { - parameter.removeListener (this); + if (LegacyAudioParameter::isLegacy (¶meter)) + processor.removeListener (this); + else + parameter.removeListener (this); } AudioProcessorParameter& getParameter() noexcept @@ -52,6 +59,7 @@ public: virtual void handleNewParameterValue() = 0; private: + //============================================================================== void parameterValueChanged (int, float) override { parameterValueHasChanged = 1; @@ -59,6 +67,16 @@ private: void parameterGestureChanged (int, bool) override {} + //============================================================================== + void audioProcessorParameterChanged (AudioProcessor*, int index, float) override + { + if (index == parameter.getParameterIndex()) + parameterValueHasChanged = 1; + } + + void audioProcessorChanged (AudioProcessor*) override {} + + //============================================================================== void timerCallback() override { if (parameterValueHasChanged.compareAndSetBool (0, 1)) @@ -72,6 +90,7 @@ private: } } + AudioProcessor& processor; AudioProcessorParameter& parameter; Atomic parameterValueHasChanged { 0 }; @@ -82,8 +101,8 @@ class BooleanParameterComponent final : public Component, private ParameterListener { public: - BooleanParameterComponent (AudioProcessorParameter& param) - : ParameterListener (param) + BooleanParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param) + : ParameterListener (processor, param) { // Set the initial value. handleNewParameterValue(); @@ -135,8 +154,8 @@ class SwitchParameterComponent final : public Component, private ParameterListener { public: - SwitchParameterComponent (AudioProcessorParameter& param) - : ParameterListener (param) + SwitchParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param) + : ParameterListener (processor, param) { auto* leftButton = buttons.add (new TextButton()); auto* rightButton = buttons.add (new TextButton()); @@ -240,8 +259,8 @@ class ChoiceParameterComponent final : public Component, private ParameterListener { public: - ChoiceParameterComponent (AudioProcessorParameter& param) - : ParameterListener (param), + ChoiceParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param) + : ParameterListener (processor, param), parameterValues (getParameter().getAllValueStrings()) { box.addItemList (parameterValues, 1); @@ -302,8 +321,8 @@ class SliderParameterComponent final : public Component, private ParameterListener { public: - SliderParameterComponent (AudioProcessorParameter& param) - : ParameterListener (param) + SliderParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param) + : ParameterListener (processor, param) { if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps()) slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0)); @@ -392,7 +411,7 @@ private: class ParameterDisplayComponent : public Component { public: - ParameterDisplayComponent (AudioProcessorParameter& param) + ParameterDisplayComponent (AudioProcessor& processor, AudioProcessorParameter& param) : parameter (param) { parameterName.setText (parameter.getName (128), dontSendNotification); @@ -408,24 +427,24 @@ public: // marking a parameter as boolean. If you want consistency across // all formats then it might be best to use a // SwitchParameterComponent instead. - parameterComp.reset (new BooleanParameterComponent (param)); + parameterComp.reset (new BooleanParameterComponent (processor, param)); } else if (param.getNumSteps() == 2) { // Most hosts display any parameter with just two steps as a switch. - parameterComp.reset (new SwitchParameterComponent (param)); + parameterComp.reset (new SwitchParameterComponent (processor, param)); } else if (! param.getAllValueStrings().isEmpty()) { // If we have a list of strings to represent the different states a // parameter can be in then we should present a dropdown allowing a // user to pick one of them. - parameterComp.reset (new ChoiceParameterComponent (param)); + parameterComp.reset (new ChoiceParameterComponent (processor, param)); } else { // Everything else can be represented as a slider. - parameterComp.reset (new SliderParameterComponent (param)); + parameterComp.reset (new SliderParameterComponent (processor, param)); } addAndMakeVisible (parameterComp.get()); @@ -455,11 +474,11 @@ private: class ParametersPanel : public Component { public: - ParametersPanel (const Array& parameters) + ParametersPanel (AudioProcessor& processor, const Array& parameters) { for (auto* param : parameters) if (param->isAutomatable()) - addAndMakeVisible (paramComponents.add (new ParameterDisplayComponent (*param))); + addAndMakeVisible (paramComponents.add (new ParameterDisplayComponent (processor, *param))); if (auto* comp = paramComponents[0]) setSize (comp->getWidth(), comp->getHeight() * paramComponents.size()); @@ -499,7 +518,7 @@ struct GenericAudioProcessorEditor::Pimpl owner.setOpaque (true); - view.setViewedComponent (new ParametersPanel (juceParameters.params)); + view.setViewedComponent (new ParametersPanel (*p, juceParameters.params)); owner.addAndMakeVisible (view); view.setScrollBarsShown (true, false);