From 7e02a46beb9ac62ed3b9dfeae445d68db773f640 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 27 Dec 2024 22:10:21 +0100 Subject: [PATCH] more stats in transport --- crates/tek/src/arranger.rs | 28 ++++++++++++++-------------- crates/tek/src/time/perf.rs | 4 ++++ crates/tek/src/transport.rs | 36 ++++++++++++++++++++++++------------ 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/crates/tek/src/arranger.rs b/crates/tek/src/arranger.rs index 71478dc1..9aea0de3 100644 --- a/crates/tek/src/arranger.rs +++ b/crates/tek/src/arranger.rs @@ -10,20 +10,20 @@ mod arranger_h; /// Root view for standalone `tek_arranger` pub struct ArrangerTui { - jack: Arc>, - pub clock: ClockModel, - pub phrases: PoolModel, - pub tracks: Vec, - pub scenes: Vec, - pub splits: [u16;2], - pub selected: ArrangerSelection, - pub mode: ArrangerMode, - pub color: ItemPalette, - pub size: Measure, - pub note_buf: Vec, - pub midi_buf: Vec>>, - pub editor: MidiEditorModel, - pub perf: PerfModel, + jack: Arc>, + pub clock: ClockModel, + pub phrases: PoolModel, + pub tracks: Vec, + pub scenes: Vec, + pub splits: [u16;2], + pub selected: ArrangerSelection, + pub mode: ArrangerMode, + pub color: ItemPalette, + pub size: Measure, + pub note_buf: Vec, + pub midi_buf: Vec>>, + pub editor: MidiEditorModel, + pub perf: PerfModel, } impl ArrangerTui { pub fn selected (&self) -> ArrangerSelection { diff --git a/crates/tek/src/time/perf.rs b/crates/tek/src/time/perf.rs index abe1e593..7d659867 100644 --- a/crates/tek/src/time/perf.rs +++ b/crates/tek/src/time/perf.rs @@ -10,6 +10,10 @@ pub struct PerfModel { period: AtomicF64, } +pub trait HasPerf { + fn perf (&self) -> &PerfModel; +} + impl Default for PerfModel { fn default () -> Self { Self { diff --git a/crates/tek/src/transport.rs b/crates/tek/src/transport.rs index 92e8eb80..980d091a 100644 --- a/crates/tek/src/transport.rs +++ b/crates/tek/src/transport.rs @@ -35,6 +35,8 @@ pub struct TransportView { color: ItemPalette, focused: bool, sr: String, + chunk: String, + latency: String, bpm: String, ppq: String, beat: String, @@ -46,17 +48,22 @@ pub struct TransportView { } impl From<(&T, Option, bool)> for TransportView { fn from ((state, color, focused): (&T, Option, bool)) -> Self { - let clock = state.clock(); - let sr = format!("{:.1}k", clock.timebase.sr.get() / 1000.0); - let bpm = format!("{:.3}", clock.timebase.bpm.get()); - let ppq = format!("{:.0}", clock.timebase.ppq.get()); - let color = color.unwrap_or(ItemPalette::from(TuiTheme::g(32))); + let clock = state.clock(); + let rate = clock.timebase.sr.get(); + let chunk = clock.chunk.load(Relaxed); + let latency = chunk as f64 / rate * 1000.; + let sr = format!("{:.1}k", rate / 1000.0); + let bpm = format!("{:.3}", clock.timebase.bpm.get()); + let ppq = format!("{:.0}", clock.timebase.ppq.get()); + let chunk = format!("{chunk}"); + let latency = format!("{latency}"); + let color = color.unwrap_or(ItemPalette::from(TuiTheme::g(32))); if let Some(started) = clock.started.read().unwrap().as_ref() { let current_sample = (clock.global.sample.get() - started.sample.get())/1000.; let current_usec = clock.global.usec.get() - started.usec.get(); let current_second = current_usec/1000000.; Self { - color, focused, sr, bpm, ppq, + color, focused, sr, bpm, ppq, chunk, latency, started: true, global_sample: format!("{:.0}k", started.sample.get()/1000.), global_second: format!("{:.1}s", started.usec.get()/1000.), @@ -68,7 +75,7 @@ impl From<(&T, Option, bool)> for TransportView { } } else { Self { - color, focused, sr, bpm, ppq, + color, focused, sr, bpm, ppq, chunk, latency, started: false, global_sample: format!("{:.0}k", clock.global.sample.get()/1000.), global_second: format!("{:.1}s", clock.global.usec.get()/1000000.), @@ -91,13 +98,18 @@ render!(|self: TransportView|{ Tui::bg(color.base.rgb, Fill::w(row!([ //PlayPause(self.started), " ", col!([ - Field(" Beat", self.beat.as_str(), &color), - Field(" BPM", self.bpm.as_str(), &color), + Field(" Beat", self.beat.as_str(), &color), + Field(" BPM", self.bpm.as_str(), &color), ]), - " ", col!([ - Field("Time", format!("{:.1}s", self.current_second).as_str(), &color), - Field("Smpl", format!("{:.1}k", self.current_sample).as_str(), &color), + Field(" Time", format!("{:.1}s", self.current_second).as_str(), &color), + //Field(" Smpl", format!("{:.1}k", self.current_sample).as_str(), &color), + Field(" Rate", format!("{}", self.sr).as_str(), &color), + //Field(" CPU%", format!("{:.1}ms", self.perf).as_str(), &color), + ]), + col!([ + Field(" Chunk", format!("{}", self.chunk).as_str(), &color), + Field(" Lag", format!("{:.3}ms", self.latency).as_str(), &color), ]), ]))) });