VST3 plugin Windows (JUCE 8.0.10) crashes when creating OpenGL-based editors on secondary display (multi-monitor DPI context issue)

A user has reported that Ableton Live freezes when our JUCE-based VST3 host plugin tries to load an OpenGL-based third-party plugin (for example, Arturia instruments or effects).
Windows 11 - VST3 Host plugin on JUCE 8.0.10
Ableton Live 12
NVIDIA RTX 4090
Main display: 5120 × 1440 @ 120 Hz (DisplayPort)
Secondary: 1920 × 1080 @ 60 Hz (HDMI)

We cannot reproduce this issue on our local test machines.

The VST3 host window automatically opens on the secondary display, and Ableton freezes as soon as the host attempts to load an OpenGL-based third-party plugin.

If the host window opens on the main 5120×1440 display, the issue does not occur.
If the 1920×1080 display is set as the main monitor, the issue does not occur either.

So the crash happens only when the host plugin loads an OpenGL-based plugin on a secondary monitor that has a different DPI or refresh rate.

We believe this points to the OpenGL context creation during IPlugView::attached() failing when the window’s DPI awareness context differs from the DAW’s (primary display), essentially a multi-monitor DPI / DWM context initialization issue.

We advised the user to set Ableton’s DPI scaling override to “Application,” but that didn’t change the behavior.

Does JUCE currently wrap plugin-editor creation in a Per-Monitor V2 DPI awareness context (SetThreadDpiAwarenessContext)?

Has anyone encountered similar cross-display crashes when a JUCE-based VST3 host loads OpenGL plugins?

Would it be advisable for hosts to manually set a DPI scope or ensure the parent window is on the target monitor before calling IPlugView::attached()?

Any insights or suggestions/best practices would be greatly appreciated.

Thank you!

I’ve had a quick go at reproducing this issue without much luck. My test setup is similar: Windows 11, RTX 3070, Live 12, two displays running at different scaling factors. Unfortunately I don’t have access to a high-refresh-rate display so I can’t test that aspect.

A good first step would be to ensure that the user has all available updates installed, for Windows, graphics drivers, Live, plugins, and other relevant components.

It would also be helpful to know a specific Arturia plugin that causes the issue, just in case the issue is restricted to certain plugins.

Given that the issue manifests as a freeze, there’s a chance the underlying problem is a deadlock. If Live detects that it shut down unexpectedly, I’d expect it to produce a problem report. Maybe you could ask the user whether they’re able to send you a copy of this report, and then check to see whether it includes stack trace information.

It might be helpful to know whether the displays are both being driven by the same GPU/adapter, or whether each display has its own adapter. The latter case seems to be more rare, so there might be undiscovered bugs lurking there.

It would also be interesting to know whether the issue is still present when running both displays at 100% scale but at different refresh rates. If so, then I think the use of the per-monitor DPI awareness APIs is unlikely to be a contributing factor.

There are also other settings that might affect how the plugin renders. I don’t necessarily think that either of the following options would cause the problem, but it would be helpful to know how these options are configured in order to reproduce the faulty environment accurately.

  • The “auto-scale plugin windows” option will affect the DPI visualisation mode for the top-level plugin window
  • Live 12.2 has a global “GPU renderer” option in the app preferences (I’ve not actually heard of this causing problems, but my experience with the Direct2D migration tells me that different graphics APIs have the potential to interact in surprising ways)

One final idea: the JUCE repo includes a HostPluginDemo that shows how to launch a third-party plugin UI from a JUCE plugin. If you’ve exhausted all other options, perhaps you could send a copy of this plugin to the user and ask them to see whether they can get it to freeze in a similar way. If both plugins freeze, that would likely indicate a problem in JUCE’s hosting code.

I believe we do, but this will depend on how you’re displaying the third-party editor. If you’re displaying it as an embedded component inside your own plugin, then both editors will be forced to use the same scaling mode, which will depend on Live’s “auto-scale” option.

Thank you for the reply!

We have created a custom class to ensure the DPI context etc is correct when on the secondary screen and added some logging.
To our surprise, both logs show the plugin editor created and Ableton freezes after having the plugin editor shown.
We created some variations of the host plugin, even with OpenGL disabled for the hosted plugin but there was no difference.
Both displays are on the same RTX 4090, and tried connecting the secondary on the display port instead of HDMI but it did not make a difference.
Yes, we can ask for the Ableton Log to see if there is anything useful there.
We have both modes, embedded and non embedded (in its own window), but the result is the same.

We could create a simple project with Juce’s HostPluginDemo and try to reproduce it with that.

