mod decoder;
mod error;
mod huffman;
mod requantize;
mod stereo;
mod synthesis;
mod tables;
mod types;
pub use crate::error::{Error, Mp3Error};
pub use crate::types::{
BitRate, Channels, Emphasis, FrameHeader, MpegLayer, MpegVersion, SampleRate,
};
use std::io::Read;
pub fn read_mp3<R: Read>(
reader: R,
) -> Result<(FrameHeader, impl Iterator<Item = (f32, f32)>), Error> {
let mut decoder = Mp3Decoder::new(reader);
let mut frame = decoder.next_frame()?;
let header = frame.header.clone();
let mut i = 0;
let iter = std::iter::from_fn(move || {
if i >= frame.num_samples {
i = 0;
frame = if let Ok(frame) = decoder.next_frame() {
frame
} else {
return None;
}
}
let sample = (frame.samples[0][i], frame.samples[1][i]);
i += 1;
Some(sample)
});
Ok((header, iter))
}
pub struct Mp3Decoder<R: Read> {
reader: R,
state: crate::types::DecoderState,
}
impl<R: Read> Mp3Decoder<R> {
pub fn new(reader: R) -> Self {
Self {
reader,
state: crate::types::DecoderState::new(),
}
}
pub fn get_ref(&self) -> &R {
&self.reader
}
pub fn get_mut(&mut self) -> &mut R {
&mut self.reader
}
pub fn into_inner(self) -> R {
self.reader
}
pub fn frames(mut self) -> impl Iterator<Item = Frame> {
std::iter::from_fn(move || self.next_frame().ok())
}
pub fn next_frame(&mut self) -> Result<Frame, Error> {
let header;
loop {
match decoder::read_frame_header(&mut self.reader) {
Ok(frame_header) => {
header = frame_header;
break;
}
Err(Error::Mp3Error(Mp3Error::InvalidData(_))) => (),
Err(e) => return Err(e),
}
}
let (num_samples, samples) =
decoder::process_frame(&mut self.state, &mut self.reader, &header)?;
Ok(Frame {
header,
samples,
num_samples,
})
}
}
pub struct Frame {
pub header: FrameHeader,
pub samples: [[f32; 1152]; 2],
pub num_samples: usize,
}