/*
- 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 "wx/system_information_dialog.h"
#include "lib/cross.h"
#include "lib/config.h"
#include "lib/util.h"
using boost::dynamic_pointer_cast;
using boost::thread;
using boost::bind;
+using namespace dcpomatic;
enum {
ID_file_open = 1,
ID_help_report_a_problem,
ID_tools_verify,
ID_tools_check_for_updates,
+ ID_tools_timing,
+ ID_tools_system_information,
/* IDs for shortcuts (with no associated menu item) */
ID_start_stop,
ID_back_frame,
, _history_items (0)
, _history_position (0)
, _history_separator (0)
+ , _system_information_dialog (0)
, _view_full_screen (0)
, _view_dual_screen (0)
{
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);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this), ID_tools_system_information);
/* Use a panel as the only child of the Frame so that we avoid
the dark-grey background on Windows.
}
}
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ BOOST_FOREACH (shared_ptr<Content> i, _film->content()) {
+ shared_ptr<FFmpegContent> c = dynamic_pointer_cast<FFmpegContent>(i);
+ if (c && !c->kdm_timing_window_valid()) {
+ ok = false;
+ }
+ }
+#endif
+
if (!ok) {
error_dialog (this, _("The KDM does not allow playback of this content at this time."));
}
void playback_started (DCPTime time)
{
/* XXX: this only logs the first piece of content; probably should be each piece? */
+ if (_film->content().empty()) {
+ return;
+ }
shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent>(_film->content().front());
if (dcp) {
- DCPExaminer ex (dcp);
+ DCPExaminer ex (dcp, true);
shared_ptr<dcp::CPL> playing_cpl;
BOOST_FOREACH (shared_ptr<dcp::CPL> i, ex.cpls()) {
if (!dcp->cpl() || i->id() == *dcp->cpl()) {
void reset_film (shared_ptr<Film> film = shared_ptr<Film>(new Film(optional<boost::filesystem::path>())))
{
_film = film;
+ _film->set_tolerant (true);
_viewer->set_film (_film);
_controls->set_film (_film);
_film->Change.connect (bind(&DOMFrame::film_changed, this, _1, _2));
/* Offer a CPL menu */
shared_ptr<DCPContent> first = dynamic_pointer_cast<DCPContent>(_film->content().front());
if (first) {
- DCPExaminer ex (first);
+ DCPExaminer ex (first, true);
int id = ID_view_cpl;
BOOST_FOREACH (shared_ptr<dcp::CPL> i, ex.cpls()) {
wxMenuItem* j = _cpl_menu->AppendRadioItem(
private:
+ bool report_errors_from_last_job (wxWindow* parent) const
+ {
+ JobManager* jm = JobManager::instance ();
+
+ DCPOMATIC_ASSERT (!jm->get().empty());
+
+ shared_ptr<Job> last = jm->get().back();
+ if (last->finished_in_error()) {
+ error_dialog(parent, wxString::Format(_("Could not load DCP.\n\n%s."), std_to_wx(last->error_summary()).data()), std_to_wx(last->error_details()));
+ return false;
+ }
+
+ return true;
+ }
+
void setup_menu (wxMenuBar* m)
{
_file_menu = new wxMenu;
_file_menu->Append (ID_file_open, _("&Open...\tCtrl-O"));
_file_add_ov = _file_menu->Append (ID_file_add_ov, _("&Add OV..."));
- _file_add_kdm = _file_menu->Append (ID_file_add_kdm, _("&Add KDM..."));
+ _file_add_kdm = _file_menu->Append (ID_file_add_kdm, _("Add &KDM..."));
_history_position = _file_menu->GetMenuItems().GetCount();
_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..."));
+ tools->Append (ID_tools_system_information, _("System information..."));
wxMenu* help = new wxMenu;
#ifdef __WXOSX__
if (d->ShowModal() == wxID_OK) {
DCPOMATIC_ASSERT (_film);
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ shared_ptr<FFmpegContent> ffmpeg = boost::dynamic_pointer_cast<FFmpegContent>(_film->content().front());
+ if (ffmpeg) {
+ try {
+ ffmpeg->add_kdm (EncryptedECinemaKDM(dcp::file_to_string(wx_to_std(d->GetPath()), MAX_KDM_SIZE)));
+ } catch (exception& e) {
+ error_dialog (this, wxString::Format(_("Could not load KDM.")), std_to_wx(e.what()));
+ d->Destroy();
+ return;
+ }
+ }
+#endif
shared_ptr<DCPContent> dcp = boost::dynamic_pointer_cast<DCPContent>(_film->content().front());
+#ifndef DCPOMATIC_VARIANT_SWAROOP
DCPOMATIC_ASSERT (dcp);
+#endif
try {
- dcp->add_kdm (dcp::EncryptedKDM (dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE)));
- dcp->examine (_film, shared_ptr<Job>());
+ if (dcp) {
+ dcp->add_kdm (dcp::EncryptedKDM(dcp::file_to_string(wx_to_std(d->GetPath()), MAX_KDM_SIZE)));
+ dcp->examine (_film, shared_ptr<Job>());
+ }
} catch (exception& e) {
error_dialog (this, wxString::Format (_("Could not load KDM.")), std_to_wx(e.what()));
d->Destroy ();
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()));
+ }
}
}
{
shared_ptr<DCPContent> dcp = boost::dynamic_pointer_cast<DCPContent>(_film->content().front());
DCPOMATIC_ASSERT (dcp);
- DCPExaminer ex (dcp);
+ DCPExaminer ex (dcp, true);
int id = ev.GetId() - ID_view_cpl;
DCPOMATIC_ASSERT (id >= 0);
DCPOMATIC_ASSERT (id < int(ex.cpls().size()));
_update_news_requested = true;
}
+ void tools_timing ()
+ {
+ TimerDisplay* d = new TimerDisplay (this, _viewer->state_timer(), _viewer->gets());
+ d->ShowModal ();
+ d->Destroy ();
+ }
+
+ void tools_system_information ()
+ {
+ if (!_system_information_dialog) {
+ _system_information_dialog = new SystemInformationDialog (this, _viewer);
+ }
+
+ _system_information_dialog->Show ();
+ }
+
void help_about ()
{
AboutDialog* d = new AboutDialog (this);
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 ()) {
} else {
dcpomatic_log.reset (new NullLog());
}
- dcpomatic_log->set_types (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR);
+ dcpomatic_log->set_types (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR | LogEntry::TYPE_DEBUG_PLAYER);
}
}
wxMenuItem* _history_separator;
shared_ptr<FilmViewer> _viewer;
Controls* _controls;
+ SystemInformationDialog* _system_information_dialog;
boost::shared_ptr<Film> _film;
boost::signals2::scoped_connection _config_changed_connection;
wxMenuItem* _file_add_ov;