From d58fe2991d7aee040b044eee191203584b9c9bf4 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:21:15 +0200 Subject: [PATCH] Format negative Audio Samples time as a signed timecode Found while testing crates/time/src/lib.rs:383-387 Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/time/src/lib.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/crates/time/src/lib.rs b/crates/time/src/lib.rs index f5697156..7a64a82b 100644 --- a/crates/time/src/lib.rs +++ b/crates/time/src/lib.rs @@ -381,9 +381,11 @@ pub fn format_time(t: Tick, rate: FrameRate, drop_frame: bool, display: TimeDisp format!("{}{}+{:02}", if neg { "-" } else { "" }, a / per_ft, a % per_ft) } TimeDisplay::AudioSamples => { - let secs = t.0.div_euclid(TICKS_PER_SECOND); - let rem = Tick(t.0.rem_euclid(TICKS_PER_SECOND)).to_units_floor(sample_rate); - format!("{:02}:{:02}:{:02}:{rem:05}", secs / 3600, (secs / 60) % 60, secs % 60) + let sign = if t.0 < 0 { "-" } else { "" }; + let abs = t.0.saturating_abs(); + let secs = abs.div_euclid(TICKS_PER_SECOND); + let rem = Tick(abs.rem_euclid(TICKS_PER_SECOND)).to_units_floor(sample_rate); + format!("{sign}{:02}:{:02}:{:02}:{rem:05}", secs / 3600, (secs / 60) % 60, secs % 60) } TimeDisplay::Seconds => format!("{:.3}", t.seconds()), } @@ -701,6 +703,14 @@ mod tests { assert_eq!(format_time(Tick::from_units(48_001, 48_000), r, false, TimeDisplay::AudioSamples, 48000), "00:00:01:00001"); } + #[test] + fn neg_samples() { + let r = FrameRate::FPS_30; + let fmt = |s: f64| format_time(Tick::from_seconds_f64(s), r, false, TimeDisplay::AudioSamples, 48000); + assert_eq!(fmt(-0.5), "-00:00:00:24000"); + assert_eq!(fmt(-3700.0), "-01:01:40:00000"); + } + #[test] fn rational_conversions() { // 90 kHz MPEG timebase