diff --git a/Sources/CSFBAudioEngine/Player/AudioPlayer.mm b/Sources/CSFBAudioEngine/Player/AudioPlayer.mm index 41288a14..30cf744a 100644 --- a/Sources/CSFBAudioEngine/Player/AudioPlayer.mm +++ b/Sources/CSFBAudioEngine/Player/AudioPlayer.mm @@ -1811,6 +1811,7 @@ Flags clearFlags(Flags flags, std::memory_order order = std::memory_order_acq_re } Decoder decoder = nil; + Decoder nextDecoder = nil; NSError *error = nil; AVAudioFramePosition framesRendered = 0; { @@ -1829,6 +1830,10 @@ Flags clearFlags(Flags flags, std::memory_order order = std::memory_order_acq_re sequenceNumber); return false; } + + if (const auto *decoderState = firstActiveDecoderState(); decoderState != nullptr) { + nextDecoder = decoderState->decoder_; + } } // Mark the decoder as canceled for any scheduled render notifications @@ -1846,19 +1851,25 @@ Flags clearFlags(Flags flags, std::memory_order order = std::memory_order_acq_re } } - const auto hasNoDecoders = [&] { - std::scoped_lock lock{queuedDecodersMutex_, activeDecodersMutex_}; - return queuedDecoders_.empty() && activeDecoders_.empty(); - }(); + if (nextDecoder != nil) { + if (bits::is_clear(loadFlags(), Flags::isPlaying)) { + setNowPlaying(nextDecoder); + } + } else { + const auto hasNoDecoders = [&] { + std::scoped_lock lock{queuedDecodersMutex_, activeDecodersMutex_}; + return queuedDecoders_.empty() && activeDecoders_.empty(); + }(); - if (hasNoDecoders) { - setNowPlaying(nil); + if (hasNoDecoders) { + setNowPlaying(nil); - const auto didStopEngine = stopEngineIfRunning(); - if (didStopEngine) { - if (__strong id delegate = player_.delegate; - delegate != nil && [delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { - [delegate audioPlayer:player_ playbackStateChanged:SFBAudioPlayerPlaybackStateStopped]; + const auto didStopEngine = stopEngineIfRunning(); + if (didStopEngine) { + if (__strong id delegate = player_.delegate; + delegate != nil && [delegate respondsToSelector:@selector(audioPlayer:playbackStateChanged:)]) { + [delegate audioPlayer:player_ playbackStateChanged:SFBAudioPlayerPlaybackStateStopped]; + } } } }