use std::sync::Arc;
pub type Sample = i32;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Codec {
Pcm,
Opus,
Flac,
Mp3,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AudioFormat {
pub codec: Codec,
pub sample_rate: u32,
pub channels: u8,
pub bit_depth: u8,
pub codec_header: Option<Vec<u8>>,
}
impl AudioFormat {
pub fn duration_us(&self, num_samples: usize) -> i64 {
debug_assert!(self.channels > 0, "AudioFormat with 0 channels");
debug_assert!(self.sample_rate > 0, "AudioFormat with 0 sample_rate");
let frames = num_samples / self.channels.max(1) as usize;
let rate = self.sample_rate.max(1) as i64;
(frames as i64 * 1_000_000 + rate / 2) / rate
}
}
pub struct AudioBuffer {
pub timestamp: i64,
pub samples: Arc<[Sample]>,
pub format: AudioFormat,
}
impl AudioBuffer {
pub fn duration_us(&self) -> i64 {
self.format.duration_us(self.samples.len())
}
}