From 0e3b5af94ec2c4fa409445f0cfb73e89abc0bbea Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Mon, 4 Jan 2021 22:33:44 +0100 Subject: [PATCH] Fully implement IAudioPresentationLatency Now we support all VST 3.1.0 interfaces. --- src/common/serialization/vst3.h | 1 + src/plugin/bridges/vst3-impls/plugin-proxy.cpp | 11 ++++++----- src/wine-host/bridges/vst3.cpp | 11 +++++++++++ src/wine-host/bridges/vst3.h | 2 ++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index ac4e909a..bfed88a4 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -68,6 +68,7 @@ using ControlRequest = Vst3PluginProxy::Destruct, Vst3PluginProxy::SetState, Vst3PluginProxy::GetState, + YaAudioPresentationLatency::SetAudioPresentationLatencySamples, YaConnectionPoint::Connect, YaConnectionPoint::Disconnect, YaConnectionPoint::Notify, diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 4da62329..95070d81 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -43,11 +43,12 @@ tresult PLUGIN_API Vst3PluginProxyImpl::setAudioPresentationLatencySamples( Steinberg::Vst::BusDirection dir, int32 busIndex, uint32 latencyInSamples) { - // TODO: Implement - bridge.logger.log( - "TODO: " - "IAudioPresentationLatency::setAudioPresentationLatencySamples()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaAudioPresentationLatency::SetAudioPresentationLatencySamples{ + .instance_id = instance_id(), + .dir = dir, + .bus_index = busIndex, + .latency_in_samples = latencyInSamples}); } tresult PLUGIN_API Vst3PluginProxyImpl::setBusArrangements( diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 29a26efc..de99d18d 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -36,6 +36,7 @@ InstanceInterfaces::InstanceInterfaces() {} InstanceInterfaces::InstanceInterfaces( Steinberg::IPtr object) : object(object), + audio_presentation_latency(object), audio_processor(object), component(object), connection_point(object), @@ -183,6 +184,16 @@ void Vst3Bridge::run() { return Vst3PluginProxy::GetStateResponse{ .result = result, .updated_state = std::move(stream)}; }, + [&](YaAudioPresentationLatency::SetAudioPresentationLatencySamples& + request) + -> YaAudioPresentationLatency:: + SetAudioPresentationLatencySamples::Response { + return object_instances[request.instance_id] + .audio_presentation_latency + ->setAudioPresentationLatencySamples( + request.dir, request.bus_index, + request.latency_in_samples); + }, [&](YaConnectionPoint::Connect& request) -> YaConnectionPoint::Connect::Response { // If the host directly connected the underlying objects then we diff --git a/src/wine-host/bridges/vst3.h b/src/wine-host/bridges/vst3.h index 84569288..55a3932f 100644 --- a/src/wine-host/bridges/vst3.h +++ b/src/wine-host/bridges/vst3.h @@ -128,6 +128,8 @@ struct InstanceInterfaces { // All smart pointers below are created from `component`. They will be null // pointers if `component` did not implement the interface. + Steinberg::FUnknownPtr + audio_presentation_latency; Steinberg::FUnknownPtr audio_processor; Steinberg::FUnknownPtr component; Steinberg::FUnknownPtr connection_point;