pub trait PluginLogic: Send + 'static {
Show 14 methods
// Required methods
fn reset(&mut self, sample_rate: f64, max_block_size: usize);
fn process(
&mut self,
buffer: &mut AudioBuffer<'_, f32>,
events: &EventList,
context: &mut ProcessContext<'_>,
) -> ProcessStatus;
// Provided methods
fn supports_in_place() -> bool
where Self: Sized { ... }
fn bus_layouts() -> Vec<BusLayout>
where Self: Sized { ... }
fn save_state(&self) -> Vec<u8> ⓘ { ... }
fn load_state(&mut self, _data: &[u8]) -> Result<(), StateLoadError> { ... }
fn state_changed(&mut self) { ... }
fn latency(&self) -> u32 { ... }
fn tail(&self) -> u32 { ... }
fn layout(&self) -> GridLayout { ... }
fn render(&self, _backend: &mut dyn RenderBackend) { ... }
fn uses_custom_render(&self) -> bool { ... }
fn hit_test(
&self,
widgets: &[WidgetRegion],
x: f32,
y: f32,
) -> Option<usize> { ... }
fn custom_editor(&self) -> Option<Box<dyn Editor>> { ... }
}Expand description
The f32-buffer user-facing plugin trait.
Plugin authors implement this in a single impl block when
their audio path is f32 end-to-end (the default - matches
the host wire format for nearly all DAWs and formats).
truce::prelude and truce::prelude32 re-export this name
directly; truce::prelude64m does too (the m mixed-precision
prelude keeps the audio buffer at f32 and only switches the
param.read() precision).
Only Self::reset and Self::process are required;
everything else has a default. Headless (no-GUI) plugins leave
layout / render / custom_editor at their defaults - the
format wrappers fall back to a minimal built-in editor.
Required Methods§
Sourcefn reset(&mut self, sample_rate: f64, max_block_size: usize)
fn reset(&mut self, sample_rate: f64, max_block_size: usize)
Reset for a new sample rate / block size. Called before
the first process and any time the host reconfigures.
Sourcefn process(
&mut self,
buffer: &mut AudioBuffer<'_, f32>,
events: &EventList,
context: &mut ProcessContext<'_>,
) -> ProcessStatus
fn process( &mut self, buffer: &mut AudioBuffer<'_, f32>, events: &EventList, context: &mut ProcessContext<'_>, ) -> ProcessStatus
Process one block of audio. Real-time - no allocations, locks, or I/O.
Provided Methods§
Sourcefn supports_in_place() -> boolwhere
Self: Sized,
fn supports_in_place() -> boolwhere
Self: Sized,
Opt into zero-copy in-place I/O. When this returns true,
the format wrapper skips its safety memcpy on host-aliased
buffers and hands the plugin the raw shared memory through
AudioBuffer::in_out_mut(ch). The plugin must check
AudioBuffer::is_in_place(ch) per channel before reading
input(ch).
Default false: the wrapper copies aliased inputs into
scratch so input(ch) and output(ch) are always
disjoint. Costs one memcpy per aliased channel per block.
Sourcefn bus_layouts() -> Vec<BusLayout>where
Self: Sized,
fn bus_layouts() -> Vec<BusLayout>where
Self: Sized,
Supported audio bus configurations. The host picks one;
the others are rejected at bus-config time before
process is ever called. Default: stereo in, stereo out.
Sourcefn save_state(&self) -> Vec<u8> ⓘ
fn save_state(&self) -> Vec<u8> ⓘ
Serialize plugin-specific state (DSP state, not params - those are saved automatically). Default: no extra state.
Sourcefn load_state(&mut self, _data: &[u8]) -> Result<(), StateLoadError>
fn load_state(&mut self, _data: &[u8]) -> Result<(), StateLoadError>
Restore plugin-specific state.
§Errors
Return Err(StateLoadError) when the blob is malformed
or otherwise can’t be interpreted - the format wrapper
logs the failure (and on hosts that support it, surfaces
it to the DAW).
Sourcefn state_changed(&mut self)
fn state_changed(&mut self)
Called on the audio thread immediately after
Self::load_state returns. Invalidate or recompute any
caches the next process() reads. Default: no-op.
Sourcefn tail(&self) -> u32
fn tail(&self) -> u32
Report tail time in samples (audio produced after input
stops - reverbs, delays). u32::MAX for infinite tail.
Sourcefn layout(&self) -> GridLayout
fn layout(&self) -> GridLayout
Return the widget layout for the built-in GUI. Default:
empty layout. Plugins that supply a custom editor via
Self::custom_editor can leave this default.
Sourcefn render(&self, _backend: &mut dyn RenderBackend)
fn render(&self, _backend: &mut dyn RenderBackend)
Render the GUI into a backend. Default: no-op. Override
only for custom GPU/CPU rasterisation outside the
standard widget set; flip Self::uses_custom_render
to true when you do.
Sourcefn uses_custom_render(&self) -> bool
fn uses_custom_render(&self) -> bool
Whether this plugin overrides Self::render. The
shell uses the standard widget drawing from
Self::layout when this is false. Default: false.
Sourcefn hit_test(&self, widgets: &[WidgetRegion], x: f32, y: f32) -> Option<usize>
fn hit_test(&self, widgets: &[WidgetRegion], x: f32, y: f32) -> Option<usize>
Hit test: which widget (if any) is at (x, y)?
Default: circular for knobs, rectangular for everything
else, meters skipped.
Sourcefn custom_editor(&self) -> Option<Box<dyn Editor>>
fn custom_editor(&self) -> Option<Box<dyn Editor>>
Provide a custom Editor instead of the built-in
widget layout (egui, iced, slint, raw window handle).
The shell calls this first; if it returns None, falls
back to the built-in editor from Self::layout.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".