diff --git a/CHANGELOG.md b/CHANGELOG.md index 452db89a..9a1dfa1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,9 @@ TODO: Add an updates screenshot with some fancy VST3-only plugins to the readme - Changed part of the build process considering [this Wine bug](https://bugs.winehq.org/show_bug.cgi?id=49138). Building with Wine 5.7 and 5.8 required a change, but that change now breaks builds using Wine 6.0 - and up, so this change has been reverted. + and up. We now detect which version of Wine is used to build with, and we then + apply the change conditionally to be able to support building with both older + and newer versions of Wine. ### Fixed diff --git a/meson.build b/meson.build index 3165a5e4..75130443 100644 --- a/meson.build +++ b/meson.build @@ -53,6 +53,20 @@ if with_vst3 compiler_options += '-DWITH_VST3' endif +# Wine versions after Wine 5.6 and before 6.0 require a `__cdecl` calling +# convention to be specified on the `main()` functions or else `argc` and `argv` +# will point to the wrong memory. Similarly, with other versions of Wine this +# should _not_ be specified for the same reason. We'll try to figure out the +# current Wine version and add this calling convention based on that. +# +# https://bugs.winehq.org/show_bug.cgi?id=49138 +wine_version = run_command('sh', '-c', '''wine --version | grep --only-matching -E '[0-9]+\.[0-9.]+' | head -n1''') +if wine_version.returncode() == 0 and \ + wine_version.stdout().version_compare('>=5.7') and \ + wine_version.stdout().version_compare('<6.0') + compiler_options += '-DWINE_USE_CDECL' +endif + # Generate header files for configuration variables such as the current git tag # and the name of the host binary subdir('src/common/config') diff --git a/src/wine-host/group-host.cpp b/src/wine-host/group-host.cpp index 3782efc5..75585ba7 100644 --- a/src/wine-host/group-host.cpp +++ b/src/wine-host/group-host.cpp @@ -36,7 +36,11 @@ * plugin host and this group plugin host will function identically on both the * plugin and the Wine VST host side. */ -int __attribute__((visibility("default"))) main(int argc, char* argv[]) { +int __attribute__((visibility("default"))) +#ifdef WINE_USE_CDECL +__cdecl +#endif + main(int argc, char* argv[]) { set_realtime_priority(); // Instead of directly hosting a plugin, this process will receive a UNIX diff --git a/src/wine-host/individual-host.cpp b/src/wine-host/individual-host.cpp index 0610e797..d2279691 100644 --- a/src/wine-host/individual-host.cpp +++ b/src/wine-host/individual-host.cpp @@ -32,7 +32,11 @@ * plugin plugin, and then connect back to the `libyabridge-{vst2,vst3}.so` * instance that spawned this over the socket. */ -int __attribute__((visibility("default"))) main(int argc, char* argv[]) { +int __attribute__((visibility("default"))) +#ifdef WINE_USE_CDECL +__cdecl +#endif + main(int argc, char* argv[]) { set_realtime_priority(); // We pass plugin format, the name of the VST2 plugin .dll file or VST3