diff --git a/src/common/serialization/clap/host.cpp b/src/common/serialization/clap/host.cpp index 93a2cfc9..bbc39dc2 100644 --- a/src/common/serialization/clap/host.cpp +++ b/src/common/serialization/clap/host.cpp @@ -28,8 +28,5 @@ Host::Host(const clap_host_t& original) url(original.url ? std::optional(original.url) : std::nullopt), version((assert(original.version), original.version)) {} -SupportedHostExtensions::SupportedHostExtensions(const clap_host& host) - : supports_audio_ports(host.get_extension(&host, CLAP_EXT_AUDIO_PORTS)) {} - } // namespace host } // namespace clap diff --git a/src/common/serialization/clap/host.h b/src/common/serialization/clap/host.h index 1949537c..c3e329fa 100644 --- a/src/common/serialization/clap/host.h +++ b/src/common/serialization/clap/host.h @@ -75,18 +75,11 @@ struct Host { /** * Extensions supported by the host. This can only be queried in - * `clap_plugin::init()` so it cannot be part of `Host`. We'll create make these - * same extensions available to the bridged CLAP plugins using proxies. + * `clap_plugin::init()` so it cannot be part of `Host`. Created by + * `ClapHostExtensions::supported()`. We'll create make these same extensions + * available to the bridged CLAP plugins using proxies. */ struct SupportedHostExtensions { - /** - * Read the supported extensions from a native CLAP host. This is only valid - * once the native host has called `clap_host::init()`. - */ - SupportedHostExtensions(const clap_host& host); - - SupportedHostExtensions() noexcept {} - // Don't forget to add new extensions to the log output bool supports_audio_ports = false; diff --git a/src/common/serialization/clap/plugin.cpp b/src/common/serialization/clap/plugin.cpp index 3798e337..3e84f459 100644 --- a/src/common/serialization/clap/plugin.cpp +++ b/src/common/serialization/clap/plugin.cpp @@ -76,9 +76,5 @@ const clap_plugin_descriptor_t* Descriptor::get() const { return &clap_descriptor; } -SupportedPluginExtensions::SupportedPluginExtensions(const clap_plugin& plugin) - : supports_audio_ports( - plugin.get_extension(&plugin, CLAP_EXT_AUDIO_PORTS)) {} - } // namespace plugin } // namespace clap diff --git a/src/common/serialization/clap/plugin.h b/src/common/serialization/clap/plugin.h index 7a358e39..124a2347 100644 --- a/src/common/serialization/clap/plugin.h +++ b/src/common/serialization/clap/plugin.h @@ -109,17 +109,10 @@ struct Descriptor { }; /** - * Extensions supported by the plugin. Queried after `clap_plugin::init()`. + * Extensions supported by the plugin. Queried after `clap_plugin::init()` and + * created by `ClapPluginExtensions::supported()`. */ struct SupportedPluginExtensions { - /** - * Read the supported extensions from a CLAP plugin. This is only valid - * after `clap_plugin::init()` has been called on the plugin. - */ - SupportedPluginExtensions(const clap_plugin& plugin); - - SupportedPluginExtensions() noexcept {} - // Don't forget to add new extensions to the log output bool supports_audio_ports = false; diff --git a/src/plugin/bridges/clap-impls/plugin-proxy.cpp b/src/plugin/bridges/clap-impls/plugin-proxy.cpp index cea16f37..385f20e4 100644 --- a/src/plugin/bridges/clap-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/clap-impls/plugin-proxy.cpp @@ -24,6 +24,12 @@ ClapHostExtensions::ClapHostExtensions(const clap_host& host) noexcept ClapHostExtensions::ClapHostExtensions() noexcept {} +clap::host::SupportedHostExtensions ClapHostExtensions::supported() + const noexcept { + return clap::host::SupportedHostExtensions{.supports_audio_ports = + audio_ports != nullptr}; +} + clap_plugin_proxy::clap_plugin_proxy(ClapPluginBridge& bridge, size_t instance_id, clap::plugin::Descriptor descriptor, @@ -65,9 +71,9 @@ bool CLAP_ABI clap_plugin_proxy::plugin_init(const struct clap_plugin* plugin) { self->extensions_ = ClapHostExtensions(*self->host_); const clap::plugin::InitResponse response = - self->bridge_.send_main_thread_message( - clap::plugin::Init{.instance_id = self->instance_id(), - .supported_host_extensions = *self->host_}); + self->bridge_.send_main_thread_message(clap::plugin::Init{ + .instance_id = self->instance_id(), + .supported_host_extensions = self->extensions_.supported()}); // This determines which extensions the host is allowed to query in // `clap_plugin::get_extension()` diff --git a/src/plugin/bridges/clap-impls/plugin-proxy.h b/src/plugin/bridges/clap-impls/plugin-proxy.h index 68616215..9039cdbe 100644 --- a/src/plugin/bridges/clap-impls/plugin-proxy.h +++ b/src/plugin/bridges/clap-impls/plugin-proxy.h @@ -49,6 +49,12 @@ struct ClapHostExtensions { */ ClapHostExtensions() noexcept; + /** + * Get the supported extensions as boolean values for serialization + * purposes. + */ + clap::host::SupportedHostExtensions supported() const noexcept; + const clap_host_audio_ports_t* audio_ports = nullptr; }; diff --git a/src/wine-host/bridges/clap.cpp b/src/wine-host/bridges/clap.cpp index fd1b393e..25db058d 100644 --- a/src/wine-host/bridges/clap.cpp +++ b/src/wine-host/bridges/clap.cpp @@ -32,6 +32,12 @@ ClapPluginExtensions::ClapPluginExtensions(const clap_plugin& plugin) noexcept ClapPluginExtensions::ClapPluginExtensions() noexcept {} +clap::plugin::SupportedPluginExtensions ClapPluginExtensions::supported() + const noexcept { + return clap::plugin::SupportedPluginExtensions{.supports_audio_ports = + audio_ports != nullptr}; +} + ClapPluginInstance::ClapPluginInstance( const clap_plugin* plugin, std::unique_ptr host_proxy) noexcept @@ -227,6 +233,12 @@ void ClapBridge::run() { const bool result = instance.plugin->init(instance.plugin.get()); if (result) { + // This mimics the same behavior we had to implement + // for VST2 and VST3. The Win32 message loop is + // completely blocked while a plugin instance has + // been created but not yet initialized. + instance.is_initialized = true; + // At this point we should also get the extension // pointers for the plugin's supported extensions. // In addition we'll send whether or not the plugin @@ -236,18 +248,17 @@ void ClapBridge::run() { instance.extensions = ClapPluginExtensions(*instance.plugin); - // This mimics the same behavior we had to implement - // for VST2 and VST3. The Win32 message loop is - // completely blocked while a plugin instance has - // been created but not yet initialized. - instance.is_initialized = true; + return clap::plugin::InitResponse{ + .result = result, + // Similarly, we'll make the plugin's supported + // extensions available to the host + .supported_plugin_extensions = + instance.extensions.supported()}; + } else { + return clap::plugin::InitResponse{ + .result = result, + .supported_plugin_extensions = {}}; } - - return clap::plugin::InitResponse{ - .result = result, - // Similarly, we'll make the plugin's supported - // extensions available to the host - .supported_plugin_extensions = *instance.plugin}; }) .get(); }, diff --git a/src/wine-host/bridges/clap.h b/src/wine-host/bridges/clap.h index b311766e..be6d8fec 100644 --- a/src/wine-host/bridges/clap.h +++ b/src/wine-host/bridges/clap.h @@ -60,6 +60,12 @@ struct ClapPluginExtensions { */ ClapPluginExtensions() noexcept; + /** + * Get the supported extensions as boolean values for serialization + * purposes. + */ + clap::plugin::SupportedPluginExtensions supported() const noexcept; + const clap_plugin_audio_ports_t* audio_ports = nullptr; };