X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_player.cc;h=50981525f34b0035349134733784967ca82331c8;hb=4c435d735b010929dfb222e2da0cf90205e6a6c1;hp=cb81c5b89d7aaa24a2fc4bdfc4aee7cd97f5ac49;hpb=744b6a777cca4eecc39c81a80507507ec425d080;p=dcpomatic.git diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index cb81c5b89..50981525f 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -34,6 +34,7 @@ #endif #include "wx/timer_display.h" #include "wx/system_information_dialog.h" +#include "wx/player_stress_tester.h" #include "lib/cross.h" #include "lib/config.h" #include "lib/util.h" @@ -100,59 +101,6 @@ using boost::bind; using dcp::raw_convert; using namespace dcpomatic; -#ifdef DCPOMATIC_PLAYER_STRESS_TEST -/* Interval to check what to do next with the stress checker, in milliseconds */ -#define STRESS_TEST_CHECK_INTERVAL 20 - -class Command -{ -public: - enum Type { - NONE, - OPEN, - PLAY, - WAIT, - STOP, - SEEK, - }; - - Command(string line) - : type (NONE) - , int_param (0) - { - vector bits; - boost::split (bits, line, boost::is_any_of(" ")); - if (bits[0] == "O") { - if (bits.size() != 2) { - return; - } - type = OPEN; - string_param = bits[1]; - } else if (bits[0] == "P") { - type = PLAY; - } else if (bits[0] == "W") { - if (bits.size() != 2) { - return; - } - type = WAIT; - int_param = raw_convert(bits[1]); - } else if (bits[0] == "S") { - type = STOP; - } else if (bits[0] == "K") { - if (bits.size() != 2) { - return; - } - type = SEEK; - int_param = raw_convert(bits[1]); - } - } - - Type type; - string string_param; - int int_param; -}; -#endif - enum { ID_file_open = 1, ID_file_add_ov, @@ -176,8 +124,16 @@ enum { ID_tools_system_information, /* IDs for shortcuts (with no associated menu item) */ ID_start_stop, - ID_back_frame, - ID_forward_frame + ID_go_back_frame, + ID_go_forward_frame, + ID_go_back_small_amount, + ID_go_forward_small_amount, + ID_go_back_medium_amount, + ID_go_forward_medium_amount, + ID_go_back_large_amount, + ID_go_forward_large_amount, + ID_go_to_start, + ID_go_to_end }; class DOMFrame : public wxFrame @@ -197,9 +153,6 @@ public: , _system_information_dialog (0) , _view_full_screen (0) , _view_dual_screen (0) -#ifdef DCPOMATIC_PLAYER_STRESS_TEST - , _timer (this) -#endif { dcpomatic_log.reset (new NullLog()); @@ -267,25 +220,43 @@ public: _info = new PlayerInformation (_overall_panel, _viewer); setup_main_sizer (Config::instance()->player_mode()); #ifdef __WXOSX__ - int accelerators = 4; + int accelerators = 12; #else - int accelerators = 3; + int accelerators = 11; #endif + _stress.setup (this, _controls); + wxAcceleratorEntry* accel = new wxAcceleratorEntry[accelerators]; - accel[0].Set(wxACCEL_NORMAL, WXK_SPACE, ID_start_stop); - accel[1].Set(wxACCEL_NORMAL, WXK_LEFT, ID_back_frame); - accel[2].Set(wxACCEL_NORMAL, WXK_RIGHT, ID_forward_frame); + accel[0].Set(wxACCEL_NORMAL, WXK_SPACE, ID_start_stop); + accel[1].Set(wxACCEL_NORMAL, WXK_LEFT, ID_go_back_frame); + accel[2].Set(wxACCEL_NORMAL, WXK_RIGHT, ID_go_forward_frame); + accel[3].Set(wxACCEL_SHIFT, WXK_LEFT, ID_go_back_small_amount); + accel[4].Set(wxACCEL_SHIFT, WXK_RIGHT, ID_go_forward_small_amount); + accel[5].Set(wxACCEL_CTRL, WXK_LEFT, ID_go_back_medium_amount); + accel[6].Set(wxACCEL_CTRL, WXK_RIGHT, ID_go_forward_medium_amount); + accel[7].Set(wxACCEL_SHIFT | wxACCEL_CTRL, WXK_LEFT, ID_go_back_large_amount); + accel[8].Set(wxACCEL_SHIFT | wxACCEL_CTRL, WXK_RIGHT, ID_go_forward_large_amount); + accel[9].Set(wxACCEL_NORMAL, WXK_HOME, ID_go_to_start); + accel[10].Set(wxACCEL_NORMAL, WXK_END, ID_go_to_end); #ifdef __WXOSX__ - accel[3].Set(wxACCEL_CTRL, static_cast('W'), ID_file_close); + accel[11].Set(wxACCEL_CTRL, static_cast('W'), ID_file_close); #endif wxAcceleratorTable accel_table (accelerators, accel); SetAcceleratorTable (accel_table); delete[] accel; - Bind (wxEVT_MENU, boost::bind (&DOMFrame::start_stop_pressed, this), ID_start_stop); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::back_frame, this), ID_back_frame); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this), ID_forward_frame); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::start_stop_pressed, this), ID_start_stop); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_back_frame, this), ID_go_back_frame); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_forward_frame, this), ID_go_forward_frame); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_seconds, this, -60), ID_go_back_small_amount); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_seconds, this, 60), ID_go_forward_small_amount); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_seconds, this, -600), ID_go_back_medium_amount); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_seconds, this, 600), ID_go_forward_medium_amount); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_seconds, this, -3600), ID_go_back_large_amount); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_seconds, this, 3600), ID_go_forward_large_amount); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_to_start, this), ID_go_to_start); + Bind (wxEVT_MENU, boost::bind(&DOMFrame::go_to_end, this), ID_go_to_end); reset_film (); @@ -298,76 +269,13 @@ public: #endif setup_screen (); + _stress.LoadDCP.connect (boost::bind(&DOMFrame::load_dcp, this, _1)); + #ifdef DCPOMATIC_VARIANT_SWAROOP sc->check_restart (); #endif } -#ifdef DCPOMATIC_PLAYER_STRESS_TEST - void stress (boost::filesystem::path script_file) - { - Bind (wxEVT_TIMER, boost::bind(&DOMFrame::check_commands, this)); - _timer.Start(STRESS_TEST_CHECK_INTERVAL); - vector lines; - string const script = dcp::file_to_string(script_file); - boost::split (lines, script, boost::is_any_of("\n")); - BOOST_FOREACH (string i, lines) { - _commands.push_back (Command(i)); - } - _current_command = _commands.begin(); - } - - void check_commands () - { - if (_current_command == _commands.end()) { - _timer.Stop (); - cout << "ST: finished.\n"; - return; - } - - switch (_current_command->type) { - case Command::OPEN: - cout << "ST: load " << _current_command->string_param << "\n"; - load_dcp (_current_command->string_param); - ++_current_command; - break; - case Command::PLAY: - cout << "ST: play\n"; - _controls->play (); - ++_current_command; - break; - case Command::WAIT: - /* int_param here is the number of milliseconds to wait */ - if (_wait_remaining) { - _wait_remaining = *_wait_remaining - STRESS_TEST_CHECK_INTERVAL; - if (_wait_remaining < 0) { - cout << "ST: wait done.\n"; - _wait_remaining = optional(); - ++_current_command; - } - } else { - _wait_remaining = _current_command->int_param; - cout << "ST: waiting for " << *_wait_remaining << ".\n"; - } - break; - case Command::STOP: - cout << "ST: stop\n"; - _controls->stop (); - ++_current_command; - break; - case Command::NONE: - ++_current_command; - break; - case Command::SEEK: - /* int_param here is a number between 0 and 4095, corresponding to the possible slider positions */ - cout << "ST: seek to " << _current_command->int_param << "\n"; - _controls->seek (_current_command->int_param); - ++_current_command; - break; - } - } -#endif - #ifdef DCPOMATIC_VARIANT_SWAROOP void monitor_checker_state_changed () { @@ -504,8 +412,11 @@ public: reset_film (); try { + _stress.set_suspended (true); shared_ptr dcp (new DCPContent(dir)); - _film->examine_and_add_content (dcp, true); + shared_ptr job (new ExamineContentJob(_film, dcp)); + _examine_job_connection = job->Finished.connect(bind(&DOMFrame::add_dcp_to_film, this, weak_ptr(job), weak_ptr(dcp))); + JobManager::instance()->add (job); bool const ok = display_progress (_("DCP-o-matic Player"), _("Loading content")); if (!ok || !report_errors_from_last_job(this)) { return; @@ -513,11 +424,27 @@ public: #ifndef DCPOMATIC_VARIANT_SWAROOP Config::instance()->add_to_player_history (dir); #endif - } catch (dcp::DCPReadError& e) { + } catch (dcp::ReadError& e) { error_dialog (this, wxString::Format(_("Could not load a DCP from %s"), std_to_wx(dir.string())), std_to_wx(e.what())); } } + void add_dcp_to_film (weak_ptr weak_job, weak_ptr weak_content) + { + shared_ptr job = weak_job.lock (); + if (!job || !job->finished_ok()) { + return; + } + + shared_ptr content = weak_content.lock (); + if (!content) { + return; + } + + _film->add_content (content); + _stress.set_suspended (false); + } + void reset_film_weak (weak_ptr weak_film) { shared_ptr film = weak_film.lock (); @@ -599,6 +526,11 @@ public: } } + void load_stress_script (boost::filesystem::path path) + { + _stress.load_script (path); + } + private: bool report_errors_from_last_job (wxWindow* parent) const @@ -1102,17 +1034,30 @@ private: } } - void back_frame () + void go_back_frame () { _viewer->seek_by (-_viewer->one_video_frame(), true); } - void forward_frame () + void go_forward_frame () { _viewer->seek_by (_viewer->one_video_frame(), true); } -private: + void go_seconds (int s) + { + _viewer->seek_by (DCPTime::from_seconds(s), true); + } + + void go_to_start () + { + _viewer->seek (DCPTime(), true); + } + + void go_to_end () + { + _viewer->seek (_film->length() - _viewer->one_video_frame(), true); + } wxFrame* _dual_screen; bool _update_news_requested; @@ -1131,26 +1076,19 @@ private: SystemInformationDialog* _system_information_dialog; boost::shared_ptr _film; boost::signals2::scoped_connection _config_changed_connection; + boost::signals2::scoped_connection _examine_job_connection; wxMenuItem* _file_add_ov; wxMenuItem* _file_add_kdm; wxMenuItem* _tools_verify; wxMenuItem* _view_full_screen; wxMenuItem* _view_dual_screen; -#ifdef DCPOMATIC_PLAYER_STRESS_TEST - wxTimer _timer; - list _commands; - list::const_iterator _current_command; - /** Remaining time that the script must wait, in milliseconds */ - optional _wait_remaining; -#endif + PlayerStressTester _stress; }; static const wxCmdLineEntryDesc command_line_description[] = { { wxCMD_LINE_PARAM, 0, 0, "DCP to load or create", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_OPTION, "c", "config", "Directory containing config.xml", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, -#ifdef DCPOMATIC_PLAYER_STRESS_TEST { wxCMD_LINE_OPTION, "s", "stress", "File containing description of stress test", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, -#endif { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } }; @@ -1266,15 +1204,13 @@ private: } } -#ifdef DCPOMATIC_PLAYER_STRESS_TEST if (_stress) { try { - _frame->stress (_stress.get()); + _frame->load_stress_script (*_stress); } catch (exception& e) { error_dialog (0, wxString::Format("Could not load stress test file %s", std_to_wx(*_stress))); } } -#endif Bind (wxEVT_IDLE, boost::bind (&App::idle, this)); @@ -1309,12 +1245,10 @@ private: if (parser.Found("c", &config)) { Config::override_path = wx_to_std (config); } -#ifdef DCPOMATIC_PLAYER_STRESS_TEST wxString stress; if (parser.Found("s", &stress)) { _stress = wx_to_std (stress); } -#endif return true; } @@ -1375,9 +1309,7 @@ private: DOMFrame* _frame; string _dcp_to_load; -#ifdef DCPOMATIC_PLAYER_STRESS_TEST boost::optional _stress; -#endif }; IMPLEMENT_APP (App)