Skip to main content

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;
41pub mod cookbook;
42mod graph;
43mod patch;
44mod port;
45mod processor;
46
47pub use arena::BlockArena;
48pub use block::ProcessBlock;
49pub use bridge::DomainBridgeMetadataProcessor;
50pub use citizen::{
51    AudioGraphNodeConfig, AudioGraphPatchDescriptor, audio_graph_node_config_class_symbol,
52    audio_graph_patch_class_symbol,
53};
54pub use cookbook::copy_node_demo;
55pub use graph::{Cable, Graph};
56pub use patch::{Patch, PatchNode};
57pub use port::{PortDecl, PortDir, PortMedia, PortUri};
58pub use processor::{
59    BlockEvent, EventSink, NullEventSink, PrepareConfig, Processor, ProcessorDescriptor, Transport,
60};
61pub use sim_lib_stream_core::{
62    BridgeLatency, ClockDomain, DomainBridgeDescriptor, DomainBridgeKind, LatencyClass,
63    RateContract,
64};
65
66/// Cookbook recipes for this lib, embedded at build time.
67pub static RECIPES: sim_cookbook::EmbeddedDir =
68    include!(concat!(env!("OUT_DIR"), "/cookbook_recipes.rs"));
69
70#[cfg(test)]
71mod bridge_tests;
72#[cfg(test)]
73mod tests;