use std::fs::File;
use std::io::{Read, Seek};
use std::path::Path;
pub use self::symphonia_decoder::SymphoniaDecoder;
pub mod symphonia_decoder;
pub trait AudioDecoder {
fn sample_rate(&self) -> u32;
fn channels(&self) -> u32;
fn decode_chunk(&mut self) -> crate::error::Result<Option<Vec<i16>>>;
}
pub fn create_decoder<R: Read + Seek + Send + Sync + 'static>(
reader: R,
) -> crate::error::Result<Box<dyn AudioDecoder>> {
Ok(Box::new(SymphoniaDecoder::new(reader)?))
}
pub fn create_decoder_from_path(path: &Path) -> crate::error::Result<Box<dyn AudioDecoder>> {
let file = File::open(path)?;
create_decoder(file)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_decoder_requires_valid_reader() {
let empty: &[u8] = &[];
let reader = std::io::Cursor::new(empty);
let result = create_decoder(reader);
assert!(result.is_err());
}
#[test]
fn test_create_decoder_from_nonexistent_path() {
let result = create_decoder_from_path(Path::new("/nonexistent/file.mp3"));
assert!(result.is_err());
}
}