use std::time::Duration;
pub struct ChunkingManager {
buffer: Vec<f32>,
min_chunk_duration: Duration,
sample_rate: u32,
required_samples: usize,
}
impl ChunkingManager {
pub fn new(sample_rate: u32, min_chunk_duration: Duration) -> Self {
let required_samples = (sample_rate as f32 * min_chunk_duration.as_secs_f32()) as usize;
Self {
buffer: Vec::with_capacity(required_samples * 2),
min_chunk_duration,
sample_rate,
required_samples,
}
}
pub fn add_samples(&mut self, samples: &[f32]) -> Vec<Vec<f32>> {
self.buffer.extend_from_slice(samples);
let mut chunks = Vec::new();
while self.buffer.len() >= self.required_samples {
let chunk = self.buffer.drain(0..self.required_samples).collect();
chunks.push(chunk);
}
chunks
}
pub fn take_remaining(&mut self) -> Vec<f32> {
self.buffer.drain(..).collect()
}
pub fn buffered_samples(&self) -> usize {
self.buffer.len()
}
pub fn required_samples(&self) -> usize {
self.required_samples
}
pub fn current_duration(&self) -> f32 {
self.buffer.len() as f32 / self.sample_rate as f32
}
}