use std::io::Read;
use kithara_stream::AudioCodec;
use super::{GaplessInfo, mp3::read_lame_trim, mp4::probe_mp4_gapless_dyn};
use crate::traits::DecoderInput;
const LAME_PROBE_WINDOW_BYTES: usize = 16 * 1024;
pub(crate) fn scoped_probe(
source: &mut dyn DecoderInput,
codec: AudioCodec,
) -> crate::error::DecodeResult<Option<GaplessInfo>> {
use std::io::SeekFrom;
source.seek(SeekFrom::Start(0))?;
let info = probe_codec_gapless(codec, source);
source.seek(SeekFrom::Start(0))?;
Ok(info)
}
pub(crate) fn probe_codec_gapless(
codec: AudioCodec,
source: &mut dyn DecoderInput,
) -> Option<GaplessInfo> {
match codec {
AudioCodec::AacLc | AudioCodec::AacHe | AudioCodec::AacHeV2 => {
probe_mp4_gapless_dyn(source).ok().flatten()
}
AudioCodec::Mp3 => {
let mut buffer = Vec::with_capacity(LAME_PROBE_WINDOW_BYTES);
source
.take(LAME_PROBE_WINDOW_BYTES as u64)
.read_to_end(&mut buffer)
.ok()?;
read_lame_trim(&buffer).map(|trim| GaplessInfo {
leading_frames: u64::from(trim.enc_delay),
trailing_frames: u64::from(trim.enc_padding),
})
}
_ => None,
}
}