X-Git-Url: https://git.nihav.org/?p=nihav-player.git;a=blobdiff_plain;f=sndplay%2Fsrc%2Fmain.rs;h=b58577f0611f6a7cd47e17f590d9aec0b71b6de7;hp=618c2271b14c9950d8d6429a93ce0d542baf0ec6;hb=e08bbe032e8553d872673701f016d1bcf3070312;hpb=b5053bfc25fb327776886269e615c2e5dd63fa08 diff --git a/sndplay/src/main.rs b/sndplay/src/main.rs index 618c227..b58577f 100644 --- a/sndplay/src/main.rs +++ b/sndplay/src/main.rs @@ -5,7 +5,7 @@ extern crate nihav_registry; use std::fs::File; use std::io::prelude::*; -use std::io::{BufReader, SeekFrom}; +use std::io::BufReader; use std::sync::mpsc; use std::time::Duration; use std::thread; @@ -15,16 +15,16 @@ use nihav_core::frame::*; use nihav_core::codecs::*; use nihav_core::demuxers::*; use nihav_core::soundcvt::*; -use nihav_registry::detect; mod allreg; mod command; use command::*; +mod demux; +use demux::*; struct Player { ended: bool, - dmx_reg: RegisteredDemuxers, - dec_reg: RegisteredDecoders, + full_reg: allreg::FullRegister, paused: bool, mute: bool, volume: u8, @@ -92,7 +92,7 @@ impl Drop for AudioDevice { } struct Decoder<'a> { - demuxer: Demuxer<'a>, + demuxer: DemuxerObject<'a>, decoder: Box, dsupp: Box, buf: &'a mut Vec, @@ -215,10 +215,7 @@ fn format_time(ms: u64) -> String { impl Player { fn new() -> Self { - let mut dmx_reg = RegisteredDemuxers::new(); - allreg::register_all_demuxers(&mut dmx_reg); - let mut dec_reg = RegisteredDecoders::new(); - allreg::register_all_decoders(&mut dec_reg); + let full_reg = allreg::FullRegister::new(); unsafe { if sdl2_sys::SDL_Init(sdl2_sys::SDL_INIT_AUDIO) != 0 { @@ -229,7 +226,7 @@ impl Player { Self { ended: false, paused: false, - dmx_reg, dec_reg, + full_reg, volume: 100, mute: false, debug: false, @@ -242,35 +239,27 @@ impl Player { println!("error opening {}", name); return; } - let mut file = ret.unwrap(); + let file = ret.unwrap(); + let file = BufReader::new(file); - let mut fr = FileReader::new_read(&mut file); + let mut fr = FileReader::new_read(file); let mut br = ByteReader::new(&mut fr); - let res = detect::detect_format(name, &mut br); - if res.is_none() { - println!("cannot detect format for {}", name); - return; - } - let (dmx_name, _) = res.unwrap(); - drop(br); - drop(fr); - let dmx_fact = self.dmx_reg.find_demuxer(dmx_name); - if dmx_fact.is_none() { - println!("no demuxer for format {}", dmx_name); - return; - } - let dmx_fact = dmx_fact.unwrap(); + let (is_raw, start, end) = detect_tags(&mut br); - file.seek(SeekFrom::Start(0)).unwrap(); - let mut file = BufReader::new(file); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let res = create_demuxer(dmx_fact, &mut br); - if res.is_err() { - println!("cannot create demuxer"); + let mut nfr: Box; + if start != 0 || end.is_some() { + //println!(" limiting range to {:X}-{:X}", start, end.unwrap_or(0)); + let file = fr.finish(); + nfr = Box::new(BoundedFileReader::new_read(file, start, end).unwrap()); + } else { + nfr = Box::new(fr); + } + let mut br = ByteReader::new(nfr.as_mut()); + let dmx = DemuxerObject::create(&mut br, &self.full_reg, name, is_raw); + if dmx.is_none() { + println!("No demuxer found!"); return; } - let dmx = res.unwrap(); let mut ainfo = None; let mut dec: Option<(Box, Box)> = None; @@ -280,7 +269,7 @@ impl Player { let s = dmx.get_stream(i).unwrap(); let info = s.get_info(); if info.is_audio() { - let decfunc = self.dec_reg.find_decoder(info.get_name()); + let decfunc = self.full_reg.dec_reg.find_decoder(info.get_name()); if decfunc.is_none() { println!("no decoder for {}", info.get_name()); continue;