mirror of
https://github.com/johrpan/musicus_mobile.git
synced 2025-10-26 10:47:25 +01:00
Start wiring up playback service
This commit is contained in:
parent
be1a41a90e
commit
524a6d9994
2 changed files with 45 additions and 1 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
},
|
||||
);
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue