swaroop: fix phantom entries when loading/saving playlists.
[dcpomatic.git] / src / tools / dcpomatic_player.cc
index 7028624a847116c270df7839a248f0781485ecfb..26110b373761e5a02f867d98a658dae69b7c788f 100644 (file)
@@ -27,7 +27,8 @@
 #include "wx/update_dialog.h"
 #include "wx/player_config_dialog.h"
 #include "wx/verify_dcp_dialog.h"
-#include "wx/controls.h"
+#include "wx/standard_controls.h"
+#include "wx/swaroop_controls.h"
 #include "lib/cross.h"
 #include "lib/config.h"
 #include "lib/util.h"
@@ -51,6 +52,7 @@
 #include "lib/monitor_checker.h"
 #include "lib/lock_file_checker.h"
 #include "lib/ffmpeg_content.h"
+#include "lib/dcpomatic_log.h"
 #include <dcp/dcp.h>
 #include <dcp/raw_convert.h>
 #include <dcp/exceptions.h>
@@ -79,6 +81,7 @@ using std::list;
 using std::exception;
 using std::vector;
 using boost::shared_ptr;
+using boost::weak_ptr;
 using boost::scoped_array;
 using boost::optional;
 using boost::dynamic_pointer_cast;
@@ -127,9 +130,7 @@ public:
                , _view_full_screen (0)
                , _view_dual_screen (0)
        {
-               /* XXX */
                dcpomatic_log.reset (new NullLog());
-               cout << "here's the log " << dcpomatic_log.get() << "\n";
 
 #if defined(DCPOMATIC_WINDOWS)
                maybe_open_console ();
@@ -173,15 +174,18 @@ public:
                _overall_panel = new wxPanel (this, wxID_ANY);
 
                _viewer.reset (new FilmViewer (_overall_panel));
-               _controls = new Controls (_overall_panel, _viewer, false);
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+               SwaroopControls* sc = new SwaroopControls (_overall_panel, _viewer);
+               _controls = sc;
+               sc->ResetFilm.connect (bind(&DOMFrame::reset_film_weak, this, _1));
+#else
+               _controls = new StandardControls (_overall_panel, _viewer, false);
+#endif
                _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));
-#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__
@@ -217,40 +221,10 @@ public:
                setup_screen ();
 
 #ifdef DCPOMATIC_VARIANT_SWAROOP
-               if (
-                       boost::filesystem::is_regular_file(Config::path("position")) &&
-                       boost::filesystem::is_regular_file(Config::path("spl.xml"))) {
-
-                       shared_ptr<Film> film (new Film(boost::optional<boost::filesystem::path>()));
-                       film->read_metadata (Config::path("spl.xml"));
-                       reset_film (film);
-                       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);
-                       }
-               }
-
+               sc->check_restart ();
 #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<string> (_viewer->position().get());
-                       fwrite (p.c_str(), p.length(), 1, f);
-                       fclose (f);
-               }
-       }
-
 #ifdef DCPOMATIC_VARIANT_SWAROOP
        void monitor_checker_state_changed ()
        {
@@ -404,7 +378,7 @@ public:
                reset_film ();
                try {
                        shared_ptr<DCPContent> dcp (new DCPContent(dir));
-                       _film->examine_and_add_content (dcp);
+                       _film->examine_and_add_content (dcp, true);
                        bool const ok = display_progress (_("DCP-o-matic Player"), _("Loading content"));
                        if (!ok || !report_errors_from_last_job(this)) {
                                return;
@@ -458,11 +432,21 @@ public:
                return optional<dcp::EncryptedKDM>();
        }
 
+       void reset_film_weak (weak_ptr<Film> weak_film)
+       {
+               shared_ptr<Film> film = weak_film.lock ();
+               if (film) {
+                       reset_film (film);
+               }
+       }
+
        void reset_film (shared_ptr<Film> film = shared_ptr<Film>(new Film(optional<boost::filesystem::path>())))
        {
                _film = film;
                _viewer->set_film (_film);
+               _controls->set_film (_film);
                _film->Change.connect (bind(&DOMFrame::film_changed, this, _1, _2));
+               _info->triggered_update ();
        }
 
        void film_changed (ChangeType type, Film::Property property)
@@ -471,8 +455,6 @@ public:
                        return;
                }
 
-               _film->write_metadata (Config::path("spl.xml"));
-
                if (_viewer->playing ()) {
                        _viewer->stop ();
                }
@@ -795,7 +777,6 @@ private:
        void setup_screen ()
        {
                _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);
@@ -1019,6 +1000,7 @@ private:
 
 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 },
        { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 }
 };
 
@@ -1154,6 +1136,11 @@ private:
                        _dcp_to_load = wx_to_std (parser.GetParam (0));
                }
 
+               wxString config;
+               if (parser.Found("c", &config)) {
+                       Config::override_path = wx_to_std (config);
+               }
+
                return true;
        }