diff options
| author | Alejandro Sior <aho@sior.be> | 2022-10-31 18:45:06 +0100 |
|---|---|---|
| committer | Alejandro Sior <aho@sior.be> | 2022-10-31 18:45:06 +0100 |
| commit | 34a76f5b5e29d5509e0e45601bef71191b45162c (patch) | |
| tree | f4c2b94c37c90e66d9a1a12814cb2e601ac73a2e /src | |
| parent | c1a28c918e4b7625356a3bd221c2f43cd5973af9 (diff) | |
aproc: send data through channels
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 86 |
1 files changed, 73 insertions, 13 deletions
diff --git a/src/main.rs b/src/main.rs index 799496b..b01dc9f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,58 @@ use cpal::traits::HostTrait; use cpal::traits::DeviceTrait; use cpal::traits::StreamTrait; +use std::time; +use std::thread; +use std::sync::mpsc; + +struct AudioSink { + recv: mpsc::Receiver<Box<[f32]>>, + buffer: Option<Box<[f32]>>, + idx: usize +} + +impl AudioSink { + fn new(recv: mpsc::Receiver<Box<[f32]>>) -> Self { + Self { + recv: recv, + buffer: None, + idx: 0 + } + } + + fn pour(&mut self, mut dst: &mut [f32], i: usize) { + loop { + match self.buffer.as_ref() { + Some(src) => { + let src_new = &src[self.idx..]; + let count = std::cmp::min(src_new.len(), dst.len()); + let src_new = &src_new[..count]; + let dst_new = &mut dst[..count]; + + dst_new.copy_from_slice(&src_new); + + self.idx += count; + + if self.idx >= src.len() { + self.buffer = None; + self.idx = 0; + } + + if dst.len() > count { + dst = &mut dst[count..]; + continue; + } + + return; + }, + None => { + self.buffer = Some(self.recv.recv().unwrap()); + } + }; + } + } +} + fn main() { let host = cpal::default_host(); let dev = host.default_output_device().expect("no audio device found"); @@ -11,27 +63,35 @@ fn main() { .next() .expect("bogus device") .with_max_sample_rate().into(); - - println!("sample rate {:?}", &cfg.sample_rate); - - let mut i: f32 = 0.0; - + let denom = cfg.sample_rate.0 as f32 * cfg.channels as f32; + + + let (send, recv) = mpsc::sync_channel(1); + let mut snk = AudioSink::new(recv); + + let mut snum: f32 = 0.0; let stream = dev.build_output_stream( &cfg, move |data: &mut [f32], _: &cpal::OutputCallbackInfo| { - println!("{}", &data.len()); - for sample in data.iter_mut() { - *sample = cpal::Sample::from(&(i/384000.0*2.0*3.141592 * 340.0).sin()); - i += 1.0; - } + snk.pour(data, 0); }, move |err| { println!("err: {}", err); } ).expect("could not build stream"); - + stream.play().unwrap(); - loop {} - println!("Hello, world!"); + let mut snum: usize = 0; + + loop { + let mut samples = vec![0.0f32;1024].into_boxed_slice(); + + for s in samples.iter_mut() { + *s += (snum as f32 / denom * 2.0 * 3.141592 * 200.0 as f32).sin(); + snum = snum.wrapping_add(1); + } + + send.send(samples).unwrap(); + } } |
