From e3bac2533000be7e947f522cee571ceceb93e383 Mon Sep 17 00:00:00 2001 From: zeozeozeo <108888572+zeozeozeo@users.noreply.github.com> Date: Sat, 16 Dec 2023 22:45:26 +0500 Subject: [PATCH] Add a buffer callback to `Renderer` --- src/backend.rs | 1 + src/renderer.rs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) 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.