From: Carl Hetherington Date: Tue, 9 Oct 2018 20:57:35 +0000 (+0100) Subject: swaroop: restart playback after player crash. X-Git-Tag: v2.13.58~2 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=f598e06928af82fee1d2b25bc4cf25f560478ad4 swaroop: restart playback after player crash. --- diff --git a/src/lib/config.h b/src/lib/config.h index 94690a727..baf446df3 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -1033,13 +1033,13 @@ public: static void restore_defaults (); static bool have_existing (std::string); static boost::filesystem::path config_file (); + static boost::filesystem::path path (std::string file, bool create_directories = true); /** If set, this overrides the standard path (in home, Library, AppData or wherever) for config.xml and cinemas.xml */ static boost::optional override_path; private: Config (); - static boost::filesystem::path path (std::string file, bool create_directories = true); void read (); void set_defaults (); void set_kdm_email_to_default (); diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 3d792467b..c687569ec 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -221,12 +221,13 @@ public: return Time (INT64_MAX); } + static const int HZ = 96000; + private: friend struct dcpomatic_time_ceil_test; friend struct dcpomatic_time_floor_test; Type _t; - static const int HZ = 96000; }; class ContentTimeDifferentiator {}; diff --git a/src/lib/spl.cc b/src/lib/spl.cc index ba99e3028..d7c0944d7 100644 --- a/src/lib/spl.cc +++ b/src/lib/spl.cc @@ -21,9 +21,30 @@ #include "spl.h" #include "spl_entry.h" #include +#include #include #include +using boost::shared_ptr; + +SPL::SPL (boost::filesystem::path file) +{ + cxml::Document f ("DCPPlaylist"); + f.read_file (file); + + name = f.string_attribute ("Name"); + BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("DCP")) { + boost::filesystem::path dir(i->content()); + dcp::DCP dcp (dir); + dcp.read (); + BOOST_FOREACH (shared_ptr j, dcp.cpls()) { + if (j->id() == i->string_attribute("CPL")) { + playlist.push_back (SPLEntry(j, dir)); + } + } + } +} + void SPL::as_xml (boost::filesystem::path file) const { diff --git a/src/lib/spl.h b/src/lib/spl.h index 526016f45..5e1bd47b2 100644 --- a/src/lib/spl.h +++ b/src/lib/spl.h @@ -28,6 +28,9 @@ class SPLEntry; class SPL { public: + SPL () {} + SPL (boost::filesystem::path file); + void as_xml (boost::filesystem::path file) const; std::string name; diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 0b84d1c34..e855a1cc6 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -51,6 +51,7 @@ #include "lib/scoped_temporary.h" #include "lib/monitor_checker.h" #include +#include #include #include #include @@ -173,6 +174,9 @@ public: _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)); +#ifdef DCPOMATIC_VARIANT_SWAROOP + _viewer->PositionChanged.connect (bind(&DOMFrame::position_changed, this)); +#endif _info = new PlayerInformation (_overall_panel, _viewer); setup_main_sizer (Config::instance()->player_mode()); #ifdef __WXOSX__ @@ -203,6 +207,38 @@ public: MonitorChecker::instance()->run (); #endif setup_screen (); + +#ifdef DCPOMATIC_VARIANT_SWAROOP + if ( + boost::filesystem::is_regular_file(Config::path("position")) && + boost::filesystem::is_regular_file(Config::path("spl.xml"))) { + + set_spl (SPL(Config::path("spl.xml"))); + FILE* f = fopen_boost (Config::path("position"), "r"); + if (f) { + char buffer[64]; + fscanf (f, "%63s", buffer); + _viewer->seek (DCPTime(atoi(buffer)), true); + _viewer->start (); + fclose (f); + } + } + +#endif + } + + void position_changed () + { + if (!_viewer->playing() || _viewer->position().get() % DCPTime::HZ) { + return; + } + + FILE* f = fopen_boost (Config::path("position"), "w"); + if (f) { + string const p = dcp::raw_convert (_viewer->position().get()); + fwrite (p.c_str(), p.length(), 1, f); + fclose (f); + } } void monitor_checker_state_changed () @@ -296,6 +332,14 @@ public: void playback_stopped (DCPTime time) { +#ifdef DCPOMATIC_VARIANT_SWAROOP + try { + boost::filesystem::remove (Config::path("position")); + } catch (...) { + /* Never mind */ + } +#endif + optional log = Config::instance()->player_log_file(); if (!log) { return; @@ -370,6 +414,10 @@ public: void set_spl (SPL spl) { +#ifdef DCPOMATIC_VARIANT_SWAROOP + spl.as_xml (Config::path("spl.xml")); +#endif + if (_viewer->playing ()) { _viewer->stop (); } @@ -1077,6 +1125,8 @@ private: */ Config::drop (); + signal_manager = new wxSignalManager (this); + _frame = new DOMFrame (); SetTopWindow (_frame); _frame->Maximize (); @@ -1085,8 +1135,6 @@ private: } _frame->Show (); - signal_manager = new wxSignalManager (this); - PlayServer* server = new PlayServer (_frame); new thread (boost::bind (&PlayServer::run, server));