diff --git a/CHANGELOG.md b/CHANGELOG.md index 44375dc9..20b7026f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,9 @@ TODO: Add an updated screenshot with some fancy VST3-only plugins to the readme to realtime priority. This prevents changing the scheduling policy of your host's GUI thread if your host instantiates plugins from its GUI thread like REAPER does. + - Relaying messages printed by the plugin and Wine is now done without + realtime priority, as this could in theory cause issues with plugins that + produce a lot of fixmes. - The realtime scheduling priorities of all audio threads on the Wine plugin host are now periodically synchronized with those of the host's audio threads. diff --git a/src/plugin/bridges/common.h b/src/plugin/bridges/common.h index ae4f66e8..b0fa8706 100644 --- a/src/plugin/bridges/common.h +++ b/src/plugin/bridges/common.h @@ -91,8 +91,14 @@ class PluginBridge { sockets.base_dir.string()}))), has_realtime_priority(has_realtime_priority_promise.get_future()), wine_io_handler([&]() { + // We no longer run this thread with realtime scheduling because + // plugins that produce a lot of FIXMEs could in theory cause + // dropouts that way, but we still need to run this from a thread + // to check whether we support it has_realtime_priority_promise.set_value( set_realtime_priority(true)); + set_realtime_priority(false); + io_context.run(); }) {} diff --git a/src/wine-host/bridges/group.cpp b/src/wine-host/bridges/group.cpp index 9cba85a7..cdd1ca4b 100644 --- a/src/wine-host/bridges/group.cpp +++ b/src/wine-host/bridges/group.cpp @@ -104,7 +104,13 @@ GroupBridge::GroupBridge(boost::filesystem::path group_socket_path) async_log_pipe_lines(stdout_redirect.pipe, stdout_buffer, "[STDOUT] "); async_log_pipe_lines(stderr_redirect.pipe, stderr_buffer, "[STDERR] "); - stdio_handler = Win32Thread([&]() { stdio_context.run(); }); + stdio_handler = Win32Thread([&]() { + // In case a plugin generates a lot of FIXMEs relaying this IO with + // realtime scheduling could in theory cause latency issues + set_realtime_priority(false); + + stdio_context.run(); + }); } GroupBridge::~GroupBridge() {