mirror of
https://github.com/johrpan/musicus_mobile.git
synced 2025-10-26 18:57: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: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,
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue