libdaw/nodes/
multi_frequency.rs1use crate::{stream::Stream, sync::AtomicF64, FrequencyNode, Node, Result};
2use std::sync::{atomic::Ordering, Arc};
3
4#[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}