112 lines
3.6 KiB
Dart
112 lines
3.6 KiB
Dart
import '../models.dart';
|
|
|
|
/// Reactive streams for player state changes.
|
|
///
|
|
/// Subscribe to these streams to receive updates when the player state changes.
|
|
/// For synchronous state access, use [PlayerState].
|
|
class PlayerStreams {
|
|
/// Stream of playing state changes.
|
|
final Stream<bool> playing;
|
|
|
|
/// Stream of completion state changes.
|
|
final Stream<bool> completed;
|
|
|
|
/// Stream of buffering state changes.
|
|
final Stream<bool> buffering;
|
|
|
|
/// Stream of position updates.
|
|
final Stream<Duration> position;
|
|
|
|
/// Stream of duration changes (when media is loaded).
|
|
final Stream<Duration> duration;
|
|
|
|
/// Stream of seekability changes for the current media item.
|
|
final Stream<bool> seekable;
|
|
|
|
/// Stream of buffer position updates.
|
|
final Stream<Duration> buffer;
|
|
|
|
/// Stream of volume changes.
|
|
final Stream<double> volume;
|
|
|
|
/// Stream of playback rate changes.
|
|
final Stream<double> rate;
|
|
|
|
/// Stream of available tracks updates.
|
|
final Stream<Tracks> tracks;
|
|
|
|
/// Stream of track selection changes.
|
|
final Stream<TrackSelection> track;
|
|
|
|
/// Stream of log messages from the player.
|
|
final Stream<PlayerLog> log;
|
|
|
|
/// Stream of player errors.
|
|
final Stream<PlayerError> error;
|
|
|
|
/// Stream of audio device changes.
|
|
final Stream<AudioDevice> audioDevice;
|
|
|
|
/// Stream of available audio devices.
|
|
final Stream<List<AudioDevice>> audioDevices;
|
|
|
|
/// Stream that emits when playback restarts (first frame ready after load/seek).
|
|
final Stream<void> playbackRestart;
|
|
|
|
/// Stream that emits when the player has loaded the current media file.
|
|
final Stream<void> fileLoaded;
|
|
|
|
/// Emits when mpv starts loading a new file. This delimits load-scoped
|
|
/// readiness and failure signals for callers that arm before [Player.open].
|
|
final Stream<void> fileStarted;
|
|
|
|
/// Emits only when the active file ends because loading or playback failed.
|
|
/// Generic platform/property errors remain on [error] and must not be
|
|
/// mistaken for a media-open failure.
|
|
final Stream<void> fileLoadFailed;
|
|
|
|
/// Emits once mpv has discovered a non-external audio or video track for
|
|
/// the current file. Unlike [fileLoaded], this can fire before remote
|
|
/// subtitle sidecars finish opening.
|
|
final Stream<void> primaryMediaReady;
|
|
|
|
/// Stream of seekable buffer ranges from the demuxer cache.
|
|
final Stream<List<BufferRange>> bufferRanges;
|
|
|
|
/// Stream that emits when the native player backend switches (e.g., ExoPlayer to MPV).
|
|
/// Only emitted on Android when ExoPlayer encounters an unsupported format.
|
|
final Stream<void> backendSwitched;
|
|
|
|
/// Emits the URI the backend auto-advanced into after playing out the
|
|
/// current item, when a next item was pre-armed via [Player.setNext]
|
|
/// (gapless music). Only audio players emit this; the value is the armed
|
|
/// [Media.uri].
|
|
final Stream<String> trackTransition;
|
|
|
|
const PlayerStreams({
|
|
required this.playing,
|
|
required this.completed,
|
|
required this.buffering,
|
|
required this.position,
|
|
required this.duration,
|
|
required this.seekable,
|
|
required this.buffer,
|
|
required this.volume,
|
|
required this.rate,
|
|
required this.tracks,
|
|
required this.track,
|
|
required this.log,
|
|
required this.error,
|
|
required this.audioDevice,
|
|
required this.audioDevices,
|
|
required this.bufferRanges,
|
|
required this.playbackRestart,
|
|
this.fileLoaded = const Stream<void>.empty(),
|
|
this.fileStarted = const Stream<void>.empty(),
|
|
this.fileLoadFailed = const Stream<void>.empty(),
|
|
this.primaryMediaReady = const Stream<void>.empty(),
|
|
required this.backendSwitched,
|
|
this.trackTransition = const Stream<String>.empty(),
|
|
});
|
|
}
|