diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/audio_merger.cc | 6 | ||||
| -rw-r--r-- | src/lib/audio_merger.h | 1 | ||||
| -rw-r--r-- | src/lib/player.cc | 21 |
3 files changed, 13 insertions, 15 deletions
diff --git a/src/lib/audio_merger.cc b/src/lib/audio_merger.cc index 8a69dee52..a16c378c6 100644 --- a/src/lib/audio_merger.cc +++ b/src/lib/audio_merger.cc @@ -56,11 +56,9 @@ AudioMerger::pull (DCPTime time) { list<pair<shared_ptr<AudioBuffers>, DCPTime> > out; - DCPTimePeriod period (_last_pull, time); - _buffers.sort (AudioMerger::BufferComparator()); - list<Buffer> new_buffers; + _buffers.sort (AudioMerger::BufferComparator()); BOOST_FOREACH (Buffer i, _buffers) { if (i.period().to <= time) { /* Completely within the pull period */ @@ -98,7 +96,6 @@ AudioMerger::pull (DCPTime time) void AudioMerger::push (boost::shared_ptr<const AudioBuffers> audio, DCPTime time) { - DCPOMATIC_ASSERT (time >= _last_pull); DCPOMATIC_ASSERT (audio->frames() > 0); DCPTimePeriod period (time, time + DCPTime::from_frames (audio->frames(), _frame_rate)); @@ -164,5 +161,4 @@ void AudioMerger::clear () { _buffers.clear (); - _last_pull = DCPTime (); } diff --git a/src/lib/audio_merger.h b/src/lib/audio_merger.h index c3e627fcd..6c9d87097 100644 --- a/src/lib/audio_merger.h +++ b/src/lib/audio_merger.h @@ -79,6 +79,5 @@ private: }; std::list<Buffer> _buffers; - DCPTime _last_pull; int _frame_rate; }; diff --git a/src/lib/player.cc b/src/lib/player.cc index a711c80c0..8ebeb236d 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -584,20 +584,16 @@ Player::pass () filled = true; } - if (!earliest && !filled) { - return true; - } - /* Emit any audio that is ready */ - DCPTime pull_from = _playlist->length (); + DCPTime pull_to = _playlist->length (); for (map<AudioStreamPtr, StreamState>::const_iterator i = _stream_states.begin(); i != _stream_states.end(); ++i) { - if (!i->second.piece->done && i->second.last_push_end < pull_from) { - pull_from = i->second.last_push_end; + if (!i->second.piece->done && i->second.last_push_end < pull_to) { + pull_to = i->second.last_push_end; } } - list<pair<shared_ptr<AudioBuffers>, DCPTime> > audio = _audio_merger.pull (pull_from); + list<pair<shared_ptr<AudioBuffers>, DCPTime> > audio = _audio_merger.pull (pull_to); for (list<pair<shared_ptr<AudioBuffers>, DCPTime> >::iterator i = audio.begin(); i != audio.end(); ++i) { if (_last_audio_time && i->second < *_last_audio_time) { /* There has been an accurate seek and we have received some audio before the seek time; @@ -617,7 +613,7 @@ Player::pass () emit_audio (i->first, i->second); } - return false; + return !earliest && !filled; } optional<PositionImage> @@ -808,6 +804,13 @@ Player::audio (weak_ptr<Piece> wp, AudioStreamPtr stream, ContentAudio content_a /* And the end of this block in the DCP */ DCPTime end = time + DCPTime::from_frames(content_audio.audio->frames(), content->resampled_frame_rate()); + /* Pad any gap which may be caused by audio delay */ + if (_last_audio_time) { + fill_audio (DCPTimePeriod (*_last_audio_time, time)); + } else if (_last_seek_time && _last_seek_accurate) { + fill_audio (DCPTimePeriod (*_last_seek_time, time)); + } + /* Remove anything that comes before the start or after the end of the content */ if (time < piece->content->position()) { pair<shared_ptr<AudioBuffers>, DCPTime> cut = discard_audio (content_audio.audio, time, piece->content->position()); |
