X-Git-Url: https://git.nihav.org/?p=nihav-player.git;a=blobdiff_plain;f=sndplay%2Fsrc%2Fmain.rs;h=a5fc6ff29b2648b44a69442d883d91e5c81fc82f;hp=377c2d1b11bb7b134f3a1b9e1bd5ad287a61d175;hb=5a92ee55d90571333184392ebb240581c990d18e;hpb=0a727e0528c2b26c5cefb9bbf13f6b356e6fb3db diff --git a/sndplay/src/main.rs b/sndplay/src/main.rs index 377c2d1..a5fc6ff 100644 --- a/sndplay/src/main.rs +++ b/sndplay/src/main.rs @@ -2,7 +2,6 @@ extern crate libc; extern crate sdl2_sys; extern crate nihav_core; extern crate nihav_registry; -extern crate nihav_allstuff; use std::fs::File; use std::io::prelude::*; @@ -17,8 +16,8 @@ use nihav_core::codecs::*; use nihav_core::demuxers::*; use nihav_core::soundcvt::*; use nihav_registry::detect; -use nihav_allstuff::*; +mod allreg; mod command; use command::*; @@ -86,6 +85,12 @@ impl AudioDevice { } } +impl Drop for AudioDevice { + fn drop(&mut self) { + unsafe { sdl2_sys::SDL_CloseAudioDevice(self.device_id); } + } +} + struct Decoder<'a> { demuxer: Demuxer<'a>, decoder: Box, @@ -193,19 +198,24 @@ fn format_time(ms: u64) -> String { let s = ms / 1000; let ds = (ms % 1000) / 100; let (min, s) = (s / 60, s % 60); - if min == 0 { - format!("{}.{}", s, ds) + let (h, min) = (min / 60, min % 60); + if h == 0 { + if min == 0 { + format!("{}.{}", s, ds) + } else { + format!("{}:{:02}.{}", min, s, ds) + } } else { - format!("{}:{:02}.{}", min, s, ds) + format!("{}:{:02}:{:02}.{}", h, min, s, ds) } } impl Player { fn new() -> Self { let mut dmx_reg = RegisteredDemuxers::new(); - nihav_register_all_demuxers(&mut dmx_reg); + allreg::register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - nihav_register_all_decoders(&mut dec_reg); + allreg::register_all_decoders(&mut dec_reg); unsafe { if sdl2_sys::SDL_Init(sdl2_sys::SDL_INIT_AUDIO) != 0 { @@ -223,7 +233,7 @@ impl Player { buf: Vec::new(), } } - fn play_file(&mut self, name: &str, cmd_receiver: &mpsc::Receiver) { + fn play_file(&mut self, name: &str, cmd_receiver: &mpsc::Receiver, start_time: NATimePoint) { let ret = File::open(name); if ret.is_err() { println!("error opening {}", name); @@ -298,7 +308,7 @@ impl Player { let ch = ainfo.channels; println!("Playing {} [{}Hz {}ch]", name, arate, ch); - let ret = AudioDevice::open(arate, ch.max(2)); + let ret = AudioDevice::open(arate, ch.min(2)); if ret.is_none() { println!("cannot open output"); return; @@ -326,6 +336,10 @@ impl Player { let mut refill_limit = arate * u32::from(dspec.channels); let underfill_limit = (arate * u32::from(dspec.channels) / 4).max(block_limit); + if start_time != NATimePoint::None { + let _ret = decoder.demuxer.seek(start_time); + } + let mut eof = decoder.refill(&device); while !eof && device.size() < refill_limit { eof = decoder.refill(&device); @@ -466,8 +480,18 @@ impl Player { Command::Debug => { self.debug = !self.debug; }, - Command::PauseDisplay => { no_display = true; }, - Command::ResumeDisplay => { no_display = false; }, + Command::PauseDisplay => { + no_display = true; + if !self.paused { + device.pause(); + } + }, + Command::ResumeDisplay => { + no_display = false; + if !self.paused { + device.resume(); + } + }, }; if !no_display { print!("\r{:60}\r", ' '); @@ -508,11 +532,29 @@ fn main() { return; } - for arg in args[1..].iter() { - player.play_file(arg, &cmd_receiver); - if player.ended { - break; - } + let mut aiter = args[1..].iter(); + let mut start_time = NATimePoint::None; + while let Some(arg) = aiter.next() { + match arg.as_str() { + "-start" => { + if let Some(arg) = aiter.next() { + if let Ok(val) = arg.parse() { + start_time = val; + } else { + println!("invalid time"); + } + } else { + println!("argument is required"); + } + }, + _ => { + player.play_file(arg, &cmd_receiver, start_time); + if player.ended { + break; + } + start_time = NATimePoint::None; + }, + }; } cmd_state.restore();