proteus_lib/tools/
tools.rs1use symphonia::core::codecs::{Decoder, DecoderOptions, CODEC_TYPE_NULL};
4use symphonia::core::formats::{FormatOptions, FormatReader};
5use symphonia::core::io::MediaSourceStream;
6use symphonia::core::meta::MetadataOptions;
7use symphonia::core::probe::Hint;
8
9pub fn open_file(file_path: &str) -> (Box<dyn Decoder>, Box<dyn FormatReader>) {
13 let format = get_reader(file_path);
14 let decoder = get_decoder(&format);
15
16 (decoder, format)
17}
18
19pub fn get_reader(file_path: &str) -> Box<dyn FormatReader> {
23 let src = std::fs::File::open(file_path).expect("failed to open media");
25
26 let mss = MediaSourceStream::new(Box::new(src), Default::default());
28
29 let mut hint = Hint::new();
31 let mut hint_extension = std::path::Path::new(file_path)
32 .extension()
33 .unwrap()
34 .to_str()
35 .unwrap();
36 if hint_extension == "prot" {
38 hint_extension = "mka";
39 }
40 hint.with_extension(hint_extension);
41
42 let meta_opts: MetadataOptions = Default::default();
44 let fmt_opts: FormatOptions = Default::default();
45
46 let probed = symphonia::default::get_probe()
48 .format(&hint, mss, &fmt_opts, &meta_opts)
49 .expect("unsupported format");
50
51 let format = probed.format;
53
54 format
56 .tracks()
57 .iter()
58 .find(|t| t.codec_params.codec != CODEC_TYPE_NULL)
59 .expect("no supported audio tracks");
60
61 format
62}
63
64pub fn get_decoder(format: &Box<dyn FormatReader>) -> Box<dyn Decoder> {
66 let dec_opts: DecoderOptions = Default::default();
68
69 let decoder = symphonia::default::get_codecs()
71 .make(&format.tracks()[0].codec_params, &dec_opts)
72 .expect("unsupported codec");
73
74 decoder
75}