}
_film = film;
- _video_view->clear ();
- _video_view->set_image (shared_ptr<Image>());
+ _video_view->clear ();
_closed_captions_dialog->clear ();
if (!_film) {
_player->set_play_referenced ();
_film->Change.connect (boost::bind (&FilmViewer::film_change, this, _1, _2));
+ _film->LengthChange.connect (boost::bind(&FilmViewer::film_length_change, this));
_player->Change.connect (boost::bind (&FilmViewer::player_change, this, _1, _2, _3));
/* Keep about 1 second's worth of history samples */
_audio.startStream ();
}
- _playing = true;
_dropped = 0;
+ _playing = true;
_video_view->start ();
Started (position());
}
}
_playing = false;
+ _video_view->stop ();
Stopped (position());
return true;
}
void
FilmViewer::film_change (ChangeType type, Film::Property p)
{
- if (type == CHANGE_TYPE_DONE && p == Film::AUDIO_CHANNELS) {
+ if (type != CHANGE_TYPE_DONE) {
+ return;
+ }
+
+ if (p == Film::AUDIO_CHANNELS) {
recreate_butler ();
+ } else if (p == Film::VIDEO_FRAME_RATE) {
+ _video_view->set_video_frame_rate (_film->video_frame_rate());
}
}
+void
+FilmViewer::film_length_change ()
+{
+ _video_view->set_length (_film->length());
+}
+
/** Re-get the current frame slowly by seeking */
void
FilmViewer::slow_refresh ()
return _video_view->position();
}
+optional<DCPTime>
+FilmViewer::audio_time () const
+{
+ if (!_audio.isStreamRunning()) {
+ return optional<DCPTime>();
+ }
+
+ return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime ()) -
+ DCPTime::from_frames (average_latency(), _film->audio_frame_rate());
+}
+
DCPTime
FilmViewer::time () const
{
_pad_black = p;
}
-/* XXX_b: comment */
-int
-FilmViewer::time_until_next_frame () const
+/* May be called from a non-UI thread */
+void
+FilmViewer::emit_finished ()
{
- DCPTime const next = position() + one_video_frame();
- std::cout << to_string(next) << " " << to_string(time()) << " " << ((next.seconds() - time().seconds()) * 1000) << "\n";
- if (next < time()) {
- return 0;
- }
- return (next.seconds() - time().seconds()) * 1000;
+ emit (boost::bind(boost::ref(Finished)));
}
+