diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 37a4fff5..4d548f5a 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -200,6 +200,15 @@ void Vst3Logger::log_request(bool is_host_vst, }); } +void Vst3Logger::log_request(bool is_host_vst, + const YaComponent::SetProcessing& request) { + log_request_base(is_host_vst, [&](auto& message) { + message << "::setProcessing(state = " + << (request.state ? "true" : "false") << ")"; + }); +} + void Vst3Logger::log_request(bool is_host_vst, const YaPluginFactory::Construct&) { log_request_base(is_host_vst, diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 94eaff66..09bcf269 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -74,6 +74,7 @@ class Vst3Logger { const YaComponent::CanProcessSampleSize&); void log_request(bool is_host_vst, const YaComponent::GetLatencySamples&); void log_request(bool is_host_vst, const YaComponent::SetupProcessing&); + void log_request(bool is_host_vst, const YaComponent::SetProcessing&); void log_request(bool is_host_vst, const YaPluginFactory::Construct&); void log_request(bool is_host_vst, const YaPluginFactory::SetHostContext&); void log_request(bool is_host_vst, const WantsConfiguration&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 57563b0c..0b82b726 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -74,6 +74,7 @@ using ControlRequest = std::variant; diff --git a/src/common/serialization/vst3/component.h b/src/common/serialization/vst3/component.h index 54a54cf1..6c0285aa 100644 --- a/src/common/serialization/vst3/component.h +++ b/src/common/serialization/vst3/component.h @@ -560,6 +560,25 @@ class YaComponent : public Steinberg::Vst::IComponent, virtual tresult PLUGIN_API setupProcessing(Steinberg::Vst::ProcessSetup& setup) override = 0; + + /** + * Message to pass through a call to `IAudioProcessor::setProcessing(state)` + * to the Wine plugin host. + */ + struct SetProcessing { + using Response = UniversalTResult; + + native_size_t instance_id; + + TBool state; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value1b(state); + } + }; + virtual tresult PLUGIN_API setProcessing(TBool state) override = 0; virtual tresult PLUGIN_API process(Steinberg::Vst::ProcessData& data) override = 0; diff --git a/src/plugin/bridges/vst3-impls/component.cpp b/src/plugin/bridges/vst3-impls/component.cpp index 9790b299..cbdb321d 100644 --- a/src/plugin/bridges/vst3-impls/component.cpp +++ b/src/plugin/bridges/vst3-impls/component.cpp @@ -194,9 +194,8 @@ YaComponentPluginImpl::setupProcessing(Steinberg::Vst::ProcessSetup& setup) { } tresult PLUGIN_API YaComponentPluginImpl::setProcessing(TBool state) { - // TODO: Implement - bridge.logger.log("TODO: IAudioProcessor::setProcessing()"); - return Steinberg::kNotImplemented; + return bridge.send_message(YaComponent::SetProcessing{ + .instance_id = arguments.instance_id, .state = state}); } tresult PLUGIN_API diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index e65e1cdb..d42952f2 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -200,6 +200,11 @@ void Vst3Bridge::run() { return component_instances[request.instance_id] .audio_processor->setupProcessing(request.setup); }, + [&](const YaComponent::SetProcessing& request) + -> YaComponent::SetProcessing::Response { + return component_instances[request.instance_id] + .audio_processor->setProcessing(request.state); + }, [&](const YaPluginFactory::Construct&) -> YaPluginFactory::Construct::Response { return YaPluginFactory::ConstructArgs(