rill-io
Audio I/O backends — ALSA, CPAL, PipeWire, JACK.
This crate provides I/O backends and the AudioInput/AudioOutput graph
nodes that own the reactive stream (PipeWire callback or similar).
All backends implement [AudioIo] — a trait for reactive stream processing:
set_process_callback, read_input, write_output, start, stop.
Nodes
-
AudioInput—Sourcenode (push model). Owns the backend (Box<dyn AudioIo>). Creates the process callback via [start()]. Backend can be created externally via [set_backend()] or by name via [init_backend()].let mut input = new; input.init_backend?; input.start; -
AudioOutput—Sinknode (push model or pull model). Borrows backend via [AudioIoPtr]. In pull model, [set_active()] stores the source index and [start()] drives the graph from that source:let mut output = new; output.set_backend; output.set_active; output.start;
Processing models
| Model | Active node | Callback owner |
|---|---|---|
| Push | AudioInput (Source) |
AudioInput::start() |
| Pull | AudioOutput (Sink) |
AudioOutput::start() |
In both cases the callback does:
- Drain
MpscQueue<ParameterCommand>into graph nodes process_block()on the source →generate()fills output portsPort::propagate()— recursive DAG traversal, data lands in port buffersAudioOutput::consume()reads from its input ports →write_output()
Backends
| Backend | Feature | AudioIo | Mechanism |
|---|---|---|---|
NullBackend |
(always) | ✅ | No-op, for testing |
PipewireBackend |
pipewire |
✅ | RT callback (PW thread) |
JackBackend |
jack |
✅ | RT callback (JACK thread) |
AlsaBackend |
alsa |
✅ | snd_pcm_wait() — event‑driven |
CpalBackend |
cpal |
✅ | Thread + polling |
Links
- Repository: https://github.com/DigitalRats/rill
- Documentation: https://docs.rs/rill-io