X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=0e0fc4315ad7a58ff339d32c8cf4df4590718952;hb=1fe6bd7f8ba059322b8357b2210f0fd590567ce2;hp=8c1a79113c732d33d2ca054307569eba039b1b90;hpb=ae4f0d9f55489ddc50b3e5f0d713621ee8f50645;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 8c1a79113..0e0fc4315 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -203,7 +203,6 @@ FilmViewer::set_film (shared_ptr film) if (!_film) { _player.reset (); - _closed_captions_dialog->set_player (_player); recreate_butler (); _frame.reset (); refresh_panel (); @@ -222,8 +221,6 @@ FilmViewer::set_film (shared_ptr film) return; } - _closed_captions_dialog->set_player (_player); - _player->set_always_burn_open_subtitles (); _player->set_play_referenced (); @@ -277,6 +274,8 @@ FilmViewer::recreate_butler () _butler->disable_audio (); } + _closed_captions_dialog->set_butler (_butler); + if (was_running) { start (); } @@ -529,8 +528,6 @@ FilmViewer::start () _audio.startStream (); } - cout << "start playback at " << to_string(_video_position) << "\n"; - _playing = true; _dropped = 0; timer (); @@ -770,7 +767,10 @@ FilmViewer::set_position (DCPTime p) void FilmViewer::set_position (shared_ptr content, ContentTime t) { - set_position (_player->content_time_to_dcp (content, t)); + optional dt = _player->content_time_to_dcp (content, t); + if (dt) { + set_position (*dt); + } } void @@ -883,6 +883,16 @@ FilmViewer::config_changed (Config::Property p) } } +DCPTime +FilmViewer::uncorrected_time () const +{ + if (_audio.isStreamRunning ()) { + return DCPTime::from_seconds (const_cast(&_audio)->getStreamTime()); + } + + return _video_position; +} + DCPTime FilmViewer::time () const { @@ -897,7 +907,14 @@ FilmViewer::time () const int FilmViewer::audio_callback (void* out_p, unsigned int frames) { - _butler->get_audio (reinterpret_cast (out_p), frames); + while (true) { + optional t = _butler->get_audio (reinterpret_cast (out_p), frames); + if (!t || DCPTime(uncorrected_time() - *t) < one_video_frame()) { + /* There was an underrun or this audio is on time; carry on */ + break; + } + /* The audio we just got was (very) late; drop it and get some more. */ + } boost::mutex::scoped_lock lm (_latency_history_mutex, boost::try_to_lock); if (lm) {