Here is the log when opening on the primary display (no Ableton freeze):
2025-11-05 19:22:58.462] [Thread:22840] === load_plugin_editor: START ===
[2025-11-05 19:22:58.462] [Thread:22840] load_plugin_editor: DPI hosting and awareness set
[2025-11-05 19:22:58.462] [Thread:22840] load_plugin_editor: Using SEPARATE window mode
[2025-11-05 19:22:58.464] [Thread:22840] load_plugin_editor: Window added to desktop
[2025-11-05 19:22:58.467] [Thread:22840] load_plugin_editor: Window made visible and brought to front
[2025-11-05 19:22:58.467] [Thread:22840] dp_ensureWindowGpuAffinity: Starting GPU affinity check for HWND=0x00000000000F0890
[2025-11-05 19:22:58.467] [Thread:22840] dp_ensureWindowGpuAffinity: Window visible=YES
[2025-11-05 19:22:58.468] [Thread:22840] dp_ensureWindowGpuAffinity: UpdateWindow succeeded
[2025-11-05 19:22:58.519] [Thread:22840] dp_ensureWindowGpuAffinity: Sleep completed (actual time: 47ms)
[2025-11-05 19:22:58.519] [Thread:22840] Monitor Info: Bounds(0,0 - 5120,1440) WorkArea(0,0 - 5120,1392) Primary=YES
[2025-11-05 19:22:58.519] [Thread:22840] Window Rect: (560,240 - 1360,840) Size: 800x600 HWND: 0x00000000000F0890
[2025-11-05 19:22:58.519] [Thread:22840] Thread DPI Awareness: PER_MONITOR_AWARE (2)
[2025-11-05 19:22:58.519] [Thread:22840] dp_setWindowDpiHosting: Function not available or window is null
[2025-11-05 19:22:58.519] [Thread:22840] dp_isWindowOnSecondaryMonitor: Window is on PRIMARY monitor (bounds: 0,0 - 5120,1440)
[2025-11-05 19:22:58.519] [Thread:22840] Plugin Info: Name=‘Acid V’ Manufacturer=‘Arturia’ Version=‘1.1.5.6367’ Format=‘VST3’ IsInstrument=YES
[2025-11-05 19:22:58.520] [Thread:22840] Plugin File: ‘C:\Program Files\Common Files\VST3\Acid V.vst3’ UID=VST3-Acid V-1529c90b-edccc18e
[2025-11-05 19:22:58.520] [Thread:22840] load_plugin_editor: About to call getPluginEditor() - THIS IS WHERE CRASHES MAY OCCUR
[2025-11-05 19:22:58.520] [Thread:22840] NOTE: If the log ends here without SUCCESS message, the plugin crashed during editor creation
[2025-11-05 19:22:58.520] [Thread:22840] ======================================================================
[2025-11-05 19:22:58.520] [Thread:22840] COMPLETE SYSTEM STATE DUMP BEFORE PLUGIN EDITOR CREATION
[2025-11-05 19:22:58.520] [Thread:22840] ======================================================================
[2025-11-05 19:22:58.520] [Thread:22840] — WINDOW STATE —
[2025-11-05 19:22:58.520] [Thread:22840] HWND: 0x00000000000F0890
[2025-11-05 19:22:58.520] [Thread:22840] IsVisible: YES
[2025-11-05 19:22:58.521] [Thread:22840] IsEnabled: YES
[2025-11-05 19:22:58.521] [Thread:22840] Window Style: 0x0000000096000000
[2025-11-05 19:22:58.521] [Thread:22840] WS_CLIPCHILDREN: YES
[2025-11-05 19:22:58.521] [Thread:22840] WS_CLIPSIBLINGS: YES
[2025-11-05 19:22:58.521] [Thread:22840] Extended Style: 0x0000000000040008
[2025-11-05 19:22:58.521] [Thread:22840] Window Position: (560, 240) Size: 800x600
[2025-11-05 19:22:58.521] [Thread:22840] Client Size: 800x600
[2025-11-05 19:22:58.521] [Thread:22840] Parent HWND: 0x0000000000000000
[2025-11-05 19:22:58.522] [Thread:22840] — MONITOR & DPI —
[2025-11-05 19:22:58.522] [Thread:22840] Monitor Info: Bounds(0,0 - 5120,1440) WorkArea(0,0 - 5120,1392) Primary=YES
[2025-11-05 19:22:58.522] [Thread:22840] Window Rect: (560,240 - 1360,840) Size: 800x600 HWND: 0x00000000000F0890
[2025-11-05 19:22:58.522] [Thread:22840] Thread DPI Awareness: PER_MONITOR_AWARE (2)
[2025-11-05 19:22:58.522] [Thread:22840] Window DPI: 96 (Scale: 100.00%)
[2025-11-05 19:22:58.522] [Thread:22840] Window DPI Hosting Behavior: MIXED (1)
[2025-11-05 19:22:58.522] [Thread:22840] — THREAD & PROCESS —
[2025-11-05 19:22:58.522] [Thread:22840] Thread ID: 22840, Process ID: 22500
[2025-11-05 19:22:58.523] [Thread:22840] — MEMORY —
[2025-11-05 19:22:58.523] [Thread:22840] Memory Load: 36% Available Physical: 20195 MB / 31912 MB
[2025-11-05 19:22:58.523] [Thread:22840] Process Memory: Working Set: 1086 MB, Peak: 1086 MB
[2025-11-05 19:22:58.523] [Thread:22840] — WINDOWS VERSION —
[2025-11-05 19:22:58.523] [Thread:22840] Windows Version: 10.0 Build 26100
[2025-11-05 19:22:58.523] [Thread:22840] ======================================================================
[2025-11-05 19:22:58.523] [Thread:22840] END OF SYSTEM STATE DUMP
[2025-11-05 19:22:58.523] [Thread:22840] ======================================================================
[2025-11-05 19:22:58.751] [Thread:22840] load_plugin_editor: SUCCESS! Plugin editor created without crash!
[2025-11-05 19:22:58.977] [Thread:22840] === load_plugin_editor: COMPLETED SUCCESSFULLY ===

