Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
graph_runtime_plan.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <cstdint>
6#include <span>
7#include <string>
8#include <vector>
9
10namespace pulp::graph {
11
24
26 std::uint32_t max_nodes = 512;
27 std::uint32_t max_connections = 2048;
28 std::uint32_t max_ports_per_node = 64;
29 std::uint32_t max_total_ports = 4096;
30};
31
33 NodeId id = 0;
35 std::uint32_t input_ports = 0;
36 std::uint32_t output_ports = 0;
37 std::uint32_t event_input_ports = 0;
38 std::uint32_t event_output_ports = 0;
39 // When true, the buffer assignment gives this node's output region dedicated
40 // scratch slots that are never recycled by another node, so their contents
41 // persist across blocks. Required for parity with a per-node persistent
42 // output buffer when the node may NOT fully overwrite its outputs each block
43 // (e.g. a hosted plugin that leaves a channel or trailing samples untouched);
44 // slot reuse would otherwise hand it a different node's stale data.
45 // Meaningful only for nodes with output_ports > 0; a no-op otherwise.
46 bool persistent_output = false;
47 // Latency this node ADDS to its own signal path, in samples (e.g. a hosted
48 // plugin's reported processing latency). The buffer assignment propagates it
49 // through the topology to derive per-connection delay compensation so that
50 // fan-in paths of differing latency time-align. Zero for nodes that add no
51 // latency (audio I/O, gain).
52 std::uint32_t latency_samples = 0;
53 std::uint32_t spectral_input_ports = 0;
54 std::uint32_t spectral_output_ports = 0;
55};
56
57// Parameter automation carried on a connection: the source audio output drives
58// the destination plugin's parameter `param_id` instead of an audio/event port.
59// `audio_rate` selects dense per-sample modulation; otherwise sparse two-point
60// (sample 0 + sample N-1). All values the realtime automation gather needs —
61// the source→param range map, the per-source slew time, the mix mode, and the
62// resolved parameter bounds — are carried here so the gather never calls into
63// the plugin on the audio thread. Meaningful only when the owning connection's
64// `kind` is GraphRuntimeConnectionKind::Automation.
66 std::uint32_t param_id = 0;
67 float range_lo = 0.0f; // plain-parameter domain the source maps into
68 float range_hi = 1.0f;
69 float smoothing_ms = 0.0f; // per-source linear slew time (sparse only)
70 bool mix_add = false; // false = Replace, true = Add (then clamp)
71 bool audio_rate = false; // true = dense per-sample, false = sparse 2-point
72 float bounds_lo = 0.0f; // resolved parameter bounds (Add-mix clamp)
73 float bounds_hi = 1.0f;
74};
75
76// The lane a connection carries, as a single discriminator. A connection is
77// exactly one of: plain Audio (feedforward or sidechain — sidechain is plain
78// audio into a higher destination port), an Event edge (MIDI), or Automation
79// (the source audio drives a destination parameter; `automation` carries the
80// mapping, and `automation.audio_rate` further selects dense vs. sparse). This
81// replaces the older independent `event`/`is_automation` bools so the three
82// lanes can never be set inconsistently. `feedback` stays ORTHOGONAL: a
83// feedback edge is a plain-audio back-edge (kind == Audio) that reads the
84// previous block, so feedback and the lane are tracked separately.
85enum class GraphRuntimeConnectionKind : std::uint8_t {
90 // Reserved typed trigger lane. The planner refuses it until a prepared
91 // producer/consumer pair can execute it; it is never a MIDI Event edge.
93};
94
100 bool feedback = false;
101 // The connection lane. Automation connections still order the graph (source
102 // before dest) but carry no audio/MIDI payload; `automation` carries the
103 // parameter mapping when kind == Automation.
106 // Sidechain is still plain audio, but its authored order is meaningful to
107 // the host's bus wiring. Keep the lane marker separate from `kind` so the
108 // runtime planner can canonicalize ordinary main-bus fan-in without
109 // reordering sidechain edges.
110 bool sidechain = false;
111};
112
114 NodeId id = 0;
116 std::uint32_t input_ports = 0;
117 std::uint32_t output_ports = 0;
118 std::uint32_t event_input_ports = 0;
119 std::uint32_t event_output_ports = 0;
120 // Carried from GraphRuntimeNodeSpec::persistent_output; see that field.
121 bool persistent_output = false;
122 // Carried from GraphRuntimeNodeSpec::latency_samples; see that field.
123 std::uint32_t latency_samples = 0;
124 std::uint32_t first_inbound_connection = 0;
125 std::uint32_t inbound_connection_count = 0;
126 std::uint32_t first_outbound_connection = 0;
127 std::uint32_t outbound_connection_count = 0;
129 std::uint32_t single_audio_inbound_connection = 0xFFFFFFFFu;
130 std::uint64_t audio_inbound_port_mask = 0;
131 std::uint32_t spectral_input_ports = 0;
132 std::uint32_t spectral_output_ports = 0;
133};
134
136 std::uint32_t source_index = 0;
138 std::uint32_t dest_index = 0;
140 bool feedback = false;
141 // Carried from GraphRuntimeConnectionSpec; see that field.
144 // Carried from GraphRuntimeConnectionSpec; see that field.
145 bool sidechain = false;
146};
147
148// Lane accessors shared by GraphRuntimeConnectionSpec and
149// GraphRuntimeConnectionPlan (both expose `kind`). They read ONLY the lane
150// discriminator, never `feedback` — a feedback edge is a plain-audio back-edge
151// (carries_audio() is true for it). Templated so a single definition serves
152// both the spec and the plan connection types.
153template <class Connection>
154constexpr bool is_event(const Connection& c) noexcept {
155 return c.kind == GraphRuntimeConnectionKind::Event;
156}
157template <class Connection>
158constexpr bool is_automation_conn(const Connection& c) noexcept {
160}
161template <class Connection>
162constexpr bool carries_audio(const Connection& c) noexcept {
163 return c.kind == GraphRuntimeConnectionKind::Audio;
164}
165template <class Connection> constexpr bool is_spectral(const Connection& c) noexcept {
167}
168
170 std::vector<GraphRuntimeNodePlan> nodes;
171 std::vector<GraphRuntimeConnectionPlan> connections;
172 std::vector<std::uint32_t> inbound_connection_indices;
173 std::vector<std::uint32_t> outbound_connection_indices;
174 // Dense node indices into `nodes`, not NodeIds. The walk is a stable
175 // topological order: when several nodes are ready, the node with the
176 // lowest NodeId is selected. This keeps equivalent plans independent of
177 // authored dense-vector order; non-audio adjacency keeps authored order,
178 // while ordinary audio fan-in is canonicalized for deterministic mixing.
179 std::vector<std::uint32_t> processing_order_indices;
180
181 void clear();
182 std::uint32_t node_count() const noexcept;
183 std::uint32_t connection_count() const noexcept;
184};
185
205
212
221
223 std::span<const GraphRuntimeNodeSpec> nodes,
224 std::span<const GraphRuntimeConnectionSpec> connections,
225 GraphRuntimeLimits limits = {});
226
227} // namespace pulp::graph
Definition graph_runtime_buffer_assignment.hpp:8
GraphRuntimeNodeKind
Definition graph_runtime_plan.hpp:12
@ SpectralStage
Definition graph_runtime_plan.hpp:21
@ AudioOutput
Definition graph_runtime_plan.hpp:14
@ AudioInput
Definition graph_runtime_plan.hpp:13
@ Custom
Definition graph_runtime_plan.hpp:19
@ Utility
Definition graph_runtime_plan.hpp:16
@ SpectralAnalysis
Definition graph_runtime_plan.hpp:20
@ MidiOutput
Definition graph_runtime_plan.hpp:18
@ SpectralSynthesis
Definition graph_runtime_plan.hpp:22
@ Processor
Definition graph_runtime_plan.hpp:15
@ MidiInput
Definition graph_runtime_plan.hpp:17
std::uint32_t NodeId
Definition graph_types.hpp:7
constexpr bool is_spectral(const Connection &c) noexcept
Definition graph_runtime_plan.hpp:165
GraphRuntimeConnectionKind
Definition graph_runtime_plan.hpp:85
@ Event
Definition graph_runtime_plan.hpp:87
@ Audio
Definition graph_runtime_plan.hpp:86
@ Automation
Definition graph_runtime_plan.hpp:88
@ Spectral
Definition graph_runtime_plan.hpp:89
@ Trigger
Definition graph_runtime_plan.hpp:92
GraphRuntimePlanResult build_graph_runtime_plan(std::span< const GraphRuntimeNodeSpec > nodes, std::span< const GraphRuntimeConnectionSpec > connections, GraphRuntimeLimits limits={})
std::uint32_t PortIndex
Definition graph_types.hpp:8
constexpr bool is_event(const Connection &c) noexcept
Definition graph_runtime_plan.hpp:154
GraphRuntimePlanErrorCode
Definition graph_runtime_plan.hpp:186
@ UnknownSourceNode
Definition graph_runtime_plan.hpp:195
@ InvalidNodePortCount
Definition graph_runtime_plan.hpp:194
@ TooManyConnections
Definition graph_runtime_plan.hpp:190
@ DuplicateNodeId
Definition graph_runtime_plan.hpp:193
@ InvalidConnectionKind
Definition graph_runtime_plan.hpp:203
@ TooManyPorts
Definition graph_runtime_plan.hpp:191
@ None
Definition graph_runtime_plan.hpp:187
@ TooManyNodes
Definition graph_runtime_plan.hpp:189
@ DestinationPortOutOfRange
Definition graph_runtime_plan.hpp:198
@ UnknownDestinationNode
Definition graph_runtime_plan.hpp:196
@ SourcePortOutOfRange
Definition graph_runtime_plan.hpp:197
@ AllocationFailed
Definition graph_runtime_plan.hpp:200
@ InvalidNodeId
Definition graph_runtime_plan.hpp:192
@ CycleDetected
Definition graph_runtime_plan.hpp:199
@ UnsupportedTrigger
Definition graph_runtime_plan.hpp:201
@ InvalidLimits
Definition graph_runtime_plan.hpp:188
@ NonAudioFeedback
Definition graph_runtime_plan.hpp:202
constexpr bool is_automation_conn(const Connection &c) noexcept
Definition graph_runtime_plan.hpp:158
constexpr bool carries_audio(const Connection &c) noexcept
Definition graph_runtime_plan.hpp:162
STL namespace.
Definition graph_runtime_plan.hpp:65
float range_lo
Definition graph_runtime_plan.hpp:67
float smoothing_ms
Definition graph_runtime_plan.hpp:69
float bounds_hi
Definition graph_runtime_plan.hpp:73
bool mix_add
Definition graph_runtime_plan.hpp:70
std::uint32_t param_id
Definition graph_runtime_plan.hpp:66
float bounds_lo
Definition graph_runtime_plan.hpp:72
bool audio_rate
Definition graph_runtime_plan.hpp:71
float range_hi
Definition graph_runtime_plan.hpp:68
Definition graph_runtime_plan.hpp:135
PortIndex dest_port
Definition graph_runtime_plan.hpp:139
std::uint32_t dest_index
Definition graph_runtime_plan.hpp:138
std::uint32_t source_index
Definition graph_runtime_plan.hpp:136
GraphRuntimeAutomationSpec automation
Definition graph_runtime_plan.hpp:143
PortIndex source_port
Definition graph_runtime_plan.hpp:137
bool feedback
Definition graph_runtime_plan.hpp:140
bool sidechain
Definition graph_runtime_plan.hpp:145
GraphRuntimeConnectionKind kind
Definition graph_runtime_plan.hpp:142
Definition graph_runtime_plan.hpp:95
NodeId dest_node
Definition graph_runtime_plan.hpp:98
NodeId source_node
Definition graph_runtime_plan.hpp:96
PortIndex dest_port
Definition graph_runtime_plan.hpp:99
bool feedback
Definition graph_runtime_plan.hpp:100
PortIndex source_port
Definition graph_runtime_plan.hpp:97
bool sidechain
Definition graph_runtime_plan.hpp:110
GraphRuntimeConnectionKind kind
Definition graph_runtime_plan.hpp:104
GraphRuntimeAutomationSpec automation
Definition graph_runtime_plan.hpp:105
Definition graph_runtime_plan.hpp:25
std::uint32_t max_nodes
Definition graph_runtime_plan.hpp:26
std::uint32_t max_connections
Definition graph_runtime_plan.hpp:27
std::uint32_t max_ports_per_node
Definition graph_runtime_plan.hpp:28
std::uint32_t max_total_ports
Definition graph_runtime_plan.hpp:29
Definition graph_runtime_plan.hpp:113
std::uint32_t latency_samples
Definition graph_runtime_plan.hpp:123
std::uint32_t output_ports
Definition graph_runtime_plan.hpp:117
bool persistent_output
Definition graph_runtime_plan.hpp:121
std::uint32_t spectral_output_ports
Definition graph_runtime_plan.hpp:132
std::uint32_t event_output_ports
Definition graph_runtime_plan.hpp:119
std::uint32_t single_audio_inbound_connection
Definition graph_runtime_plan.hpp:129
std::uint32_t inbound_connection_count
Definition graph_runtime_plan.hpp:125
std::uint32_t event_input_ports
Definition graph_runtime_plan.hpp:118
std::uint32_t spectral_input_ports
Definition graph_runtime_plan.hpp:131
std::uint32_t audio_inbound_connection_count
Definition graph_runtime_plan.hpp:128
std::uint64_t audio_inbound_port_mask
Definition graph_runtime_plan.hpp:130
std::uint32_t first_outbound_connection
Definition graph_runtime_plan.hpp:126
GraphRuntimeNodeKind kind
Definition graph_runtime_plan.hpp:115
std::uint32_t outbound_connection_count
Definition graph_runtime_plan.hpp:127
std::uint32_t first_inbound_connection
Definition graph_runtime_plan.hpp:124
std::uint32_t input_ports
Definition graph_runtime_plan.hpp:116
Definition graph_runtime_plan.hpp:32
std::uint32_t event_input_ports
Definition graph_runtime_plan.hpp:37
std::uint32_t input_ports
Definition graph_runtime_plan.hpp:35
std::uint32_t spectral_output_ports
Definition graph_runtime_plan.hpp:54
bool persistent_output
Definition graph_runtime_plan.hpp:46
std::uint32_t spectral_input_ports
Definition graph_runtime_plan.hpp:53
std::uint32_t event_output_ports
Definition graph_runtime_plan.hpp:38
GraphRuntimeNodeKind kind
Definition graph_runtime_plan.hpp:34
std::uint32_t latency_samples
Definition graph_runtime_plan.hpp:52
std::uint32_t output_ports
Definition graph_runtime_plan.hpp:36
Definition graph_runtime_plan.hpp:206
GraphRuntimePlanErrorCode code
Definition graph_runtime_plan.hpp:207
std::uint32_t index
Definition graph_runtime_plan.hpp:208
std::string message
Definition graph_runtime_plan.hpp:210
NodeId node_id
Definition graph_runtime_plan.hpp:209
Definition graph_runtime_plan.hpp:213
GraphRuntimePlan plan
Definition graph_runtime_plan.hpp:214
GraphRuntimePlanError error
Definition graph_runtime_plan.hpp:215
bool ok() const noexcept
Definition graph_runtime_plan.hpp:217
Definition graph_runtime_plan.hpp:169
std::vector< std::uint32_t > outbound_connection_indices
Definition graph_runtime_plan.hpp:173
std::uint32_t connection_count() const noexcept
std::vector< std::uint32_t > inbound_connection_indices
Definition graph_runtime_plan.hpp:172
std::vector< GraphRuntimeConnectionPlan > connections
Definition graph_runtime_plan.hpp:171
std::vector< std::uint32_t > processing_order_indices
Definition graph_runtime_plan.hpp:179
std::vector< GraphRuntimeNodePlan > nodes
Definition graph_runtime_plan.hpp:170
std::uint32_t node_count() const noexcept