diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index f5c6983e..1add9e8f 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -257,6 +257,13 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaPlugView::Removed& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.owner_instance_id << ": IPlugView::removed()"; + }); +} + bool Vst3Logger::log_request(bool is_host_vst, const YaPlugView::GetSize& request) { return log_request_base(is_host_vst, [&](auto& message) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index d5c237e6..b42af87c 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -90,6 +90,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaPlugView::IsPlatformTypeSupported&); bool log_request(bool is_host_vst, const YaPlugView::Attached&); + bool log_request(bool is_host_vst, const YaPlugView::Removed&); bool log_request(bool is_host_vst, const YaPlugView::GetSize&); bool log_request(bool is_host_vst, const YaPluginBase::Initialize&); bool log_request(bool is_host_vst, const YaPluginBase::Terminate&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index d41c52f3..7fa649b6 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -79,6 +79,7 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.value8b(owner_instance_id); + } + }; + virtual tresult PLUGIN_API removed() override = 0; virtual tresult PLUGIN_API onWheel(float distance) override = 0; virtual tresult PLUGIN_API onKeyDown(char16 key, diff --git a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp index e71f7d03..8b931003 100644 --- a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp @@ -59,9 +59,8 @@ tresult PLUGIN_API Vst3PlugViewProxyImpl::attached(void* parent, } tresult PLUGIN_API Vst3PlugViewProxyImpl::removed() { - // TODO: Implement - bridge.logger.log("TODO: IPlugView::removed()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaPlugView::Removed{.owner_instance_id = owner_instance_id()}); } tresult PLUGIN_API Vst3PlugViewProxyImpl::onWheel(float distance) { diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 4a4476f4..c29447f3 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -355,6 +355,21 @@ void Vst3Bridge::run() { }) .get(); }, + [&](const YaPlugView::Removed& request) + -> YaPlugView::Removed::Response { + return main_context + .run_in_context([&]() { + const tresult result = + object_instances[request.owner_instance_id] + .plug_view->removed(); + + object_instances[request.owner_instance_id] + .editor.reset(); + + return result; + }) + .get(); + }, [&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response { const tresult result = object_instances[request.owner_instance_id]