#include "audio_buffers.h"
#include "audio_decoder_stream.h"
#include "audio_content.h"
+#include "log.h"
+#include "compose.hpp"
#include <boost/foreach.hpp>
#include <iostream>
using std::cout;
using std::map;
using boost::shared_ptr;
+using boost::optional;
AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr<const AudioContent> content, shared_ptr<Log> log)
- : _ignore (false)
- , _fast (false)
+ : DecoderPart (parent, log)
{
BOOST_FOREACH (AudioStreamPtr i, content->streams ()) {
- _streams[i] = shared_ptr<AudioDecoderStream> (new AudioDecoderStream (content, i, parent, log));
+ _streams[i] = shared_ptr<AudioDecoderStream> (new AudioDecoderStream (content, i, parent, this, log));
}
}
void
AudioDecoder::give (AudioStreamPtr stream, shared_ptr<const AudioBuffers> data, ContentTime time)
{
- if (_ignore) {
+ if (ignore ()) {
return;
}
void
AudioDecoder::flush ()
{
- for (map<AudioStreamPtr, shared_ptr<AudioDecoderStream> >::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)
{
- for (map<AudioStreamPtr, shared_ptr<AudioDecoderStream> >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) {
+ _log->log (String::compose ("AD seek to %1", to_string(t)), LogEntry::TYPE_DEBUG_DECODE);
+ for (StreamMap::const_iterator i = _streams.begin(); i != _streams.end(); ++i) {
i->second->seek (t, accurate);
}
}
-/** Set this decoder never to produce any data */
void
-AudioDecoder::set_ignore ()
+AudioDecoder::set_fast ()
{
- _ignore = true;
+ for (StreamMap::const_iterator i = _streams.begin(); i != _streams.end(); ++i) {
+ i->second->set_fast ();
+ }
}
-void
-AudioDecoder::set_fast ()
+optional<ContentTime>
+AudioDecoder::position () const
{
- for (map<AudioStreamPtr, shared_ptr<AudioDecoderStream> >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) {
- i->second->set_fast ();
+ optional<ContentTime> pos;
+ for (StreamMap::const_iterator i = _streams.begin(); i != _streams.end(); ++i) {
+ if (!pos || (i->second->position() && i->second->position().get() < pos.get())) {
+ pos = i->second->position();
+ }
}
+ return pos;
}