Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
rill-io
Audio I/O backends — PortAudio, ALSA, PipeWire, JACK.
This crate provides I/O backends and the Output/Input graph
nodes that own the reactive stream (process callback or similar).
I/O is split into three orthogonal traits:
IoDriver—set_process_callback,run,stop(owns the timing loop)IoCapture—read_input(channel, &mut [f32]),num_input_channels()IoPlayback—write_output(channel, &[f32]),num_output_channels()
A single backend struct (e.g. PipewireBackend) implements IoDriver
and optionally IoCapture / IoPlayback.
IoBackend is a backward-compatible alias: pub trait IoBackend: IoDriver {}.
The process callback is registered via IoDriver::set_process_callback().
Nodes
-
Output—Sinknode. HoldsArc<dyn IoPlayback>and callswrite_output()directly inconsume(). The backend is injected viaSink::set_playback()byProcessingState::wire_backends().let playback: = ...; let mut output = with_channels; -
Input—Sourcenode (push model). HoldsArc<dyn IoCapture>. Same pattern —Source::set_capture()injects the backend.
The process callback (registered by the orchestrator) does:
- Drain actor mailbox (
SetParametercommands) into graph nodes ProcessingState::process_block(&tick)— generates, processes, propagatesProcessingState::send_clock_tick(&tick)— dispatches to control actors
Backends
| Backend | Feature | Thread model |
|---|---|---|
PortAudioBackend |
portaudio (default) |
RT callback, exact buffer size |
PipewireBackend |
pipewire |
RT callback (PW thread) |
JackBackend |
jack |
RT callback (JACK thread) |
AlsaBackend |
alsa |
snd_pcm_wait() — poll‑driven, exact period required |
NullBackend |
(always) | No‑op, for testing |
Sample rate negotiation:
- JACK: reads
client.sample_rate()after activation - ALSA: queries
hw.get_rate()afterset_rate(Nearest), checkshw.get_period_size() == BUF_SIZE - PipeWire: output uses requested rate, input reads negotiated rate atomically
- PortAudio: opens stream with exact requested rate and buffer size
- Null: uses
config.sample_ratedirectly
Links
- Repository: https://github.com/DigitalRats/rill
- Documentation: https://docs.rs/rill-io