X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder.cc;h=20c8ea1ea812c60b7b33fd62a8d1300fe8c3958d;hb=0a93237cb5e4642d3b698ff9b7d0cfae5401478c;hp=18f4b890d6b8878cc58eabc6a2aba5930eec6838;hpb=4388fff5376a6e5a6dc8d33e244a1245a728335c;p=dcpomatic.git diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index 18f4b890d..20c8ea1ea 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,39 +19,48 @@ #include "audio_decoder.h" #include "audio_buffers.h" -#include "exceptions.h" -#include "log.h" -#include "resampler.h" +#include "audio_decoder_stream.h" +#include +#include #include "i18n.h" -using std::list; -using std::pair; using std::cout; -using boost::optional; +using std::map; using boost::shared_ptr; -AudioDecoder::AudioDecoder (shared_ptr film, shared_ptr content) - : Decoder (film) - , _audio_content (content) - , _audio_position (0) +AudioDecoder::AudioDecoder (shared_ptr content) + : _audio_content (content) { + BOOST_FOREACH (AudioStreamPtr i, content->audio_streams ()) { + _streams[i] = shared_ptr (new AudioDecoderStream (_audio_content, i, this)); + } +} +ContentAudio +AudioDecoder::get_audio (AudioStreamPtr stream, Frame frame, Frame length, bool accurate) +{ + return _streams[stream]->get (frame, length, accurate); } void -AudioDecoder::audio (shared_ptr data, AudioContent::Frame frame) +AudioDecoder::audio (AudioStreamPtr stream, shared_ptr data, ContentTime time) { - Audio (data, frame); - _audio_position = frame + data->frames (); + _streams[stream]->audio (data, time); } -/** This is a bit odd, but necessary when we have (e.g.) FFmpegDecoders with no audio. - * The player needs to know that there is no audio otherwise it will keep trying to - * pass() the decoder to get it to emit audio. - */ -bool -AudioDecoder::has_audio () const +void +AudioDecoder::flush () +{ + for (map >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { + i->second->flush (); + } +} + +void +AudioDecoder::seek (ContentTime t, bool accurate) { - return _audio_content->audio_channels () > 0; + for (map >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { + i->second->seek (t, accurate); + } }