and the log when loading it on the secondary display (Ableton freezes)

[2025-11-05 19:19:01.842] [Thread:2596] === load_plugin_editor: START ===
[2025-11-05 19:19:01.842] [Thread:2596] load_plugin_editor: DPI hosting and awareness set
[2025-11-05 19:19:01.843] [Thread:2596] load_plugin_editor: Using SEPARATE window mode
[2025-11-05 19:19:01.845] [Thread:2596] load_plugin_editor: Window added to desktop
[2025-11-05 19:19:01.848] [Thread:2596] load_plugin_editor: Window made visible and brought to front
[2025-11-05 19:19:01.849] [Thread:2596] dp_ensureWindowGpuAffinity: Starting GPU affinity check for HWND=0x000000000035062A
[2025-11-05 19:19:01.849] [Thread:2596] dp_ensureWindowGpuAffinity: Window visible=YES
[2025-11-05 19:19:01.849] [Thread:2596] dp_ensureWindowGpuAffinity: UpdateWindow succeeded
[2025-11-05 19:19:01.900] [Thread:2596] dp_ensureWindowGpuAffinity: Sleep completed (actual time: 47ms)
[2025-11-05 19:19:01.900] [Thread:2596] Monitor Info: Bounds(5120,157 - 7040,1237) WorkArea(5120,157 - 7040,1237) Primary=NO
[2025-11-05 19:19:01.900] [Thread:2596] Window Rect: (5680,397 - 6480,997) Size: 800x600 HWND: 0x000000000035062A
[2025-11-05 19:19:01.900] [Thread:2596] Thread DPI Awareness: PER_MONITOR_AWARE (2)
[2025-11-05 19:19:01.900] [Thread:2596] dp_setWindowDpiHosting: Function not available or window is null
[2025-11-05 19:19:01.900] [Thread:2596] dp_isWindowOnSecondaryMonitor: Window is on SECONDARY monitor (bounds: 5120,157 - 7040,1237)
[2025-11-05 19:19:01.901] [Thread:2596] Plugin Info: Name=‘Acid V’ Manufacturer=‘Arturia’ Version=‘1.1.5.6367’ Format=‘VST3’ IsInstrument=YES
[2025-11-05 19:19:01.901] [Thread:2596] Plugin File: ‘C:\Program Files\Common Files\VST3\Acid V.vst3’ UID=VST3-Acid V-1529c90b-edccc18e
[2025-11-05 19:19:01.901] [Thread:2596] load_plugin_editor: About to call getPluginEditor() - THIS IS WHERE CRASHES MAY OCCUR
[2025-11-05 19:19:01.901] [Thread:2596] NOTE: If the log ends here without SUCCESS message, the plugin crashed during editor creation
[2025-11-05 19:19:01.901] [Thread:2596] ======================================================================
[2025-11-05 19:19:01.901] [Thread:2596] COMPLETE SYSTEM STATE DUMP BEFORE PLUGIN EDITOR CREATION
[2025-11-05 19:19:01.901] [Thread:2596] ======================================================================
[2025-11-05 19:19:01.901] [Thread:2596] — WINDOW STATE —
[2025-11-05 19:19:01.901] [Thread:2596] HWND: 0x000000000035062A
[2025-11-05 19:19:01.902] [Thread:2596] IsVisible: YES
[2025-11-05 19:19:01.902] [Thread:2596] IsEnabled: YES
[2025-11-05 19:19:01.902] [Thread:2596] Window Style: 0x0000000096000000
[2025-11-05 19:19:01.902] [Thread:2596] WS_CLIPCHILDREN: YES
[2025-11-05 19:19:01.902] [Thread:2596] WS_CLIPSIBLINGS: YES
[2025-11-05 19:19:01.902] [Thread:2596] Extended Style: 0x0000000000040008
[2025-11-05 19:19:01.902] [Thread:2596] Window Position: (5680, 397) Size: 800x600
[2025-11-05 19:19:01.902] [Thread:2596] Client Size: 800x600
[2025-11-05 19:19:01.903] [Thread:2596] Parent HWND: 0x0000000000000000
[2025-11-05 19:19:01.903] [Thread:2596] — MONITOR & DPI —
[2025-11-05 19:19:01.903] [Thread:2596] Monitor Info: Bounds(5120,157 - 7040,1237) WorkArea(5120,157 - 7040,1237) Primary=NO
[2025-11-05 19:19:01.903] [Thread:2596] Window Rect: (5680,397 - 6480,997) Size: 800x600 HWND: 0x000000000035062A
[2025-11-05 19:19:01.903] [Thread:2596] Thread DPI Awareness: PER_MONITOR_AWARE (2)
[2025-11-05 19:19:01.903] [Thread:2596] Window DPI: 96 (Scale: 100.00%)
[2025-11-05 19:19:01.903] [Thread:2596] Window DPI Hosting Behavior: MIXED (1)
[2025-11-05 19:19:01.903] [Thread:2596] — THREAD & PROCESS —
[2025-11-05 19:19:01.904] [Thread:2596] Thread ID: 2596, Process ID: 3440
[2025-11-05 19:19:01.904] [Thread:2596] — MEMORY —
[2025-11-05 19:19:01.904] [Thread:2596] Memory Load: 36% Available Physical: 20347 MB / 31912 MB
[2025-11-05 19:19:01.904] [Thread:2596] Process Memory: Working Set: 1075 MB, Peak: 1075 MB
[2025-11-05 19:19:01.904] [Thread:2596] — WINDOWS VERSION —
[2025-11-05 19:19:01.904] [Thread:2596] Windows Version: 10.0 Build 26100
[2025-11-05 19:19:01.904] [Thread:2596] ======================================================================
[2025-11-05 19:19:01.904] [Thread:2596] END OF SYSTEM STATE DUMP
[2025-11-05 19:19:01.905] [Thread:2596] ======================================================================
[2025-11-05 19:19:02.129] [Thread:2596] load_plugin_editor: SUCCESS! Plugin editor created without crash!
[2025-11-05 19:19:02.350] [Thread:2596] === load_plugin_editor: COMPLETED SUCCESSFULLY ===

