X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=sndplay%2Fsrc%2Fcommand.rs;h=b706b9a2f05f9ec9787b6f8e97de1b0a37a24fd7;hb=ff58185ab2070ba00779e48df0fd7e7f6a87ad9e;hp=802908b2de0e0ec818c8eed2e8bed4c9dfd662cd;hpb=b043bd0a14b04ddc4cf69b4701c2e1e6fe8e0111;p=nihav-player.git diff --git a/sndplay/src/command.rs b/sndplay/src/command.rs index 802908b..b706b9a 100644 --- a/sndplay/src/command.rs +++ b/sndplay/src/command.rs @@ -1,7 +1,8 @@ use libc::{termios, tcgetattr, tcsetattr}; use std::sync::mpsc; -use std::io::Read; +use std::io::{Read, BufRead}; use std::thread; +use nihav_core::frame::NATimePoint; #[derive(Clone,Copy,Debug,PartialEq)] pub enum Command { @@ -12,8 +13,11 @@ pub enum Command { Pause, Back(u8), Forward(u8), + Seek(u64), Repeat, Next, + PauseDisplay, + ResumeDisplay, Quit, } @@ -22,13 +26,21 @@ pub struct CmdLineState { } impl CmdLineState { pub fn new() -> Self { - let mut orig_state: termios = unsafe { std::mem::uninitialized() }; + let mut orig_state: termios = unsafe { std::mem::MaybeUninit::uninit().assume_init() }; unsafe { tcgetattr(0, &mut orig_state); } let mut new_state = orig_state; new_state.c_lflag &= !(libc::ECHO | libc::ICANON); unsafe { tcsetattr(0, 0, &new_state); } Self { orig_state } } + pub fn new_normal() -> Self { + let mut orig_state: termios = unsafe { std::mem::MaybeUninit::uninit().assume_init() }; + unsafe { tcgetattr(0, &mut orig_state); } + let mut new_state = orig_state; + new_state.c_lflag |= libc::ECHO | libc::ICANON; + unsafe { tcsetattr(0, 0, &new_state); } + Self { orig_state } + } pub fn restore(&self) { unsafe { tcsetattr(0, 0, &self.orig_state); } } @@ -60,6 +72,26 @@ pub fn start_reader() -> (thread::JoinHandle<()>, mpsc::Receiver) { b'-' => { sender.send(Command::VolumeDown).unwrap(); }, b'd' | b'D' => { sender.send(Command::Debug).unwrap(); }, b'm' | b'M' => { sender.send(Command::Mute).unwrap(); }, + b'j' | b'J' => { + sender.send(Command::PauseDisplay).unwrap(); + let cstate = CmdLineState::new_normal(); + // wait so that the main thread stops displaying + thread::sleep(std::time::Duration::from_millis(500)); + print!("\nJump to: "); + let mut str = String::new(); + let ret = file.read_line(&mut str); + cstate.restore(); + sender.send(Command::ResumeDisplay).unwrap(); + + if ret.is_ok() && str.len() > 1 { + str.pop(); // newline + if let Ok(NATimePoint::Milliseconds(time)) = str.parse::() { + sender.send(Command::Seek(time)).unwrap(); + } else { + println!("wrong time"); + } + } + }, _ => {}, }; }, @@ -98,4 +130,4 @@ pub fn start_reader() -> (thread::JoinHandle<()>, mpsc::Receiver) { } } }), cmd_receiver) -} \ No newline at end of file +}