summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-12-22 23:32:59 +0000
committerCarl Hetherington <cth@carlh.net>2018-12-22 23:32:59 +0000
commitb73576594b252e033539bec964d72403d3775585 (patch)
treec3d0a8e438fa19e23535c6250b551aa81fa58223 /src
parent2f5982e8e03ddb242d1443fc4aba4ea247cdacde (diff)
Fix assumption of 48kHz DCP audio in AudioRingBuffers consistency check (#1436).
Diffstat (limited to 'src')
-rw-r--r--src/lib/audio_ring_buffers.cc7
-rw-r--r--src/lib/audio_ring_buffers.h2
-rw-r--r--src/lib/butler.cc6
-rw-r--r--src/lib/butler.h2
-rw-r--r--src/lib/player.cc2
-rw-r--r--src/lib/player.h2
6 files changed, 11 insertions, 10 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<const AudioBuffers> data, DCPTime time)
+AudioRingBuffers::put (shared_ptr<const AudioBuffers> 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<const AudioBuffers> data, DCPTime time);
+ void put (boost::shared_ptr<const AudioBuffers> data, DCPTime time, int frame_rate);
boost::optional<DCPTime> 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<PlayerVideo> video, DCPTime time)
}
void
-Butler::audio (shared_ptr<AudioBuffers> audio, DCPTime time)
+Butler::audio (shared_ptr<AudioBuffers> audio, DCPTime time, int frame_rate)
{
{
boost::mutex::scoped_lock lm (_mutex);
@@ -307,7 +307,7 @@ Butler::audio (shared_ptr<AudioBuffers> 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<PlayerVideo> video, DCPTime time);
- void audio (boost::shared_ptr<AudioBuffers> audio, DCPTime time);
+ void audio (boost::shared_ptr<AudioBuffers> audio, DCPTime time, int frame_rate);
void text (PlayerText pt, TextType type, boost::optional<DCPTextTrack> track, DCPTimePeriod period);
bool should_run () const;
void prepare (boost::weak_ptr<PlayerVideo> 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<AudioBuffers> 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<void (boost::shared_ptr<PlayerVideo>, DCPTime)> Video;
- boost::signals2::signal<void (boost::shared_ptr<AudioBuffers>, DCPTime)> Audio;
+ boost::signals2::signal<void (boost::shared_ptr<AudioBuffers>, DCPTime, int)> Audio;
/** Emitted when a text is ready. This signal may be emitted considerably
* after the corresponding Video.
*/