Fix 3D crash.
[dcpomatic.git] / src / wx / film_viewer.cc
index d00c0bfafb0148e995649fcb8e5ac6c503d9f2ee..76e269975fb0eea467589e0a4a9ed775c1983c73 100644 (file)
@@ -224,8 +224,8 @@ FilmViewer::set_film (shared_ptr<Film> film)
        _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;
@@ -296,6 +296,7 @@ FilmViewer::get ()
        do {
                _player_video = _butler->get_video ();
        } 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))
                );
@@ -665,9 +666,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;
        }
 
@@ -720,8 +721,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) {
@@ -767,7 +772,10 @@ FilmViewer::set_position (DCPTime p)
 void
 FilmViewer::set_position (shared_ptr<Content> content, ContentTime t)
 {
-       set_position (_player->content_time_to_dcp (content, t));
+       optional<DCPTime> dt = _player->content_time_to_dcp (content, t);
+       if (dt) {
+               set_position (*dt);
+       }
 }
 
 void
@@ -777,7 +785,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 ();
        }