X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder.cc;h=6a795f3ac1906c3bf0979c9623424ae36a588e41;hb=8b0cdac1ce437a46815b04ff3261febd1269a71c;hp=bc37960583eb52b15edd89435aff901e4c85c1a9;hpb=fb607fb660317fcce15320c2ec7db78d85a43f41;p=dcpomatic.git diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index bc3796058..6a795f3ac 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -22,6 +22,8 @@ #include "audio_buffers.h" #include "audio_decoder_stream.h" #include "audio_content.h" +#include "log.h" +#include "compose.hpp" #include #include @@ -30,25 +32,20 @@ using std::cout; using std::map; using boost::shared_ptr; +using boost::optional; AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr content, shared_ptr log) - : _ignore (false) + : DecoderPart (parent, log) { BOOST_FOREACH (AudioStreamPtr i, content->streams ()) { - _streams[i] = shared_ptr (new AudioDecoderStream (content, i, parent, log)); + _streams[i] = shared_ptr (new AudioDecoderStream (content, i, parent, this, log)); } } -ContentAudio -AudioDecoder::get (AudioStreamPtr stream, Frame frame, Frame length, bool accurate) -{ - return _streams[stream]->get (frame, length, accurate); -} - void -AudioDecoder::give (AudioStreamPtr stream, shared_ptr data, ContentTime time) +AudioDecoder::emit (AudioStreamPtr stream, shared_ptr data, ContentTime time) { - if (_ignore) { + if (ignore ()) { return; } @@ -81,30 +78,34 @@ AudioDecoder::give (AudioStreamPtr stream, shared_ptr data, void AudioDecoder::flush () { - for (map >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { + for (StreamMap::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { i->second->flush (); } } void -AudioDecoder::seek (ContentTime t, bool accurate) +AudioDecoder::set_fast () { - for (map >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { - i->second->seek (t, accurate); + for (StreamMap::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { + i->second->set_fast (); } } -/** Set this decoder never to produce any data */ -void -AudioDecoder::set_ignore () +optional +AudioDecoder::position () const { - _ignore = true; + optional p; + for (map::const_iterator i = _positions.begin(); i != _positions.end(); ++i) { + if (!p || i->second < *p) { + p = i->second; + } + } + + return p; } void -AudioDecoder::set_fast () +AudioDecoder::set_position (AudioStreamPtr stream, ContentTime time) { - for (map >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { - i->second->set_fast (); - } + _positions[stream] = time; }