Fix another hang caused by Playlist::maybe_sequence being called
authorCarl Hetherington <cth@carlh.net>
Wed, 29 Aug 2018 15:09:53 +0000 (16:09 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 29 Aug 2018 15:09:53 +0000 (16:09 +0100)
between PENDING and DONE for VIDEO_RATE_CHANGED.  maybe_sequence
ends up with a call to get_video before the butler has heard
that the VIDEO_RATE_CHANGED is DONE.

src/lib/film.cc

index 93e7aa1c05c4322368ee87299b4289a8102d02df..0000dca10485c63a09ffb9c41de1dce8d426c109 100644 (file)
@@ -948,19 +948,19 @@ Film::signal_change (ChangeType type, Property p)
        if (type == CHANGE_TYPE_DONE) {
                _dirty = true;
 
-               switch (p) {
-               case Film::CONTENT:
+               if (p == Film::CONTENT) {
                        set_video_frame_rate (_playlist->best_video_frame_rate ());
-                       break;
-               case Film::VIDEO_FRAME_RATE:
-               case Film::SEQUENCE:
-                       _playlist->maybe_sequence ();
-                       break;
-               default:
-                       break;
                }
 
                emit (boost::bind (boost::ref (Change), type, p));
+
+               if (p == Film::VIDEO_FRAME_RATE || p == Film::SEQUENCE) {
+                       /* We want to call Playlist::maybe_sequence but this must happen after the
+                          main signal emission (since the butler will see that emission and un-suspend itself).
+                          Doing it this way ensures that the Change signal above is emitted first.
+                       */
+                       signal_manager->when_idle (boost::bind(&Playlist::maybe_sequence, _playlist.get()));
+               }
        } else {
                Change (type, p);
        }