Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
reaper.hpp File Reference

Per-host quirks for Cockos REAPER. More...

Go to the source code of this file.

Namespaces

namespace  pulp
namespace  pulp::format
 What the product grants a device: the quota table indexed by capability tier and live thermal state.
namespace  pulp::format::host_quirks

Functions

void pulp::format::host_quirks::apply_reaper (HostQuirks &q, HostVersion)
 Populate REAPER's main 6 host-gated flags (rows 15 + R1-R4 + R6) onto q.
void pulp::format::host_quirks::apply_reaper_keyboard (HostQuirks &q, HostVersion)
 Populate REAPER keyboard-only-space flag onto q.
void pulp::format::host_quirks::apply_reaper_auv3_in_process (HostQuirks &q, HostVersion)
 Populate REAPER AU v3 in-process preferredContentSize lesson onto q.

Detailed Description

Per-host quirks for Cockos REAPER.

REAPER is a forgiving host — it absorbs many spec violations — but it also exposes more permissive configurations (e.g. arbitrary pin connectivity, mid-session FX-chain reloads, anticipative-FX rendering) than the typical VST3 / CLAP / AU host, so several quirks are REAPER-specific accommodations rather than spec bugs.

This header owns the full REAPER quirk dispatch (DAW-quirks rows 15

  • R1-R7), keeping REAPER-specific lessons next to each other.

Rows covered

  • row 15 (reaper_vst3_gesture_ordering) — REAPER's VST3 automation reader expects parameter gesture-begin / value-change / gesture-end events in a particular order that differs from Cubase / Wavelab. Mis-ordered gestures produce spurious touch-automation lanes. The VST3 adapter consults this flag to switch to REAPER's ordering when the host is detected as REAPER.
  • row R1 (reaper_process_while_bypassed) — REAPER's "Run FX while bypassed" track option calls process() on the plugin even while bypassed (so tail state can settle cleanly). Adapters route bypass to Processor::process_bypassed() rather than assuming "bypassed = no process call".
  • row R2 (reaper_keyboard_passthrough) — REAPER's "send all keyboard input to plugin" track option routes raw key events into the plugin editor in addition to REAPER's own shortcut handling. View::on_key_event must distinguish "consumed" vs "not consumed" so the adapter can propagate unconsumed keys back to the host.
  • row R3 (reaper_permissive_bus_arrangements) — REAPER's FX-route pin matrix is more permissive than Cubase / Live; the VST3 adapter accepts any arrangement whose channel counts the plugin can handle (silence-out the rest) rather than rejecting non-standard layout names. Layers on top of the always-on silence_unsupported_bus_arrangements cheap defense.
  • row R4 (reaper_anticipative_fx_buffer_variability) — REAPER's anticipative-FX / offline render path calls process() from a non-realtime thread with buffer sizes that may differ from prepare()'s max_buffer_size. The contract is that Processor::process() honors per-block buffer-size variability without re-allocating.
  • row R5 (reaper_vst3_gesture_ordering covers the gesture half; the vendor/product-string identity contract for REAPER's compatibility-allow-list is handled by the PluginDescriptor::manufacturer string contract and does not need a dedicated flag here. Documented for cross-reference.)
  • row R6 (reaper_midsession_setstate) — REAPER's per-track FX-state save/restore can fire setState at arbitrary times during a session, not just at project-load. Processor::set_state must stay safely callable mid-play; no resource re-allocation may require prepare() to be re-called.
  • row R7 (CLAP canary, no dedicated flag) — REAPER's CLAP host is among the most reference-correct in the wild and is used as the canary for any CLAP adapter regression. Carried here as documentation; the CLAP-side acceptance lives in the CLAP adapter test matrix.

Plus the keyboard-only-space lesson layered on top:

  • reaper_keyboard_only_space — REAPER's VST2/VST3 onKeyDown / effEditKeyDown pipeline only delivers a well-formed keyMsg payload for the Space key (VKEY_SPACE); other keys arrive with malformed key state. Editors that route keyboard input through the format adapter must reject non-Space keys when this flag is set. Documented across REAPER 5.x through current 7.x.

Version handling

Every REAPER quirk Pulp tracks today is documented across every REAPER vintage Pulp encounters (5.x through current 7.x line), so apply_reaper fires every flag unconditionally. If a future REAPER release fixes a specific behavior, add an is_before(major, minor) guard at that point.

Tier status

HostQuirksMeta now reflects a mixed evidence set. Rows backed by checked-in REAPER 7.x DAW-bench evidence are Validated; the remaining REAPER dispatch rows stay Speculative until their scenarios are bench-confirmed. The REAPER keyboard-only-Space and AU v3 in-process sizing rows remain LessonOnly because they are carried as catalog lessons without in-tree bench evidence.

Reference-Lineage: independent reproducer=macos-plan-item-5.8 docs=https://www.reaper.fm/sdk/vst/vst_ext.php