spotube/lib/services/audio_player/audio_players_streams_mixin.dart
Kingkor Roy Tirtho 22a49e56a2
refactor: use tcp server based track matcher (#1386)
* refactor: remove SourcedTrack based audio player and utilize mediakit playback system

* feat: implement local (loopback) server to resolve stream source and leverage the media_kit playback API

* feat: add source change support and re-add prefetching tracks

* fix: assign lastId when track fetch completes regardless of error

* chore: remove print statements

* fix: remote queue not working

* fix: increase mpv network timeout to reduce auto-skipping

* fix: do not pre-fetch local tracks

* fix(proxy-playlist): reset collections on load

* chore: fix lint warnings

* fix(mobile): player overlay should not be visible when the player is not playing

* chore: fix typo in turkish translation

* cd: checkout PR branch

* cd: upgrade flutter version

* chore: fix lint errors
2024-04-11 17:56:41 +06:00

154 lines
4.3 KiB
Dart

part of 'audio_player.dart';
mixin SpotubeAudioPlayersStreams on AudioPlayerInterface {
// stream getters
Stream<Duration> get durationStream {
// if (mkSupportedPlatform) {
return _mkPlayer.stream.duration;
// } else {
// return _justAudio!.durationStream
// .where((event) => event != null)
// .map((event) => event!)
// ;
// }
}
Stream<Duration> get positionStream {
// if (mkSupportedPlatform) {
return _mkPlayer.stream.position;
// } else {
// return _justAudio!.positionStream;
// }
}
Stream<Duration> get bufferedPositionStream {
// if (mkSupportedPlatform) {
// audioplayers doesn't have the capability to get buffered position
return _mkPlayer.stream.buffer;
// } else {
// return _justAudio!.bufferedPositionStream;
// }
}
Stream<void> get completedStream {
// if (mkSupportedPlatform) {
return _mkPlayer.stream.completed;
// } else {
// return _justAudio!.playerStateStream
// .where(
// (event) => event.processingState == ja.ProcessingState.completed)
// ;
// }
}
/// Stream that emits when the player is almost (%) complete
Stream<int> percentCompletedStream(double percent) {
return positionStream
.asyncMap(
(position) async => (await duration)?.inSeconds == 0
? 0
: (position.inSeconds /
((await duration)?.inSeconds ?? 100) *
100)
.toInt(),
)
.where((event) => event >= percent);
}
Stream<bool> get playingStream {
// if (mkSupportedPlatform) {
return _mkPlayer.stream.playing;
// } else {
// return _justAudio!.playingStream;
// }
}
Stream<bool> get shuffledStream {
// if (mkSupportedPlatform) {
return _mkPlayer.shuffleStream;
// } else {
// return _justAudio!.shuffleModeEnabledStream;
// }
}
Stream<PlaybackLoopMode> get loopModeStream {
// if (mkSupportedPlatform) {
return _mkPlayer.stream.playlistMode.map(PlaybackLoopMode.fromPlaylistMode);
// } else {
// return _justAudio!.loopModeStream
// .map(PlaybackLoopMode.fromLoopMode)
// ;
// }
}
Stream<double> get volumeStream {
// if (mkSupportedPlatform) {
return _mkPlayer.stream.volume.map((event) => event / 100);
// } else {
// return _justAudio!.volumeStream;
// }
}
Stream<bool> get bufferingStream {
// if (mkSupportedPlatform) {
return Stream.value(false);
// } else {
// return _justAudio!.playerStateStream
// .map(
// (event) =>
// event.processingState == ja.ProcessingState.buffering ||
// event.processingState == ja.ProcessingState.loading,
// )
// ;
// }
}
Stream<AudioPlaybackState> get playerStateStream {
// if (mkSupportedPlatform) {
return _mkPlayer.playerStateStream;
// } else {
// return _justAudio!.playerStateStream
// .map(AudioPlaybackState.fromJaPlayerState)
// ;
// }
}
Stream<int> get currentIndexChangedStream {
// if (mkSupportedPlatform) {
return _mkPlayer.indexChangeStream;
// } else {
// return _justAudio!.sequenceStateStream
// .map((event) => event?.currentIndex ?? -1)
// ;
// }
}
Stream<String> get activeSourceChangedStream {
// if (mkSupportedPlatform) {
return _mkPlayer.indexChangeStream
.map((event) {
return _mkPlayer.state.playlist.medias.elementAtOrNull(event)?.uri;
})
.where((event) => event != null)
.cast<String>();
// } else {
// return _justAudio!.sequenceStateStream
// .map((event) {
// return (event?.currentSource as ja.UriAudioSource?)?.uri.toString();
// })
// .where((event) => event != null)
// .cast<String>();
// }
}
Stream<List<mk.AudioDevice>> get devicesStream =>
_mkPlayer.stream.audioDevices.asBroadcastStream();
Stream<mk.AudioDevice> get selectedDeviceStream =>
_mkPlayer.stream.audioDevice.asBroadcastStream();
Stream<String> get errorStream => _mkPlayer.stream.error;
Stream<mk.Playlist> get playlistStream => _mkPlayer.stream.playlist;
}