From ef05e2c89eabdccedf7a200d0bb3a0145aed3b2e Mon Sep 17 00:00:00 2001 From: Albin Chaboissier Date: Sun, 19 Oct 2025 14:46:48 +0200 Subject: [PATCH] No more alsa uderruns --- src/main.rs | 60 +++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9332bd5..1906530 100644 --- a/src/main.rs +++ b/src/main.rs @@ -519,45 +519,37 @@ impl EguiApp { .with_sample_rate(cpal::SampleRate(48_000)) .config(); - let output_samples = Arc::new(std::sync::RwLock::new(Vec::new())); - let progression = Arc::new(AtomicU64::new(0)); + while let Some(stream) = up_receiver.recv().await { + let stream_len = stream.len(); + let progression = Arc::new(AtomicU64::new(0)); + let (finished_tx, mut finished_rx) = channel::<()>(16); - let output_samples2 = output_samples.clone(); - let progression2 = progression.clone(); + let send_stream = device + .build_output_stream( + &config, + move |data: &mut [f32], _: &cpal::OutputCallbackInfo| { + for d in data.iter_mut() { + if progression.load(std::sync::atomic::Ordering::Relaxed) as usize + == stream.len() + { + let _ = finished_tx.blocking_send(()); + break; + } - let (finished_tx, mut finished_rx) = channel::<()>(16); - let send_stream = device - .build_output_stream( - &config, - move |data: &mut [f32], _: &cpal::OutputCallbackInfo| { - let output_samples = output_samples.read().unwrap(); - let len = output_samples.len(); - for d in data.iter_mut() { - let i = progression.fetch_add(1, std::sync::atomic::Ordering::Relaxed) - as usize; - if i < len { - *d = output_samples[i]; - } else { - let _ = finished_tx.blocking_send(()); + *d = stream[progression + .fetch_add(1, std::sync::atomic::Ordering::Relaxed) + as usize] + * 0.1; // TODO } - } - }, - move |err| { - eprintln!("Stream error: {}", err); - }, - None, - ) - .unwrap(); - - while let Some(data) = up_receiver.recv().await { - progression2.store(0, std::sync::atomic::Ordering::Relaxed); - *output_samples2.write().unwrap() = data; - + }, + move |err| { + eprintln!("Stream error: {}", err); + }, + None, + ) + .unwrap(); send_stream.play().unwrap(); - let _ = finished_rx.recv().await; - - let _ = send_stream.pause(); } });