clap

CLAP Audio Plugin API
Log | Files | Refs | README | LICENSE

commit 63f8872c991cf7f5220317b151277e35fcb93e0f
parent 81aab02bdb88240adfc41cb3cb18e3dc8fdea60e
Author: Alexandre BIQUE <bique.alexandre@gmail.com>
Date:   Tue, 14 Sep 2021 18:04:48 +0200

Work on better tracking of begin/end adjust

Diffstat:
Mexamples/host/plugin-host.cc | 66+++++++++++++++++++++++++++++++++++++++++-------------------------
Mexamples/host/plugin-host.hh | 15+++++++++++----
Mexamples/host/plugin-param.hh | 10++++++++--
Mexamples/host/plugin-parameters-widget.cc | 8++++----
Mexamples/host/plugin-parameters-widget.hh | 2+-
Mexamples/plugins/qml/clap/Knob.qml | 5++++-
6 files changed, 69 insertions(+), 37 deletions(-)

diff --git a/examples/host/plugin-host.cc b/examples/host/plugin-host.cc @@ -677,20 +677,21 @@ void PluginHost::process() { _process.audio_outputs_count = 1; _evOut.clear(); - _appToEngineValueQueue.consume([this](clap_id param_id, const ParamQueueValue &value) { - clap_event ev; - ev.time = 0; - ev.type = CLAP_EVENT_PARAM_VALUE; - ev.param_value.param_id = param_id; - ev.param_value.cookie = value.cookie; - ev.param_value.key = -1; - ev.param_value.channel = -1; - ev.param_value.value = value.value; - ev.param_value.flags = 0; - _evIn.push_back(ev); - }); - - _appToEngineModQueue.consume([this](clap_id param_id, const ParamQueueValue &value) { + _appToEngineValueQueue.consume( + [this](clap_id param_id, const AppToEngineParamQueueValue &value) { + clap_event ev; + ev.time = 0; + ev.type = CLAP_EVENT_PARAM_VALUE; + ev.param_value.param_id = param_id; + ev.param_value.cookie = value.cookie; + ev.param_value.key = -1; + ev.param_value.channel = -1; + ev.param_value.value = value.value; + ev.param_value.flags = 0; + _evIn.push_back(ev); + }); + + _appToEngineModQueue.consume([this](clap_id param_id, const AppToEngineParamQueueValue &value) { clap_event ev; ev.time = 0; ev.type = CLAP_EVENT_PARAM_MOD; @@ -715,11 +716,24 @@ void PluginHost::process() { for (auto &ev : _evOut) { switch (ev.type) { - case CLAP_EVENT_PARAM_VALUE: + case CLAP_EVENT_PARAM_VALUE: { + if (ev.param_value.flags & CLAP_EVENT_PARAM_BEGIN_ADJUST) { + if (_isAdjusting[ev.param_value.param_id]) + throw std::logic_error("The plugin sent BEGIN_ADJUST twice"); + _isAdjusting[ev.param_value.param_id] = true; + } + + if (ev.param_value.flags & CLAP_EVENT_PARAM_END_ADJUST) { + if (!_isAdjusting[ev.param_value.param_id]) + throw std::logic_error("The plugin sent END_ADJUST without a preceding BEGIN_ADJUST"); + _isAdjusting[ev.param_value.param_id] = false; + } + _engineToAppValueQueue.set(ev.param_value.param_id, - {ev.param_value.cookie, ev.param_value.value}); + {ev.param_value.value, _isAdjusting[ev.param_value.param_id]}); break; } + } } _evOut.clear(); _evIn.clear(); @@ -741,16 +755,18 @@ void PluginHost::idle() { _appToEngineValueQueue.producerDone(); _appToEngineModQueue.producerDone(); - _engineToAppValueQueue.consume([this](clap_id param_id, const ParamQueueValue &value) { - auto it = _params.find(param_id); - if (it == _params.end()) { - std::ostringstream msg; - msg << "Plugin produced a CLAP_EVENT_PARAM_SET with an unknown param_id: " << param_id; - throw std::invalid_argument(msg.str()); - } + _engineToAppValueQueue.consume( + [this](clap_id param_id, const EngineToAppParamQueueValue &value) { + auto it = _params.find(param_id); + if (it == _params.end()) { + std::ostringstream msg; + msg << "Plugin produced a CLAP_EVENT_PARAM_SET with an unknown param_id: " << param_id; + throw std::invalid_argument(msg.str()); + } - it->second->setValue(value.value); - }); + it->second->setValue(value.value); + it->second->setIsAdjusting(value.isAdjusting); + }); } PluginParam &PluginHost::checkValidParamId(const std::string_view &function, diff --git a/examples/host/plugin-host.hh b/examples/host/plugin-host.hh @@ -215,14 +215,21 @@ PluginHost::clapParamsRescan, /* param update queues */ std::unordered_map<clap_id, std::unique_ptr<PluginParam>> _params; - struct ParamQueueValue { + struct AppToEngineParamQueueValue { void *cookie; double value; }; - ParamQueue<ParamQueueValue> _appToEngineValueQueue; - ParamQueue<ParamQueueValue> _appToEngineModQueue; - ParamQueue<ParamQueueValue> _engineToAppValueQueue; + struct EngineToAppParamQueueValue { + double value; + bool isAdjusting; + }; + + ParamQueue<AppToEngineParamQueueValue> _appToEngineValueQueue; + ParamQueue<AppToEngineParamQueueValue> _appToEngineModQueue; + ParamQueue<EngineToAppParamQueueValue> _engineToAppValueQueue; + + std::unordered_map<clap_id, bool> _isAdjusting; std::unordered_map<clap_id, std::unique_ptr<clap_quick_controls_page>> _quickControlsPages; clap_id _quickControlsSelectedPage = CLAP_INVALID_ID; diff --git a/examples/host/plugin-param.hh b/examples/host/plugin-param.hh @@ -36,15 +36,21 @@ public: const clap_param_info &info() const noexcept { return _info; } bool isBeingAdjusted() const noexcept { return _isBeingAdjusted; } + void setIsAdjusting(bool isAdjusting) { + if (isAdjusting && !_isBeingAdjusted) + beginAdjust(); + else if (!isAdjusting && _isBeingAdjusted) + endAdjust(); + } void beginAdjust() { Q_ASSERT(!_isBeingAdjusted); _isBeingAdjusted = true; - isBeingAdjustedChanged(); + emit isBeingAdjustedChanged(); } void endAdjust() { Q_ASSERT(_isBeingAdjusted); _isBeingAdjusted = false; - isBeingAdjustedChanged(); + emit isBeingAdjustedChanged(); } signals: diff --git a/examples/host/plugin-parameters-widget.cc b/examples/host/plugin-parameters-widget.cc @@ -208,7 +208,7 @@ void PluginParametersWidget::connectToParam(PluginParam *param) { connect(param, &PluginParam::isBeingAdjustedChanged, this, - &PluginParametersWidget::updateParamIsBeingAjustedChanged); + &PluginParametersWidget::updateParamIsBeingAjusted); updateAll(); } @@ -224,7 +224,7 @@ void PluginParametersWidget::disconnectFromParam() { disconnect(_currentParam, &PluginParam::isBeingAdjustedChanged, this, - &PluginParametersWidget::updateParamIsBeingAjustedChanged); + &PluginParametersWidget::updateParamIsBeingAjusted); _currentParam = nullptr; @@ -235,7 +235,7 @@ void PluginParametersWidget::updateAll() { updateParamInfo(); updateParamValue(); updateParamModulation(); - updateParamIsBeingAjustedChanged(); + updateParamIsBeingAjusted(); } void PluginParametersWidget::updateParamInfo() { @@ -276,7 +276,7 @@ void PluginParametersWidget::updateParamInfo() { } } -void PluginParametersWidget::updateParamIsBeingAjustedChanged() { +void PluginParametersWidget::updateParamIsBeingAjusted() { if (!_currentParam) { _isBeingAdjusted->setText("-"); } else { diff --git a/examples/host/plugin-parameters-widget.hh b/examples/host/plugin-parameters-widget.hh @@ -71,7 +71,7 @@ private: void updateParamValue(); void updateParamValueText(); void updateParamModulation(); - void updateParamIsBeingAjustedChanged(); + void updateParamIsBeingAjusted(); static const constexpr int SLIDER_RANGE = 10000; diff --git a/examples/plugins/qml/clap/Knob.qml b/examples/plugins/qml/clap/Knob.qml @@ -43,11 +43,12 @@ Canvas { lastY = mouse.y; knob.param.isAdjusting = true; knob.requestPaint(); + mouse.accepted = true; } } onReleased: (mouse) => { - if (mouse.button === Qt.LeftButton) { + if (mouse.button === Qt.LeftButton || !(mouse.buttons & Qt.LeftButton)) { knob.param.isAdjusting = false; knob.requestPaint(); } @@ -58,6 +59,7 @@ Canvas { return; knob.param.normalizedValue += ((mouse.modifiers & Qt.ShiftModifier) ? 0.001 : 0.01) * (lastY - mouse.y); lastY = mouse.y; + mouse.accepted = true; knob.requestPaint(); } @@ -65,6 +67,7 @@ Canvas { if (mouse.button === Qt.LeftButton) { knob.param.setToDefault(); knob.requestPaint(); + mouse.accepted = true; } }