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:
@@ -90,12 +90,16 @@ class PlayerService extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Baut die Zufallsreihenfolge neu: alle Indizes außer dem aktuellen Song, gemischt.
|
/// 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() {
|
void _baueShuffleReihenfolge() {
|
||||||
_shuffleReihenfolge.clear();
|
_shuffleReihenfolge.clear();
|
||||||
_shufflePos = -1;
|
_shufflePos = -1;
|
||||||
if (_warteschlange.isEmpty) return;
|
if (_warteschlange.isEmpty) return;
|
||||||
if (_warteschlange.length == 1) {
|
if (_warteschlange.length == 1) {
|
||||||
_shuffleReihenfolge.add(0);
|
if (_wiederholmodus == Wiederholmodus.playlist) {
|
||||||
|
_shuffleReihenfolge.add(0);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final indices = List<int>.generate(_warteschlange.length, (i) => i);
|
final indices = List<int>.generate(_warteschlange.length, (i) => i);
|
||||||
@@ -237,6 +241,11 @@ class PlayerService extends ChangeNotifier {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final idx = _shuffleReihenfolge[_shufflePos];
|
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;
|
return (idx >= 0 && idx < _warteschlange.length) ? idx : null;
|
||||||
}
|
}
|
||||||
var neuerIndex = _aktuellerIndex + 1;
|
var neuerIndex = _aktuellerIndex + 1;
|
||||||
|
|||||||
@@ -143,6 +143,16 @@ void main() {
|
|||||||
expect(p.naechsterIndex(), 0);
|
expect(p.naechsterIndex(), 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('shuffle + repeat aus + einzelne Warteschlange: Queue-Ende (null)', () {
|
||||||
|
final p = PlayerService();
|
||||||
|
p.setWarteschlange([_song(1, 'A')]);
|
||||||
|
p.setZufallsmodus(true);
|
||||||
|
p.setWiederholmodus(Wiederholmodus.aus);
|
||||||
|
// Einzel-Song-Queue ohne Repeat darf denselben Song NICHT erneut liefern
|
||||||
|
expect(p.naechsterIndex(), isNull);
|
||||||
|
expect(p.naechsterIndex(), isNull);
|
||||||
|
});
|
||||||
|
|
||||||
test('shuffle schließt neuen aktuellen Index nach Umsortieren aus', () {
|
test('shuffle schließt neuen aktuellen Index nach Umsortieren aus', () {
|
||||||
final p = PlayerService();
|
final p = PlayerService();
|
||||||
p.setWarteschlange([for (var i = 1; i <= 5; i++) _song(i, 'S$i')]);
|
p.setWarteschlange([for (var i = 1; i <= 5; i++) _song(i, 'S$i')]);
|
||||||
|
|||||||
Reference in New Issue
Block a user