, _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);
- request_idle_get ();
- if (was_running) {
- start ();
+ if (!_playing) {
+ request_idle_get ();
+ } else {
+ /* Make sure we get a frame so that _video_position is set up before we resume */
+ while (!get(true)) {}
}
+
+ resume ();
}
void
DCPTime
FilmViewer::one_video_frame () const
{
- return DCPTime::from_frames (1, _film->video_frame_rate());
+ return DCPTime::from_frames (1, _film ? _film->video_frame_rate() : 24);
}
/** Open a dialog box showing our film's closed captions */