X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder_stream.cc;h=4fedf9291eea8e55515a187ae688dbfb437748e0;hb=a9936a35fbae63311b1132e6283bf28db1d8c233;hp=fdcebbc9f0648a24a22cc8770a56c1bf52e512b6;hpb=a1201ace8a1d5d3e0a9eca769cb9e0a12bf32693;p=dcpomatic.git diff --git a/src/lib/audio_decoder_stream.cc b/src/lib/audio_decoder_stream.cc index fdcebbc9f..4fedf9291 100644 --- a/src/lib/audio_decoder_stream.cc +++ b/src/lib/audio_decoder_stream.cc @@ -25,6 +25,8 @@ #include "util.h" #include "film.h" #include "log.h" +#include "audio_content.h" +#include "compose.hpp" #include #include "i18n.h" @@ -42,8 +44,8 @@ AudioDecoderStream::AudioDecoderStream (shared_ptr content, , _stream (stream) , _decoder (decoder) { - if (content->resampled_audio_frame_rate() != _stream->frame_rate()) { - _resampler.reset (new Resampler (_stream->frame_rate(), content->resampled_audio_frame_rate(), _stream->channels ())); + if (content->resampled_audio_frame_rate() != _stream->frame_rate() && _stream->channels() > 0) { + _resampler.reset (new Resampler (_stream->frame_rate(), content->resampled_audio_frame_rate(), _stream->channels (), decoder->fast ())); } reset_decoded (); @@ -60,7 +62,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) { shared_ptr dec; - _content->film()->log()->log (String::compose ("ADS has request for %1 %2", frame, length), Log::TYPE_DEBUG_DECODE); + _content->film()->log()->log (String::compose ("-> ADS has request for %1 %2", frame, length), LogEntry::TYPE_DEBUG_DECODE); Frame const end = frame + length - 1; @@ -85,7 +87,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) /* Keep stuffing data into _decoded until we have enough data, or the subclass does not want to give us any more */ while ( (_decoded.frame > frame || (_decoded.frame + _decoded.audio->frames()) < end) && - !_decoder->pass () + !_decoder->pass (Decoder::PASS_REASON_AUDIO, accurate) ) {} @@ -93,7 +95,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) } else { while ( _decoded.audio->frames() < length && - !_decoder->pass () + !_decoder->pass (Decoder::PASS_REASON_AUDIO, accurate) ) {} @@ -134,7 +136,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) void AudioDecoderStream::audio (shared_ptr data, ContentTime time) { - _content->film()->log()->log (String::compose ("ADS receives %1 %2", time, data->frames ()), Log::TYPE_DEBUG_DECODE); + _content->film()->log()->log (String::compose ("ADS receives %1 %2", time, data->frames ()), LogEntry::TYPE_DEBUG_DECODE); if (_resampler) { data = _resampler->run (data); @@ -145,7 +147,7 @@ AudioDecoderStream::audio (shared_ptr data, ContentTime time if (_seek_reference) { /* We've had an accurate seek and now we're seeing some data */ ContentTime const delta = time - _seek_reference.get (); - Frame const delta_frames = delta.frames (frame_rate); + Frame const delta_frames = delta.frames_round (frame_rate); if (delta_frames > 0) { /* This data comes after the seek time. Pad the data with some silence. */ shared_ptr padded (new AudioBuffers (data->channels(), data->frames() + delta_frames)); @@ -172,7 +174,7 @@ AudioDecoderStream::audio (shared_ptr data, ContentTime time } if (!_position) { - _position = time.frames (frame_rate); + _position = time.frames_round (frame_rate); } DCPOMATIC_ASSERT (_position.get() >= (_decoded.frame + _decoded.audio->frames()));