Rather dubious fix for crash due to the sequence:
authorCarl Hetherington <cth@carlh.net>
Wed, 8 Aug 2018 22:59:26 +0000 (23:59 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 9 Aug 2018 21:31:11 +0000 (22:31 +0100)
  - playlist change
  - _have_valid_pieces -> false
  - signal butler
  - but meanwhile, pass happens which calls setup_pieces and starts emitting
    data from time 0
  - this new data is not in sync with what's already in the audio ring buffers

src/lib/player.cc

index c1a6c0f..2313e09 100644 (file)
@@ -594,7 +594,13 @@ Player::pass ()
        boost::mutex::scoped_lock lm (_mutex);
 
        if (!_have_valid_pieces) {
-               setup_pieces ();
+               /* This should only happen when we are under the control of the butler.  In this case, _have_valid_pieces
+                  will be false if something in the Player has changed and we are waiting for the butler to notice
+                  and do a seek back to the place we were at before.  During this time we don't want pass() to do anything,
+                  as just after setup_pieces the new decoders will be back to time 0 until the seek has gone through.  Just do nothing
+                  here and assume that the seek will be forthcoming.
+               */
+               return false;
        }
 
        if (_playlist->length() == DCPTime()) {