diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-08-05 01:15:45 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-08-05 01:15:45 +0100 |
| commit | 3a7b6acdb993864f319a6ceb3bc4c3fb7d4aaefd (patch) | |
| tree | 6f516185b6155b13cddfcd6be8fdf9e5bc52f86a /src/wx | |
| parent | 7c45c2c7b0904446bbc8cd175fe1deab54c61c15 (diff) | |
Get closed caption view data from the butler, rather than the player.
You can't introduce the butler (so that the player is ahead of time)
and then ask the player what should be in the frame that is being
displayed "now"; the player will already have moved on.
Diffstat (limited to 'src/wx')
| -rw-r--r-- | src/wx/closed_captions_dialog.cc | 65 | ||||
| -rw-r--r-- | src/wx/closed_captions_dialog.h | 8 | ||||
| -rw-r--r-- | src/wx/film_viewer.cc | 5 |
3 files changed, 52 insertions, 26 deletions
diff --git a/src/wx/closed_captions_dialog.cc b/src/wx/closed_captions_dialog.cc index a504cade9..c07961cc8 100644 --- a/src/wx/closed_captions_dialog.cc +++ b/src/wx/closed_captions_dialog.cc @@ -20,14 +20,17 @@ #include "closed_captions_dialog.h" #include "lib/string_text.h" +#include "lib/butler.h" #include <boost/bind.hpp> using std::list; using std::max; using std::cout; +using std::pair; using std::make_pair; using boost::shared_ptr; using boost::weak_ptr; +using boost::optional; ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent) : wxDialog (parent, wxID_ANY, _("Closed captions"), wxDefaultPosition, wxDefaultSize, @@ -40,7 +43,7 @@ ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent) wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFULL_REPAINT_ON_RESIZE | wxFRAME_FLOAT_ON_PARENT #endif ) - + , _current_in_lines (false) { _lines.resize (CLOSED_CAPTION_LINES); Bind (wxEVT_PAINT, boost::bind (&ClosedCaptionsDialog::paint, this)); @@ -100,40 +103,62 @@ private: void ClosedCaptionsDialog::update (DCPTime time) { - shared_ptr<Player> player = _player.lock (); - DCPOMATIC_ASSERT (player); - list<StringText> to_show; - BOOST_FOREACH (PlayerText i, player->closed_captions_for_frame(time)) { - BOOST_FOREACH (StringText j, i.string) { - to_show.push_back (j); + if (_current_in_lines && _current->second.to > time) { + /* Current one is fine */ + return; + } + + if (_current && _current->second.to < time) { + /* Current one has finished; clear out */ + for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) { + _lines[j] = ""; } + Refresh (); + _current = optional<pair<PlayerText, DCPTimePeriod> >(); } - for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) { - _lines[j] = ""; + if (!_current) { + /* We have no current one: get another */ + shared_ptr<Butler> butler = _butler.lock (); + DCPOMATIC_ASSERT (butler); + _current = butler->get_closed_caption (); + _current_in_lines = false; } - to_show.sort (ClosedCaptionSorter()); + if (_current && _current->second.contains(time)) { + /* We need to set this new one up */ - list<StringText>::const_iterator j = to_show.begin(); - int k = 0; - while (j != to_show.end() && k < CLOSED_CAPTION_LINES) { - _lines[k] = j->text(); - ++j; - ++k; - } + list<StringText> to_show = _current->first.string; - Refresh (); + for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) { + _lines[j] = ""; + } + + to_show.sort (ClosedCaptionSorter()); + + list<StringText>::const_iterator j = to_show.begin(); + int k = 0; + while (j != to_show.end() && k < CLOSED_CAPTION_LINES) { + _lines[k] = j->text(); + ++j; + ++k; + } + + Refresh (); + _current_in_lines = true; + } } void ClosedCaptionsDialog::clear () { + _current = optional<pair<PlayerText, DCPTimePeriod> >(); + _current_in_lines = false; Refresh (); } void -ClosedCaptionsDialog::set_player (weak_ptr<Player> player) +ClosedCaptionsDialog::set_butler (weak_ptr<Butler> butler) { - _player = player; + _butler = butler; } diff --git a/src/wx/closed_captions_dialog.h b/src/wx/closed_captions_dialog.h index e3f13f62f..3da7f6522 100644 --- a/src/wx/closed_captions_dialog.h +++ b/src/wx/closed_captions_dialog.h @@ -22,7 +22,7 @@ #include "lib/player.h" #include <wx/wx.h> -class Player; +class Butler; class ClosedCaptionsDialog : public wxDialog { @@ -31,11 +31,13 @@ public: void update (DCPTime); void clear (); - void set_player (boost::weak_ptr<Player>); + void set_butler (boost::weak_ptr<Butler>); private: void paint (); + boost::optional<std::pair<PlayerText, DCPTimePeriod> > _current; + bool _current_in_lines; std::vector<wxString> _lines; - boost::weak_ptr<Player> _player; + boost::weak_ptr<Butler> _butler; }; diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index ce34b06b7..d00c0bfaf 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -203,7 +203,6 @@ FilmViewer::set_film (shared_ptr<Film> film) if (!_film) { _player.reset (); - _closed_captions_dialog->set_player (_player); recreate_butler (); _frame.reset (); refresh_panel (); @@ -222,8 +221,6 @@ FilmViewer::set_film (shared_ptr<Film> film) return; } - _closed_captions_dialog->set_player (_player); - _player->set_always_burn_open_subtitles (); _player->set_play_referenced (); @@ -277,6 +274,8 @@ FilmViewer::recreate_butler () _butler->disable_audio (); } + _closed_captions_dialog->set_butler (_butler); + if (was_running) { start (); } |
