Deduplicate CLAP extension support queries

They're only queried once now and the booleans are derived from the
stored pointers.
This commit is contained in:
Robbert van der Helm
2022-09-12 18:42:52 +02:00
parent b31bee24b6
commit 51edef4427
8 changed files with 48 additions and 40 deletions
-3
View File
@@ -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
+3 -10
View File
@@ -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;
-4
View File
@@ -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
+2 -9
View File
@@ -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;
@@ -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()`
@@ -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;
};
+22 -11
View File
@@ -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<clap_host_proxy> 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();
},
+6
View File
@@ -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;
};