Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::format::HostQuirks Struct Reference

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.

Detailed Description

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.

Member Data Documentation

◆ aax_vendor_version_unknown

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.)

◆ au_v3_bypass_dual_tracking

bool pulp::format::HostQuirks::au_v3_bypass_dual_tracking = false

row 21

◆ au_v3_host_id_from_wrapper

bool pulp::format::HostQuirks::au_v3_host_id_from_wrapper = false

row 22

◆ bitwig_vst3_linux_repaint_after_resize

bool pulp::format::HostQuirks::bitwig_vst3_linux_repaint_after_resize = false

row 8 (Linux-only)

◆ bitwig_vst3_setbusarrangements_while_active

bool pulp::format::HostQuirks::bitwig_vst3_setbusarrangements_while_active = false

row 9

◆ clamp_latency_to_nonneg

bool pulp::format::HostQuirks::clamp_latency_to_nonneg = true

Clamp Processor::latency_samples() to non-negative when reporting to the host (VST3 requires unsigned).

◆ cubase10_async_view_resize_queue

bool pulp::format::HostQuirks::cubase10_async_view_resize_queue = false

row 1

◆ cubase10_fractional_scale_correction

bool pulp::format::HostQuirks::cubase10_fractional_scale_correction = false

row 3

◆ cubase10_param_gesture_ordering

bool pulp::format::HostQuirks::cubase10_param_gesture_ordering = false

row 2

◆ cubase13_midi_cc_param_id_stable

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.

◆ cubase9_state_blob_size_validation

bool pulp::format::HostQuirks::cubase9_state_blob_size_validation = false

row 4

◆ digital_performer_param_list_reload

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.

◆ double_string_buffer_for_live_10_1_13

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.

◆ fl_studio_setactive_process_mutex

bool pulp::format::HostQuirks::fl_studio_setactive_process_mutex = false

row 13

◆ fl_studio_state_reader_skip

bool pulp::format::HostQuirks::fl_studio_state_reader_skip = false

row 14

◆ live_vst3_canresize_ignore

bool pulp::format::HostQuirks::live_vst3_canresize_ignore = false

row 5

◆ live_vst3_windows_dpi_defer

bool pulp::format::HostQuirks::live_vst3_windows_dpi_defer = false

row 6 (Windows-only)

◆ logic_au_channel_probe_cap

int pulp::format::HostQuirks::logic_au_channel_probe_cap = 64

row 19 (Logic = 8)

◆ logic_au_tail_time_conversion

bool pulp::format::HostQuirks::logic_au_tail_time_conversion = false

row 20

◆ logic_au_v2_container_resize

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.

◆ pro_tools_aax_latency_callback_push

bool pulp::format::HostQuirks::pro_tools_aax_latency_callback_push = false

row 17

◆ pro_tools_aax_mono_second_bus

bool pulp::format::HostQuirks::pro_tools_aax_mono_second_bus = false

row 18

◆ pro_tools_aax_sidechain_negotiation

bool pulp::format::HostQuirks::pro_tools_aax_sidechain_negotiation = false

row 16

◆ reaper_anticipative_fx_buffer_variability

bool pulp::format::HostQuirks::reaper_anticipative_fx_buffer_variability = false

row R4

◆ reaper_auv3_in_process_preferred_size_sync

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.

◆ reaper_keyboard_only_space

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.

◆ reaper_keyboard_passthrough

bool pulp::format::HostQuirks::reaper_keyboard_passthrough = false

row R2

◆ reaper_midsession_setstate

bool pulp::format::HostQuirks::reaper_midsession_setstate = false

row R6

◆ reaper_permissive_bus_arrangements

bool pulp::format::HostQuirks::reaper_permissive_bus_arrangements = false

row R3

◆ reaper_process_while_bypassed

bool pulp::format::HostQuirks::reaper_process_while_bypassed = false

row R1

◆ reaper_vst3_gesture_ordering

bool pulp::format::HostQuirks::reaper_vst3_gesture_ordering = false

row 15

◆ silence_unsupported_bus_arrangements

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.

◆ skip_bus_arrangement_call

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.

◆ studio_one_restart_component_ui_thread

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.

◆ synthesize_bypass_parameter

bool pulp::format::HostQuirks::synthesize_bypass_parameter = true

Synthesize a bypass parameter when the plugin doesn't declare one.

◆ tolerate_state_read_nontrue_status

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.

◆ wavelab_state_blob_fallback

bool pulp::format::HostQuirks::wavelab_state_blob_fallback = false

row 11

◆ wavelab_vst3_defer_activation

bool pulp::format::HostQuirks::wavelab_vst3_defer_activation = false

row 10


The documentation for this struct was generated from the following file:
  • /home/runner/work/pulp/pulp/core/format/include/pulp/format/host_quirks.hpp