use std::fmt; mod lewton_decoder; pub use lewton_decoder::{VorbisDecoder, VorbisError}; mod passthrough_decoder; pub use passthrough_decoder::{PassthroughDecoder, PassthroughError}; pub enum AudioPacket { Samples(Vec), OggData(Vec), } impl AudioPacket { pub fn samples_from_f32(f32_samples: Vec) -> Self { let f64_samples = f32_samples.iter().map(|sample| *sample as f64).collect(); AudioPacket::Samples(f64_samples) } pub fn samples(&self) -> &[f64] { match self { AudioPacket::Samples(s) => s, AudioPacket::OggData(_) => panic!("can't return OggData on samples"), } } pub fn oggdata(&self) -> &[u8] { match self { AudioPacket::Samples(_) => panic!("can't return samples on OggData"), AudioPacket::OggData(d) => d, } } pub fn is_empty(&self) -> bool { match self { AudioPacket::Samples(s) => s.is_empty(), AudioPacket::OggData(d) => d.is_empty(), } } } #[derive(Debug)] pub enum AudioError { PassthroughError(PassthroughError), VorbisError(VorbisError), } impl fmt::Display for AudioError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { AudioError::PassthroughError(err) => write!(f, "PassthroughError({})", err), AudioError::VorbisError(err) => write!(f, "VorbisError({})", err), } } } impl From for AudioError { fn from(err: VorbisError) -> AudioError { AudioError::VorbisError(err) } } impl From for AudioError { fn from(err: PassthroughError) -> AudioError { AudioError::PassthroughError(err) } } pub trait AudioDecoder { fn seek(&mut self, ms: i64) -> Result<(), AudioError>; fn next_packet(&mut self) -> Result, AudioError>; }