From d95907ad565ac587dea8f8692a3775c1dc6e0ff1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 21 Jul 2017 13:06:07 +0100 Subject: [PATCH] Fix completely-broken Time::scale. --- src/sub_time.cc | 11 ++++------- test/time_test.cc | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/sub_time.cc b/src/sub_time.cc index adaab31..763b4e4 100644 --- a/src/sub_time.cc +++ b/src/sub_time.cc @@ -169,7 +169,7 @@ Time::from_frames (int f, Rational rate) double Time::all_as_seconds () const { - return _seconds + double(milliseconds ()) / 1000; + return _seconds + double(milliseconds()) / 1000; } /** Add a time to this one. Both *this and t must have a specified _rate */ @@ -190,10 +190,7 @@ Time::scale (float f) SUB_ASSERT (_rate->denominator != 0); SUB_ASSERT (_rate->integer ()); - _seconds = rint (_seconds * f); - _frames = rint (_frames * f); - if (_frames >= _rate->integer_fraction()) { - _frames -= _rate->integer_fraction (); - ++_seconds; - } + double const s = Time::all_as_seconds() * f; + _seconds = floor (s); + _frames = rint ((s - _seconds) * _rate->fraction()); } diff --git a/test/time_test.cc b/test/time_test.cc index 3fa9cb5..d103efc 100644 --- a/test/time_test.cc +++ b/test/time_test.cc @@ -81,3 +81,19 @@ BOOST_AUTO_TEST_CASE (time_add_test) t.add (sub::Time::from_frames(54641, sub::Rational(24, 1))); BOOST_CHECK_EQUAL (t, sub::Time::from_hmsf (0, 42, 4, 916, sub::Rational(1000, 1))); } + +BOOST_AUTO_TEST_CASE (time_scale_test1) +{ + sub::Time t = sub::Time::from_hmsf (0, 0, 1, 0, sub::Rational(1000, 1)); + t.scale (0.96); + BOOST_CHECK_EQUAL (t.seconds(), 0); + BOOST_CHECK_EQUAL (t.frames_at(sub::Rational(1000, 1)), 960); +} + +BOOST_AUTO_TEST_CASE (time_scale_test2) +{ + sub::Time t = sub::Time::from_hmsf (0, 0, 2, 0, sub::Rational(1000, 1)); + t.scale (0.96); + BOOST_CHECK_EQUAL (t.seconds(), 1); + BOOST_CHECK_EQUAL (t.frames_at(sub::Rational(1000, 1)), 920); +} -- 2.30.2