mucke/lib/presentation/state/audio_store.dart

202 lines
5.5 KiB
Dart
Raw Normal View History

2020-04-07 22:06:43 +02:00
import 'package:meta/meta.dart';
import 'package:mobx/mobx.dart';
import '../../domain/entities/album.dart';
import '../../domain/entities/artist.dart';
2020-12-19 12:22:57 +01:00
import '../../domain/entities/loop_mode.dart';
2020-08-25 16:23:52 +02:00
import '../../domain/entities/shuffle_mode.dart';
2020-04-07 22:06:43 +02:00
import '../../domain/entities/song.dart';
2021-02-26 22:07:18 +01:00
import '../../domain/repositories/audio_player_repository.dart';
2021-03-06 19:09:19 +01:00
import '../../domain/usecases/add_to_queue.dart';
import '../../domain/usecases/move_queue_item.dart';
2021-02-26 22:07:18 +01:00
import '../../domain/usecases/pause.dart';
import '../../domain/usecases/play.dart';
2021-04-16 18:58:27 +02:00
import '../../domain/usecases/play_album.dart';
import '../../domain/usecases/play_artist.dart';
2021-03-06 19:09:19 +01:00
import '../../domain/usecases/play_next.dart';
2021-02-26 22:07:18 +01:00
import '../../domain/usecases/play_songs.dart';
2021-03-06 19:09:19 +01:00
import '../../domain/usecases/remove_queue_index.dart';
import '../../domain/usecases/seek_to_index.dart';
2021-02-26 22:07:18 +01:00
import '../../domain/usecases/seek_to_next.dart';
import '../../domain/usecases/seek_to_previous.dart';
import '../../domain/usecases/set_loop_mode.dart';
2021-03-06 19:09:19 +01:00
import '../../domain/usecases/set_shuffle_mode.dart';
2021-02-26 22:07:18 +01:00
import '../../domain/usecases/shuffle_all.dart';
2020-04-07 22:06:43 +02:00
part 'audio_store.g.dart';
class AudioStore extends _AudioStore with _$AudioStore {
2020-11-15 16:36:50 +01:00
AudioStore({
2021-03-06 19:09:19 +01:00
@required AddToQueue addToQueue,
@required MoveQueueItem moveQueueItem,
2021-02-26 22:07:18 +01:00
@required Pause pause,
@required Play play,
2021-04-16 18:58:27 +02:00
@required PlayAlbum playAlbum,
@required PlayArtist playArtist,
2021-03-06 19:09:19 +01:00
@required PlayNext playNext,
2021-02-26 22:07:18 +01:00
@required PlaySongs playSongs,
2021-03-06 19:09:19 +01:00
@required RemoveQueueIndex removeQueueIndex,
@required SeekToIndex seekToIndex,
2021-02-26 22:07:18 +01:00
@required SeekToNext seekToNext,
@required SeekToPrevious seekToPrevious,
@required SetLoopMode setLoopMode,
2021-03-06 19:09:19 +01:00
@required SetShuffleMode setShuffleMode,
2021-02-26 22:07:18 +01:00
@required ShuffleAll shuffleAll,
@required AudioPlayerInfoRepository audioPlayerInfoRepository,
2021-03-06 19:09:19 +01:00
}) : super(
addToQueue,
moveQueueItem,
playSongs,
audioPlayerInfoRepository,
pause,
play,
2021-04-16 18:58:27 +02:00
playAlbum,
playArtist,
2021-03-06 19:09:19 +01:00
playNext,
removeQueueIndex,
seekToIndex,
seekToNext,
seekToPrevious,
setLoopMode,
setShuffleMode,
shuffleAll,
);
2020-04-07 22:06:43 +02:00
}
abstract class _AudioStore with Store {
2021-02-26 22:07:18 +01:00
_AudioStore(
2021-03-06 19:09:19 +01:00
this._addToQueue,
this._moveQueueItem,
2021-02-26 22:07:18 +01:00
this._playSongs,
this._audioPlayerInfoRepository,
this._pause,
this._play,
2021-04-16 18:58:27 +02:00
this._playAlbum,
this._playArtist,
2021-03-06 19:09:19 +01:00
this._playNext,
this._removeQueueIndex,
this._seekToIndex,
2021-02-26 22:07:18 +01:00
this._seekToNext,
this._seekToPrevious,
this._setLoopMode,
2021-03-06 19:09:19 +01:00
this._setShuffleMode,
2021-02-26 22:07:18 +01:00
this._shuffleAll,
) {
currentPositionStream = _audioPlayerInfoRepository.positionStream
.asObservable(initialValue: const Duration(seconds: 0));
2020-09-19 17:08:48 +02:00
2021-03-06 19:09:19 +01:00
queueStream = _audioPlayerInfoRepository.queueStream.asObservable();
2020-09-19 17:08:48 +02:00
2021-02-26 22:07:18 +01:00
queueIndexStream = _audioPlayerInfoRepository.currentIndexStream.asObservable();
2020-09-19 17:08:48 +02:00
2021-02-26 22:07:18 +01:00
currentSongStream = _audioPlayerInfoRepository.currentSongStream.asObservable();
2021-02-26 22:07:18 +01:00
shuffleModeStream = _audioPlayerInfoRepository.shuffleModeStream.asObservable();
2020-09-19 17:08:48 +02:00
2021-02-26 22:07:18 +01:00
loopModeStream = _audioPlayerInfoRepository.loopModeStream.asObservable();
2020-12-19 12:22:57 +01:00
2021-02-26 22:07:18 +01:00
playingStream = _audioPlayerInfoRepository.playingStream.asObservable();
2020-09-19 17:08:48 +02:00
}
2020-04-07 22:06:43 +02:00
2021-02-26 22:07:18 +01:00
final AudioPlayerInfoRepository _audioPlayerInfoRepository;
2021-03-06 19:09:19 +01:00
final AddToQueue _addToQueue;
final MoveQueueItem _moveQueueItem;
2021-02-26 22:07:18 +01:00
final Pause _pause;
final Play _play;
2021-04-16 18:58:27 +02:00
final PlayAlbum _playAlbum;
final PlayArtist _playArtist;
2021-03-06 19:09:19 +01:00
final PlayNext _playNext;
2021-02-26 22:07:18 +01:00
final PlaySongs _playSongs;
2021-03-06 19:09:19 +01:00
final RemoveQueueIndex _removeQueueIndex;
final SeekToIndex _seekToIndex;
2021-02-26 22:07:18 +01:00
final SeekToNext _seekToNext;
final SeekToPrevious _seekToPrevious;
final SetLoopMode _setLoopMode;
2021-03-06 19:09:19 +01:00
final SetShuffleMode _setShuffleMode;
2021-02-26 22:07:18 +01:00
final ShuffleAll _shuffleAll;
2020-04-07 22:06:43 +02:00
@observable
ObservableStream<Song> currentSongStream;
2020-11-15 16:36:50 +01:00
2020-04-10 20:12:26 +02:00
@observable
2021-02-26 22:07:18 +01:00
ObservableStream<bool> playingStream;
2020-04-10 20:12:26 +02:00
2020-04-11 20:23:02 +02:00
@observable
2021-02-26 22:07:18 +01:00
ObservableStream<Duration> currentPositionStream;
2020-04-11 20:23:02 +02:00
2021-03-06 19:09:19 +01:00
// beware that this only triggers reactions when a new list (new reference) is set
// doesn't work if the same reference is added to BehaviorSubject
2020-07-12 18:25:34 +02:00
@observable
ObservableStream<List<Song>> queueStream;
@observable
ObservableStream<int> queueIndexStream;
2020-08-24 16:43:22 +02:00
@observable
ObservableStream<ShuffleMode> shuffleModeStream;
2020-12-19 12:22:57 +01:00
@observable
ObservableStream<LoopMode> loopModeStream;
2020-04-07 22:06:43 +02:00
Future<void> playSong(int index, List<Song> songList) async {
2021-02-26 22:07:18 +01:00
_playSongs(songs: songList, initialIndex: index);
2020-04-07 22:06:43 +02:00
}
2020-04-10 20:12:26 +02:00
Future<void> play() async {
2021-02-26 22:07:18 +01:00
_play();
2020-04-10 20:12:26 +02:00
}
Future<void> pause() async {
2021-02-26 22:07:18 +01:00
_pause();
2020-04-10 20:12:26 +02:00
}
2020-07-12 18:25:34 +02:00
Future<void> skipToNext() async {
2021-02-26 22:07:18 +01:00
_seekToNext();
2020-07-12 18:25:34 +02:00
}
Future<void> skipToPrevious() async {
2021-02-26 22:07:18 +01:00
_seekToPrevious();
2020-07-12 18:25:34 +02:00
}
2021-03-06 19:09:19 +01:00
Future<void> seekToIndex(int index) async {
_seekToIndex(index);
2020-12-24 11:20:22 +01:00
}
2020-08-24 16:43:22 +02:00
Future<void> setShuffleMode(ShuffleMode shuffleMode) async {
2021-03-06 19:09:19 +01:00
_setShuffleMode(shuffleMode);
2020-08-24 16:43:22 +02:00
}
2020-12-19 12:22:57 +01:00
Future<void> setLoopMode(LoopMode loopMode) async {
2021-02-26 22:07:18 +01:00
_setLoopMode(loopMode);
2020-12-19 12:22:57 +01:00
}
2020-08-25 16:23:52 +02:00
Future<void> shuffleAll() async {
2021-02-26 22:07:18 +01:00
_shuffleAll();
2020-08-25 16:23:52 +02:00
}
2020-10-25 11:54:11 +01:00
Future<void> addToQueue(Song song) async {
2021-03-06 19:09:19 +01:00
_addToQueue(song);
}
Future<void> playNext(Song song) async {
_playNext(song);
2020-10-25 11:54:11 +01:00
}
Future<void> moveQueueItem(int oldIndex, int newIndex) async {
2021-03-06 19:09:19 +01:00
_moveQueueItem(oldIndex, newIndex);
2020-10-25 11:54:11 +01:00
}
2020-12-08 20:54:41 +01:00
Future<void> removeQueueIndex(int index) async {
2021-03-06 19:09:19 +01:00
_removeQueueIndex(index);
2020-10-25 11:54:11 +01:00
}
Future<void> playAlbum(Album album) async {
2021-04-16 18:58:27 +02:00
_playAlbum(album);
}
Future<void> shuffleArtist(Artist artist) async {
2021-04-16 18:58:27 +02:00
_playArtist(artist);
}
2020-04-10 20:12:26 +02:00
}