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:
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;
}
}