From 587aa9c711f761f5ce4e30d7c2624397983204a3 Mon Sep 17 00:00:00 2001 From: Will Stott Date: Wed, 20 Mar 2019 13:23:20 +0000 Subject: [PATCH] Simple block of playback thread based on buffer size. --- playback/Cargo.toml | 2 +- playback/src/audio_backend/rodio.rs | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/playback/Cargo.toml b/playback/Cargo.toml index 6b4e775..cf07d65 100644 --- a/playback/Cargo.toml +++ b/playback/Cargo.toml @@ -20,7 +20,7 @@ portaudio-rs = { version = "0.3.0", optional = true } libpulse-sys = { version = "0.0.0", optional = true } jack = { version = "0.5.3", optional = true } libc = { version = "0.2", optional = true } -rodio = { version = "0.8.1", optional = true, default-features = false } +rodio = { git = "https://github.com/tomaka/rodio", optional = true, default-features = false} [features] alsa-backend = ["alsa"] diff --git a/playback/src/audio_backend/rodio.rs b/playback/src/audio_backend/rodio.rs index 6269a78..b00a3be 100644 --- a/playback/src/audio_backend/rodio.rs +++ b/playback/src/audio_backend/rodio.rs @@ -1,6 +1,6 @@ use super::{Open, Sink}; extern crate rodio; -use std::io; +use std::{io, thread, time}; use std::process::exit; pub struct RodioSink { @@ -83,6 +83,14 @@ impl Sink for RodioSink { fn write(&mut self, data: &[i16]) -> io::Result<()> { let source = rodio::buffer::SamplesBuffer::new(2, 44100, data); self.rodio_sink.append(source); + + // Chunk sizes seem to be about 256 to 3000 ish items long. + // Assuming they're on average 1628 then a half second buffer is: + // 44100 elements --> about 27 chunks + while self.rodio_sink.len() > 26 { + // sleep and wait for rodio to drain a bit + thread::sleep(time::Duration::from_millis(10)); + } Ok(()) } }