Always-on / host-gated defensive behaviors that the adapters consult. More...
#include <host_quirks.hpp>
Public Attributes | |
| bool | synthesize_bypass_parameter = true |
| Synthesize a bypass parameter when the plugin doesn't declare one. | |
| bool | clamp_latency_to_nonneg = true |
| Clamp Processor::latency_samples() to non-negative when reporting to the host (VST3 requires unsigned). | |
| bool | silence_unsupported_bus_arrangements = true |
| When a host-requested bus arrangement isn't supported, accept it and emit silence on the extra channels rather than failing. | |
| bool | cubase10_async_view_resize_queue = false |
| row 1 | |
| bool | cubase10_param_gesture_ordering = false |
| row 2 | |
| bool | cubase10_fractional_scale_correction = false |
| row 3 | |
| bool | cubase9_state_blob_size_validation = false |
| row 4 | |
| bool | live_vst3_canresize_ignore = false |
| row 5 | |
| bool | live_vst3_windows_dpi_defer = false |
| row 6 (Windows-only) | |
| bool | double_string_buffer_for_live_10_1_13 = false |
| Ableton Live 10.1.13 has a string-length parsing bug where the IInfoListener::getString callbacks for channel name, channel UID, and index-namespace queries write past the spec-required buffer length, corrupting adjacent memory. | |
| bool | bitwig_vst3_linux_repaint_after_resize = false |
| row 8 (Linux-only) | |
| bool | bitwig_vst3_setbusarrangements_while_active = false |
| row 9 | |
| bool | skip_bus_arrangement_call = false |
| Ardour and its Mixbus 32C derivative ship a setBusArrangements implementation that returns success without applying the request, and may corrupt subsequent layout state if the plugin calls it. | |
| bool | wavelab_vst3_defer_activation = false |
| row 10 | |
| bool | wavelab_state_blob_fallback = false |
| row 11 | |
| bool | tolerate_state_read_nontrue_status = false |
| Wavelab's IBStream::read may return a non-kResultTrue status at end-of-stream while still having populated the supplied buffer. | |
| bool | fl_studio_setactive_process_mutex = false |
| row 13 | |
| bool | fl_studio_state_reader_skip = false |
| row 14 | |
| bool | reaper_vst3_gesture_ordering = false |
| row 15 | |
| bool | reaper_process_while_bypassed = false |
| row R1 | |
| bool | reaper_keyboard_passthrough = false |
| row R2 | |
| bool | reaper_permissive_bus_arrangements = false |
| row R3 | |
| bool | reaper_anticipative_fx_buffer_variability = false |
| row R4 | |
| bool | reaper_midsession_setstate = false |
| row R6 | |
| bool | reaper_keyboard_only_space = false |
| REAPER's VST2/VST3 keyboard pipeline only delivers a well-formed keyMsg payload for the Space key (VKEY_SPACE); other keys arrive with malformed key state and cannot be parsed reliably. | |
| bool | pro_tools_aax_sidechain_negotiation = false |
| row 16 | |
| bool | pro_tools_aax_latency_callback_push = false |
| row 17 | |
| bool | pro_tools_aax_mono_second_bus = false |
| row 18 | |
| bool | aax_vendor_version_unknown = false |
| Pro Tools' AAX wrapper does not reliably surface its host vendor version through the AAX specification — querying it can return zero or stale data. | |
| int | logic_au_channel_probe_cap = 64 |
| row 19 (Logic = 8) | |
| bool | logic_au_tail_time_conversion = false |
| row 20 | |
| bool | logic_au_v2_container_resize = false |
| Logic AU v2 has no formal plugin-to-host resize callback, but its Cocoa host accepts an exact resize of the returned view's immediate container. | |
| bool | au_v3_bypass_dual_tracking = false |
| row 21 | |
| bool | au_v3_host_id_from_wrapper = false |
| row 22 | |
| bool | reaper_auv3_in_process_preferred_size_sync = false |
| Reaper's AU v3 host is in-process (it creates the AUAudioUnit on the main thread via createAudioUnitWithComponentDescription), unlike Logic / GarageBand which run AU v3 plug-ins out-of-process. | |
| bool | studio_one_restart_component_ui_thread = false |
| Studio One serializes IComponentHandler::restartComponent notifications through a non-thread-safe lane: audio-thread calls can deadlock the host or be dropped silently. | |
| bool | digital_performer_param_list_reload = false |
| Digital Performer (MOTU) revives the edit controller on preset-load / project-import paths without re-querying the previously published parameter list. | |
| bool | cubase13_midi_cc_param_id_stable = false |
| Cubase 13+ / Nuendo 13+ bind project automation lanes to the VST3 MIDI CC parameter IDs at save-time and refuse to re-map them on reload. | |
Always-on / host-gated defensive behaviors that the adapters consult.
Cheap defenses (default-true) apply to every host — they cover spec compliance and obvious safety nets. Expensive defenses (default-false) only fire when a specific host is detected; the per-host module factories under host_quirks/<host>.hpp populate the relevant flags.
| bool pulp::format::HostQuirks::aax_vendor_version_unknown = false |
Pro Tools' AAX wrapper does not reliably surface its host vendor version through the AAX specification — querying it can return zero or stale data.
Adapters and quirks must treat the Pro Tools version as unknown and avoid version-gated branching for this host. (Always-true on Pro Tools, off elsewhere.)
| bool pulp::format::HostQuirks::au_v3_bypass_dual_tracking = false |
row 21
| bool pulp::format::HostQuirks::au_v3_host_id_from_wrapper = false |
row 22
| bool pulp::format::HostQuirks::bitwig_vst3_linux_repaint_after_resize = false |
row 8 (Linux-only)
| bool pulp::format::HostQuirks::bitwig_vst3_setbusarrangements_while_active = false |
row 9
| bool pulp::format::HostQuirks::clamp_latency_to_nonneg = true |
Clamp Processor::latency_samples() to non-negative when reporting to the host (VST3 requires unsigned).
| bool pulp::format::HostQuirks::cubase10_async_view_resize_queue = false |
row 1
| bool pulp::format::HostQuirks::cubase10_fractional_scale_correction = false |
row 3
| bool pulp::format::HostQuirks::cubase10_param_gesture_ordering = false |
row 2
| bool pulp::format::HostQuirks::cubase13_midi_cc_param_id_stable = false |
Cubase 13+ / Nuendo 13+ bind project automation lanes to the VST3 MIDI CC parameter IDs at save-time and refuse to re-map them on reload.
Plug-ins that synthesize CC parameter IDs from dynamic state (e.g. preset-driven parameter counts) will see automation lanes orphaned on the 13.x line. The VST3 adapter must derive CC parameter IDs from a stable hash (not the runtime parameter index) when this flag is set. Cubase 12 was forgiving; the flag stays off on 12 and earlier.
| bool pulp::format::HostQuirks::cubase9_state_blob_size_validation = false |
row 4
| bool pulp::format::HostQuirks::digital_performer_param_list_reload = false |
Digital Performer (MOTU) revives the edit controller on preset-load / project-import paths without re-querying the previously published parameter list.
Plug-ins that mutate the parameter set via restartComponent(kParamValuesChanged | kParamTitlesChanged) end up with stale labels in DP's automation lane. The VST3 adapter must layer an additional kReloadComponent notification onto the standard restart bundle when the detected host is Digital Performer; Cubase / Logic / Reaper do not require this.
| bool pulp::format::HostQuirks::double_string_buffer_for_live_10_1_13 = false |
Ableton Live 10.1.13 has a string-length parsing bug where the IInfoListener::getString callbacks for channel name, channel UID, and index-namespace queries write past the spec-required buffer length, corrupting adjacent memory.
Adapters must allocate those buffers at twice the spec size when this flag is on. Only the 10.1.13 build is affected; the flag stays off on every other Live version.
| bool pulp::format::HostQuirks::fl_studio_setactive_process_mutex = false |
row 13
| bool pulp::format::HostQuirks::fl_studio_state_reader_skip = false |
row 14
| bool pulp::format::HostQuirks::live_vst3_canresize_ignore = false |
row 5
| bool pulp::format::HostQuirks::live_vst3_windows_dpi_defer = false |
row 6 (Windows-only)
| int pulp::format::HostQuirks::logic_au_channel_probe_cap = 64 |
row 19 (Logic = 8)
| bool pulp::format::HostQuirks::logic_au_tail_time_conversion = false |
row 20
| bool pulp::format::HostQuirks::logic_au_v2_container_resize = false |
Logic AU v2 has no formal plugin-to-host resize callback, but its Cocoa host accepts an exact resize of the returned view's immediate container.
| bool pulp::format::HostQuirks::pro_tools_aax_latency_callback_push = false |
row 17
| bool pulp::format::HostQuirks::pro_tools_aax_mono_second_bus = false |
row 18
| bool pulp::format::HostQuirks::pro_tools_aax_sidechain_negotiation = false |
row 16
| bool pulp::format::HostQuirks::reaper_anticipative_fx_buffer_variability = false |
row R4
| bool pulp::format::HostQuirks::reaper_auv3_in_process_preferred_size_sync = false |
Reaper's AU v3 host is in-process (it creates the AUAudioUnit on the main thread via createAudioUnitWithComponentDescription), unlike Logic / GarageBand which run AU v3 plug-ins out-of-process.
Setting the view controller's preferredContentSize only from viewDidLoad is too late on the in-process path — the editor opens at the extension's default size and snaps to the requested size one paint cycle later. AU v3 adapters must additionally set preferredContentSize synchronously in audioUnitInitialized (the in-process entry point); setting it twice is harmless on the OOP path. Layered on top of the REAPER VST3 dispatch via apply_reaper_auv3_in_process.
| bool pulp::format::HostQuirks::reaper_keyboard_only_space = false |
REAPER's VST2/VST3 keyboard pipeline only delivers a well-formed keyMsg payload for the Space key (VKEY_SPACE); other keys arrive with malformed key state and cannot be parsed reliably.
Editors that route keyboard input must reject non-Space keys when this flag is set rather than acting on garbage data.
| bool pulp::format::HostQuirks::reaper_keyboard_passthrough = false |
row R2
| bool pulp::format::HostQuirks::reaper_midsession_setstate = false |
row R6
| bool pulp::format::HostQuirks::reaper_permissive_bus_arrangements = false |
row R3
| bool pulp::format::HostQuirks::reaper_process_while_bypassed = false |
row R1
| bool pulp::format::HostQuirks::reaper_vst3_gesture_ordering = false |
row 15
| bool pulp::format::HostQuirks::silence_unsupported_bus_arrangements = true |
When a host-requested bus arrangement isn't supported, accept it and emit silence on the extra channels rather than failing.
| bool pulp::format::HostQuirks::skip_bus_arrangement_call = false |
Ardour and its Mixbus 32C derivative ship a setBusArrangements implementation that returns success without applying the request, and may corrupt subsequent layout state if the plugin calls it.
VST3 adapters must skip the call on these hosts and accept the host-published default arrangement instead.
| bool pulp::format::HostQuirks::studio_one_restart_component_ui_thread = false |
Studio One serializes IComponentHandler::restartComponent notifications through a non-thread-safe lane: audio-thread calls can deadlock the host or be dropped silently.
The VST3 adapter must marshal restart-component calls (especially kLatencyChanged, which is the most common audio-thread emitter) to the UI thread when this flag is set. Cubase / Nuendo / Reaper accept the call from any thread.
| bool pulp::format::HostQuirks::synthesize_bypass_parameter = true |
Synthesize a bypass parameter when the plugin doesn't declare one.
| bool pulp::format::HostQuirks::tolerate_state_read_nontrue_status = false |
Wavelab's IBStream::read may return a non-kResultTrue status at end-of-stream while still having populated the supplied buffer.
Strict callers reject the load and lose the parameter set; the VST3 adapter must accept the populated buffer when the read count matches the requested byte count even if the status is not kResultTrue.
| bool pulp::format::HostQuirks::wavelab_state_blob_fallback = false |
row 11
| bool pulp::format::HostQuirks::wavelab_vst3_defer_activation = false |
row 10