sim_lib_audio_graph_core/lib.rs
1#![forbid(unsafe_code)]
2#![deny(missing_docs)]
3//! Pure Rust audio processor graph primitives.
4//!
5//! The core graph is hardware-free: callers provide processors, prepare the
6//! graph, and can render deterministic offline blocks in tests or previews.
7//!
8//! ```rust
9//! use sim_lib_audio_graph_core::{
10//! Graph, PrepareConfig, ProcessBlock, Processor,
11//! };
12//!
13//! #[derive(Default)]
14//! struct CopyNode;
15//!
16//! impl Processor for CopyNode {
17//! fn prepare(&mut self, _cfg: PrepareConfig) {}
18//!
19//! fn reset(&mut self) {}
20//!
21//! fn process(&mut self, block: &mut ProcessBlock<'_>) {
22//! let frames = block.frames as usize;
23//! for (input, output) in block.in_audio.iter().zip(block.out_audio.iter_mut()) {
24//! output[..frames].copy_from_slice(&input[..frames]);
25//! }
26//! }
27//! }
28//!
29//! let mut graph = Graph::new();
30//! graph.add_node("copy", Box::<CopyNode>::default(), 1, 1).unwrap();
31//! graph.prepare(48_000, 4).unwrap();
32//!
33//! let output = graph.process_offline(&[vec![0.25, -0.5]], 2).unwrap();
34//! assert_eq!(output, vec![vec![0.25, -0.5]]);
35//! ```
36
37mod arena;
38mod block;
39mod bridge;
40mod citizen;
41mod graph;
42mod patch;
43mod port;
44mod processor;
45
46pub use arena::BlockArena;
47pub use block::ProcessBlock;
48pub use bridge::DomainBridgeProcessor;
49pub use citizen::{
50 AudioGraphNodeConfig, AudioGraphPatchDescriptor, audio_graph_node_config_class_symbol,
51 audio_graph_patch_class_symbol,
52};
53pub use graph::{Cable, Graph};
54pub use patch::{Patch, PatchNode};
55pub use port::{PortDecl, PortDir, PortMedia, PortUri};
56pub use processor::{
57 BlockEvent, EventSink, NullEventSink, PrepareConfig, Processor, ProcessorDescriptor, Transport,
58};
59pub use sim_lib_stream_core::{
60 BridgeLatency, ClockDomain, DomainBridgeDescriptor, DomainBridgeKind, LatencyClass,
61 RateContract,
62};
63
64#[cfg(test)]
65mod bridge_tests;
66#[cfg(test)]
67mod tests;