It seems we have found the root cause of this issue.

We looked at the Ableton crash dump and although it did not have any useful information other than the thread did not have access to read or write we noticed the following in the used dlls.

AudioDevProps2.dll C:\ProgramData\A-Volute\A-Volute.28054DF1F58B4\Modules\ScheduledModules\x64\
NahimicOSD.dll C:\ProgramData\A-Volute\A-Volute.28054DF1F58B4\Modules\ScheduledModules\x64\
ProductInfo.dll C:\ProgramData\A-Volute\A-Volute.28054DF1F58B4\Modules\ScheduledModules\x64\
AudioDevProps2.dll C:\ProgramData\A-Volute\A-Volute.SonicStudio3\Modules\ScheduledModules\x64\
ProductInfo.dll C:\ProgramData\A-Volute\A-Volute.SonicStudio3\Modules\ScheduledModules\x64\

Nahimic/A-Volute is known to:

  • Hook into audio applications and DAWs
  • Inject into Ableton’s process
  • Intercept window messages and audio APIs
  • Cause crashes with multi-monitor DPI issues
  • Notice AudioDevProps2.dll appears TWICE from different A-Volute installations

The NahimicOSD.dll (On-Screen Display) is particularly problematic - it hooks into graphics rendering and can break DPI context handling.

The user disabled the Nahimic service and it worked fine.

2 Likes

Thank you Reuk for the suggestions and for looking into this! :+1: