From 64507828bb5267e7545d4de0be5db79807f55394 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Fri, 15 Jan 2021 22:31:47 +0100 Subject: [PATCH] Add a proxy class for IMidiLearn --- meson.build | 2 + src/common/serialization/vst3/README.md | 1 + .../serialization/vst3/plugin/midi-learn.cpp | 26 +++++++ .../serialization/vst3/plugin/midi-learn.h | 73 +++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 src/common/serialization/vst3/plugin/midi-learn.cpp create mode 100644 src/common/serialization/vst3/plugin/midi-learn.h diff --git a/meson.build b/meson.build index 25e1f7d7..1168b4c5 100644 --- a/meson.build +++ b/meson.build @@ -133,6 +133,7 @@ vst3_plugin_sources = [ 'src/common/serialization/vst3/plugin/edit-controller-host-editing.cpp', 'src/common/serialization/vst3/plugin/info-listener.cpp', 'src/common/serialization/vst3/plugin/keyswitch-controller.cpp', + 'src/common/serialization/vst3/plugin/midi-learn.cpp', 'src/common/serialization/vst3/plugin/midi-mapping.cpp', 'src/common/serialization/vst3/plugin/note-expression-controller.cpp', 'src/common/serialization/vst3/plugin/note-expression-physical-ui-mapping.cpp', @@ -215,6 +216,7 @@ if with_vst3 'src/common/serialization/vst3/plugin/edit-controller-host-editing.cpp', 'src/common/serialization/vst3/plugin/info-listener.cpp', 'src/common/serialization/vst3/plugin/keyswitch-controller.cpp', + 'src/common/serialization/vst3/plugin/midi-learn.cpp', 'src/common/serialization/vst3/plugin/midi-mapping.cpp', 'src/common/serialization/vst3/plugin/note-expression-controller.cpp', 'src/common/serialization/vst3/plugin/note-expression-physical-ui-mapping.cpp', diff --git a/src/common/serialization/vst3/README.md b/src/common/serialization/vst3/README.md index d3f07153..42e7e3d5 100644 --- a/src/common/serialization/vst3/README.md +++ b/src/common/serialization/vst3/README.md @@ -31,6 +31,7 @@ VST3 plugin interfaces are implemented as follows: | `YaEditControllerHostEditing` | `Vst3PluginProxy` | `IEditControllerHostEditing` | | `YaInfoListener` | `Vst3PluginProxy` | `IInfoListener` | | `YaKeyswitchController` | `Vst3PluginProxy` | `IKeyswitchController` | +| `YaMidiLearn` | `Vst3PluginProxy` | `IMidiLearn` | | `YaMidiMapping` | `Vst3PluginProxy` | `IMidiMapping` | | `YaNoteExpressionController` | `Vst3PluginProxy` | `INoteExpressionController` | | `YaNoteExpressionPhysicalUIMapping` | `Vst3PluginProxy` | `INoteExpressionPhysicalUIMapping` | diff --git a/src/common/serialization/vst3/plugin/midi-learn.cpp b/src/common/serialization/vst3/plugin/midi-learn.cpp new file mode 100644 index 00000000..660ebff9 --- /dev/null +++ b/src/common/serialization/vst3/plugin/midi-learn.cpp @@ -0,0 +1,26 @@ +// yabridge: a Wine VST bridge +// Copyright (C) 2020-2021 Robbert van der Helm +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "midi-learn.h" + +YaMidiLearn::ConstructArgs::ConstructArgs() {} + +YaMidiLearn::ConstructArgs::ConstructArgs( + Steinberg::IPtr object) + : supported(Steinberg::FUnknownPtr(object)) {} + +YaMidiLearn::YaMidiLearn(const ConstructArgs&& args) + : arguments(std::move(args)) {} diff --git a/src/common/serialization/vst3/plugin/midi-learn.h b/src/common/serialization/vst3/plugin/midi-learn.h new file mode 100644 index 00000000..700d9583 --- /dev/null +++ b/src/common/serialization/vst3/plugin/midi-learn.h @@ -0,0 +1,73 @@ +// yabridge: a Wine VST bridge +// Copyright (C) 2020-2021 Robbert van der Helm +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +#include "../../common.h" +#include "../base.h" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" + +/** + * Wraps around `IMidiLearn` for serialization purposes. This is instantiated as + * part of `Vst3PluginProxy`. + */ +class YaMidiLearn : public Steinberg::Vst::IMidiLearn { + public: + /** + * These are the arguments for creating a `YaMidiLearn`. + */ + struct ConstructArgs { + ConstructArgs(); + + /** + * Check whether an existing implementation implements `IMidiLearn` + * and read arguments from it. + */ + ConstructArgs(Steinberg::IPtr object); + + /** + * Whether the object supported this interface. + */ + bool supported; + + template + void serialize(S& s) { + s.value1b(supported); + } + }; + + /** + * Instantiate this instance with arguments read from another interface + * implementation. + */ + YaMidiLearn(const ConstructArgs&& args); + + inline bool supported() const { return arguments.supported; } + + virtual tresult PLUGIN_API + onLiveMIDIControllerInput(int32 busIndex, + int16 channel, + Steinberg::Vst::CtrlNumber midiCC) override = 0; + + protected: + ConstructArgs arguments; +}; + +#pragma GCC diagnostic pop