libdaw/nodes/
multi_frequency.rs

1use crate::{stream::Stream, sync::AtomicF64, FrequencyNode, Node, Result};
2use std::sync::{atomic::Ordering, Arc};
3
4/// A FrequencyNode that wraps any number of other frequency nodes
5#[derive(Debug)]
6pub struct MultiFrequency {
7    nodes: Box<[Arc<dyn FrequencyNode>]>,
8    frequency: AtomicF64,
9}
10
11impl MultiFrequency {
12    pub fn new(nodes: impl IntoIterator<Item = Arc<dyn FrequencyNode>>) -> Self {
13        Self {
14            frequency: AtomicF64::new(256.0),
15            nodes: nodes.into_iter().collect(),
16        }
17    }
18}
19
20impl FrequencyNode for MultiFrequency {
21    fn set_frequency(&self, frequency: f64) -> Result<()> {
22        self.frequency.store(frequency, Ordering::Relaxed);
23        for node in self.nodes.iter() {
24            node.set_frequency(frequency)?;
25        }
26        Ok(())
27    }
28    fn get_frequency(&self) -> Result<f64> {
29        Ok(self.frequency.load(Ordering::Relaxed))
30    }
31}
32
33impl Node for MultiFrequency {
34    fn process<'a, 'b, 'c>(
35        &'a self,
36        inputs: &'b [Stream],
37        outputs: &'c mut Vec<Stream>,
38    ) -> Result<()> {
39        for node in self.nodes.iter() {
40            node.process(inputs, outputs)?;
41        }
42        Ok(())
43    }
44}