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: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<void> addTracks(List<InternalTrack> 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<void> _play() async {
@ -182,11 +195,20 @@ class _PlaybackService extends BackgroundAudioTask {
);
final _completer = Completer();
final List<InternalTrack> _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<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
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,

View file

@ -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]);
},
);
},