commit 5a92d08ef711d069da3497966666a0d14f794708
parent f28d1ad577bba445d247e2201a718f312508cb47
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Mon, 6 May 2024 22:37:56 +0200
add support to rate limit parameter changes
Diffstat:
2 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/source/jucePluginLib/parameter.cpp b/source/jucePluginLib/parameter.cpp
@@ -69,17 +69,60 @@ namespace pluginLib
// ignore initial update
if (m_lastValue != -1)
- m_ctrl.sendParameterChange(*this, static_cast<uint8_t>(value));
+ {
+ if(m_rateLimit)
+ {
+ sendParameterChangeDelayed(static_cast<uint8_t>(value), ++m_uniqueDelayCallbackId);
+ }
+ else
+ {
+ m_lastSendTime = milliseconds();
+ m_ctrl.sendParameterChange(*this, static_cast<uint8_t>(value));
+ }
+ }
m_lastValue = value;
}
+ uint64_t Parameter::milliseconds()
+ {
+ const auto t = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch());
+ return t.count();
+ }
+
+ void Parameter::sendParameterChangeDelayed(const uint8_t _value, uint32_t _uniqueId)
+ {
+ if(_uniqueId != m_uniqueDelayCallbackId)
+ return;
+
+ const auto ms = milliseconds();
+
+ const auto elapsed = ms - m_lastSendTime;
+ if(elapsed >= m_rateLimit)
+ {
+ m_lastSendTime = ms;
+ m_ctrl.sendParameterChange(*this, _value);
+ }
+ else
+ {
+ juce::Timer::callAfterDelay(static_cast<int>(elapsed), [this, _value, _uniqueId]
+ {
+ sendParameterChangeDelayed(_value, _uniqueId);
+ });
+ }
+ }
+
void Parameter::setValueNotifyingHost(const float _value, const ChangedBy _origin)
{
setValue(_value, _origin);
sendValueChangedMessageToListeners(_value);
}
+ void Parameter::setRateLimitMilliseconds(const uint32_t _ms)
+ {
+ m_rateLimit = _ms;
+ }
+
bool Parameter::isMetaParameter() const
{
return !m_derivedParameters.empty();
diff --git a/source/jucePluginLib/parameter.h b/source/jucePluginLib/parameter.h
@@ -83,11 +83,15 @@ namespace pluginLib
void setValueNotifyingHost(float _value, ChangedBy _origin);
+ void setRateLimitMilliseconds(uint32_t _ms);
+
private:
static juce::String genId(const Description &d, int part, int uniqueId);
void valueChanged(juce::Value &) override;
void setDerivedValue(int _value, ChangedBy _origin, bool _notifyHost);
void sendToSynth();
+ static uint64_t milliseconds();
+ void sendParameterChangeDelayed(uint8_t, uint32_t _uniqueId);
Controller &m_ctrl;
const Description m_desc;
@@ -99,5 +103,9 @@ namespace pluginLib
juce::Value m_value;
std::set<Parameter*> m_derivedParameters;
bool m_changingDerivedValues = false;
+
+ uint32_t m_rateLimit = 0; // milliseconds
+ uint64_t m_lastSendTime = 0;
+ uint32_t m_uniqueDelayCallbackId = 0;
};
}