X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=d954e1818a59a7b89cb5b20b1c133267661595c3;hb=2a0ad7979b208f84916b13f7a37998aa3701e371;hp=8c1a79113c732d33d2ca054307569eba039b1b90;hpb=ae4f0d9f55489ddc50b3e5f0d713621ee8f50645;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 8c1a79113..d954e1818 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,13 +221,11 @@ FilmViewer::set_film (shared_ptr film) return; } - _closed_captions_dialog->set_player (_player); - _player->set_always_burn_open_subtitles (); _player->set_play_referenced (); - _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1)); - _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1, _2)); + _film->Change.connect (boost::bind (&FilmViewer::film_change, this, _1, _2)); + _player->Change.connect (boost::bind (&FilmViewer::player_change, this, _1, _2, _3)); /* Keep about 1 second's worth of history samples */ _latency_history_count = _film->audio_frame_rate() / _audio_block_size; @@ -277,6 +274,8 @@ FilmViewer::recreate_butler () _butler->disable_audio (); } + _closed_captions_dialog->set_butler (_butler); + if (was_running) { start (); } @@ -295,8 +294,14 @@ FilmViewer::get () DCPOMATIC_ASSERT (_butler); do { - _player_video = _butler->get_video (); + Butler::Error e; + _player_video = _butler->get_video (&e); + if (!_player_video.first && e == Butler::AGAIN) { + signal_manager->when_idle (boost::bind(&FilmViewer::get, this)); + return; + } } while ( + _player_video.first && _film->three_d() && ((_eye->GetSelection() == 0 && _player_video.first->eyes() == EYES_RIGHT) || (_eye->GetSelection() == 1 && _player_video.first->eyes() == EYES_LEFT)) ); @@ -529,8 +534,6 @@ FilmViewer::start () _audio.startStream (); } - cout << "start playback at " << to_string(_video_position) << "\n"; - _playing = true; _dropped = 0; timer (); @@ -668,9 +671,9 @@ FilmViewer::forward_clicked (wxKeyboardState& ev) } void -FilmViewer::player_changed (int property, bool frequent) +FilmViewer::player_change (ChangeType type, int property, bool frequent) { - if (frequent) { + if (type != CHANGE_TYPE_DONE || frequent) { return; } @@ -723,8 +726,12 @@ FilmViewer::setup_sensitivity () } void -FilmViewer::film_changed (Film::Property p) +FilmViewer::film_change (ChangeType type, Film::Property p) { + if (type != CHANGE_TYPE_DONE) { + return; + } + if (p == Film::CONTENT || p == Film::THREE_D) { setup_sensitivity (); } else if (p == Film::AUDIO_CHANNELS) { @@ -770,7 +777,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 @@ -780,7 +790,7 @@ FilmViewer::set_coalesce_player_changes (bool c) if (!c) { BOOST_FOREACH (int i, _pending_player_changes) { - player_changed (i, false); + player_change (CHANGE_TYPE_DONE, i, false); } _pending_player_changes.clear (); } @@ -883,6 +893,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 +917,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) {