diff --git a/src/backend.rs b/src/backend.rs index bdf83e2..b1d0262 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -321,6 +321,7 @@ impl Backend { } } } + renderer_moved.guard().on_buffer(data); }, move |err| { // we got an error on stream, push it to the error queue diff --git a/src/renderer.rs b/src/renderer.rs index e6a2e76..258ef6b 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -9,6 +9,13 @@ pub trait Renderer: Clone + Send + 'static { /// /// Note: you can use a [`crate::Resampler`] to resample audio data. fn next_frame(&mut self, sample_rate: u32) -> Frame; + + /// This gets called when an audio buffer is done processing. + fn on_buffer(&mut self, _buffer: &mut [T]) + where + T: cpal::SizedSample + cpal::FromSample, + { + } } /// Default audio renderer. @@ -16,6 +23,8 @@ pub trait Renderer: Clone + Send + 'static { pub struct DefaultRenderer { /// All playing sounds. pub sounds: Vec, + /// The last buffer size given by the [cpal] backend. + pub last_buffer_size: usize, } impl DefaultRenderer { @@ -50,6 +59,13 @@ impl Renderer for DefaultRenderer { out } + + fn on_buffer(&mut self, buffer: &mut [T]) + where + T: cpal::SizedSample + cpal::FromSample, + { + self.last_buffer_size = buffer.len(); + } } /// Wraps [`Renderer`] so it can be shared between threads.