use crate::chunk::Chunk;
use crate::error::StreamError;
pub trait DspNode: Send {
fn process(&mut self, input: Chunk) -> Result<Chunk, StreamError>;
fn reset(&mut self);
}
#[cfg(test)]
mod tests {
use super::*;
struct Passthrough;
impl DspNode for Passthrough {
fn process(&mut self, input: Chunk) -> Result<Chunk, StreamError> {
Ok(input)
}
fn reset(&mut self) {}
}
#[test]
fn passthrough_preserves_data() {
let mut node = Passthrough;
let chunk = Chunk::new(vec![1.0, 2.0, 3.0], 44100, 1);
let out = node.process(chunk).ok();
assert_eq!(
out.as_ref().map(|c| c.data()),
Some([1.0, 2.0, 3.0].as_slice())
);
}
#[test]
fn passthrough_preserves_metadata() {
let mut node = Passthrough;
let chunk = Chunk::new(vec![0.0; 4], 48000, 2);
let out = node.process(chunk).ok();
let out = out.as_ref();
assert_eq!(out.map(|c| c.sample_rate()), Some(48000));
assert_eq!(out.map(|c| c.channels()), Some(2));
}
#[test]
fn passthrough_handles_empty() {
let mut node = Passthrough;
let chunk = Chunk::empty(44100, 1);
let out = node.process(chunk).ok();
assert_eq!(out.as_ref().map(|c| c.is_empty()), Some(true));
}
#[test]
fn trait_is_object_safe() {
let node: Box<dyn DspNode> = Box::new(Passthrough);
let _ = node;
}
#[test]
fn trait_is_send() {
fn assert_send<T: Send>() {}
assert_send::<Passthrough>();
}
}