euphony_mix/
stereo.rs

1#![allow(dead_code)]
2
3use crate::{
4    frame::{Frame, N2},
5    Mixer, Writer,
6};
7use euphony_dsp::sample::Sample;
8
9#[derive(Clone, Copy, Debug, Default)]
10pub struct Config {}
11
12#[derive(Debug)]
13pub struct Stereo<W: Writer> {
14    writer: W,
15    config: Config,
16}
17
18impl<W: Writer> Stereo<W> {
19    #[inline]
20    pub fn new(writer: W) -> Self {
21        Self {
22            writer,
23            config: Default::default(),
24        }
25    }
26
27    #[inline]
28    pub fn with_config(writer: W, config: Config) -> Self {
29        Self { writer, config }
30    }
31
32    #[inline]
33    pub fn finish(self) -> W {
34        self.writer
35    }
36}
37
38impl<W: Writer> Mixer for Stereo<W>
39where
40    W::Frame: Frame<NumChannels = N2>,
41{
42    type Error = W::Error;
43
44    #[inline]
45    fn skip(&mut self, frames: usize) -> Result<(), Self::Error> {
46        self.writer.skip(frames)
47    }
48
49    #[inline]
50    fn mix(&mut self, samples: &[crate::SpatialSample]) -> Result<(), Self::Error> {
51        let mut frame = [0.0f64, 0.0f64];
52        for s in samples.iter() {
53            // TODO use the bformat
54            let x = 0.5;
55            frame[0] += s.value * x;
56            frame[1] += s.value * x;
57        }
58
59        let frame = W::Frame::from_fn(|idx| unsafe { frame.get_unchecked(idx).to_sample() });
60        self.writer.write(frame)?;
61
62        Ok(())
63    }
64}