diff --git a/lib/services/player_service.dart b/lib/services/player_service.dart index b9dc25a..d54eb7a 100644 --- a/lib/services/player_service.dart +++ b/lib/services/player_service.dart @@ -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.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; diff --git a/test/player_service_test.dart b/test/player_service_test.dart index 06faf3d..bddf822 100644 --- a/test/player_service_test.dart +++ b/test/player_service_test.dart @@ -143,6 +143,16 @@ void main() { 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', () { final p = PlayerService(); p.setWarteschlange([for (var i = 1; i <= 5; i++) _song(i, 'S$i')]);