X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_player.cc;h=7a7e5ac16a8d55e6bd5ba79f179642f313d24987;hb=18fbb7b578eb0626c269bbb90de205c2d8fc3326;hp=a95476fc10bf06376821f900c028d89976ddcc62;hpb=7151de6910e6072754bd38d50efa5a36622bb5c6;p=dcpomatic.git diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index a95476fc1..7a7e5ac16 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -18,7 +18,6 @@ */ - #include "wx/wx_signal_manager.h" #include "wx/wx_util.h" #include "wx/about_dialog.h" @@ -29,6 +28,7 @@ #include "wx/player_config_dialog.h" #include "wx/verify_dcp_dialog.h" #include "wx/controls.h" +#include "wx/cinema_player_dialog.h" #include "lib/cross.h" #include "lib/config.h" #include "lib/util.h" @@ -52,6 +52,7 @@ #include #include #include +#include #ifdef __WXOSX__ #include #endif @@ -85,7 +86,9 @@ enum { ID_file_close = 100, ID_view_cpl, /* Allow spare IDs for CPLs */ - ID_view_closed_captions = 200, + ID_view_full_screen = 200, + ID_view_dual_screen, + ID_view_closed_captions, ID_view_scale_appropriate, ID_view_scale_full, ID_view_scale_half, @@ -106,7 +109,9 @@ public: : wxFrame (0, -1, _("DCP-o-matic Player")) , _update_news_requested (false) , _info (0) + , _mode (Config::instance()->player_mode()) , _config_dialog (0) + , _cinema_dialog (0) , _file_menu (0) , _history_items (0) , _history_position (0) @@ -137,6 +142,8 @@ public: Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_close, this), ID_file_close); Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_exit, this), wxID_EXIT); Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::view_full_screen, this), ID_view_full_screen); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::view_dual_screen, this), ID_view_dual_screen); Bind (wxEVT_MENU, boost::bind (&DOMFrame::view_closed_captions, this), ID_view_closed_captions); Bind (wxEVT_MENU, boost::bind (&DOMFrame::view_cpl, this, _1), ID_view_cpl, ID_view_cpl + MAX_CPLS); Bind (wxEVT_MENU, boost::bind (&DOMFrame::set_decode_reduction, this, optional(0)), ID_view_scale_full); @@ -150,17 +157,20 @@ public: /* Use a panel as the only child of the Frame so that we avoid the dark-grey background on Windows. */ - wxPanel* overall_panel = new wxPanel (this, wxID_ANY); + _overall_panel = new wxPanel (this, wxID_ANY); - _viewer.reset (new FilmViewer (overall_panel)); - _controls = new Controls (overall_panel, _viewer); + _viewer.reset (new FilmViewer (_overall_panel)); + _controls = new Controls (_overall_panel, _viewer); _viewer->set_dcp_decode_reduction (Config::instance()->decode_reduction ()); - _info = new PlayerInformation (overall_panel, _viewer); + _viewer->PlaybackPermitted.connect (bind(&DOMFrame::playback_permitted, this)); + _viewer->Started.connect (bind(&DOMFrame::playback_started, this)); + _viewer->Stopped.connect (bind(&DOMFrame::playback_stopped, this)); + _info = new PlayerInformation (_overall_panel, _viewer); wxSizer* main_sizer = new wxBoxSizer (wxVERTICAL); - main_sizer->Add (_viewer->panel(), 1, wxEXPAND | wxALL, 6); + main_sizer->Add (_viewer->panel(), 1, wxEXPAND); main_sizer->Add (_controls, 0, wxEXPAND | wxALL, 6); main_sizer->Add (_info, 0, wxEXPAND | wxALL, 6); - overall_panel->SetSizer (main_sizer); + _overall_panel->SetSizer (main_sizer); #ifdef __WXOSX__ int accelerators = 4; @@ -183,13 +193,80 @@ public: Bind (wxEVT_MENU, boost::bind (&DOMFrame::back_frame, this), ID_back_frame); Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this), ID_forward_frame); + _cinema_dialog = new CinemaPlayerDialog (this, _viewer); + UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); + + setup_screen (); + } + + bool playback_permitted () + { + if (!_film || !Config::instance()->respect_kdm_validity_periods()) { + return true; + } + + bool ok = true; + BOOST_FOREACH (shared_ptr i, _film->content()) { + shared_ptr d = dynamic_pointer_cast(i); + if (d && !d->kdm_timing_window_valid()) { + ok = false; + } + } + + if (!ok) { + error_dialog (this, _("The KDM does not allow playback of this content at this time.")); + } + + return ok; + } + + void playback_started () + { + optional log = Config::instance()->player_log_file(); + if (!log) { + return; + } + + shared_ptr dcp = boost::dynamic_pointer_cast(_film->content().front()); + DCPOMATIC_ASSERT (dcp); + DCPExaminer ex (dcp); + shared_ptr playing_cpl; + BOOST_FOREACH (shared_ptr i, ex.cpls()) { + if (!dcp->cpl() || i->id() == *dcp->cpl()) { + playing_cpl = i; + } + } + DCPOMATIC_ASSERT (playing_cpl) + + FILE* f = fopen_boost(*log, "a"); + fprintf ( + f, + "%s playback-started %s %s\n", + dcp::LocalTime().as_string().c_str(), + dcp->directories().front().string().c_str(), + playing_cpl->annotation_text().c_str() + ); + fclose (f); + } + + void playback_stopped () + { + optional log = Config::instance()->player_log_file(); + if (!log) { + return; + } + + FILE* f = fopen_boost(*log, "a"); + fprintf (f, "%s playback-stopped\n", dcp::LocalTime().as_string().c_str()); + fclose (f); } void set_decode_reduction (optional reduction) { _viewer->set_dcp_decode_reduction (reduction); _info->triggered_update (); + _cinema_dialog->triggered_update (); Config::instance()->set_decode_reduction (reduction); } @@ -219,6 +296,7 @@ public: _viewer->set_film (_film); _viewer->seek (DCPTime(), true); _info->triggered_update (); + _cinema_dialog->triggered_update (); Config::instance()->add_to_player_history (dir); @@ -274,6 +352,8 @@ private: wxMenu* view = new wxMenu; optional c = Config::instance()->decode_reduction(); _view_cpl = view->Append(ID_view_cpl, _("CPL"), _cpl_menu); + view->AppendCheckItem(ID_view_full_screen, _("Full screen\tF11"))->Check(_mode == Config::PLAYER_MODE_FULL); + view->AppendCheckItem(ID_view_dual_screen, _("Dual screen\tShift+F11"))->Check(_mode == Config::PLAYER_MODE_DUAL); view->Append(ID_view_closed_captions, _("Closed captions...")); view->AppendSeparator(); view->AppendRadioItem(ID_view_scale_appropriate, _("Set decode resolution to match display"))->Check(!static_cast(c)); @@ -365,6 +445,7 @@ private: c->Destroy (); _info->triggered_update (); + _cinema_dialog->triggered_update (); } void file_add_kdm () @@ -387,6 +468,7 @@ private: d->Destroy (); _info->triggered_update (); + _cinema_dialog->triggered_update (); } void file_history (wxCommandEvent& event) @@ -403,6 +485,7 @@ private: _viewer->set_film (shared_ptr()); _film.reset (); _info->triggered_update (); + _cinema_dialog->triggered_update (); set_menu_sensitivity (); } @@ -438,6 +521,42 @@ private: dcp->examine (shared_ptr()); } + void view_full_screen () + { + if (_mode == Config::PLAYER_MODE_FULL) { + _mode = Config::PLAYER_MODE_WINDOW; + } else { + _mode = Config::PLAYER_MODE_FULL; + } + setup_screen (); + } + + void view_dual_screen () + { + if (_mode == Config::PLAYER_MODE_DUAL) { + _mode = Config::PLAYER_MODE_WINDOW; + } else { + _mode = Config::PLAYER_MODE_DUAL; + } + setup_screen (); + } + + void setup_screen () + { + _controls->Show (_mode == Config::PLAYER_MODE_WINDOW); + _info->Show (_mode == Config::PLAYER_MODE_WINDOW); + _overall_panel->SetBackgroundColour (_mode == Config::PLAYER_MODE_WINDOW ? wxNullColour : wxColour(0, 0, 0)); + ShowFullScreen (_mode != Config::PLAYER_MODE_WINDOW); + if (_mode == Config::PLAYER_MODE_DUAL) { + _cinema_dialog->Show (); + if (wxDisplay::GetCount() > 1) { + this->Move (wxDisplay(0).GetClientArea().GetWidth(), 0); + /* (0, 0) doesn't seem to work for some strange reason */ + _cinema_dialog->Move (8, 8); + } + } + } + void view_closed_captions () { _viewer->show_closed_captions (); @@ -645,7 +764,10 @@ private: bool _update_news_requested; PlayerInformation* _info; + Config::PlayerMode _mode; wxPreferencesEditor* _config_dialog; + CinemaPlayerDialog* _cinema_dialog; + wxPanel* _overall_panel; wxMenu* _file_menu; wxMenuItem* _view_cpl; wxMenu* _cpl_menu;