v2.49.3 — Shuffle-Edge-Case: Einzel-Song-Queue + Repeat-aus → Queue-Ende

## Fix (Code-Review Finding 1, HIGH)
- _baueShuffleReihenfolge: Index 0 nur noch bei Repeat-playlist in die
  Shuffle-Reihenfolge aufnehmen (Einzel-Song-Queue)
- naechsterIndex: Sicherheitsnetz gegen stale Reihenfolge — Kandidat ==
  aktueller Song bei Repeat-aus liefert null (Queue-Ende) statt denselben
  Song erneut
- Test ergänzt: shuffle + repeat aus + 1-Song-Queue → null
This commit is contained in:
Dustin
2026-08-04 16:46:08 +02:00
parent a1f1d87cd0
commit c6826db651
2 changed files with 20 additions and 1 deletions
+10 -1
View File
@@ -90,12 +90,16 @@ class PlayerService extends ChangeNotifier {
}
/// Baut die Zufallsreihenfolge neu: alle Indizes außer dem aktuellen Song, gemischt.
/// Bei einer Einzel-Song-Queue kommt der Song nur bei Repeat-playlist in die
/// Reihenfolge — sonst ist die Queue nach dem Song zu Ende (naechsterIndex → null).
void _baueShuffleReihenfolge() {
_shuffleReihenfolge.clear();
_shufflePos = -1;
if (_warteschlange.isEmpty) return;
if (_warteschlange.length == 1) {
_shuffleReihenfolge.add(0);
if (_wiederholmodus == Wiederholmodus.playlist) {
_shuffleReihenfolge.add(0);
}
return;
}
final indices = List<int>.generate(_warteschlange.length, (i) => i);
@@ -237,6 +241,11 @@ class PlayerService extends ChangeNotifier {
return null;
}
final idx = _shuffleReihenfolge[_shufflePos];
// Sicherheitsnetz: Einzel-Song-Queue (oder stale Reihenfolge) darf bei
// Repeat-aus nicht denselben Song erneut liefern — das ist Queue-Ende.
if (idx == _aktuellerIndex && _wiederholmodus == Wiederholmodus.aus) {
return null;
}
return (idx >= 0 && idx < _warteschlange.length) ? idx : null;
}
var neuerIndex = _aktuellerIndex + 1;