No more alsa uderruns
This commit is contained in:
60
src/main.rs
60
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();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user