From 0d63c7ee5f5a709a2a94505e0089e01913b67ee8 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 29 Apr 2021 15:38:43 +0200 Subject: [PATCH] Add vst support for message<->update conversion --- plugins/vst/CMakeLists.txt | 1 + plugins/vst/SfizzVstUpdates.cpp | 18 ++++++++++++----- plugins/vst/SfizzVstUpdates.h | 36 +++++++++++++++++++++++++++------ plugins/vst/SfizzVstUpdates.hpp | 30 +++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 plugins/vst/SfizzVstUpdates.hpp diff --git a/plugins/vst/CMakeLists.txt b/plugins/vst/CMakeLists.txt index a92125ad..894975f4 100644 --- a/plugins/vst/CMakeLists.txt +++ b/plugins/vst/CMakeLists.txt @@ -33,6 +33,7 @@ add_library(sfizz-vst3-core STATIC EXCLUDE_FROM_ALL SfizzVstState.h SfizzVstParameters.h SfizzVstUpdates.h + SfizzVstUpdates.hpp SfizzVstUpdates.cpp SfizzVstIDs.h OrderedEventProcessor.h diff --git a/plugins/vst/SfizzVstUpdates.cpp b/plugins/vst/SfizzVstUpdates.cpp index 6ffcbea5..eac7a685 100644 --- a/plugins/vst/SfizzVstUpdates.cpp +++ b/plugins/vst/SfizzVstUpdates.cpp @@ -40,12 +40,20 @@ void QueuedUpdates::removeDependent(IDependent* dep) } /// -OSCUpdate::OSCUpdate(const uint8* data, uint32 size) +bool OSCUpdate::saveToAttributes(Vst::IAttributeList* attrs) const { - uint8* copy = new uint8[size]; - std::copy_n(data, size, copy); - data_.reset(copy); - size_ = size; + return attrs->setBinary("Data", data(), size()) == kResultTrue; +} + +bool OSCUpdate::loadFromAttributes(Vst::IAttributeList* attrs) +{ + const void* data; + uint32 size; + if (attrs->getBinary("Data", data, size) != kResultTrue) + return false; + const uint8* data8 = reinterpret_cast(data); + data_.assign(data8, data8 + size); + return true; } /// diff --git a/plugins/vst/SfizzVstUpdates.h b/plugins/vst/SfizzVstUpdates.h index d39edcfd..23f8a529 100644 --- a/plugins/vst/SfizzVstUpdates.h +++ b/plugins/vst/SfizzVstUpdates.h @@ -6,14 +6,32 @@ #pragma once #include "SfizzVstState.h" +#include +#include #include #include #include #include #include #include +#include #include +/** + * @brief Update which is convertible with Vst::IMessage back and forth. + */ +template class IConvertibleToMessage { +public: + virtual ~IConvertibleToMessage() {} + + IPtr convertToMessage(Vst::ComponentBase* sender) const; + static IPtr convertFromMessage(Vst::IMessage& message); + +protected: + virtual bool saveToAttributes(Vst::IAttributeList* attrs) const = 0; + virtual bool loadFromAttributes(Vst::IAttributeList* attrs) = 0; +}; + /** * @brief Update which notifies a FIFO queue of one-time updates */ @@ -37,17 +55,21 @@ private: /** * @brief Update which notifies a single OSC message */ -class OSCUpdate : public Steinberg::FObject { +class OSCUpdate : public Steinberg::FObject, + public IConvertibleToMessage { public: - OSCUpdate(const uint8* data, uint32 size); - const uint8* data() const noexcept { return data_.get(); } - uint32_t size() const noexcept { return size_; } + OSCUpdate() = default; + OSCUpdate(const uint8* data, uint32 size) : data_(data, data + size) {} + const uint8* data() const noexcept { return data_.data(); } + uint32_t size() const noexcept { return static_cast(data_.size()); } + + bool saveToAttributes(Vst::IAttributeList* attrs) const override; + bool loadFromAttributes(Vst::IAttributeList* attrs) override; OBJ_METHODS(OSCUpdate, FObject) private: - std::unique_ptr data_; - uint32 size_ = 0; + std::vector data_; }; /** @@ -163,3 +185,5 @@ private: SfizzPlayState state_ {}; mutable std::mutex mutex_; }; + +#include "SfizzVstUpdates.hpp" diff --git a/plugins/vst/SfizzVstUpdates.hpp b/plugins/vst/SfizzVstUpdates.hpp new file mode 100644 index 00000000..92f7557b --- /dev/null +++ b/plugins/vst/SfizzVstUpdates.hpp @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#pragma once +#include "SfizzVstUpdates.h" + +template +IPtr IConvertibleToMessage::convertToMessage(Vst::ComponentBase* sender) const +{ + IPtr message = owned(sender->allocateMessage()); + message->setMessageID(static_cast(this)->isA()); + if (!saveToAttributes(message->getAttributes())) + return nullptr; + return message; +} + +template +IPtr IConvertibleToMessage::convertFromMessage(Vst::IMessage& message) +{ + IPtr object; + if (!strcmp(T::getFClassID(), message.getMessageID())) { + object = owned(new T); + if (!object->loadFromAttributes(message.getAttributes())) + object = nullptr; + } + return object; +}