/*
- Copyright (C) 2017-2018 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2017-2019 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "wx/verify_dcp_dialog.h"
#include "wx/standard_controls.h"
#include "wx/swaroop_controls.h"
+#include "wx/timer_display.h"
#include "lib/cross.h"
#include "lib/config.h"
#include "lib/util.h"
#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>
ID_help_report_a_problem,
ID_tools_verify,
ID_tools_check_for_updates,
+ ID_tools_timing,
/* IDs for shortcuts (with no associated menu item) */
ID_start_stop,
ID_back_frame,
#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);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_verify, this), ID_tools_verify);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_timing, this), ID_tools_timing);
/* Use a panel as the only child of the Frame so that we avoid
the dark-grey background on Windows.
_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());
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);
}
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)
}
#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)
_tools_verify = tools->Append (ID_tools_verify, _("Verify DCP"));
tools->AppendSeparator ();
tools->Append (ID_tools_check_for_updates, _("Check for updates"));
+ tools->Append (ID_tools_timing, _("Timing..."));
wxMenu* help = new wxMenu;
#ifdef __WXOSX__
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()));
+ }
}
}
_update_news_requested = true;
}
+ void tools_timing ()
+ {
+ TimerDisplay* d = new TimerDisplay (this, _viewer->state_timer(), _viewer->gets());
+ d->ShowModal ();
+ d->Destroy ();
+ }
+
void help_about ()
{
AboutDialog* d = new AboutDialog (this);
);
}
- 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);
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 ()) {
}
_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 ()
Config::FailedToLoad.connect (boost::bind (&App::config_failed_to_load, this));
Config::Warning.connect (boost::bind (&App::config_warning, this, _1));
- wxSplashScreen* splash = maybe_show_splash ();
+ splash = maybe_show_splash ();
SetAppName (_("DCP-o-matic Player"));