From c676dfb6511241ff74fbceecdecbaeba84c59953 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sat, 10 Sep 2022 18:33:22 +0200 Subject: [PATCH] Add CLAP plugin activation and deactivation Shared memory audio buffers are not yet set up. --- src/common/serialization/clap.h | 4 ++- .../bridges/clap-impls/plugin-proxy.cpp | 17 +++++++-- src/wine-host/bridges/clap.cpp | 36 ++++++++++++++++++- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/common/serialization/clap.h b/src/common/serialization/clap.h index 7594436a..ba7eb9ef 100644 --- a/src/common/serialization/clap.h +++ b/src/common/serialization/clap.h @@ -43,7 +43,9 @@ using ClapMainThreadControlRequest = std::variant; + clap::plugin::Destroy, + clap::plugin::Activate, + clap::plugin::Deactivate>; template void serialize(S& s, ClapMainThreadControlRequest& payload) { diff --git a/src/plugin/bridges/clap-impls/plugin-proxy.cpp b/src/plugin/bridges/clap-impls/plugin-proxy.cpp index 3dee36fe..fdf0f962 100644 --- a/src/plugin/bridges/clap-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/clap-impls/plugin-proxy.cpp @@ -80,8 +80,18 @@ bool CLAP_ABI clap_plugin_proxy::plugin_activate( assert(plugin && plugin->plugin_data); auto self = static_cast(plugin->plugin_data); - // TODO: Implement - return false; + const clap::plugin::ActivateResponse response = + self->bridge_.send_main_thread_message( + clap::plugin::Activate{.instance_id = self->instance_id(), + .sample_rate = sample_rate, + .min_frames_count = min_frames_count, + .max_frames_count = max_frames_count}); + + if (response.updated_audio_buffers_config) { + // TODO: Set up the shared memory audio buffers + } + + return response.result; } void CLAP_ABI @@ -89,7 +99,8 @@ clap_plugin_proxy::plugin_deactivate(const struct clap_plugin* plugin) { assert(plugin && plugin->plugin_data); auto self = static_cast(plugin->plugin_data); - // TODO: Implement + self->bridge_.send_main_thread_message( + clap::plugin::Deactivate{.instance_id = self->instance_id()}); } bool CLAP_ABI diff --git a/src/wine-host/bridges/clap.cpp b/src/wine-host/bridges/clap.cpp index 2ab0ca8a..0bb46d28 100644 --- a/src/wine-host/bridges/clap.cpp +++ b/src/wine-host/bridges/clap.cpp @@ -238,7 +238,6 @@ void ClapBridge::run() { }) .get(); }, - [&](clap::plugin::Destroy& request) -> clap::plugin::Destroy::Response { return main_context_ @@ -252,6 +251,41 @@ void ClapBridge::run() { }) .get(); }, + [&](clap::plugin::Activate& request) + -> clap::plugin::Activate::Response { + return main_context_ + .run_in_context([&]() { + const auto& [instance, _] = + get_instance(request.instance_id); + + const bool result = instance.plugin->activate( + instance.plugin.get(), request.sample_rate, + request.min_frames_count, request.max_frames_count); + + // TODO: Audio buffer setup + const std::optional + updated_audio_buffers_config; + + return clap::plugin::ActivateResponse{ + .result = result, + .updated_audio_buffers_config = + std::move(updated_audio_buffers_config)}; + }) + .get(); + }, + [&](clap::plugin::Deactivate& request) + -> clap::plugin::Deactivate::Response { + return main_context_ + .run_in_context([&]() { + const auto& [instance, _] = + get_instance(request.instance_id); + + instance.plugin->deactivate(instance.plugin.get()); + + return Ack{}; + }) + .get(); + }, }); }