proteus_lib/audio/samples.rs
1//! Helpers for working with `rodio` sample buffers.
2
3use rodio::{buffer::SamplesBuffer, Source};
4
5/// Clone a [`SamplesBuffer`] into two independent buffers.
6///
7/// `rodio::SamplesBuffer` owns its backing Vec; this helper extracts the data
8/// and builds two new buffers with identical content.
9///
10/// # Example
11/// ```rust
12/// use rodio::buffer::SamplesBuffer;
13/// use proteus_lib::audio::samples::clone_samples_buffer;
14///
15/// let buffer = SamplesBuffer::new(2, 48_000, vec![0.0f32; 4]);
16/// let (a, b) = clone_samples_buffer(buffer);
17/// assert_eq!(a.count(), b.count());
18/// ```
19pub fn clone_samples_buffer(buffer: SamplesBuffer) -> (SamplesBuffer, SamplesBuffer) {
20 let sample_rate = buffer.sample_rate();
21 let buffered = buffer.buffered();
22 let vector_samples = buffered.clone().into_iter().collect::<Vec<f32>>();
23 let clone1 = SamplesBuffer::new(buffered.channels(), sample_rate, vector_samples.clone());
24 let clone2 = SamplesBuffer::new(buffered.channels(), sample_rate, vector_samples);
25
26 (clone1, clone2)
27}