sndplay: support various input kinds
[nihav-player.git] / sndplay / src / main.rs
index 618c2271b14c9950d8d6429a93ce0d542baf0ec6..b58577f0611f6a7cd47e17f590d9aec0b71b6de7 100644 (file)
@@ -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<dyn NADecoder>,
     dsupp:      Box<NADecoderSupport>,
     buf:        &'a mut Vec<i16>,
@@ -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<dyn ByteIO>;
+        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<NADecoderSupport>, Box<dyn NADecoder>)> = 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;