From df47104297679d0dcffbccd47c896158873d2466 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Mon, 24 Feb 2020 15:46:22 +0100 Subject: [PATCH] Connect to the unix socket from the Wine VST host --- meson.build | 4 +++- src/plugin/bridge.cpp | 9 ++++----- src/plugin/bridge.h | 1 + src/wine-host/native-includes.h | 2 ++ src/wine-host/vst-host.cpp | 18 +++++++++++++++++- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/meson.build b/meson.build index 8d2bba62..fb62de9c 100644 --- a/meson.build +++ b/meson.build @@ -23,6 +23,8 @@ endif boost_dep = dependency('boost', modules : ['filesystem']) msgpack_dep = dependency('msgpack') threads_dep = dependency('threads') +# The built in threads dependency does not know how to handle winegcc +wine_threads_dep = declare_dependency(link_args : '-lpthread') include_dir = include_directories('src/include') @@ -45,6 +47,6 @@ executable( ], native : false, include_directories : include_dir, - dependencies : [msgpack_dep], + dependencies : [boost_dep, msgpack_dep, wine_threads_dep], link_args : [] ) diff --git a/src/plugin/bridge.cpp b/src/plugin/bridge.cpp index 51978472..0b69706a 100644 --- a/src/plugin/bridge.cpp +++ b/src/plugin/bridge.cpp @@ -55,6 +55,7 @@ bp::environment set_wineprefix(); Bridge::Bridge() : io_context(), socket_endpoint(generate_endpoint_name().string()), + socket_acceptor(io_context, socket_endpoint), host_vst_dispatch(io_context), vst_stdin(), vst_stdout(), @@ -66,12 +67,9 @@ Bridge::Bridge() bp::std_in = vst_stdin, bp::std_out = vst_stdout, bp::env = set_wineprefix()) { - boost::asio::local::stream_protocol::acceptor acceptor(io_context, - socket_endpoint); - // It's very important that these sockets are connected to in the same order // in the Wine VST host - acceptor.accept(host_vst_dispatch); + socket_acceptor.accept(host_vst_dispatch); } /** @@ -187,7 +185,8 @@ fs::path find_vst_plugin() { "VST plugin .dll file."); } - return plugin_path; + // Also resolve symlinks here, mostly for development purposes + return fs::canonical(plugin_path); } /** diff --git a/src/plugin/bridge.h b/src/plugin/bridge.h index cdd907c0..03306a44 100644 --- a/src/plugin/bridge.h +++ b/src/plugin/bridge.h @@ -64,6 +64,7 @@ class Bridge { private: boost::asio::io_context io_context; boost::asio::local::stream_protocol::endpoint socket_endpoint; + boost::asio::local::stream_protocol::acceptor socket_acceptor; // The naming convention for these sockets is `__`. For // instance the socket named `host_vst_dispatch` forwards diff --git a/src/wine-host/native-includes.h b/src/wine-host/native-includes.h index 20c5079a..fa968892 100644 --- a/src/wine-host/native-includes.h +++ b/src/wine-host/native-includes.h @@ -34,6 +34,8 @@ #undef __WIN32__ #undef _WIN64 +#include +#include #include #pragma pop_macro("WIN32") diff --git a/src/wine-host/vst-host.cpp b/src/wine-host/vst-host.cpp index 44f979e1..c287f4ce 100644 --- a/src/wine-host/vst-host.cpp +++ b/src/wine-host/vst-host.cpp @@ -65,7 +65,23 @@ int main(int argc, char* argv[]) { std::string plugin_title(buffer.data()); - // TODO: The program should terminate automatically when stdin gets closed + // Connect to the sockets for communication once the plugin has finished + // loading + // TODO: The program should terminate gracefully when one of the sockets + // gets closed + // TODO: Remove debug and move most of these things to + // `wine-host/bridge.cpp`, similar to `plugin/bridge.cpp` + + boost::asio::io_context io_context; + boost::asio::local::stream_protocol::endpoint socket_endpoint( + socket_endpoint_path); + + // The naming convention for these sockets is `__`. For + // instance the socket named `host_vst_dispatch` forwards + // `AEffect.dispatch()` calls from the native VST host to the Windows VST + // plugin (through the Wine VST host). + boost::asio::local::stream_protocol::socket host_vst_dispatch(io_context); + host_vst_dispatch.connect(socket_endpoint); // TODO: Remove debug, we're just reporting the plugin's name we retrieved // above