summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-09 17:13:28 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-09 17:13:28 +0100
commit64f24832974e5b05dabf7117d5b2d34ea079c033 (patch)
treeaefe8a3a4fb34ddb67f2d1f947699f038048d732
parentdc1b54d559dac0b722e8854d1f48c77a07507497 (diff)
Simplify and test audio sample rate alteration.
-rw-r--r--src/lib/film_state.cc16
-rw-r--r--test/test.cc23
2 files changed, 29 insertions, 10 deletions
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);
+}