use symphonia::core::codecs::{Decoder, DecoderOptions, CODEC_TYPE_NULL};
use symphonia::core::formats::{FormatOptions, FormatReader};
use symphonia::core::io::MediaSourceStream;
use symphonia::core::meta::MetadataOptions;
use symphonia::core::probe::Hint;
pub fn open_file(file_path: &str) -> (Box<dyn Decoder>, Box<dyn FormatReader>) {
let format = get_reader(file_path);
let decoder = get_decoder(&format);
(decoder, format)
}
pub fn get_reader(file_path: &str) -> Box<dyn FormatReader> {
let src = std::fs::File::open(file_path).expect("failed to open media");
let mss = MediaSourceStream::new(Box::new(src), Default::default());
let mut hint = Hint::new();
let mut hint_extension = std::path::Path::new(file_path).extension().unwrap().to_str().unwrap();
if hint_extension == "prot" {
hint_extension = "mka";
}
hint.with_extension(hint_extension);
let meta_opts: MetadataOptions = Default::default();
let fmt_opts: FormatOptions = Default::default();
let probed = symphonia::default::get_probe()
.format(&hint, mss, &fmt_opts, &meta_opts)
.expect("unsupported format");
let format = probed.format;
format
.tracks()
.iter()
.find(|t| t.codec_params.codec != CODEC_TYPE_NULL)
.expect("no supported audio tracks");
format
}
pub fn get_decoder(format: &Box<dyn FormatReader>) -> Box<dyn Decoder> {
let dec_opts: DecoderOptions = Default::default();
let decoder = symphonia::default::get_codecs()
.make(&format.tracks()[0].codec_params, &dec_opts)
.expect("unsupported codec");
decoder
}