summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-07-21 13:06:07 +0100
committerCarl Hetherington <cth@carlh.net>2017-07-21 13:06:07 +0100
commitd95907ad565ac587dea8f8692a3775c1dc6e0ff1 (patch)
tree8b23935cc906260797f7b3e39568171d19d6b9d6
parenta25cc3fda26e2bbc6b1c3786cc7f2ed7141a29f0 (diff)
Fix completely-broken Time::scale.
-rw-r--r--src/sub_time.cc11
-rw-r--r--test/time_test.cc16
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);
+}