Prevent player folding audio to 2 channel if "default DCP audio channels" is set...
[dcpomatic.git] / src / tools / dcpomatic_player.cc
index 32e5b16d691bcefeb331e16a50f5a66a991accd7..9511990aefca6e1483747bddc87164e4abc46e6d 100644 (file)
@@ -53,6 +53,7 @@
 #include "lib/lock_file_checker.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/dcpomatic_log.h"
+#include "lib/file_log.h"
 #include <dcp/dcp.h>
 #include <dcp/raw_convert.h>
 #include <dcp/exceptions.h>
@@ -147,7 +148,7 @@ public:
 #endif
 
                _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this, _1));
-               update_from_config ();
+               update_from_config (Config::PLAYER_DEBUG_LOG);
 
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_open, this), ID_file_open);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_add_ov, this), ID_file_add_ov);
@@ -184,7 +185,6 @@ public:
                _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);
                setup_main_sizer (Config::instance()->player_mode());
@@ -288,15 +288,11 @@ public:
 
        void playback_started (DCPTime time)
        {
-               optional<boost::filesystem::path> log = Config::instance()->player_log_file();
-               if (!log) {
+               /* XXX: this only logs the first piece of content; probably should be each piece? */
+               if (_film->content().empty()) {
                        return;
                }
 
-               FILE* f = fopen_boost(*log, "a");
-
-               /* XXX: this only logs the first piece of content; probably should be each piece? */
-
                shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent>(_film->content().front());
                if (dcp) {
                        DCPExaminer ex (dcp);
@@ -308,40 +304,26 @@ public:
                        }
                        DCPOMATIC_ASSERT (playing_cpl);
 
-                       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()
+                       _controls->log (
+                               wxString::Format(
+                                       "playback-started %s %s %s",
+                                       time.timecode(_film->video_frame_rate()).c_str(),
+                                       dcp->directories().front().string().c_str(),
+                                       playing_cpl->annotation_text().c_str()
+                                       )
                                );
                }
 
                shared_ptr<FFmpegContent> ffmpeg = dynamic_pointer_cast<FFmpegContent>(_film->content().front());
                if (ffmpeg) {
-                       fprintf (
-                               f,
-                               "%s playback-started %s %s\n",
-                               dcp::LocalTime().as_string().c_str(),
-                               time.timecode(_film->video_frame_rate()).c_str(),
-                               ffmpeg->path(0).string().c_str()
+                       _controls->log (
+                               wxString::Format(
+                                       "playback-started %s %s",
+                                       time.timecode(_film->video_frame_rate()).c_str(),
+                                       ffmpeg->path(0).string().c_str()
+                                       )
                                );
                }
-
-               fclose (f);
-       }
-
-       void playback_seeked (DCPTime time)
-       {
-               optional<boost::filesystem::path> 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)
@@ -354,14 +336,7 @@ public:
                }
 #endif
 
-               optional<boost::filesystem::path> 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);
+               _controls->log (wxString::Format("playback-stopped %s", time.timecode(_film->video_frame_rate()).c_str()));
        }
 
        void set_decode_reduction (optional<int> reduction)
@@ -402,6 +377,7 @@ public:
        void reset_film (shared_ptr<Film> film = shared_ptr<Film>(new Film(optional<boost::filesystem::path>())))
        {
                _film = film;
+               _film->set_audio_channels (MAX_DCP_AUDIO_CHANNELS);
                _viewer->set_film (_film);
                _controls->set_film (_film);
                _film->Change.connect (bind(&DOMFrame::film_changed, this, _1, _2));
@@ -640,7 +616,11 @@ private:
                vector<boost::filesystem::path> history = Config::instance()->player_history ();
                int n = event.GetId() - ID_file_history;
                if (n >= 0 && n < static_cast<int> (history.size ())) {
-                       load_dcp (history[n]);
+                       try {
+                               load_dcp (history[n]);
+                       } catch (exception& e) {
+                               error_dialog (0, std_to_wx(String::compose(wx_to_std(_("Could not load DCP %1.")), history[n])), std_to_wx(e.what()));
+                       }
                }
        }
 
@@ -855,10 +835,10 @@ private:
                                );
                }
 
-               update_from_config ();
+               update_from_config (prop);
        }
 
-       void update_from_config ()
+       void update_from_config (Config::Property prop)
        {
                for (int i = 0; i < _history_items; ++i) {
                        delete _file_menu->Remove (ID_file_history + i);
@@ -872,6 +852,8 @@ private:
 
                int pos = _history_position;
 
+               /* Clear out non-existant history items before we re-build the menu */
+               Config::instance()->clean_player_history ();
                vector<boost::filesystem::path> history = Config::instance()->player_history ();
 
                if (!history.empty ()) {
@@ -889,6 +871,16 @@ private:
                }
 
                _history_items = history.size ();
+
+               if (prop == Config::PLAYER_DEBUG_LOG) {
+                       optional<boost::filesystem::path> p = Config::instance()->player_debug_log_file();
+                       if (p) {
+                               dcpomatic_log.reset (new FileLog(*p));
+                       } else {
+                               dcpomatic_log.reset (new NullLog());
+                       }
+                       dcpomatic_log->set_types (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR | LogEntry::TYPE_DEBUG_PLAYER);
+               }
        }
 
        void set_menu_sensitivity ()