X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fswaroop_controls.cc;h=add9bf3e0ae5937f9bbdce005dae8f01212a7501;hb=1c11eaf92c5d592be6df07e2ac77cfcf65e3ed0c;hp=d557d09e9b8fe9190c7d7882fd455ccbcfaa8f2d;hpb=c4403784febdbdd42e9c32e67fadb147f11fe566;p=dcpomatic.git diff --git a/src/wx/swaroop_controls.cc b/src/wx/swaroop_controls.cc index d557d09e9..add9bf3e0 100644 --- a/src/wx/swaroop_controls.cc +++ b/src/wx/swaroop_controls.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018 Carl Hetherington + Copyright (C) 2018-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -29,6 +29,8 @@ #include "lib/cross.h" #include "lib/scoped_temporary.h" #include "lib/internet.h" +#include "lib/ffmpeg_content.h" +#include "lib/compose.hpp" #include #include #include @@ -52,6 +54,7 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe , _previous_button (new Button(this, "Previous")) , _current_disable_timeline (false) , _current_disable_next (false) + , _timer (this) { _button_sizer->Add (_previous_button, 0, wxEXPAND); _button_sizer->Add (_play_button, 0, wxEXPAND); @@ -102,9 +105,6 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe _v_sizer->Add (e_sizer, 1, wxEXPAND); - _log = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(-1, 200), wxTE_READONLY | wxTE_MULTILINE); - _v_sizer->Add (_log, 0, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); - _play_button->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::play_clicked, this)); _pause_button->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::pause_clicked, this)); _stop_button->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::stop_clicked, this)); @@ -113,10 +113,13 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe _spl_view->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind(&SwaroopControls::spl_selection_changed, this)); _spl_view->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind(&SwaroopControls::spl_selection_changed, this)); _viewer->Finished.connect (boost::bind(&SwaroopControls::viewer_finished, this)); - _viewer->PositionChanged.connect (boost::bind(&SwaroopControls::viewer_position_changed, this)); _refresh_spl_view->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::update_playlist_directory, this)); _refresh_content_view->Bind (wxEVT_BUTTON, boost::bind(&ContentView::update, _content_view)); + /* Write position every two minutes if we're playing */ + Bind (wxEVT_TIMER, boost::bind(&SwaroopControls::write_position, this)); + _timer.Start (2 * 60 * 1000, wxTIMER_CONTINUOUS); + _content_view->update (); update_playlist_directory (); @@ -154,9 +157,9 @@ SwaroopControls::check_restart () } void -SwaroopControls::viewer_position_changed () +SwaroopControls::write_position () { - if (!_selected_playlist || !_viewer->playing() || _viewer->position().get() % DCPTime::HZ) { + if (!_selected_playlist || !_viewer->playing()) { return; } @@ -184,6 +187,7 @@ SwaroopControls::started () _viewer->set_background_image (false); } +/** Called when the viewer finishes a single piece of content, or it is explicitly stopped */ void SwaroopControls::stopped () { @@ -192,6 +196,29 @@ SwaroopControls::stopped () _pause_button->Enable (false); } +void +SwaroopControls::deselect_playlist () +{ + long int const selected = _spl_view->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + if (selected != -1) { + _selected_playlist = boost::none; + _spl_view->SetItemState (selected, 0, wxLIST_STATE_SELECTED); + } + ResetFilm (shared_ptr(new Film(optional()))); +} + +void +SwaroopControls::decrement_allowed_shows () +{ + if (_selected_playlist) { + SPL& spl = _playlists[*_selected_playlist]; + spl.decrement_allowed_shows(); + if (spl.path()) { + spl.write (*spl.path()); + } + } +} + void SwaroopControls::play_clicked () { @@ -228,6 +255,8 @@ SwaroopControls::stop_clicked () update_current_content (); } _viewer->set_background_image (true); + decrement_allowed_shows (); + deselect_playlist (); } bool @@ -267,6 +296,11 @@ SwaroopControls::next_clicked () void SwaroopControls::log (wxString s) { + optional log = Config::instance()->player_activity_log_file(); + if (!log) { + return; + } + struct timeval time; gettimeofday (&time, 0); char buffer[64]; @@ -274,14 +308,10 @@ SwaroopControls::log (wxString s) struct tm* t = localtime (&sec); strftime (buffer, 64, "%c", t); wxString ts = std_to_wx(string(buffer)) + N_(": "); - _log->SetValue(_log->GetValue() + ts + s + "\n"); - - optional log = Config::instance()->player_activity_log_file(); - if (!log) { + FILE* f = fopen_boost (*log, "a"); + if (!f) { return; } - - FILE* f = fopen_boost (*log, "a"); fprintf (f, "%s%s\n", wx_to_std(ts).c_str(), wx_to_std(s).c_str()); fclose (f); } @@ -385,6 +415,28 @@ SwaroopControls::get_kdm_from_directory (shared_ptr dcp) return optional(); } +optional +SwaroopControls::get_kdm_from_directory (shared_ptr ffmpeg) +{ + using namespace boost::filesystem; + optional kdm_dir = Config::instance()->player_kdm_directory(); + if (!kdm_dir) { + return optional(); + } + for (directory_iterator i = directory_iterator(*kdm_dir); i != directory_iterator(); ++i) { + try { + if (file_size(i->path()) < MAX_KDM_SIZE) { + EncryptedECinemaKDM kdm (dcp::file_to_string(i->path())); + if (kdm.id() == ffmpeg->id().get_value_or("")) { + return kdm; + } + } + } catch (std::exception& e) { + /* Hey well */ + } + } + return optional(); +} void SwaroopControls::spl_selection_changed () { @@ -397,8 +449,7 @@ SwaroopControls::spl_selection_changed () if (_playlists[selected].missing()) { error_dialog (this, "This playlist cannot be loaded as some content is missing."); - _selected_playlist = boost::none; - _spl_view->SetItemState (selected, 0, wxLIST_STATE_SELECTED); + deselect_playlist (); return; } @@ -407,6 +458,11 @@ SwaroopControls::spl_selection_changed () return; } + if (!_playlists[selected].have_allowed_shows()) { + error_dialog (this, "There are no more allowed shows of this playlist."); + return; + } + select_playlist (selected, 0); } @@ -436,9 +492,26 @@ SwaroopControls::select_playlist (int selected, int position) } if (dcp->needs_kdm()) { /* We didn't get a KDM for this */ - error_dialog (this, "This playlist cannot be loaded as a KDM is missing."); - _selected_playlist = boost::none; - _spl_view->SetItemState (selected, 0, wxLIST_STATE_SELECTED); + error_dialog (this, "This playlist cannot be loaded as a KDM is missing or incorrect."); + deselect_playlist (); + return; + } + } + shared_ptr ffmpeg = dynamic_pointer_cast (i.content); + if (ffmpeg && ffmpeg->encrypted()) { + optional kdm = get_kdm_from_directory (ffmpeg); + if (kdm) { + try { + ffmpeg->add_kdm (*kdm); + ffmpeg->examine (_film, shared_ptr()); + } catch (KDMError& e) { + error_dialog (this, "This playlist cannot be loaded as a KDM is missing or incorrect."); + deselect_playlist (); + return; + } + } else { + error_dialog (this, "This playlist cannot be loaded as a KDM is missing or incorrect."); + deselect_playlist (); return; } } @@ -508,6 +581,7 @@ SwaroopControls::update_current_content () reset_film (); } +/** One piece of content in our SPL has finished playing */ void SwaroopControls::viewer_finished () { @@ -519,13 +593,18 @@ SwaroopControls::viewer_finished () _selected_playlist_position++; if (_selected_playlist_position < int(_playlists[*_selected_playlist].get().size())) { + /* Next piece of content on the SPL */ update_current_content (); if (!stop) { _viewer->start (); } } else { + /* Finished the whole SPL */ _selected_playlist_position = 0; _viewer->set_background_image (true); ResetFilm (shared_ptr(new Film(optional()))); + decrement_allowed_shows (); + _play_button->Enable (true); + _pause_button->Enable (false); } }