, _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)
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;
}
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;
}
typedef std::pair<boost::shared_ptr<dcp::CPL>, boost::filesystem::path> CPL;
bool _slider_being_moved;
- bool _was_running_before_slider;
wxCheckBox* _outline_content;
wxChoice* _eye;
, _audio_channels (0)
, _audio_block_size (1024)
, _playing (false)
+ , _suspended (0)
, _latency_history_count (0)
, _dropped (0)
, _closed_captions_dialog (new ClosedCaptionsDialog(p, this))
void
FilmViewer::recreate_butler ()
{
- bool const was_running = stop ();
+ suspend ();
_butler.reset ();
if (!_film) {
+ resume ();
return;
}
_closed_captions_dialog->set_film_and_butler (_film, _butler);
- if (was_running) {
- start ();
- }
+ resume ();
}
void
return;
}
- if (_playing && (time() - _player_video.second) > one_video_frame()) {
+ if (_playing && !_suspended && (time() - _player_video.second) > one_video_frame()) {
/* Too late; just drop this frame before we try to get its image (which will be the time-consuming
part if this frame is J2K).
*/
void
FilmViewer::timer ()
{
- if (!_film || !_playing) {
+ if (!_film || !_playing || _suspended) {
return;
}
_player->set_video_container_size (_out_size);
}
+void
+FilmViewer::suspend ()
+{
+ ++_suspended;
+ if (_audio.isStreamRunning()) {
+ _audio.abortStream();
+ }
+}
+
+void
+FilmViewer::resume ()
+{
+ --_suspended;
+ if (_playing && !_suspended) {
+ if (_audio.isStreamOpen()) {
+ _audio.setStreamTime (_video_position.seconds());
+ _audio.startStream ();
+ }
+ timer ();
+ }
+}
+
void
FilmViewer::start ()
{
t = _film->length ();
}
- bool const was_running = stop ();
+ suspend ();
_closed_captions_dialog->clear ();
_butler->seek (t, accurate);
- if (!was_running) {
+ if (!_playing) {
request_idle_get ();
} else {
- start ();
+ /* Make sure we get a frame so that _video_position is set up before we resume */
+ while (!get(true)) {}
}
+
+ resume ();
}
void