using std::map;
using boost::shared_ptr;
-AudioDecoder::AudioDecoder (shared_ptr<const AudioContent> content)
+AudioDecoder::AudioDecoder (shared_ptr<const AudioContent> content, bool fast)
: _audio_content (content)
+ , _ignore_audio (false)
+ , _fast (fast)
{
BOOST_FOREACH (AudioStreamPtr i, content->audio_streams ()) {
_streams[i] = shared_ptr<AudioDecoderStream> (new AudioDecoderStream (_audio_content, i, this));
void
AudioDecoder::audio (AudioStreamPtr stream, shared_ptr<const AudioBuffers> data, ContentTime time)
{
+ if (_ignore_audio) {
+ return;
+ }
+
+ if (_streams.find (stream) == _streams.end ()) {
+
+ /* This method can be called with an unknown stream during the following sequence:
+ - Add KDM to some DCP content.
+ - Content gets re-examined.
+ - SingleStreamAudioContent::take_from_audio_examiner creates a new stream.
+ - Some content property change signal is delivered so Player::Changed is emitted.
+ - Film viewer to re-gets the frame.
+ - Player calls DCPDecoder pass which calls this method on the new stream.
+
+ At this point the AudioDecoder does not know about the new stream.
+
+ Then
+ - Some other property change signal is delivered which marks the player's pieces invalid.
+ - Film viewer re-gets again.
+ - Everything is OK.
+
+ In this situation it is fine for us to silently drop the audio.
+ */
+
+ return;
+ }
+
_streams[stream]->audio (data, time);
}
i->second->seek (t, accurate);
}
}
+
+/** Set this player never to produce any audio data */
+void
+AudioDecoder::set_ignore_audio ()
+{
+ _ignore_audio = true;
+}