mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Fixed some bugs in GenericAudioProcessorEditor
This commit is contained in:
parent
e89c4d5d4e
commit
208c7923dc
3 changed files with 58 additions and 39 deletions
|
|
@ -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<LegacyAudioParameter*> (param))
|
||||
{
|
||||
return legacy->idx;
|
||||
return legacy->parameterIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -119,9 +121,6 @@ public:
|
|||
|
||||
return String (param->getParameterIndex());
|
||||
}
|
||||
private:
|
||||
AudioProcessor& audioProcessor;
|
||||
int idx;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -287,6 +287,7 @@ public:
|
|||
private:
|
||||
//==============================================================================
|
||||
friend class AudioProcessor;
|
||||
friend class LegacyAudioParameter;
|
||||
AudioProcessor* processor = nullptr;
|
||||
int parameterIndex = -1;
|
||||
CriticalSection listenerLock;
|
||||
|
|
|
|||
|
|
@ -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<int> 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<AudioProcessorParameter*>& parameters)
|
||||
ParametersPanel (AudioProcessor& processor, const Array<AudioProcessorParameter*>& 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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue