use anyhow::{Context, Result, anyhow};
use symphonia::core::audio::AudioBufferRef;
use symphonia::core::codecs::{Decoder, DecoderOptions};
use symphonia::core::errors::Error as SymphoniaError;
use symphonia::core::formats::{Packet, Track};
pub fn make_decoder_for_track(track: &Track) -> Result<Box<dyn Decoder>> {
let decoder_opts: DecoderOptions = Default::default();
symphonia::default::get_codecs()
.make(&track.codec_params, &decoder_opts)
.map_err(|e| anyhow!(e))
.context("failed to create decoder for audio track")
}
pub fn decode_packet_and_then(
decoder: &mut Box<dyn Decoder>,
packet: &Packet,
mut on_decoded: impl FnMut(AudioBufferRef<'_>) -> Result<()>,
) -> Result<bool> {
match decoder.decode(packet) {
Ok(buf) => {
on_decoded(buf)?;
Ok(true)
}
Err(SymphoniaError::DecodeError(_)) => Ok(false),
Err(SymphoniaError::IoError(_)) => Ok(false),
Err(e) => Err(anyhow!(e)).context("decoder failure"),
}
}