diff --git a/musicus/lib/player.dart b/musicus/lib/player.dart index 0c4ac46..318017e 100644 --- a/musicus/lib/player.dart +++ b/musicus/lib/player.dart @@ -1,8 +1,12 @@ import 'dart:async'; +import 'dart:convert'; import 'package:audio_service/audio_service.dart'; +import 'package:musicus_player/musicus_player.dart'; import 'package:rxdart/rxdart.dart'; +import 'music_library.dart'; + /// Entrypoint for the playback service. void _playbackServiceEntrypoint() { AudioServiceBackground.run(() => _PlaybackService()); @@ -121,6 +125,15 @@ class Player { } } + /// Add a list of tracks to the players playlist. + Future addTracks(List tracks) async { + if (!AudioService.running) { + await start(); + } + + await AudioService.customAction('addTracks', jsonEncode(tracks)); + } + /// Regularly update [_positionMs] while playing. // TODO: Maybe find a better approach on handling this. Future _play() async { @@ -182,11 +195,20 @@ class _PlaybackService extends BackgroundAudioTask { ); final _completer = Completer(); + final List _playlist = []; + MusicusPlayer _player; + int _currentTrack = 0; int _position; int _updateTime; bool _playing = false; + _PlaybackService() { + _player = MusicusPlayer(onComplete: () { + // TODO: Go to next track. + }); + } + void _setPosition(int position) { _position = position; _updateTime = DateTime.now().millisecondsSinceEpoch; @@ -212,10 +234,25 @@ class _PlaybackService extends BackgroundAudioTask { await _completer.future; } + @override + void onCustomAction(String name, dynamic arguments) { + super.onCustomAction(name, arguments); + + // addTracks expects a List> as its argument. + if (name == 'addTracks') { + final tracksJson = jsonDecode(arguments); + final List tracks = List.castFrom( + tracksJson.map((j) => InternalTrack.fromJson(j)).toList()); + _playlist.addAll(tracks); + _player.setUri(tracks.first.uri); + } + } + @override void onPlay() { super.onPlay(); + _player.play(); _playing = true; _setState(); } @@ -224,6 +261,7 @@ class _PlaybackService extends BackgroundAudioTask { void onPause() { super.onPause(); + _player.pause(); _playing = false; _setState(); } @@ -238,6 +276,8 @@ class _PlaybackService extends BackgroundAudioTask { @override void onStop() { + _player.stop(); + AudioServiceBackground.setState( controls: [], basicState: BasicPlaybackState.stopped, diff --git a/musicus/lib/screens/work.dart b/musicus/lib/screens/work.dart index 7b5028e..59563c7 100644 --- a/musicus/lib/screens/work.dart +++ b/musicus/lib/screens/work.dart @@ -47,7 +47,11 @@ class WorkScreen extends StatelessWidget { return ListTile( title: PerformancesText(recording.id), onTap: () async { - // TODO: Play recording. + final tracks = backend.ml.tracks[recording.id]; + tracks.sort( + (t1, t2) => t1.track.index.compareTo(t2.track.index)); + + backend.player.addTracks(backend.ml.tracks[recording.id]); }, ); },