Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
native_core.h
Go to the documentation of this file.
1/*
2 * pulp/native_components/native_core.h — Pulp Native Component Core ABI (v1)
3 *
4 * The language-neutral C contract a native DSP core (Rust first, also C / Zig /
5 * generated FAUST·Cmajor) implements, and a C++ `pulp::format::Processor`
6 * adapter owns. This header is the *canonical source of truth*: in-tree Rust
7 * examples currently hand-mirror the POD structs they use, and any generated
8 * Rust bindings must be generated from this header, never the reverse.
9 *
10 * STATUS: experimental, source-built. This is shaped *like* a binary ABI (POD
11 * structs, leading size/version, opaque handles, status codes, no STL /
12 * exceptions / unwind) so the future public freeze is a *relabel*, not a
13 * rewrite — but it is NOT a frozen binary ABI yet. Rebuild your core against
14 * the SDK you ship with. See docs/reference/native-components.md and
15 * docs/reference/node-abi.md.
16 *
17 * This is the *Processor-level* FFI. It is deliberately independent of
18 * `SignalGraph` (contract decision 6): no graph, node, or host-chaining types
19 * appear here. The `pulp_node_v1` C ABI reuses these primitives but does not
20 * share this header.
21 *
22 * ── Contract decisions encoded here (see the spec) ──
23 * 1 ABI-shaped: every struct leads with `size` + `abi_version`.
24 * 2 Host owns all process buffers; the core only BORROWS them for the call.
25 * 3 State is an opaque, versioned byte span; validate-before-commit; never
26 * unwind on malformed input; empty span == defaults.
27 * 4 Parameter identity is a stable string id + a stable 64-bit hash, with
28 * plain-domain values and explicit ramp + sample-offset semantics.
29 * 5 Additive evolution only: `size`/`abi_version` checks + capability flags.
30 * 6 Independent of SignalGraph (no host-graph assumptions).
31 * 7 Explicit lifecycle states: ACTIVE vs SUSPENDED, plus reset. Alloc-heavy
32 * work happens only while SUSPENDED.
33 * 8 Sample-rate / block-size renegotiation == re-`prepare()`.
34 * 9 Multi-instance isolation: per-instance opaque handle; no process-wide
35 * mutable globals.
36 * 10 Bus / sidechain layout negotiated as POD; the core may accept/reject.
37 * 11 Parameter modulation and automation are DISTINCT, not collapsed.
38 * 12 Allocator ownership is explicit: every owned pointer names its paired
39 * free function; the core's allocator never frees host memory or vice
40 * versa.
41 */
42#ifndef PULP_NATIVE_COMPONENTS_NATIVE_CORE_H
43#define PULP_NATIVE_COMPONENTS_NATIVE_CORE_H
44
45#include <stddef.h> /* size_t */
46#include <stdint.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52/* ───────────────────────── ABI version ───────────────────────── */
53
54/* Bumped only for source-incompatible changes within draft 1. Additive field
55 * growth is signalled by per-struct `size`, not by this number. */
56#define PULP_NATIVE_CORE_ABI_VERSION 1u
57
58/* ───────────────────────── Status codes ──────────────────────── */
59
60typedef int32_t pulp_native_status;
61enum {
63 PULP_NATIVE_ERR_UNSUPPORTED = 1, /* capability/layout not supported */
66 PULP_NATIVE_ERR_INVALID_STATE = 4, /* e.g. process() before prepare() */
67 PULP_NATIVE_ERR_MALFORMED_STATE = 5, /* load_state given bad bytes */
70};
71
72/* ───────────────────────── Capability flags ──────────────────────────
73 * Decision 5/11: optional behavior is negotiated by additive bits, never by
74 * widening a required struct. A host ANDs what it needs against what the core
75 * reports in the descriptor. */
76typedef uint32_t pulp_native_caps;
77enum {
84 PULP_NATIVE_CAP_PARAM_MODULATION = 1u << 6, /* decision 11: supports mod */
85 PULP_NATIVE_CAP_STATE = 1u << 7, /* implements save/load_state */
86 PULP_NATIVE_CAP_TAIL = 1u << 8, /* reports a non-zero tail */
87 PULP_NATIVE_CAP_EDITOR_COMMAND = 1u << 9 /* non-RT editor_command path */
88};
89
90/* ───────────────────────── Lifecycle (decision 7) ─────────────────────
91 * The instance is created SUSPENDED. prepare()/release() and any allocation
92 * happen only while SUSPENDED. resume() arms the RT path; suspend() disarms it.
93 * process() is legal only while ACTIVE. */
94typedef int32_t pulp_native_lifecycle;
95enum {
98};
99
100/* ───────────────────────── Parameters (decision 4/11) ─────────────────
101 * Identity is the stable string id AND its 64-bit hash. The hash is the
102 * FNV-1a (64-bit) of the UTF-8 id bytes, computed case-sensitively over the
103 * exact byte sequence (offset basis 0xcbf29ce484222325, prime
104 * 0x100000001b3). The host computes the same hash; collisions are a hard error
105 * the host rejects at registration. Values are PLAIN DOMAIN (engineering
106 * units), never normalized. */
107typedef uint32_t pulp_native_param_flags;
108enum {
110 PULP_NATIVE_PARAM_MODULATABLE = 1u << 1, /* decision 11: mod != automation */
111 PULP_NATIVE_PARAM_STEPPED = 1u << 2, /* integer steps over [min,max] */
114};
115
116typedef struct pulp_native_param_v1 {
117 uint32_t size;
118 uint32_t abi_version;
119 /* Stable UTF-8 id. `id`+`id_len` is the byte span; NOT required to be NUL-
120 * terminated. id==NULL with id_len==0 is invalid for a parameter (every
121 * param must have an id). Lifetime: owned by the core, must stay valid
122 * until release(). */
123 const char* id;
124 size_t id_len;
125 uint64_t id_hash; /* FNV-1a/64 of the id bytes; see above. */
126 /* Optional display name (UTF-8 span). name==NULL,name_len==0 == "use id". */
127 const char* name;
128 size_t name_len;
129 double min_value;
130 double max_value;
133 uint32_t step_count; /* meaningful only with PULP_NATIVE_PARAM_STEPPED */
135
136/* Decision 11: an automation point and a modulation offset are different
137 * things and must not be collapsed. Both are sample-accurate. */
139enum {
140 PULP_NATIVE_EVENT_AUTOMATION = 0, /* sets the base value (host automation) */
141 PULP_NATIVE_EVENT_MODULATION = 1 /* signed offset added to the base value */
142};
143
144/* One sample-accurate parameter event. Mirrors Pulp's ParameterEventQueue:
145 * plain-domain `value`, `sample_offset` within the block, `ramp_frames` linear
146 * ramp duration (0 == immediate). Events in a view are SORTED ascending by
147 * sample_offset (decision 4). */
150 double value; /* automation: target base; modulation: offset */
151 uint32_t sample_offset; /* [0, frame_count) */
152 uint32_t ramp_frames; /* linear ramp length in frames; 0 == step */
154 uint32_t reserved; /* keep 8-byte alignment; must be 0 */
156
157/* Borrowed, read-only view over the host's sorted event queue for this block.
158 * Decision 2: host-owned, valid only for the duration of the process() call.
159 * `events`==NULL is semantically distinct from count==0-with-non-NULL: NULL
160 * means "host supplied no queue this block" (== empty + no capacity info),
161 * while a non-NULL pointer with count==0 means "empty queue, capacity known".
162 * Pulp's queue is fixed-capacity (1024); `overflowed` is set when the host
163 * dropped events because the queue was full. */
165 uint32_t size;
166 uint32_t abi_version;
167 const pulp_native_param_event_v1* events; /* sorted by sample_offset, or NULL */
168 uint32_t count;
169 uint32_t capacity; /* host queue capacity (1024 today), 0 if events==NULL */
170 uint32_t overflowed; /* 1 if events were dropped this block, else 0 */
171 uint32_t reserved;
173
174/* ───────────────────────── Audio buffers (decision 2) ─────────────────
175 * Host-owned, non-interleaved float32 planar channels, borrowed for the call.
176 * `channels[c]` points to `frame_count` contiguous floats. A channel pointer
177 * is never NULL when channel_count > 0. In-place processing (an output bus
178 * aliasing an input bus) is LEGAL; the core must tolerate it. Sidechain buses
179 * are READ-ONLY. The core must not retain any channel pointer past the call
180 * and must not free them (decision 12). */
182 uint32_t size;
184 float* const* channels; /* channel_count planar pointers; const for inputs */
186
188 uint32_t size;
189 uint32_t abi_version;
190 uint32_t frame_count; /* samples this block; <= prepared max_block_size */
194 uint32_t reserved;
195 const pulp_native_audio_bus_v1* inputs; /* read-only */
196 pulp_native_audio_bus_v1* outputs; /* written by the core */
197 const pulp_native_audio_bus_v1* sidechains; /* read-only, may be NULL */
199
200/* ───────────────────────── MIDI / events ──────────────────────────────
201 * Borrowed POD event stream. `data`+`size_bytes` is one raw MIDI message
202 * (short message: 1–3 bytes; sysex: full F0..F7 span). For UMP-capable cores,
203 * `is_ump` marks 32-bit-word UMP packets in `data`. The output buffer is
204 * host-owned and bounded; push via the host services, never by retaining
205 * `data`. */
208 uint32_t size_bytes;
209 const uint8_t* data; /* borrowed; valid only for the call */
210 uint32_t is_ump; /* 1 == UMP words, 0 == bytestream MIDI 1.0 */
211 uint32_t reserved;
213
215 uint32_t size;
216 uint32_t abi_version;
217 const pulp_native_midi_event_v1* in_events; /* sorted by sample_offset, or NULL */
218 uint32_t in_count;
219 uint32_t reserved;
220 /* Opaque host sink for output MIDI; pass to host_services.push_midi_out.
221 * NULL when the core declared no MIDI output. */
222 void* out_sink;
224
225/* ───────────────────────── State span (decision 3/12) ─────────────────
226 * Opaque, versioned bytes. On save the core allocates with ITS allocator and
227 * the host copies then asks the core to free via free_state (decision 12). On
228 * load the span is host-owned and read-only; the core validates before
229 * committing and returns PULP_NATIVE_ERR_MALFORMED_STATE (never unwinds) on bad
230 * input. `bytes`==NULL,`byte_len`==0 means "restore defaults". */
232 uint32_t size;
233 uint32_t abi_version;
234 uint32_t state_version; /* core-defined state format version */
235 uint32_t reserved;
236 const uint8_t* bytes;
237 size_t byte_len;
239
240/* Mutable variant the core fills in save_state. The host owns the lifetime
241 * contract: it must call free_state with the same (bytes,byte_len). */
243 uint32_t size;
244 uint32_t abi_version;
246 uint32_t reserved;
247 uint8_t* bytes; /* allocated by the core; freed by core's free_state */
248 size_t byte_len;
250
251/* ───────────────────────── Bus layout (decision 10) ───────────────────
252 * Proposed channel layout the host offers in prepare()/set_bus_layout(); the
253 * core returns PULP_NATIVE_OK to accept or PULP_NATIVE_ERR_UNSUPPORTED to
254 * reject (the host then offers another). No stereo-in/stereo-out assumption. */
256 uint32_t size;
257 uint32_t abi_version;
258 const uint32_t* input_channel_counts; /* one per input bus */
260 const uint32_t* output_channel_counts; /* one per output bus */
262 uint32_t sidechain_channel_count; /* 0 == no sidechain offered */
263 uint32_t reserved;
265
266/* ───────────────────────── prepare() config (decision 8) ──────────────
267 * Any change to sample_rate or max_block_size is a NEW prepare() call; the
268 * core must re-allocate scratch and must not assume a fixed configuration
269 * across prepare() calls. */
278
279/* ───────────────────────── Process context ────────────────────────────
280 * Read-only transport snapshot for the block. RT-thread; non-allocating. */
282 uint32_t size;
283 uint32_t abi_version;
285 double tempo_bpm;
286 double ppq_position; /* musical position at block start */
287 int64_t playhead_frames; /* sample position at block start */
288 uint32_t is_playing;
289 uint32_t is_looping;
293
294/* Everything one process() call needs, bundled so the call signature is stable
295 * and growable by `size`. All pointers are host-owned and borrowed. */
304
305/* ───────────────────────── Descriptor (decision 1/5/6) ────────────────
306 * Static identity + capabilities. Strings are UTF-8 spans owned by the core
307 * for its lifetime. */
309 uint32_t size;
310 uint32_t abi_version;
311 const char* id; /* reverse-DNS-ish stable plugin id */
312 size_t id_len;
313 const char* name;
314 size_t name_len;
315 const char* vendor;
317 uint32_t plugin_version; /* core-defined */
321 uint32_t latency_frames; /* initial; may change, see report_latency */
322 uint32_t tail_frames; /* 0 if no tail / unknown */
324
325/* ───────────────────────── Host services (decision 12) ────────────────
326 * Callbacks the host provides to the core. Each is explicitly labeled
327 * RT-callable or NON-RT-ONLY. Calling a NON-RT-ONLY callback from process() is
328 * a contract violation the RT-safety hook traps. `alloc`/`free` here are the
329 * HOST allocator — the core must NOT pass host-allocated pointers to its own
330 * free, nor vice versa (decision 12). */
332 uint32_t size;
333 uint32_t abi_version;
334 void* host_context; /* opaque, passed back to each callback */
335
336 /* NON-RT-ONLY. Host allocator for editor/state side-channels. */
337 void* (*alloc)(void* host_context, size_t bytes);
338 void (*free)(void* host_context, void* ptr);
339 /* NON-RT-ONLY. Diagnostic log. Never call from process(). */
340 void (*log)(void* host_context, int32_t level, const char* utf8, size_t len);
341
342 /* RT-callable. Push one output MIDI event into the host sink obtained from
343 * pulp_native_midi_view_v1.out_sink. Bounded; returns 0 if dropped. */
344 int32_t (*push_midi_out)(void* out_sink,
345 const pulp_native_midi_event_v1* event);
346 /* RT-callable. Tell the host latency changed (host re-queries report_*). */
349
350/* ───────────────────────── The core vtable (decision 1/7/9) ───────────
351 * A single exported entry returns a const pointer to this table plus a static
352 * descriptor. Per-instance state lives behind the opaque handle from create()
353 * (decision 9: no process-wide mutable globals). All function pointers are
354 * stable; growth is additive via `size`. */
355typedef struct pulp_native_instance pulp_native_instance; /* opaque */
356
357typedef struct pulp_native_core_v1 {
358 uint32_t size;
359 uint32_t abi_version;
360
361 /* Static, instance-independent. */
362 const pulp_native_descriptor_v1* (*descriptor)(void);
363 /* Returns the parameter table; *out_count set to the entry count. The
364 * array is owned by the core and stable for the process lifetime. */
365 const pulp_native_param_v1* (*parameters)(uint32_t* out_count);
366
367 /* Lifecycle. create() returns a SUSPENDED instance. NON-RT. */
369 pulp_native_instance** out_instance);
370 void (*destroy)(pulp_native_instance* instance);
371
372 /* NON-RT, SUSPENDED only. Allocate scratch for this configuration. A new
373 * sample_rate/max_block_size requires a fresh prepare() (decision 8). */
375 const pulp_native_prepare_v1* config);
376 /* NON-RT, SUSPENDED only. Release scratch. */
377 void (*release)(pulp_native_instance* instance);
378
379 /* NON-RT. Offer a bus layout; accept (OK) or reject (ERR_UNSUPPORTED). */
381 const pulp_native_bus_layout_v1* layout);
382
383 /* NON-RT. SUSPENDED <-> ACTIVE transitions (decision 7). */
386 /* RT-callable. Clear runtime history (filters, delay lines) without
387 * reallocating. Legal while ACTIVE. */
388 void (*reset)(pulp_native_instance* instance);
389
390 /* RT-callable, ACTIVE only. The real-time audio callback. Must not
391 * allocate, lock, log, do I/O, or panic. Host owns all buffers. On
392 * internal failure return a status and leave outputs silent. */
394 const pulp_native_process_v1* io);
395
396 /* NON-RT. Opaque versioned state (decision 3/12). save_state allocates
397 * with the core allocator; the host copies then calls free_state. */
399 pulp_native_state_out_v1* out_state);
401 pulp_native_state_out_v1* out_state);
403 const pulp_native_state_span_v1* state);
404
405 /* NON-RT. Current latency / tail in frames (decision: latency/tail query). */
406 uint32_t (*report_latency)(pulp_native_instance* instance);
407 uint32_t (*report_tail)(pulp_native_instance* instance);
408
409 /* NON-RT, optional (PULP_NATIVE_CAP_EDITOR_COMMAND). JSON-in / JSON-out
410 * command channel for editor/domain logic, off the audio thread. The core
411 * allocates the reply with its allocator; host frees via free_state-style
412 * pairing using free_editor_reply. */
414 const uint8_t* request_json,
415 size_t request_len,
416 uint8_t** out_reply_json,
417 size_t* out_reply_len);
419 uint8_t* reply_json,
420 size_t reply_len);
422
423/* ───────────────────────── Entry point ────────────────────────────────
424 * The ONE symbol the host resolves. A staticlib core exports this; the C++
425 * adapter calls it to obtain the vtable, checks `abi_version`/`size`, then
426 * drives the lifecycle. Returning NULL means "incompatible / unavailable".
427 * Referencing this symbol directly lets the C++ side link the staticlib
428 * without `--whole-archive`. */
430
431/* The RT-safety hook (test builds) calls this from a checking allocator /
432 * operator new when an allocation is attempted inside a no-alloc scope. The
433 * default (production) implementation is a no-op; test harnesses override it to
434 * trap. `kind` is a small tag (0=c++ new, 1=malloc, 2=rust-global-alloc,
435 * 3=blocking lock, ...), `bytes` the requested size — 0 when the tag names a
436 * non-allocating violation. A trapping harness reports the tag, so a new tag
437 * needs a message there or it reads as an allocation. It must never
438 * allocate. */
439void pulp_rt_trap_if_no_alloc_scope(int32_t kind, size_t bytes);
440
441#ifdef __cplusplus
442} /* extern "C" */
443#endif
444
445#endif /* PULP_NATIVE_COMPONENTS_NATIVE_CORE_H */
@ PULP_NATIVE_EVENT_MODULATION
Definition native_core.h:141
@ PULP_NATIVE_EVENT_AUTOMATION
Definition native_core.h:140
struct pulp_native_instance pulp_native_instance
Definition native_core.h:355
uint32_t pulp_native_caps
Definition native_core.h:76
@ PULP_NATIVE_PARAM_BOOLEAN
Definition native_core.h:112
@ PULP_NATIVE_PARAM_MODULATABLE
Definition native_core.h:110
@ PULP_NATIVE_PARAM_STEPPED
Definition native_core.h:111
@ PULP_NATIVE_PARAM_AUTOMATABLE
Definition native_core.h:109
@ PULP_NATIVE_PARAM_LOGARITHMIC
Definition native_core.h:113
@ PULP_NATIVE_ERR_VERSION_MISMATCH
Definition native_core.h:68
@ PULP_NATIVE_OK
Definition native_core.h:62
@ PULP_NATIVE_ERR_INTERNAL
Definition native_core.h:69
@ PULP_NATIVE_ERR_INVALID_ARGUMENT
Definition native_core.h:64
@ PULP_NATIVE_ERR_INVALID_STATE
Definition native_core.h:66
@ PULP_NATIVE_ERR_MALFORMED_STATE
Definition native_core.h:67
@ PULP_NATIVE_ERR_UNSUPPORTED
Definition native_core.h:63
@ PULP_NATIVE_ERR_OUT_OF_MEMORY
Definition native_core.h:65
int32_t pulp_native_param_event_kind
Definition native_core.h:138
uint32_t pulp_native_param_flags
Definition native_core.h:107
int32_t pulp_native_lifecycle
Definition native_core.h:94
const pulp_native_core_v1 * pulp_native_core_entry_v1(void)
int32_t pulp_native_status
Definition native_core.h:60
@ PULP_NATIVE_CAP_UMP
Definition native_core.h:81
@ PULP_NATIVE_CAP_MIDI_INPUT
Definition native_core.h:78
@ PULP_NATIVE_CAP_STATE
Definition native_core.h:85
@ PULP_NATIVE_CAP_EDITOR_COMMAND
Definition native_core.h:87
@ PULP_NATIVE_CAP_TAIL
Definition native_core.h:86
@ PULP_NATIVE_CAP_MPE
Definition native_core.h:80
@ PULP_NATIVE_CAP_SIDECHAIN
Definition native_core.h:82
@ PULP_NATIVE_CAP_IS_INSTRUMENT
Definition native_core.h:83
@ PULP_NATIVE_CAP_PARAM_MODULATION
Definition native_core.h:84
@ PULP_NATIVE_CAP_MIDI_OUTPUT
Definition native_core.h:79
@ PULP_NATIVE_LIFECYCLE_SUSPENDED
Definition native_core.h:96
@ PULP_NATIVE_LIFECYCLE_ACTIVE
Definition native_core.h:97
void pulp_rt_trap_if_no_alloc_scope(int32_t kind, size_t bytes)
Definition native_core.h:181
float *const * channels
Definition native_core.h:184
uint32_t size
Definition native_core.h:182
uint32_t channel_count
Definition native_core.h:183
Definition native_core.h:187
uint32_t reserved
Definition native_core.h:194
uint32_t abi_version
Definition native_core.h:189
uint32_t output_bus_count
Definition native_core.h:192
pulp_native_audio_bus_v1 * outputs
Definition native_core.h:196
uint32_t sidechain_bus_count
Definition native_core.h:193
uint32_t size
Definition native_core.h:188
const pulp_native_audio_bus_v1 * sidechains
Definition native_core.h:197
uint32_t frame_count
Definition native_core.h:190
const pulp_native_audio_bus_v1 * inputs
Definition native_core.h:195
uint32_t input_bus_count
Definition native_core.h:191
Definition native_core.h:255
uint32_t size
Definition native_core.h:256
const uint32_t * input_channel_counts
Definition native_core.h:258
uint32_t reserved
Definition native_core.h:263
uint32_t abi_version
Definition native_core.h:257
const uint32_t * output_channel_counts
Definition native_core.h:260
uint32_t output_bus_count
Definition native_core.h:261
uint32_t sidechain_channel_count
Definition native_core.h:262
uint32_t input_bus_count
Definition native_core.h:259
Definition native_core.h:357
void(* free_state)(pulp_native_instance *instance, pulp_native_state_out_v1 *out_state)
Definition native_core.h:400
pulp_native_status(* save_state)(pulp_native_instance *instance, pulp_native_state_out_v1 *out_state)
Definition native_core.h:398
pulp_native_status(* load_state)(pulp_native_instance *instance, const pulp_native_state_span_v1 *state)
Definition native_core.h:402
pulp_native_status(* resume)(pulp_native_instance *instance)
Definition native_core.h:384
pulp_native_status(* process)(pulp_native_instance *instance, const pulp_native_process_v1 *io)
Definition native_core.h:393
void(* reset)(pulp_native_instance *instance)
Definition native_core.h:388
void(* destroy)(pulp_native_instance *instance)
Definition native_core.h:370
pulp_native_status(* prepare)(pulp_native_instance *instance, const pulp_native_prepare_v1 *config)
Definition native_core.h:374
uint32_t(* report_latency)(pulp_native_instance *instance)
Definition native_core.h:406
uint32_t(* report_tail)(pulp_native_instance *instance)
Definition native_core.h:407
pulp_native_status(* set_bus_layout)(pulp_native_instance *instance, const pulp_native_bus_layout_v1 *layout)
Definition native_core.h:380
pulp_native_status(* editor_command)(pulp_native_instance *instance, const uint8_t *request_json, size_t request_len, uint8_t **out_reply_json, size_t *out_reply_len)
Definition native_core.h:413
uint32_t size
Definition native_core.h:358
void(* release)(pulp_native_instance *instance)
Definition native_core.h:377
pulp_native_status(* create)(const pulp_native_host_services_v1 *host, pulp_native_instance **out_instance)
Definition native_core.h:368
pulp_native_status(* suspend)(pulp_native_instance *instance)
Definition native_core.h:385
uint32_t abi_version
Definition native_core.h:359
void(* free_editor_reply)(pulp_native_instance *instance, uint8_t *reply_json, size_t reply_len)
Definition native_core.h:418
Definition native_core.h:308
uint32_t default_input_bus_count
Definition native_core.h:319
uint32_t tail_frames
Definition native_core.h:322
size_t name_len
Definition native_core.h:314
uint32_t size
Definition native_core.h:309
uint32_t latency_frames
Definition native_core.h:321
const char * vendor
Definition native_core.h:315
uint32_t default_output_bus_count
Definition native_core.h:320
uint32_t plugin_version
Definition native_core.h:317
size_t id_len
Definition native_core.h:312
const char * id
Definition native_core.h:311
pulp_native_caps capabilities
Definition native_core.h:318
size_t vendor_len
Definition native_core.h:316
const char * name
Definition native_core.h:313
uint32_t abi_version
Definition native_core.h:310
Definition native_core.h:331
void(* notify_latency_changed)(void *host_context)
Definition native_core.h:347
void * host_context
Definition native_core.h:334
uint32_t size
Definition native_core.h:332
uint32_t abi_version
Definition native_core.h:333
void(* free)(void *host_context, void *ptr)
Definition native_core.h:338
void(* log)(void *host_context, int32_t level, const char *utf8, size_t len)
Definition native_core.h:340
int32_t(* push_midi_out)(void *out_sink, const pulp_native_midi_event_v1 *event)
Definition native_core.h:344
Definition native_core.h:206
uint32_t sample_offset
Definition native_core.h:207
uint32_t is_ump
Definition native_core.h:210
uint32_t size_bytes
Definition native_core.h:208
const uint8_t * data
Definition native_core.h:209
uint32_t reserved
Definition native_core.h:211
Definition native_core.h:214
void * out_sink
Definition native_core.h:222
uint32_t size
Definition native_core.h:215
uint32_t reserved
Definition native_core.h:219
uint32_t in_count
Definition native_core.h:218
const pulp_native_midi_event_v1 * in_events
Definition native_core.h:217
uint32_t abi_version
Definition native_core.h:216
Definition native_core.h:148
uint32_t sample_offset
Definition native_core.h:151
double value
Definition native_core.h:150
uint64_t param_id_hash
Definition native_core.h:149
uint32_t ramp_frames
Definition native_core.h:152
pulp_native_param_event_kind kind
Definition native_core.h:153
uint32_t reserved
Definition native_core.h:154
Definition native_core.h:164
uint32_t reserved
Definition native_core.h:171
const pulp_native_param_event_v1 * events
Definition native_core.h:167
uint32_t capacity
Definition native_core.h:169
uint32_t count
Definition native_core.h:168
uint32_t size
Definition native_core.h:165
uint32_t abi_version
Definition native_core.h:166
uint32_t overflowed
Definition native_core.h:170
Definition native_core.h:116
uint32_t abi_version
Definition native_core.h:118
const char * name
Definition native_core.h:127
uint64_t id_hash
Definition native_core.h:125
size_t name_len
Definition native_core.h:128
uint32_t size
Definition native_core.h:117
double default_value
Definition native_core.h:131
uint32_t step_count
Definition native_core.h:133
const char * id
Definition native_core.h:123
size_t id_len
Definition native_core.h:124
double min_value
Definition native_core.h:129
double max_value
Definition native_core.h:130
pulp_native_param_flags flags
Definition native_core.h:132
Definition native_core.h:270
double sample_rate
Definition native_core.h:273
uint32_t size
Definition native_core.h:271
uint32_t max_block_size
Definition native_core.h:274
uint32_t abi_version
Definition native_core.h:272
uint32_t reserved
Definition native_core.h:275
pulp_native_bus_layout_v1 layout
Definition native_core.h:276
Definition native_core.h:281
uint32_t size
Definition native_core.h:282
double tempo_bpm
Definition native_core.h:285
int64_t playhead_frames
Definition native_core.h:287
double ppq_position
Definition native_core.h:286
uint32_t time_sig_numerator
Definition native_core.h:290
uint32_t abi_version
Definition native_core.h:283
double sample_rate
Definition native_core.h:284
uint32_t is_looping
Definition native_core.h:289
uint32_t time_sig_denominator
Definition native_core.h:291
uint32_t is_playing
Definition native_core.h:288
Definition native_core.h:296
const pulp_native_param_event_view_v1 * params
Definition native_core.h:300
const pulp_native_midi_view_v1 * midi
Definition native_core.h:301
uint32_t abi_version
Definition native_core.h:298
const pulp_native_audio_io_v1 * audio
Definition native_core.h:299
uint32_t size
Definition native_core.h:297
const pulp_native_process_context_v1 * context
Definition native_core.h:302
Definition native_core.h:242
uint32_t reserved
Definition native_core.h:246
uint32_t abi_version
Definition native_core.h:244
uint32_t size
Definition native_core.h:243
size_t byte_len
Definition native_core.h:248
uint32_t state_version
Definition native_core.h:245
uint8_t * bytes
Definition native_core.h:247
Definition native_core.h:231
uint32_t state_version
Definition native_core.h:234
uint32_t abi_version
Definition native_core.h:233
uint32_t size
Definition native_core.h:232
const uint8_t * bytes
Definition native_core.h:236
size_t byte_len
Definition native_core.h:237
uint32_t reserved
Definition native_core.h:235