No more alsa uderruns

This commit is contained in:
2025-10-19 14:46:48 +02:00
parent 334870e3d6
commit ef05e2c89e

View File

@ -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();
}
});