summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2021-01-04 14:32:12 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2021-01-04 14:32:12 +0100
commit36ac48e5c692d34bce560528426634c0d75c5c8b (patch)
treeffbb998c3d83fc5bc2fcd55b9d6d9eee38fce620
parentbe48734ef6a88e831d04ddec9bd56e52c983f489 (diff)
downloadnihav-player-36ac48e5c692d34bce560528426634c0d75c5c8b.tar.gz
sndplay: support -start option
-rw-r--r--sndplay/src/main.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/sndplay/src/main.rs b/sndplay/src/main.rs
index 176a6d1..43f8fca 100644
--- a/sndplay/src/main.rs
+++ b/sndplay/src/main.rs
@@ -228,7 +228,7 @@ impl Player {
buf: Vec::new(),
}
}
- fn play_file(&mut self, name: &str, cmd_receiver: &mpsc::Receiver<Command>) {
+ fn play_file(&mut self, name: &str, cmd_receiver: &mpsc::Receiver<Command>, start_time: NATimePoint) {
let ret = File::open(name);
if ret.is_err() {
println!("error opening {}", name);
@@ -331,6 +331,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);
@@ -523,11 +527,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();