diff --git a/lib/player/audio_handler.dart b/lib/player/audio_handler.dart index bff047b..1598660 100644 --- a/lib/player/audio_handler.dart +++ b/lib/player/audio_handler.dart @@ -130,6 +130,22 @@ int startIndexNachFilter(List behalten, int startIndex) { return davor.clamp(0, gesamt - 1); } +/// Übersetzung des Player-Shuffle-Zustands in den `audio_service`-Wert für +/// `PlaybackState.shuffleMode`. Als reine Funktion ausgelagert, damit sie +/// ohne laufenden `AudioPlayer` testbar ist — `_transformEvent()` läuft bei +/// jedem Player-Event und lässt sich nicht isoliert aufrufen. +AudioServiceShuffleMode toAudioServiceShuffleMode(bool enabled) => + enabled ? AudioServiceShuffleMode.all : AudioServiceShuffleMode.none; + +/// Übersetzung des Player-Loop-Modus in den `audio_service`-Wert für +/// `PlaybackState.repeatMode`. Siehe [toAudioServiceShuffleMode]. +AudioServiceRepeatMode toAudioServiceRepeatMode(LoopMode loopMode) => + switch (loopMode) { + LoopMode.one => AudioServiceRepeatMode.one, + LoopMode.all => AudioServiceRepeatMode.all, + LoopMode.off => AudioServiceRepeatMode.none, + }; + /// Im Offline-Modus ist keiner der gewählten Titel ohne Netz abspielbar. class NichtsOfflineVerfuegbar implements Exception { const NichtsOfflineVerfuegbar(); @@ -633,6 +649,8 @@ class MeloAudioHandler extends BaseAudioHandler with QueueHandler, SeekHandler { }[_player.processingState] ?? AudioProcessingState.idle, playing: _player.playing, + shuffleMode: toAudioServiceShuffleMode(_player.shuffleModeEnabled), + repeatMode: toAudioServiceRepeatMode(_player.loopMode), updatePosition: _player.position, bufferedPosition: _player.bufferedPosition, speed: _player.speed, diff --git a/test/player/audio_handler_pure_test.dart b/test/player/audio_handler_pure_test.dart new file mode 100644 index 0000000..8ac1b15 --- /dev/null +++ b/test/player/audio_handler_pure_test.dart @@ -0,0 +1,30 @@ +import 'package:audio_service/audio_service.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:melo/player/audio_handler.dart'; + +void main() { + group('toAudioServiceShuffleMode', () { + test('true wird zu AudioServiceShuffleMode.all', () { + expect(toAudioServiceShuffleMode(true), AudioServiceShuffleMode.all); + }); + + test('false wird zu AudioServiceShuffleMode.none', () { + expect(toAudioServiceShuffleMode(false), AudioServiceShuffleMode.none); + }); + }); + + group('toAudioServiceRepeatMode', () { + test('LoopMode.one wird zu AudioServiceRepeatMode.one', () { + expect(toAudioServiceRepeatMode(LoopMode.one), AudioServiceRepeatMode.one); + }); + + test('LoopMode.all wird zu AudioServiceRepeatMode.all', () { + expect(toAudioServiceRepeatMode(LoopMode.all), AudioServiceRepeatMode.all); + }); + + test('LoopMode.off wird zu AudioServiceRepeatMode.none', () { + expect(toAudioServiceRepeatMode(LoopMode.off), AudioServiceRepeatMode.none); + }); + }); +}