diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 856fd747..8560a22b 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -206,6 +206,7 @@ using CallbackRequest = YaContextMenu::Popup, YaHostApplication::GetName, YaPlugFrame::ResizeView, + YaPlugInterfaceSupport::IsPlugInterfaceSupported, YaUnitHandler::NotifyUnitSelection, YaUnitHandler::NotifyProgramListChange, YaUnitHandler2::NotifyUnitByBusChange>; diff --git a/src/plugin/bridges/vst3-impls/plugin-factory.cpp b/src/plugin/bridges/vst3-impls/plugin-factory.cpp index 43014391..3411d0a7 100644 --- a/src/plugin/bridges/vst3-impls/plugin-factory.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-factory.cpp @@ -111,6 +111,7 @@ YaPluginFactoryImpl::setHostContext(Steinberg::FUnknown* context) { // Automatically converted smart pointers for when the plugin performs a // callback later host_application = host_context; + plug_interface_support = host_context; return bridge.send_message(YaPluginFactory::SetHostContext{ .host_context_args = Vst3HostContextProxy::ConstructArgs( diff --git a/src/plugin/bridges/vst3-impls/plugin-factory.h b/src/plugin/bridges/vst3-impls/plugin-factory.h index 25813172..f0e8ac7e 100644 --- a/src/plugin/bridges/vst3-impls/plugin-factory.h +++ b/src/plugin/bridges/vst3-impls/plugin-factory.h @@ -32,6 +32,8 @@ class YaPluginFactoryImpl : public YaPluginFactory { // `IPluginFactory3::setHostContext()` has been called Steinberg::FUnknownPtr host_application; + Steinberg::FUnknownPtr + plug_interface_support; private: Vst3PluginBridge& bridge; diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 0677efbf..de06b6ae 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -698,6 +698,7 @@ tresult PLUGIN_API Vst3PluginProxyImpl::initialize(FUnknown* context) { // Automatically converted smart pointers for when the plugin performs a // callback later host_application = host_context; + plug_interface_support = host_context; return bridge.send_message(YaPluginBase::Initialize{ .instance_id = instance_id(), diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.h b/src/plugin/bridges/vst3-impls/plugin-proxy.h index 13b6f195..d3d9bcea 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.h +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.h @@ -338,6 +338,8 @@ class Vst3PluginProxyImpl : public Vst3PluginProxy { // `IPluginBase::initialize()` has been called Steinberg::FUnknownPtr host_application; + Steinberg::FUnknownPtr + plug_interface_support; // The following pointers are cast from `component_handler` if // `IEditController::setComponentHandler()` has been called diff --git a/src/plugin/bridges/vst3.cpp b/src/plugin/bridges/vst3.cpp index 7ce0e765..c4af0a0b 100644 --- a/src/plugin/bridges/vst3.cpp +++ b/src/plugin/bridges/vst3.cpp @@ -265,6 +265,28 @@ Vst3PluginBridge::Vst3PluginBridge() return plug_view->plug_frame->resizeView(plug_view, &request.new_size); }, + [&](const YaPlugInterfaceSupport::IsPlugInterfaceSupported& + request) -> YaPlugInterfaceSupport:: + IsPlugInterfaceSupported::Response { + // TODO: For correctness' sake we + // should automatically reject + // queries for interfaces we + // don't yet or can't implement, + // like the ARA interfaces. + if (request.owner_instance_id) { + return plugin_proxies + .at(*request.owner_instance_id) + .get() + .plug_interface_support + ->isPlugInterfaceSupported( + request.iid.data()); + } else { + return plugin_factory + ->plug_interface_support + ->isPlugInterfaceSupported( + request.iid.data()); + } + }, [&](const YaUnitHandler::NotifyUnitSelection& request) -> YaUnitHandler::NotifyUnitSelection::Response { return plugin_proxies.at(request.owner_instance_id) diff --git a/src/wine-host/bridges/vst3-impls/host-context-proxy.cpp b/src/wine-host/bridges/vst3-impls/host-context-proxy.cpp index 343e86d1..e1f1b4f8 100644 --- a/src/wine-host/bridges/vst3-impls/host-context-proxy.cpp +++ b/src/wine-host/bridges/vst3-impls/host-context-proxy.cpp @@ -96,9 +96,16 @@ Vst3HostContextProxyImpl::createInstance(Steinberg::TUID /*cid*/, tresult PLUGIN_API Vst3HostContextProxyImpl::isPlugInterfaceSupported(const Steinberg::TUID _iid) { - // TODO: Implement - std::cerr - << "TODO: Implement IPlugInterfaceSupport::isPlugInterfaceSupported()" - << std::endl; - return Steinberg::kNotImplemented; + if (_iid) { + return bridge.send_message( + YaPlugInterfaceSupport::IsPlugInterfaceSupported{ + .owner_instance_id = owner_instance_id(), + .iid = std::to_array( + *reinterpret_cast(&_iid))}); + } else { + bridge.logger.log( + "WARNING: Null pointer passed to " + "'IPlugInterfaceSupport::isPlugInterfaceSupported()'"); + return Steinberg::kInvalidArgument; + } }