From: Carl Hetherington Date: Tue, 9 Oct 2012 16:13:28 +0000 (+0100) Subject: Simplify and test audio sample rate alteration. X-Git-Tag: v2.0.48~1717^2~5 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=64f24832974e5b05dabf7117d5b2d34ea079c033 Simplify and test audio sample rate alteration. --- diff --git a/src/lib/film_state.cc b/src/lib/film_state.cc index 3cd7091ca..3d58a4fec 100644 --- a/src/lib/film_state.cc +++ b/src/lib/film_state.cc @@ -283,18 +283,14 @@ FilmState::bytes_per_sample () const int FilmState::target_sample_rate () const { + /* Resample to a DCI-approved sample rate */ double t = dcp_audio_sample_rate (audio_sample_rate); + + /* Compensate for the fact that video will be rounded to the + nearest integer number of frames per second. + */ if (rint (frames_per_second) != frames_per_second) { - if (fabs (frames_per_second - 23.976) < 1e-6 || (fabs (frames_per_second - 29.97) < 1e-6)) { - /* 24fps or 30fps drop-frame ie {24,30} * 1000 / 1001 frames per second; - hence we need to resample the audio to dcp_audio_sample_rate * 1000 / 1001 - so that when we play it back at dcp_audio_sample_rate it is sped up - by the same amount that the video is - */ - t *= double(1000) / 1001; - } else { - throw EncodeError ("unknown fractional frame rate"); - } + t *= frames_per_second / rint (frames_per_second); } return rint (t); diff --git a/test/test.cc b/test/test.cc index ebee50ac0..d978d36a0 100644 --- a/test/test.cc +++ b/test/test.cc @@ -362,3 +362,26 @@ BOOST_AUTO_TEST_CASE (make_dcp_with_range_test) BOOST_CHECK_EQUAL (JobManager::instance()->errors(), false); } + +BOOST_AUTO_TEST_CASE (audio_sampling_rate_test) +{ + FilmState fs; + fs.frames_per_second = 24; + + fs.audio_sample_rate = 48000; + BOOST_CHECK_EQUAL (fs.target_sample_rate(), 48000); + + fs.audio_sample_rate = 44100; + BOOST_CHECK_EQUAL (fs.target_sample_rate(), 48000); + + fs.audio_sample_rate = 80000; + BOOST_CHECK_EQUAL (fs.target_sample_rate(), 96000); + + fs.frames_per_second = 23.976; + fs.audio_sample_rate = 48000; + BOOST_CHECK_EQUAL (fs.target_sample_rate(), 47952); + + fs.frames_per_second = 29.97; + fs.audio_sample_rate = 48000; + BOOST_CHECK_EQUAL (fs.target_sample_rate(), 47952); +}