|
|
@@ -28,20 +28,27 @@ namespace juce |
|
|
{
|
|
|
{
|
|
|
|
|
|
|
|
|
class ParameterListener : private AudioProcessorParameter::Listener,
|
|
|
class ParameterListener : private AudioProcessorParameter::Listener,
|
|
|
|
|
|
private AudioProcessorListener,
|
|
|
private Timer
|
|
|
private Timer
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
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);
|
|
|
startTimer (100);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
virtual ~ParameterListener()
|
|
|
virtual ~ParameterListener()
|
|
|
{
|
|
|
{
|
|
|
parameter.removeListener (this);
|
|
|
|
|
|
|
|
|
if (LegacyAudioParameter::isLegacy (¶meter))
|
|
|
|
|
|
processor.removeListener (this);
|
|
|
|
|
|
else
|
|
|
|
|
|
parameter.removeListener (this);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
AudioProcessorParameter& getParameter() noexcept
|
|
|
AudioProcessorParameter& getParameter() noexcept
|
|
|
@@ -52,6 +59,7 @@ public: |
|
|
virtual void handleNewParameterValue() = 0;
|
|
|
virtual void handleNewParameterValue() = 0;
|
|
|
|
|
|
|
|
|
private:
|
|
|
private:
|
|
|
|
|
|
//==============================================================================
|
|
|
void parameterValueChanged (int, float) override
|
|
|
void parameterValueChanged (int, float) override
|
|
|
{
|
|
|
{
|
|
|
parameterValueHasChanged = 1;
|
|
|
parameterValueHasChanged = 1;
|
|
|
@@ -59,6 +67,16 @@ private: |
|
|
|
|
|
|
|
|
void parameterGestureChanged (int, bool) override {}
|
|
|
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
|
|
|
void timerCallback() override
|
|
|
{
|
|
|
{
|
|
|
if (parameterValueHasChanged.compareAndSetBool (0, 1))
|
|
|
if (parameterValueHasChanged.compareAndSetBool (0, 1))
|
|
|
@@ -72,6 +90,7 @@ private: |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AudioProcessor& processor;
|
|
|
AudioProcessorParameter& parameter;
|
|
|
AudioProcessorParameter& parameter;
|
|
|
Atomic<int> parameterValueHasChanged { 0 };
|
|
|
Atomic<int> parameterValueHasChanged { 0 };
|
|
|
|
|
|
|
|
|
@@ -82,8 +101,8 @@ class BooleanParameterComponent final : public Component, |
|
|
private ParameterListener
|
|
|
private ParameterListener
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
public:
|
|
|
BooleanParameterComponent (AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (param)
|
|
|
|
|
|
|
|
|
BooleanParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (processor, param)
|
|
|
{
|
|
|
{
|
|
|
// Set the initial value.
|
|
|
// Set the initial value.
|
|
|
handleNewParameterValue();
|
|
|
handleNewParameterValue();
|
|
|
@@ -135,8 +154,8 @@ class SwitchParameterComponent final : public Component, |
|
|
private ParameterListener
|
|
|
private ParameterListener
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
public:
|
|
|
SwitchParameterComponent (AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (param)
|
|
|
|
|
|
|
|
|
SwitchParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (processor, param)
|
|
|
{
|
|
|
{
|
|
|
auto* leftButton = buttons.add (new TextButton());
|
|
|
auto* leftButton = buttons.add (new TextButton());
|
|
|
auto* rightButton = buttons.add (new TextButton());
|
|
|
auto* rightButton = buttons.add (new TextButton());
|
|
|
@@ -240,8 +259,8 @@ class ChoiceParameterComponent final : public Component, |
|
|
private ParameterListener
|
|
|
private ParameterListener
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
public:
|
|
|
ChoiceParameterComponent (AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (param),
|
|
|
|
|
|
|
|
|
ChoiceParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (processor, param),
|
|
|
parameterValues (getParameter().getAllValueStrings())
|
|
|
parameterValues (getParameter().getAllValueStrings())
|
|
|
{
|
|
|
{
|
|
|
box.addItemList (parameterValues, 1);
|
|
|
box.addItemList (parameterValues, 1);
|
|
|
@@ -302,8 +321,8 @@ class SliderParameterComponent final : public Component, |
|
|
private ParameterListener
|
|
|
private ParameterListener
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
public:
|
|
|
SliderParameterComponent (AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (param)
|
|
|
|
|
|
|
|
|
SliderParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)
|
|
|
|
|
|
: ParameterListener (processor, param)
|
|
|
{
|
|
|
{
|
|
|
if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps())
|
|
|
if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps())
|
|
|
slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0));
|
|
|
slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0));
|
|
|
@@ -392,7 +411,7 @@ private: |
|
|
class ParameterDisplayComponent : public Component
|
|
|
class ParameterDisplayComponent : public Component
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
public:
|
|
|
ParameterDisplayComponent (AudioProcessorParameter& param)
|
|
|
|
|
|
|
|
|
ParameterDisplayComponent (AudioProcessor& processor, AudioProcessorParameter& param)
|
|
|
: parameter (param)
|
|
|
: parameter (param)
|
|
|
{
|
|
|
{
|
|
|
parameterName.setText (parameter.getName (128), dontSendNotification);
|
|
|
parameterName.setText (parameter.getName (128), dontSendNotification);
|
|
|
@@ -408,24 +427,24 @@ public: |
|
|
// marking a parameter as boolean. If you want consistency across
|
|
|
// marking a parameter as boolean. If you want consistency across
|
|
|
// all formats then it might be best to use a
|
|
|
// all formats then it might be best to use a
|
|
|
// SwitchParameterComponent instead.
|
|
|
// SwitchParameterComponent instead.
|
|
|
parameterComp.reset (new BooleanParameterComponent (param));
|
|
|
|
|
|
|
|
|
parameterComp.reset (new BooleanParameterComponent (processor, param));
|
|
|
}
|
|
|
}
|
|
|
else if (param.getNumSteps() == 2)
|
|
|
else if (param.getNumSteps() == 2)
|
|
|
{
|
|
|
{
|
|
|
// Most hosts display any parameter with just two steps as a switch.
|
|
|
// 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())
|
|
|
else if (! param.getAllValueStrings().isEmpty())
|
|
|
{
|
|
|
{
|
|
|
// If we have a list of strings to represent the different states a
|
|
|
// 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
|
|
|
// parameter can be in then we should present a dropdown allowing a
|
|
|
// user to pick one of them.
|
|
|
// user to pick one of them.
|
|
|
parameterComp.reset (new ChoiceParameterComponent (param));
|
|
|
|
|
|
|
|
|
parameterComp.reset (new ChoiceParameterComponent (processor, param));
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
else
|
|
|
{
|
|
|
{
|
|
|
// Everything else can be represented as a slider.
|
|
|
// Everything else can be represented as a slider.
|
|
|
parameterComp.reset (new SliderParameterComponent (param));
|
|
|
|
|
|
|
|
|
parameterComp.reset (new SliderParameterComponent (processor, param));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
addAndMakeVisible (parameterComp.get());
|
|
|
addAndMakeVisible (parameterComp.get());
|
|
|
@@ -455,11 +474,11 @@ private: |
|
|
class ParametersPanel : public Component
|
|
|
class ParametersPanel : public Component
|
|
|
{
|
|
|
{
|
|
|
public:
|
|
|
public:
|
|
|
ParametersPanel (const Array<AudioProcessorParameter*>& parameters)
|
|
|
|
|
|
|
|
|
ParametersPanel (AudioProcessor& processor, const Array<AudioProcessorParameter*>& parameters)
|
|
|
{
|
|
|
{
|
|
|
for (auto* param : parameters)
|
|
|
for (auto* param : parameters)
|
|
|
if (param->isAutomatable())
|
|
|
if (param->isAutomatable())
|
|
|
addAndMakeVisible (paramComponents.add (new ParameterDisplayComponent (*param)));
|
|
|
|
|
|
|
|
|
addAndMakeVisible (paramComponents.add (new ParameterDisplayComponent (processor, *param)));
|
|
|
|
|
|
|
|
|
if (auto* comp = paramComponents[0])
|
|
|
if (auto* comp = paramComponents[0])
|
|
|
setSize (comp->getWidth(), comp->getHeight() * paramComponents.size());
|
|
|
setSize (comp->getWidth(), comp->getHeight() * paramComponents.size());
|
|
|
@@ -499,7 +518,7 @@ struct GenericAudioProcessorEditor::Pimpl |
|
|
|
|
|
|
|
|
owner.setOpaque (true);
|
|
|
owner.setOpaque (true);
|
|
|
|
|
|
|
|
|
view.setViewedComponent (new ParametersPanel (juceParameters.params));
|
|
|
|
|
|
|
|
|
view.setViewedComponent (new ParametersPanel (*p, juceParameters.params));
|
|
|
owner.addAndMakeVisible (view);
|
|
|
owner.addAndMakeVisible (view);
|
|
|
|
|
|
|
|
|
view.setScrollBarsShown (true, false);
|
|
|
view.setScrollBarsShown (true, false);
|
|
|
|