diff --git a/src/plugin/bridges/clap-impls/plugin-proxy.cpp b/src/plugin/bridges/clap-impls/plugin-proxy.cpp index 385f20e4..3031f65f 100644 --- a/src/plugin/bridges/clap-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/clap-impls/plugin-proxy.cpp @@ -201,8 +201,9 @@ clap_plugin_proxy::ext_audio_ports_count(const clap_plugin_t* plugin, assert(plugin && plugin->plugin_data); auto self = static_cast(plugin->plugin_data); - // TODO: Implement - return 0; + return self->bridge_.send_main_thread_message( + clap::ext::audio_ports::plugin::Count{ + .instance_id = self->instance_id(), .is_input = is_input}); } bool CLAP_ABI @@ -213,6 +214,17 @@ clap_plugin_proxy::ext_audio_ports_get(const clap_plugin_t* plugin, assert(plugin && plugin->plugin_data && info); auto self = static_cast(plugin->plugin_data); - // TODO: Implement - return false; + const clap::ext::audio_ports::plugin::GetResponse response = + self->bridge_.send_main_thread_message( + clap::ext::audio_ports::plugin::Get{ + .instance_id = self->instance_id(), + .index = index, + .is_input = is_input}); + if (response.result) { + response.result->reconstruct(*info); + + return true; + } else { + return false; + } } diff --git a/src/plugin/bridges/clap.cpp b/src/plugin/bridges/clap.cpp index e4fd8c74..76c29f74 100644 --- a/src/plugin/bridges/clap.cpp +++ b/src/plugin/bridges/clap.cpp @@ -81,6 +81,36 @@ ClapPluginBridge::ClapPluginBridge(const ghc::filesystem::path& plugin_path) return Ack{}; }, + [&](const clap::ext::audio_ports::host::IsRescanFlagSupported& + request) + -> clap::ext::audio_ports::host::IsRescanFlagSupported:: + Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + // We'll ignore the main thread requirement for + // simple lookup functions like this for + // performance's sake + return plugin_proxy.extensions_.audio_ports + ->is_rescan_flag_supported(plugin_proxy.host_, + request.flag); + }, + [&](const clap::ext::audio_ports::host::Rescan& request) + -> clap::ext::audio_ports::host::Rescan::Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + plugin_proxy + .run_on_main_thread( + [&, host = plugin_proxy.host_, + audio_ports = + plugin_proxy.extensions_.audio_ports]() { + audio_ports->rescan(host, request.flags); + }) + .wait(); + + return Ack{}; + }, }); }); } diff --git a/src/plugin/meson.build b/src/plugin/meson.build index 7aba1004..48d1b332 100644 --- a/src/plugin/meson.build +++ b/src/plugin/meson.build @@ -77,6 +77,7 @@ if with_clap '../common/notifications.cpp', '../common/plugins.cpp', '../common/process.cpp', + '../common/serialization/clap/ext/audio-ports.cpp', '../common/serialization/clap/host.cpp', '../common/serialization/clap/plugin.cpp', '../common/utils.cpp', diff --git a/src/wine-host/bridges/clap-impls/host-proxy.cpp b/src/wine-host/bridges/clap-impls/host-proxy.cpp index 26268d4c..65a12322 100644 --- a/src/wine-host/bridges/clap-impls/host-proxy.cpp +++ b/src/wine-host/bridges/clap-impls/host-proxy.cpp @@ -118,8 +118,9 @@ bool CLAP_ABI clap_host_proxy::ext_audio_ports_is_rescan_flag_supported( assert(host && host->host_data); auto self = static_cast(host->host_data); - // TODO: Implement - return false; + return self->bridge_.send_main_thread_message( + clap::ext::audio_ports::host::IsRescanFlagSupported{ + .owner_instance_id = self->owner_instance_id(), .flag = flag}); } void CLAP_ABI clap_host_proxy::ext_audio_ports_rescan(const clap_host_t* host, @@ -127,5 +128,6 @@ void CLAP_ABI clap_host_proxy::ext_audio_ports_rescan(const clap_host_t* host, assert(host && host->host_data); auto self = static_cast(host->host_data); - // TODO: Implement + self->bridge_.send_main_thread_message(clap::ext::audio_ports::host::Rescan{ + .owner_instance_id = self->owner_instance_id(), .flags = flags}); } diff --git a/src/wine-host/bridges/clap.cpp b/src/wine-host/bridges/clap.cpp index 25db058d..06eb55be 100644 --- a/src/wine-host/bridges/clap.cpp +++ b/src/wine-host/bridges/clap.cpp @@ -310,6 +310,30 @@ void ClapBridge::run() { }) .get(); }, + [&](const clap::ext::audio_ports::plugin::Count& request) + -> clap::ext::audio_ports::plugin::Count::Response { + const auto& [instance, _] = get_instance(request.instance_id); + + // We'll ignore the main thread requirement for simple lookup + // functions like this for performance's sake + return instance.extensions.audio_ports->count( + instance.plugin.get(), request.is_input); + }, + [&](const clap::ext::audio_ports::plugin::Get& request) + -> clap::ext::audio_ports::plugin::Get::Response { + const auto& [instance, _] = get_instance(request.instance_id); + + clap_audio_port_info_t info{}; + if (instance.extensions.audio_ports->get( + instance.plugin.get(), request.index, request.is_input, + &info)) { + return clap::ext::audio_ports::plugin::GetResponse{ + .result = info}; + } else { + return clap::ext::audio_ports::plugin::GetResponse{ + .result = std::nullopt}; + } + }, }); }