Fix problems with playing back 3D DCPs and with inserting 3D DCPs
[dcpomatic.git] / src / wx / controls.cc
index 3e06664607d8617a158af7fbe74780b3ebb84774..a3360b262c29beb0856c492052793f65be5df307 100644 (file)
@@ -52,13 +52,13 @@ using boost::optional;
 using boost::shared_ptr;
 using boost::weak_ptr;
 using boost::dynamic_pointer_cast;
+using namespace dcpomatic;
 
 Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor_controls)
        : wxPanel (parent)
        , _slider (new wxSlider (this, wxID_ANY, 0, 0, 4096))
        , _viewer (viewer)
        , _slider_being_moved (false)
-       , _was_running_before_slider (false)
        , _outline_content (0)
        , _eye (0)
        , _jump_to_selected (0)
@@ -202,17 +202,21 @@ Controls::slider_moved (bool page)
 
        if (!page && !_slider_being_moved) {
                /* This is the first event of a drag; stop playback for the duration of the drag */
-               _was_running_before_slider = _viewer->stop ();
+               _viewer->suspend ();
                _slider_being_moved = true;
        }
 
        DCPTime t (_slider->GetValue() * _film->length().get() / 4096);
        t = t.round (_film->video_frame_rate());
-       /* Ensure that we hit the end of the film at the end of the slider */
+       /* Ensure that we hit the end of the film at the end of the slider.  In particular, we
+          need to do an accurate seek in case there isn't a keyframe near the end.
+       */
+       bool accurate = false;
        if (t >= _film->length ()) {
                t = _film->length() - _viewer->one_video_frame();
+               accurate = true;
        }
-       _viewer->seek (t, false);
+       _viewer->seek (t, accurate);
        update_position_label ();
 
        log (
@@ -225,10 +229,8 @@ Controls::slider_moved (bool page)
 void
 Controls::slider_released ()
 {
-       if (_was_running_before_slider) {
-               /* Restart after a drag */
-               _viewer->start ();
-       }
+       /* Restart after a drag */
+       _viewer->resume ();
        _slider_being_moved = false;
 }