mucke/lib/domain/actors/audio_player_actor.dart

58 lines
1.9 KiB
Dart
Raw Normal View History

2021-02-26 22:07:18 +01:00
import '../entities/song.dart';
import '../repositories/audio_player_repository.dart';
2021-04-18 13:46:16 +02:00
import '../repositories/music_data_repository.dart';
2021-02-26 22:07:18 +01:00
import '../usecases/handle_playback_state.dart';
2021-05-02 12:39:31 +02:00
import '../usecases/increment_play_count.dart';
2021-02-26 22:07:18 +01:00
import '../usecases/set_current_song.dart';
class AudioPlayerActor {
2021-05-02 12:39:31 +02:00
AudioPlayerActor(
this._audioPlayerRepository,
this._musicDataInfoRepository,
this._handlePlaybackEvent,
this._incrementPlayCount,
this._setCurrentSong,
) {
2021-04-18 13:46:16 +02:00
_audioPlayerRepository.currentSongStream.listen(_handleCurrentSong);
_audioPlayerRepository.playbackEventStream.listen(_handlePlaybackEvent);
2021-05-02 12:39:31 +02:00
_audioPlayerRepository.positionStream
.listen((duration) => _handlePosition(duration, _currentSong));
2021-04-18 13:46:16 +02:00
_musicDataInfoRepository.songUpdateStream.listen(_handleSongUpdate);
2021-02-26 22:07:18 +01:00
}
2021-04-18 13:46:16 +02:00
// TODO: is this against a previous design choice? only direct "read" access to repos?
2021-05-02 12:39:31 +02:00
// Should this actor only listen to AudioPlayer events? --> move song update to new actor?
2021-04-18 13:46:16 +02:00
final AudioPlayerRepository _audioPlayerRepository;
final MusicDataInfoRepository _musicDataInfoRepository;
2021-02-26 22:07:18 +01:00
final HandlePlaybackEvent _handlePlaybackEvent;
2021-05-02 12:39:31 +02:00
final IncrementPlayCount _incrementPlayCount;
2021-02-26 22:07:18 +01:00
final SetCurrentSong _setCurrentSong;
2021-05-02 12:39:31 +02:00
Song _currentSong;
bool _countSongPlayback = false;
Future<void> _handleCurrentSong(Song song) async {
_currentSong = song;
return _setCurrentSong(song);
}
void _handlePosition(Duration position, Song song) {
if (song == null || position == null) return;
final int pos = position.inMilliseconds;
if (pos < song.duration * 0.05) {
_countSongPlayback = true;
} else if (pos > song.duration * 0.95 && _countSongPlayback) {
_countSongPlayback = false;
_incrementPlayCount(song);
}
}
2021-04-18 13:46:16 +02:00
void _handleSongUpdate(Map<String, Song> songs) {
_audioPlayerRepository.updateSongs(songs);
}
2021-05-02 12:39:31 +02:00
}