commit 0795a1f6b11e7ecc4981bbae374f4c15b227145b
parent ec40b92a92dc98ae9016002567b31be50117d26b
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Sun, 2 Jun 2024 12:39:55 +0200
fix begin/end change gesture issues when DSP replies to parameter changes via sysex
Diffstat:
3 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/source/jucePluginLib/parameter.cpp b/source/jucePluginLib/parameter.cpp
@@ -46,9 +46,9 @@ namespace pluginLib
break;
case Origin::Unknown:
case Origin::Ui:
- beginChangeGesture();
- setUnnormalizedValueNotifyingHost(newValue, Origin::Derived);
- endChangeGesture();
+ {
+ setUnnormalizedValueNotifyingHost(newValue, Origin::Derived);
+ }
break;
}
}
@@ -121,18 +121,21 @@ namespace pluginLib
void Parameter::setValueNotifyingHost(const float _value, const Origin _origin)
{
+ ScopedChangeGesture g(*this);
setUnnormalizedValue(juce::roundToInt(convertFrom0to1(_value)), _origin);
sendValueChangedMessageToListeners(_value);
}
void Parameter::setUnnormalizedValueNotifyingHost(const float _value, const Origin _origin)
{
+ ScopedChangeGesture g(*this);
setUnnormalizedValue(juce::roundToInt(_value), _origin);
sendValueChangedMessageToListeners(convertTo0to1(_value));
}
void Parameter::setUnnormalizedValueNotifyingHost(const int _value, const Origin _origin)
{
+ ScopedChangeGesture g(*this);
setUnnormalizedValue(_value, _origin);
sendValueChangedMessageToListeners(convertTo0to1(static_cast<float>(_value)));
}
@@ -158,6 +161,21 @@ namespace pluginLib
onLinkStateChanged(this, m_linkType);
}
+ void Parameter::pushChangeGesture()
+ {
+ if(!m_changeGestureCount)
+ beginChangeGesture();
+ ++m_changeGestureCount;
+ }
+
+ void Parameter::popChangeGesture()
+ {
+ assert(m_changeGestureCount > 0);
+ --m_changeGestureCount;
+ if(!m_changeGestureCount)
+ endChangeGesture();
+ }
+
bool Parameter::isMetaParameter() const
{
return !m_derivedParameters.empty();
@@ -173,6 +191,8 @@ namespace pluginLib
if (m_changingDerivedValues)
return;
+ if(_origin == Origin::Midi)
+ int foo=0;
m_lastValueOrigin = _origin;
m_value.setValue(clampValue(_newValue));
sendToSynth();
@@ -196,9 +216,7 @@ namespace pluginLib
if (notifyHost && getDescription().isPublic)
{
- beginChangeGesture();
setUnnormalizedValueNotifyingHost(clampedValue, _origin);
- endChangeGesture();
}
else
{
diff --git a/source/jucePluginLib/parameter.h b/source/jucePluginLib/parameter.h
@@ -95,7 +95,25 @@ namespace pluginLib
ParameterLinkType getLinkState() const { return m_linkType; }
+ void pushChangeGesture();
+ void popChangeGesture();
+
private:
+
+ struct ScopedChangeGesture
+ {
+ explicit ScopedChangeGesture(Parameter& _p) : m_parameter(_p)
+ {
+ _p.pushChangeGesture();
+ }
+ ~ScopedChangeGesture()
+ {
+ m_parameter.popChangeGesture();
+ }
+ private:
+ Parameter& m_parameter;
+ };
+
static juce::String genId(const Description &d, int part, int uniqueId);
void valueChanged(juce::Value &) override;
void setDerivedValue(int _value, Origin _origin, bool _notifyHost);
@@ -124,5 +142,6 @@ namespace pluginLib
bool m_isLocked = false;
ParameterLinkType m_linkType = None;
+ uint32_t m_changeGestureCount = 0;
};
}
diff --git a/source/jucePluginLib/parameterbinding.cpp b/source/jucePluginLib/parameterbinding.cpp
@@ -14,12 +14,12 @@ namespace pluginLib
void ParameterBinding::MouseListener::mouseDown(const juce::MouseEvent& event)
{
- m_param->beginChangeGesture();
+ m_param->pushChangeGesture();
}
void ParameterBinding::MouseListener::mouseUp(const juce::MouseEvent& event)
{
- m_param->endChangeGesture();
+ m_param->popChangeGesture();
}
void ParameterBinding::MouseListener::mouseDrag(const juce::MouseEvent& event)
@@ -164,9 +164,7 @@ namespace pluginLib
if(v->getDescription().isPublic)
{
- v->beginChangeGesture();
v->setUnnormalizedValueNotifyingHost(id - 1, Parameter::Origin::Ui);
- v->endChangeGesture();
}
v->getValueObject().setValue(id - 1);
};