X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_ring_buffers.cc;h=289045ff529b445d8aa2ce0927423fd9a38820bd;hb=a5d004b0773f633401528392fc28e66d70e13ac8;hp=012ab0718022bab0fcf7ceca540f7d84e7459b43;hpb=4ff0e7ddb7580e91892075f6f11e2ef6d29578d6;p=dcpomatic.git diff --git a/src/lib/audio_ring_buffers.cc b/src/lib/audio_ring_buffers.cc index 012ab0718..289045ff5 100644 --- a/src/lib/audio_ring_buffers.cc +++ b/src/lib/audio_ring_buffers.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2016-2018 Carl Hetherington + Copyright (C) 2016-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -21,7 +21,6 @@ #include "audio_ring_buffers.h" #include "dcpomatic_assert.h" #include "exceptions.h" -#include #include using std::min; @@ -29,8 +28,9 @@ using std::cout; using std::make_pair; using std::pair; using std::list; -using boost::shared_ptr; +using std::shared_ptr; using boost::optional; +using namespace dcpomatic; AudioRingBuffers::AudioRingBuffers () : _used_in_head (0) @@ -38,17 +38,19 @@ 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) { + DCPTime const end = (_buffers.back().second + DCPTime::from_frames(_buffers.back().first->frames(), frame_rate)); + if (labs(end.get() - time.get()) > 1) { 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 (labs(end.get() - time.get()) < 2); } _buffers.push_back(make_pair(data, time)); @@ -101,6 +103,16 @@ AudioRingBuffers::get (float* out, int channels, int frames) return time; } +optional +AudioRingBuffers::peek () const +{ + boost::mutex::scoped_lock lm (_mutex); + if (_buffers.empty()) { + return optional(); + } + return _buffers.front().second; +} + void AudioRingBuffers::clear () {