Move add_files_override_path to film_util
[dcpomatic.git] / src / wx / film_viewer.cc
index c5fb502177af5c52b5cc3e1280464b711cf04748..72193fbadb8e76e6651b1681d2bf5dd0fd35c106 100644 (file)
@@ -160,9 +160,11 @@ FilmViewer::set_film (shared_ptr<Film> film)
        _video_view->clear ();
        _closed_captions_dialog->clear ();
 
+       destroy_butler();
+
        if (!_film) {
                _player = boost::none;
-               recreate_butler ();
+               resume();
                _video_view->update ();
                return;
        }
@@ -176,6 +178,7 @@ FilmViewer::set_film (shared_ptr<Film> film)
        } catch (bad_alloc &) {
                error_dialog (_video_view->get(), _("There is not enough free memory to do that."));
                _film.reset ();
+               resume();
                return;
        }
 
@@ -186,8 +189,8 @@ FilmViewer::set_film (shared_ptr<Film> film)
        _film->LengthChange.connect (boost::bind(&FilmViewer::film_length_change, this));
        _player->Change.connect (boost::bind (&FilmViewer::player_change, this, _1, _2, _3));
 
-       film_change (ChangeType::DONE, Film::Property::VIDEO_FRAME_RATE);
-       film_change (ChangeType::DONE, Film::Property::THREE_D);
+       film_change(ChangeType::DONE, FilmProperty::VIDEO_FRAME_RATE);
+       film_change(ChangeType::DONE, FilmProperty::THREE_D);
        film_length_change ();
 
        /* Keep about 1 second's worth of history samples */
@@ -195,7 +198,7 @@ FilmViewer::set_film (shared_ptr<Film> film)
 
        _closed_captions_dialog->update_tracks (_film);
 
-       recreate_butler ();
+       create_butler();
 
        calculate_sizes ();
        slow_refresh ();
@@ -203,16 +206,30 @@ FilmViewer::set_film (shared_ptr<Film> film)
 
 
 void
-FilmViewer::recreate_butler ()
+FilmViewer::destroy_butler()
 {
        suspend ();
        _butler.reset ();
+}
+
+
+void
+FilmViewer::destroy_and_maybe_create_butler()
+{
+       destroy_butler();
 
        if (!_film) {
                resume ();
                return;
        }
 
+       create_butler();
+}
+
+
+void
+FilmViewer::create_butler()
+{
 #if wxCHECK_VERSION(3, 1, 0)
        auto const j2k_gl_optimised = dynamic_pointer_cast<GLVideoView>(_video_view) && _optimise_for_j2k;
 #else
@@ -469,19 +486,19 @@ FilmViewer::player_change (vector<int> properties)
 
 
 void
-FilmViewer::film_change (ChangeType type, Film::Property p)
+FilmViewer::film_change(ChangeType type, FilmProperty p)
 {
        if (type != ChangeType::DONE) {
                return;
        }
 
-       if (p == Film::Property::AUDIO_CHANNELS) {
-               recreate_butler ();
-       } else if (p == Film::Property::VIDEO_FRAME_RATE) {
+       if (p == FilmProperty::AUDIO_CHANNELS) {
+               destroy_and_maybe_create_butler();
+       } else if (p == FilmProperty::VIDEO_FRAME_RATE) {
                _video_view->set_video_frame_rate (_film->video_frame_rate());
-       } else if (p == Film::Property::THREE_D) {
+       } else if (p == FilmProperty::THREE_D) {
                _video_view->set_three_d (_film->three_d());
-       } else if (p == Film::Property::CONTENT) {
+       } else if (p == FilmProperty::CONTENT) {
                _closed_captions_dialog->update_tracks (_film);
        }
 }
@@ -579,7 +596,7 @@ void
 FilmViewer::config_changed (Config::Property p)
 {
        if (p == Config::AUDIO_MAPPING) {
-               recreate_butler ();
+               destroy_and_maybe_create_butler();
                return;
        }
 
@@ -605,10 +622,18 @@ FilmViewer::config_changed (Config::Property p)
                                ++st;
                        }
                        if (st == _audio.getDeviceCount()) {
-                               st = _audio.getDefaultOutputDevice();
+                               try {
+                                       st = _audio.getDefaultOutputDevice();
+                               } catch (RtAudioError&) {
+                                       /* Something went wrong with that device so we don't want to use it anyway */
+                               }
                        }
                } else {
-                       st = _audio.getDefaultOutputDevice();
+                       try {
+                               st = _audio.getDefaultOutputDevice();
+                       } catch (RtAudioError&) {
+                               /* Something went wrong with that device so we don't want to use it anyway */
+                       }
                }
 
                try {
@@ -625,11 +650,11 @@ FilmViewer::config_changed (Config::Property p)
                                _("Could not set up audio output.  There will be no audio during the preview."), std_to_wx(e.what())
                                );
                }
-               recreate_butler ();
+               destroy_and_maybe_create_butler();
 
        } else {
                _audio_channels = 0;
-               recreate_butler ();
+               destroy_and_maybe_create_butler();
        }
 }