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
This commit is contained in:
Jonas Kvinge 2022-10-18 20:12:21 +02:00
parent 52139fbaa0
commit d722035883
1 changed files with 9 additions and 5 deletions

View File

@ -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;
}
}