aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-12-05 03:02:46 -0500
committerJesse Luehrs <doy@tozt.net>2021-12-05 03:05:04 -0500
commitaadfdfb40eb6fdeef2ec6e4db84524134581ea08 (patch)
tree3f5e3a06ea611872b73e6f108ca58f6ea92874cc
parenteee7ae4289e21c388b95307187a5212f69635514 (diff)
downloadttyrec-bin-aadfdfb40eb6fdeef2ec6e4db84524134581ea08.tar.gz
ttyrec-bin-aadfdfb40eb6fdeef2ec6e4db84524134581ea08.zip
allow limiting the maximum time between frames
-rw-r--r--src/bin/ttyplay/frames.rs16
-rw-r--r--src/bin/ttyplay/main.rs7
2 files changed, 19 insertions, 4 deletions
diff --git a/src/bin/ttyplay/frames.rs b/src/bin/ttyplay/frames.rs
index 713e2e9..cea05fa 100644
--- a/src/bin/ttyplay/frames.rs
+++ b/src/bin/ttyplay/frames.rs
@@ -85,7 +85,9 @@ pub fn load_from_file(
frames: async_std::sync::Arc<async_std::sync::Mutex<FrameData>>,
fh: async_std::fs::File,
event_w: async_std::channel::Sender<crate::event::Event>,
+ clamp: Option<u64>,
) {
+ let clamp = clamp.map(std::time::Duration::from_millis);
async_std::task::spawn(async move {
let mut reader = ttyrec::Reader::new(fh);
let size = terminal_size::terminal_size().map_or(
@@ -93,11 +95,20 @@ pub fn load_from_file(
|(terminal_size::Width(w), terminal_size::Height(h))| (h, w),
);
let mut parser = vt100::Parser::new(size.0, size.1, 0);
+ let mut prev_delay = std::time::Duration::from_secs(0);
+ let mut clamped_amount = std::time::Duration::from_secs(0);
while let Ok(frame) = reader.read_frame().await {
- let delay = reader.offset().map_or_else(
+ let mut delay = reader.offset().map_or_else(
|| std::time::Duration::from_secs(0),
- |time| frame.time - time,
+ |offset| frame.time - offset - clamped_amount,
);
+ if let Some(clamp) = clamp {
+ let clamped_delay = delay.min(prev_delay + clamp);
+ if clamped_delay < delay {
+ clamped_amount += delay - clamped_delay;
+ delay = clamped_delay;
+ }
+ }
parser.process(&frame.data);
let mut frames = frames.lock_arc().await;
frames
@@ -107,6 +118,7 @@ pub fn load_from_file(
.send(crate::event::Event::FrameLoaded(Some(frames.count())))
.await
.unwrap();
+ prev_delay = delay;
}
frames.lock_arc().await.done_reading().await;
event_w
diff --git a/src/bin/ttyplay/main.rs b/src/bin/ttyplay/main.rs
index 9e14fca..2f49db5 100644
--- a/src/bin/ttyplay/main.rs
+++ b/src/bin/ttyplay/main.rs
@@ -14,10 +14,13 @@ mod timer;
struct Opt {
#[structopt(short, long, default_value = "ttyrec")]
file: std::ffi::OsString,
+
+ #[structopt(long)]
+ clamp: Option<u64>,
}
async fn async_main(opt: Opt) -> anyhow::Result<()> {
- let Opt { file } = opt;
+ let Opt { file, clamp } = opt;
let fh = async_std::fs::File::open(file).await?;
@@ -34,7 +37,7 @@ async fn async_main(opt: Opt) -> anyhow::Result<()> {
let frame_data = async_std::sync::Arc::new(async_std::sync::Mutex::new(
frames::FrameData::new(),
));
- frames::load_from_file(frame_data.clone(), fh, event_w.clone());
+ frames::load_from_file(frame_data.clone(), fh, event_w.clone(), clamp);
let timer_task =
timer::spawn_task(event_w.clone(), frame_data.clone(), timer_r);