diff --git a/flutter_client/lib/player/audio_handler.dart b/flutter_client/lib/player/audio_handler.dart index 0490f5ae..3bade142 100644 --- a/flutter_client/lib/player/audio_handler.dart +++ b/flutter_client/lib/player/audio_handler.dart @@ -12,7 +12,16 @@ import 'album_cover_cache.dart'; class MinstrelAudioHandler extends BaseAudioHandler with QueueHandler, SeekHandler { MinstrelAudioHandler() { - _player.playbackEventStream.listen(_broadcastState); + _player.playbackEventStream.listen( + _broadcastState, + // ExoPlayer surfaces stream errors (404, premature EOS, decoder + // failure, network drop) here. Without an error sink, the + // player just goes quiet — exactly the "starts then stops" + // symptom we hit. + onError: (Object e, StackTrace st) { + debugPrint('audio_handler: playbackEventStream error: $e\n$st'); + }, + ); _player.currentIndexStream.listen(_onCurrentIndexChanged); // Re-broadcast on shuffle/repeat changes so the PlaybackState's // shuffleMode + repeatMode fields stay current for UI subscribers. @@ -24,6 +33,15 @@ class MinstrelAudioHandler extends BaseAudioHandler with QueueHandler, SeekHandl // the index and the eviction loop can't reclaim them. _player.bufferedPositionStream .listen((_) => unawaited(_maybeRegisterStreamCache())); + // Diagnostic: log every player-state transition so silent stops + // surface as something we can read in the log. + _player.playerStateStream.listen((s) { + debugPrint( + 'audio_handler: state playing=${s.playing} processing=${s.processingState}'); + }); + _player.processingStateStream.listen((ps) { + debugPrint('audio_handler: processingState=$ps'); + }); } final AudioPlayer _player = AudioPlayer();