Start wiring up playback service

This commit is contained in:
Elias Projahn 2020-04-21 17:37:01 +02:00
parent be1a41a90e
commit 524a6d9994
2 changed files with 45 additions and 1 deletions

View file

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

View file

@ -47,7 +47,11 @@ class WorkScreen extends StatelessWidget {
return ListTile( return ListTile(
title: PerformancesText(recording.id), title: PerformancesText(recording.id),
onTap: () async { 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]);
}, },
); );
}, },