X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_ring_buffers.cc;h=1a216ab33749399fadf51b24eb3392a3b3ee895d;hb=9a97c1b4116d7fb80e8ab145c0cc738dbf14d617;hp=21c4b6a5c1084123c71d82706653615e96aab709;hpb=70684e31a96bd7d4c7b09d525902959345b76526;p=dcpomatic.git diff --git a/src/lib/audio_ring_buffers.cc b/src/lib/audio_ring_buffers.cc index 21c4b6a5c..1a216ab33 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-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,26 +18,29 @@ */ + #include "audio_ring_buffers.h" #include "dcpomatic_assert.h" #include "exceptions.h" -#include #include + using std::min; 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) { } + /** @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, int frame_rate) @@ -56,6 +59,7 @@ AudioRingBuffers::put (shared_ptr data, DCPTime time, int fr _buffers.push_back(make_pair(data, time)); } + /** @return time of the returned data; if it's not set this indicates an underrun */ optional AudioRingBuffers::get (float* out, int channels, int frames) @@ -75,7 +79,7 @@ AudioRingBuffers::get (float* out, int channels, int frames) return time; } - pair, DCPTime> front = _buffers.front (); + auto front = _buffers.front (); if (!time) { time = front.second + DCPTime::from_frames(_used_in_head, 48000); } @@ -103,6 +107,18 @@ AudioRingBuffers::get (float* out, int channels, int frames) return time; } + +optional +AudioRingBuffers::peek () const +{ + boost::mutex::scoped_lock lm (_mutex); + if (_buffers.empty()) { + return {}; + } + return _buffers.front().second; +} + + void AudioRingBuffers::clear () { @@ -111,13 +127,14 @@ AudioRingBuffers::clear () _used_in_head = 0; } + Frame AudioRingBuffers::size () const { boost::mutex::scoped_lock lm (_mutex); Frame s = 0; - for (list, DCPTime> >::const_iterator i = _buffers.begin(); i != _buffers.end(); ++i) { - s += i->first->frames(); + for (auto const& i: _buffers) { + s += i.first->frames(); } return s - _used_in_head; }