From b73576594b252e033539bec964d72403d3775585 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 22 Dec 2018 23:32:59 +0000 Subject: [PATCH] Fix assumption of 48kHz DCP audio in AudioRingBuffers consistency check (#1436). --- src/lib/audio_ring_buffers.cc | 7 ++++--- src/lib/audio_ring_buffers.h | 2 +- src/lib/butler.cc | 6 +++--- src/lib/butler.h | 2 +- src/lib/player.cc | 2 +- src/lib/player.h | 2 +- test/audio_ring_buffers_test.cc | 6 +++--- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/lib/audio_ring_buffers.cc b/src/lib/audio_ring_buffers.cc index 012ab0718..d26fb9eb7 100644 --- a/src/lib/audio_ring_buffers.cc +++ b/src/lib/audio_ring_buffers.cc @@ -38,17 +38,18 @@ AudioRingBuffers::AudioRingBuffers () } +/** @param frame_rate Frame rate in use; this is only used to check timing consistency of the incoming data */ void -AudioRingBuffers::put (shared_ptr data, DCPTime time) +AudioRingBuffers::put (shared_ptr data, DCPTime time, int frame_rate) { boost::mutex::scoped_lock lm (_mutex); if (!_buffers.empty()) { DCPOMATIC_ASSERT (_buffers.front().first->channels() == data->channels()); - if ((_buffers.back().second + DCPTime::from_frames(_buffers.back().first->frames(), 48000)) != time) { + if ((_buffers.back().second + DCPTime::from_frames(_buffers.back().first->frames(), frame_rate)) != time) { cout << "bad put " << to_string(_buffers.back().second) << " " << _buffers.back().first->frames() << " " << to_string(time) << "\n"; } - DCPOMATIC_ASSERT ((_buffers.back().second + DCPTime::from_frames(_buffers.back().first->frames(), 48000)) == time); + DCPOMATIC_ASSERT ((_buffers.back().second + DCPTime::from_frames(_buffers.back().first->frames(), frame_rate)) == time); } _buffers.push_back(make_pair(data, time)); diff --git a/src/lib/audio_ring_buffers.h b/src/lib/audio_ring_buffers.h index 53236cb32..ce0efd3e2 100644 --- a/src/lib/audio_ring_buffers.h +++ b/src/lib/audio_ring_buffers.h @@ -33,7 +33,7 @@ class AudioRingBuffers : public boost::noncopyable public: AudioRingBuffers (); - void put (boost::shared_ptr data, DCPTime time); + void put (boost::shared_ptr data, DCPTime time, int frame_rate); boost::optional get (float* out, int channels, int frames); void clear (); diff --git a/src/lib/butler.cc b/src/lib/butler.cc index 94230d094..f3e9f73f1 100644 --- a/src/lib/butler.cc +++ b/src/lib/butler.cc @@ -76,7 +76,7 @@ Butler::Butler ( , _fast (fast) { _player_video_connection = _player->Video.connect (bind (&Butler::video, this, _1, _2)); - _player_audio_connection = _player->Audio.connect (bind (&Butler::audio, this, _1, _2)); + _player_audio_connection = _player->Audio.connect (bind (&Butler::audio, this, _1, _2, _3)); _player_text_connection = _player->Text.connect (bind (&Butler::text, this, _1, _2, _3, _4)); /* The butler must hear about things first, otherwise it might not sort out suspensions in time for get_video() to be called in response to this signal. @@ -296,7 +296,7 @@ Butler::video (shared_ptr video, DCPTime time) } void -Butler::audio (shared_ptr audio, DCPTime time) +Butler::audio (shared_ptr audio, DCPTime time, int frame_rate) { { boost::mutex::scoped_lock lm (_mutex); @@ -307,7 +307,7 @@ Butler::audio (shared_ptr audio, DCPTime time) } boost::mutex::scoped_lock lm2 (_buffers_mutex); - _audio.put (remap (audio, _audio_channels, _audio_mapping), time); + _audio.put (remap (audio, _audio_channels, _audio_mapping), time, frame_rate); } /** Try to get `frames' frames of audio and copy it into `out'. Silence diff --git a/src/lib/butler.h b/src/lib/butler.h index 4f4e50884..f1b86a1ab 100644 --- a/src/lib/butler.h +++ b/src/lib/butler.h @@ -65,7 +65,7 @@ public: private: void thread (); void video (boost::shared_ptr video, DCPTime time); - void audio (boost::shared_ptr audio, DCPTime time); + void audio (boost::shared_ptr audio, DCPTime time, int frame_rate); void text (PlayerText pt, TextType type, boost::optional track, DCPTimePeriod period); bool should_run () const; void prepare (boost::weak_ptr video) const; diff --git a/src/lib/player.cc b/src/lib/player.cc index ae16290f5..fa6c1b055 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -1099,7 +1099,7 @@ Player::emit_audio (shared_ptr data, DCPTime time) /* This audio must follow on from the previous */ DCPOMATIC_ASSERT (!_last_audio_time || time == *_last_audio_time); - Audio (data, time); + Audio (data, time, _film->audio_frame_rate()); _last_audio_time = time + DCPTime::from_frames (data->frames(), _film->audio_frame_rate()); } diff --git a/src/lib/player.h b/src/lib/player.h index b3c4e82b4..8a81146c9 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -92,7 +92,7 @@ public: /** Emitted when a video frame is ready. These emissions happen in the correct order. */ boost::signals2::signal, DCPTime)> Video; - boost::signals2::signal, DCPTime)> Audio; + boost::signals2::signal, DCPTime, int)> Audio; /** Emitted when a text is ready. This signal may be emitted considerably * after the corresponding Video. */ diff --git a/test/audio_ring_buffers_test.cc b/test/audio_ring_buffers_test.cc index 6ec5e2235..9ebd64ded 100644 --- a/test/audio_ring_buffers_test.cc +++ b/test/audio_ring_buffers_test.cc @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE (audio_ring_buffers_test1) data->data(j)[i] = value++; } } - rb.put (data, DCPTime()); + rb.put (data, DCPTime(), 48000); BOOST_CHECK_EQUAL (rb.size(), 91); /* Get part of it out */ @@ -105,7 +105,7 @@ BOOST_AUTO_TEST_CASE (audio_ring_buffers_test2) data->data(j)[i] = value++; } } - rb.put (data, DCPTime()); + rb.put (data, DCPTime(), 48000); BOOST_CHECK_EQUAL (rb.size(), 91); /* Get part of it out */ @@ -157,7 +157,7 @@ BOOST_AUTO_TEST_CASE (audio_ring_buffers_test3) data->data(j)[i] = value++; } } - rb.put (data, DCPTime ()); + rb.put (data, DCPTime(), 48000); BOOST_CHECK_EQUAL (rb.size(), 91); /* Get part of it out */ -- 2.30.2