From 1d6d4dc7b804b19fd94f97461bbec5e1a3dcb885 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 27 Sep 2020 18:01:50 +0200 Subject: [PATCH] VST3: add set-dirty/state-changed support --- libs/ardour/ardour/vst3_plugin.h | 9 ++++++- libs/ardour/vst3_host.cc | 1 + libs/ardour/vst3_plugin.cc | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/vst3_plugin.h b/libs/ardour/ardour/vst3_plugin.h index 3be200414a..2e09998ab0 100644 --- a/libs/ardour/ardour/vst3_plugin.h +++ b/libs/ardour/ardour/vst3_plugin.h @@ -48,6 +48,7 @@ namespace Steinberg { */ class LIBARDOUR_API VST3PI : public Vst::IComponentHandler + , public Vst::IComponentHandler2 , public Vst::IConnectionPoint , public IPlugFrame { @@ -61,6 +62,12 @@ public: tresult PLUGIN_API endEdit (Vst::ParamID id) SMTG_OVERRIDE; tresult PLUGIN_API restartComponent (int32 flags) SMTG_OVERRIDE; + /* IComponentHandler2 */ + tresult PLUGIN_API setDirty (TBool state) SMTG_OVERRIDE; + tresult PLUGIN_API requestOpenEditor (FIDString name) SMTG_OVERRIDE; + tresult PLUGIN_API startGroupEdit () SMTG_OVERRIDE; + tresult PLUGIN_API finishGroupEdit () SMTG_OVERRIDE; + /* IConnectionPoint API */ tresult PLUGIN_API connect (Vst::IConnectionPoint* other) SMTG_OVERRIDE; tresult PLUGIN_API disconnect (Vst::IConnectionPoint* other) SMTG_OVERRIDE; @@ -120,7 +127,7 @@ public: std::string format_parameter (uint32_t p) const; Vst::ParamID index_to_id (uint32_t) const; - enum ParameterChange { BeginGesture, EndGesture , ValueChange }; + enum ParameterChange { BeginGesture, EndGesture , ValueChange, InternalChange }; PBD::Signal3 OnParameterChange; /* API for Ardour -- Setup/Processing */ diff --git a/libs/ardour/vst3_host.cc b/libs/ardour/vst3_host.cc index 47816fc796..cd9c085cda 100644 --- a/libs/ardour/vst3_host.cc +++ b/libs/ardour/vst3_host.cc @@ -40,6 +40,7 @@ DEF_CLASS_IID (Vst::IAudioProcessor) DEF_CLASS_IID (Vst::IAutomationState) DEF_CLASS_IID (Vst::IComponent) DEF_CLASS_IID (Vst::IComponentHandler) +DEF_CLASS_IID (Vst::IComponentHandler2) DEF_CLASS_IID (Vst::IConnectionPoint) DEF_CLASS_IID (Vst::IEditController) DEF_CLASS_IID (Vst::IEventList) diff --git a/libs/ardour/vst3_plugin.cc b/libs/ardour/vst3_plugin.cc index 4c242703f2..3f3ccf4dd6 100644 --- a/libs/ardour/vst3_plugin.cc +++ b/libs/ardour/vst3_plugin.cc @@ -105,6 +105,9 @@ VST3Plugin::parameter_change_handler (VST3PI::ParameterChange t, uint32_t param, /* emit ParameterChangedExternally, mark preset dirty */ Plugin::parameter_changed_externally (param, value); break; + case VST3PI::InternalChange: + Plugin::state_changed (); + break; } } @@ -1225,6 +1228,8 @@ VST3PI::queryInterface (const TUID _iid, void** obj) { QUERY_INTERFACE (_iid, obj, FUnknown::iid, Vst::IComponentHandler) QUERY_INTERFACE (_iid, obj, Vst::IComponentHandler::iid, Vst::IComponentHandler) + QUERY_INTERFACE (_iid, obj, FUnknown::iid, Vst::IComponentHandler2) + QUERY_INTERFACE (_iid, obj, Vst::IComponentHandler2::iid, Vst::IComponentHandler2) #if SMTG_OS_LINUX if (_run_loop && FUnknownPrivate::iidEqual (_iid, Linux::IRunLoop::iid)) { @@ -1296,6 +1301,43 @@ VST3PI::endEdit (Vst::ParamID id) return kResultOk; } +tresult +VST3PI::setDirty (TBool state) +{ + if (state) { + OnParameterChange (InternalChange, 0, 0); /* EMIT SIGNAL */ + } + return kResultOk; +} + +tresult +VST3PI::requestOpenEditor (FIDString name) +{ + if (name == Vst::ViewType::kEditor) { + /* TODO get plugin-insert (first plugin only, not replicated ones) + * call pi->ShowUI (); + */ + } + return kNotImplemented; +} + +tresult +VST3PI::startGroupEdit () +{ + /* TODO: + * remember current time, update StartTouch API + * to allow passing a timestamp to PluginInsert::start_touch + * replacing .audible_sample() + */ + return kNotImplemented; +} + +tresult +VST3PI::finishGroupEdit () +{ + return kNotImplemented; +} + bool VST3PI::deactivate () {