From d722035883dfb397acfefd99f35cb1b9a7b0c0ee Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Tue, 18 Oct 2022 20:12:21 +0200 Subject: [PATCH] VLCEngine: Only emit stopped when still playing VLC sends the stopped signal too late, the player has already moved on based on the end reached signal. Emitting Stopped afterwards will interrupt the player in the middle of the song change. Fixes #1054 --- src/engine/vlcengine.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/engine/vlcengine.cpp b/src/engine/vlcengine.cpp index cbca11565..a3a0e2ae6 100644 --- a/src/engine/vlcengine.cpp +++ b/src/engine/vlcengine.cpp @@ -287,12 +287,18 @@ void VLCEngine::StateChangedCallback(const libvlc_event_t *e, void *data) { switch (e->type) { case libvlc_MediaPlayerNothingSpecial: + case libvlc_MediaPlayerOpening: + case libvlc_MediaPlayerBuffering: break; - case libvlc_MediaPlayerStopped: + case libvlc_MediaPlayerStopped:{ + const Engine::State state = engine->state_; engine->state_ = Engine::Empty; - emit engine->StateChanged(engine->state_); + if (state == Engine::Playing) { + emit engine->StateChanged(engine->state_); + } break; + } case libvlc_MediaPlayerEncounteredError: engine->state_ = Engine::Error; @@ -300,8 +306,6 @@ void VLCEngine::StateChangedCallback(const libvlc_event_t *e, void *data) { emit engine->FatalError(); break; - case libvlc_MediaPlayerOpening: - case libvlc_MediaPlayerBuffering: case libvlc_MediaPlayerPlaying: engine->state_ = Engine::Playing; emit engine->StateChanged(engine->state_); @@ -315,7 +319,7 @@ void VLCEngine::StateChangedCallback(const libvlc_event_t *e, void *data) { case libvlc_MediaPlayerEndReached: engine->state_ = Engine::Idle; emit engine->TrackEnded(); - return; // Don't emit state changed here + break; } }