summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-10-26 19:45:11 +0200
committerCarl Hetherington <cth@carlh.net>2022-10-26 19:45:11 +0200
commit4621a56be32a44e83b89ec0af77ab899fa86defd (patch)
tree0947b5e4bcce856b903ed7e44509bd6f6d19fa23
parent4b05f5d893bd4cc181da4d18d9107558b613de6e (diff)
Fix player being destroyed while the butler is still using it.
-rw-r--r--src/wx/film_viewer.cc31
-rw-r--r--src/wx/film_viewer.h4
2 files changed, 27 insertions, 8 deletions
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc
index c5fb50217..fb02f0a0f 100644
--- a/src/wx/film_viewer.cc
+++ b/src/wx/film_viewer.cc
@@ -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;
}
@@ -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
@@ -476,7 +493,7 @@ FilmViewer::film_change (ChangeType type, Film::Property p)
}
if (p == Film::Property::AUDIO_CHANNELS) {
- recreate_butler ();
+ destroy_and_maybe_create_butler();
} else if (p == Film::Property::VIDEO_FRAME_RATE) {
_video_view->set_video_frame_rate (_film->video_frame_rate());
} else if (p == Film::Property::THREE_D) {
@@ -579,7 +596,7 @@ void
FilmViewer::config_changed (Config::Property p)
{
if (p == Config::AUDIO_MAPPING) {
- recreate_butler ();
+ destroy_and_maybe_create_butler();
return;
}
@@ -625,11 +642,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();
}
}
diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h
index 062522ffd..aea3f8c86 100644
--- a/src/wx/film_viewer.h
+++ b/src/wx/film_viewer.h
@@ -163,7 +163,9 @@ private:
void idle_handler ();
void request_idle_display_next_frame ();
void film_change (ChangeType, Film::Property);
- void recreate_butler ();
+ void destroy_butler();
+ void create_butler();
+ void destroy_and_maybe_create_butler();
void config_changed (Config::Property);
void film_length_change ();
void ui_finished ();