diff options
| author | Carl Hetherington <cth@carlh.net> | 2017-05-21 19:48:14 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2017-05-21 19:48:14 +0100 |
| commit | fa4d2529d63bcfa7cf7c516b7227e20a1b6dec7e (patch) | |
| tree | 1ac1107370c7384fbce6cc67ee3e3aa6475f807e /src/lib/player.cc | |
| parent | 5bcbd6821a6ff1419f9069cf9e1a94c8557a992c (diff) | |
Do resampling in AudioDecoder rather than Player.
This fixes the problem where the decoder's position would not take
into account that all samples pushed into the resampler do not
always immediately come out. This would result in Player thinking
that there would be gaps when there are not.
Diffstat (limited to 'src/lib/player.cc')
| -rw-r--r-- | src/lib/player.cc | 77 |
1 files changed, 1 insertions, 76 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc index d51c94400..7f8b06458 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -47,7 +47,6 @@ #include "content_subtitle.h" #include "dcp_decoder.h" #include "image_decoder.h" -#include "resampler.h" #include "compose.hpp" #include <dcp/reel.h> #include <dcp/reel_sound_asset.h> @@ -580,12 +579,6 @@ Player::pass () if (earliest) { earliest->done = earliest->decoder->pass (); - if (earliest->done && earliest->content->audio) { - /* Flush the Player audio system for this piece */ - BOOST_FOREACH (AudioStreamPtr i, earliest->content->audio->streams()) { - audio_flush (earliest, i); - } - } } /* Emit any audio that is ready */ @@ -709,32 +702,6 @@ Player::video (weak_ptr<Piece> wp, ContentVideo video) emit_video (_last_video[wp], time); } -void -Player::audio_flush (shared_ptr<Piece> piece, AudioStreamPtr stream) -{ - shared_ptr<AudioContent> content = piece->content->audio; - DCPOMATIC_ASSERT (content); - - shared_ptr<Resampler> r = resampler (content, stream, false); - if (!r) { - return; - } - - pair<shared_ptr<const AudioBuffers>, Frame> ro = r->flush (); - if (ro.first->frames() == 0) { - return; - } - - ContentAudio content_audio; - content_audio.audio = ro.first; - content_audio.frame = ro.second; - - /* Compute time in the DCP */ - DCPTime time = resampled_audio_to_dcp (piece, content_audio.frame) + DCPTime::from_seconds (content->delay() / 1000.0); - - audio_transform (content, stream, content_audio, time); -} - /** Do our common processing on some audio */ void Player::audio_transform (shared_ptr<AudioContent> content, AudioStreamPtr stream, ContentAudio content_audio, DCPTime time) @@ -802,17 +769,6 @@ Player::audio (weak_ptr<Piece> wp, AudioStreamPtr stream, ContentAudio content_a shared_ptr<AudioContent> content = piece->content->audio; DCPOMATIC_ASSERT (content); - /* Resample */ - if (stream->frame_rate() != content->resampled_frame_rate()) { - shared_ptr<Resampler> r = resampler (content, stream, true); - pair<shared_ptr<const AudioBuffers>, Frame> ro = r->run (content_audio.audio, content_audio.frame); - if (ro.first->frames() == 0) { - return; - } - content_audio.audio = ro.first; - content_audio.frame = ro.second; - } - /* Compute time in the DCP */ DCPTime time = resampled_audio_to_dcp (piece, content_audio.frame) + DCPTime::from_seconds (content->delay() / 1000.0); /* And the end of this block in the DCP */ @@ -937,11 +893,6 @@ Player::seek (DCPTime time, bool accurate) _audio_processor->flush (); } - for (ResamplerMap::iterator i = _resamplers.begin(); i != _resamplers.end(); ++i) { - i->second->flush (); - i->second->reset (); - } - _audio_merger.clear (); _active_subtitles.clear (); @@ -969,33 +920,6 @@ Player::seek (DCPTime time, bool accurate) } } -shared_ptr<Resampler> -Player::resampler (shared_ptr<const AudioContent> content, AudioStreamPtr stream, bool create) -{ - ResamplerMap::const_iterator i = _resamplers.find (make_pair (content, stream)); - if (i != _resamplers.end ()) { - return i->second; - } - - if (!create) { - return shared_ptr<Resampler> (); - } - - LOG_GENERAL ( - "Creating new resampler from %1 to %2 with %3 channels", - stream->frame_rate(), - content->resampled_frame_rate(), - stream->channels() - ); - - shared_ptr<Resampler> r ( - new Resampler (stream->frame_rate(), content->resampled_frame_rate(), stream->channels()) - ); - - _resamplers[make_pair(content, stream)] = r; - return r; -} - void Player::emit_video (shared_ptr<PlayerVideo> pv, DCPTime time) { @@ -1026,6 +950,7 @@ Player::fill_audio (DCPTimePeriod period) return; } + cout << "fillin " << to_string(period.from) << " to " << to_string(period.to) << "\n"; BOOST_FOREACH (DCPTimePeriod i, subtract(period, _no_audio)) { DCPTime t = i.from; while (t < i.to) { |
