X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_player.cc;h=db9b21d925958cd04f07c98f53a981ce60d6ad01;hp=3ab890a71f5391d6c3923f92f7b2743768e6a2d6;hb=3e19bf7df70928442644b225c876d51f9fa413da;hpb=c49168dc9a125d546c879509d82b21368b2e4d58 diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 3ab890a71..db9b21d92 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -28,7 +28,6 @@ #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" @@ -107,15 +106,17 @@ class DOMFrame : public wxFrame public: DOMFrame () : wxFrame (0, -1, _("DCP-o-matic Player")) + , _dual_screen (0) , _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) , _history_separator (0) + , _view_full_screen (0) + , _view_dual_screen (0) { #if defined(DCPOMATIC_WINDOWS) @@ -160,16 +161,14 @@ public: _overall_panel = new wxPanel (this, wxID_ANY); _viewer.reset (new FilmViewer (_overall_panel)); - _controls = new Controls (_overall_panel, _viewer); + _controls = new Controls (_overall_panel, _viewer, false); _viewer->set_dcp_decode_reduction (Config::instance()->decode_reduction ()); _viewer->PlaybackPermitted.connect (bind(&DOMFrame::playback_permitted, this)); + _viewer->Started.connect (bind(&DOMFrame::playback_started, this, _1)); + _viewer->Seeked.connect (bind(&DOMFrame::playback_seeked, this, _1)); + _viewer->Stopped.connect (bind(&DOMFrame::playback_stopped, this, _1)); _info = new PlayerInformation (_overall_panel, _viewer); - wxSizer* main_sizer = new wxBoxSizer (wxVERTICAL); - 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); - + setup_main_sizer (true); #ifdef __WXOSX__ int accelerators = 4; #else @@ -191,13 +190,25 @@ 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)); + _controls->DCPDirectorySelected.connect (boost::bind(&DOMFrame::load_dcp, this, _1)); + _controls->DCPEjected.connect (boost::bind(&DOMFrame::eject_dcp, this)); setup_screen (); } + void setup_main_sizer (bool with_viewer) + { + wxSizer* main_sizer = new wxBoxSizer (wxVERTICAL); + if (with_viewer) { + main_sizer->Add (_viewer->panel(), 1, wxEXPAND | wxALIGN_CENTER_VERTICAL); + } + main_sizer->Add (_controls, 0, wxEXPAND | wxALL, 6); + main_sizer->Add (_info, 0, wxEXPAND | wxALL, 6); + _overall_panel->SetSizer (main_sizer); + _overall_panel->Layout (); + } + bool playback_permitted () { if (!_film || !Config::instance()->respect_kdm_validity_periods()) { @@ -219,14 +230,74 @@ public: return ok; } + void playback_started (DCPTime time) + { + 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 %s\n", + dcp::LocalTime().as_string().c_str(), + time.timecode(_film->video_frame_rate()).c_str(), + dcp->directories().front().string().c_str(), + playing_cpl->annotation_text().c_str() + ); + fclose (f); + } + + void playback_seeked (DCPTime time) + { + optional log = Config::instance()->player_log_file(); + if (!log) { + return; + } + + FILE* f = fopen_boost(*log, "a"); + fprintf (f, "%s playback-seeked %s\n", dcp::LocalTime().as_string().c_str(), time.timecode(_film->video_frame_rate()).c_str()); + fclose (f); + } + + void playback_stopped (DCPTime time) + { + optional log = Config::instance()->player_log_file(); + if (!log) { + return; + } + + FILE* f = fopen_boost(*log, "a"); + fprintf (f, "%s playback-stopped %s\n", dcp::LocalTime().as_string().c_str(), time.timecode(_film->video_frame_rate()).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); } + void eject_dcp () + { + _film.reset (new Film (optional())); + _viewer->set_film (_film); + _info->triggered_update (); + } + void load_dcp (boost::filesystem::path dir) { _film.reset (new Film (optional())); @@ -244,6 +315,27 @@ public: return; } + /* The DCP has been examined and loaded */ + + optional kdm_dir = Config::instance()->player_kdm_directory(); + if (dcp->needs_kdm() && kdm_dir) { + /* Look for a KDM */ + using namespace boost::filesystem; + for (directory_iterator i = directory_iterator(*kdm_dir); i != directory_iterator(); ++i) { + if (file_size(i->path()) < MAX_KDM_SIZE) { + try { + dcp::EncryptedKDM kdm(dcp::file_to_string(i->path())); + if (kdm.cpl_id() == dcp->cpl()) { + dcp->add_kdm (kdm); + dcp->examine (shared_ptr()); + } + } catch (...) { + /* Hey well */ + } + } + } + } + setup_from_dcp (dcp); if (dcp->three_d()) { @@ -253,7 +345,6 @@ 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 +365,8 @@ public: j->Check(!dcp->cpl() || i->id() == *dcp->cpl()); ++id; } + + _controls->log (wxString::Format(_("Load DCP %s"), dir.filename().string().c_str())); } private: @@ -309,8 +402,13 @@ 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->AppendSeparator(); +#ifndef DCPOMATIC_VARIANT_SWAROOP + _view_full_screen = view->AppendCheckItem(ID_view_full_screen, _("Full screen\tF11")); + _view_dual_screen = view->AppendCheckItem(ID_view_dual_screen, _("Dual screen\tShift+F11")); +#endif + setup_menu (); + view->AppendSeparator(); 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)); @@ -402,7 +500,6 @@ private: c->Destroy (); _info->triggered_update (); - _cinema_dialog->triggered_update (); } void file_add_kdm () @@ -425,7 +522,6 @@ private: d->Destroy (); _info->triggered_update (); - _cinema_dialog->triggered_update (); } void file_history (wxCommandEvent& event) @@ -442,7 +538,6 @@ private: _viewer->set_film (shared_ptr()); _film.reset (); _info->triggered_update (); - _cinema_dialog->triggered_update (); set_menu_sensitivity (); } @@ -486,6 +581,7 @@ private: _mode = Config::PLAYER_MODE_FULL; } setup_screen (); + setup_menu (); } void view_dual_screen () @@ -496,21 +592,55 @@ private: _mode = Config::PLAYER_MODE_DUAL; } setup_screen (); + setup_menu (); + } + + void setup_menu () + { + if (_view_full_screen) { + _view_full_screen->Check (_mode == Config::PLAYER_MODE_FULL); + } + if (_view_dual_screen) { + _view_dual_screen->Check (_mode == Config::PLAYER_MODE_DUAL); + } } 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); + _controls->Show (_mode != Config::PLAYER_MODE_FULL); + _controls->show_extended_player_controls (_mode == Config::PLAYER_MODE_DUAL); + _info->Show (_mode != Config::PLAYER_MODE_FULL); + _overall_panel->SetBackgroundColour (_mode == Config::PLAYER_MODE_FULL ? wxColour(0, 0, 0) : wxNullColour); + ShowFullScreen (_mode == Config::PLAYER_MODE_FULL); + if (_mode == Config::PLAYER_MODE_DUAL) { - _cinema_dialog->Show (); + _dual_screen = new wxFrame (this, wxID_ANY, wxT("")); + _dual_screen->SetBackgroundColour (wxColour(0, 0, 0)); + _dual_screen->ShowFullScreen (true); + _viewer->panel()->Reparent (_dual_screen); + _dual_screen->Show (); if (wxDisplay::GetCount() > 1) { - this->Move (0, 0); - _cinema_dialog->Move (wxDisplay(0).GetClientArea().GetWidth(), 0); + switch (Config::instance()->image_display()) { + case 0: + _dual_screen->Move (0, 0); + Move (wxDisplay(0).GetClientArea().GetWidth(), 0); + break; + case 1: + _dual_screen->Move (wxDisplay(0).GetClientArea().GetWidth(), 0); + // (0, 0) doesn't seem to work for some strange reason + Move (8, 8); + break; + } + } + } else { + if (_dual_screen) { + _viewer->panel()->Reparent (_overall_panel); + _dual_screen->Destroy (); + _dual_screen = 0; } } + + setup_main_sizer (_mode != Config::PLAYER_MODE_DUAL); } void view_closed_captions () @@ -718,11 +848,11 @@ private: } } + wxFrame* _dual_screen; bool _update_news_requested; PlayerInformation* _info; Config::PlayerMode _mode; wxPreferencesEditor* _config_dialog; - CinemaPlayerDialog* _cinema_dialog; wxPanel* _overall_panel; wxMenu* _file_menu; wxMenuItem* _view_cpl; @@ -737,6 +867,8 @@ private: wxMenuItem* _file_add_ov; wxMenuItem* _file_add_kdm; wxMenuItem* _tools_verify; + wxMenuItem* _view_full_screen; + wxMenuItem* _view_dual_screen; }; static const wxCmdLineEntryDesc command_line_description[] = {