summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Sior <aho@sior.be>2022-10-31 18:45:06 +0100
committerAlejandro Sior <aho@sior.be>2022-10-31 18:45:06 +0100
commit34a76f5b5e29d5509e0e45601bef71191b45162c (patch)
treef4c2b94c37c90e66d9a1a12814cb2e601ac73a2e
parentc1a28c918e4b7625356a3bd221c2f43cd5973af9 (diff)
aproc: send data through channels
-rw-r--r--src/main.rs86
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();
+ }
}