2020-04-11 20:23:02 +02:00
|
|
|
import 'dart:async';
|
2020-06-07 18:22:10 +02:00
|
|
|
import 'dart:ui';
|
2020-04-11 20:23:02 +02:00
|
|
|
|
|
|
|
import 'package:audio_service/audio_service.dart';
|
|
|
|
import 'package:just_audio/just_audio.dart';
|
2020-06-07 18:22:10 +02:00
|
|
|
import 'package:moor/isolate.dart';
|
|
|
|
import 'package:moor/moor.dart';
|
|
|
|
|
|
|
|
import 'moor_music_data_source.dart';
|
2020-04-11 20:23:02 +02:00
|
|
|
|
2020-04-16 08:04:34 +02:00
|
|
|
const String SET_QUEUE = 'SET_QUEUE';
|
|
|
|
|
2020-04-11 20:23:02 +02:00
|
|
|
class AudioPlayerTask extends BackgroundAudioTask {
|
|
|
|
final _audioPlayer = AudioPlayer();
|
|
|
|
final _completer = Completer();
|
2020-06-07 18:22:10 +02:00
|
|
|
MoorMusicDataSource _moorMusicDataSource;
|
2020-04-11 20:23:02 +02:00
|
|
|
|
|
|
|
final _mediaItems = <String, MediaItem>{};
|
2020-04-16 08:04:34 +02:00
|
|
|
final _queue = <MediaItem>[];
|
2020-04-11 20:23:02 +02:00
|
|
|
|
|
|
|
Duration _position;
|
|
|
|
|
|
|
|
@override
|
2020-06-03 21:17:08 +02:00
|
|
|
Future<void> onStart(Map<String, dynamic> params) async {
|
2020-04-11 20:23:02 +02:00
|
|
|
_audioPlayer.getPositionStream().listen((duration) => _position = duration);
|
|
|
|
|
2020-06-07 18:22:10 +02:00
|
|
|
final connectPort = IsolateNameServer.lookupPortByName(MOOR_ISOLATE);
|
|
|
|
final MoorIsolate moorIsolate = MoorIsolate.fromConnectPort(connectPort);
|
|
|
|
final DatabaseConnection databaseConnection = await moorIsolate.connect();
|
|
|
|
_moorMusicDataSource = MoorMusicDataSource.connect(databaseConnection);
|
|
|
|
|
2020-04-11 20:23:02 +02:00
|
|
|
await _completer.future;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void onStop() {
|
|
|
|
_audioPlayer.stop();
|
|
|
|
_completer.complete();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void onAddQueueItem(MediaItem mediaItem) {
|
|
|
|
_mediaItems[mediaItem.id] = mediaItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<void> onPlayFromMediaId(String mediaId) async {
|
|
|
|
AudioServiceBackground.setState(
|
|
|
|
controls: [pauseControl, stopControl],
|
2020-06-03 21:17:08 +02:00
|
|
|
playing: true,
|
|
|
|
processingState: AudioProcessingState.ready,
|
2020-04-11 20:23:02 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
await AudioServiceBackground.setMediaItem(_mediaItems[mediaId]);
|
|
|
|
await _audioPlayer.setFilePath(mediaId);
|
|
|
|
|
|
|
|
_audioPlayer.play();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<void> onPlay() async {
|
|
|
|
AudioServiceBackground.setState(
|
|
|
|
controls: [pauseControl, stopControl],
|
2020-06-03 21:17:08 +02:00
|
|
|
processingState: AudioProcessingState.ready,
|
|
|
|
updateTime: Duration(milliseconds: DateTime.now().millisecondsSinceEpoch),
|
|
|
|
position: _position,
|
|
|
|
playing: true,
|
2020-04-11 20:23:02 +02:00
|
|
|
);
|
|
|
|
_audioPlayer.play();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<void> onPause() async {
|
|
|
|
AudioServiceBackground.setState(
|
|
|
|
controls: [playControl, stopControl],
|
2020-06-03 21:17:08 +02:00
|
|
|
processingState: AudioProcessingState.ready,
|
|
|
|
updateTime: Duration(milliseconds: DateTime.now().millisecondsSinceEpoch),
|
|
|
|
position: _position,
|
|
|
|
playing: false,
|
2020-04-11 20:23:02 +02:00
|
|
|
);
|
|
|
|
await _audioPlayer.pause();
|
|
|
|
}
|
2020-04-16 08:04:34 +02:00
|
|
|
|
|
|
|
@override
|
|
|
|
Future<void> onCustomAction(String name, arguments) async {
|
|
|
|
switch (name) {
|
|
|
|
case SET_QUEUE:
|
2020-06-07 18:22:10 +02:00
|
|
|
return _setQueue(List<String>.from(arguments as List<dynamic>));
|
2020-04-16 08:04:34 +02:00
|
|
|
default:
|
|
|
|
}
|
|
|
|
}
|
2020-06-07 18:22:10 +02:00
|
|
|
|
|
|
|
Future<void> _setQueue(List<String> queue) async {
|
|
|
|
|
|
|
|
}
|
2020-04-11 20:23:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
MediaControl playControl = const MediaControl(
|
|
|
|
androidIcon: 'drawable/ic_action_play_arrow',
|
|
|
|
label: 'Play',
|
|
|
|
action: MediaAction.play,
|
|
|
|
);
|
|
|
|
MediaControl pauseControl = const MediaControl(
|
|
|
|
androidIcon: 'drawable/ic_action_pause',
|
|
|
|
label: 'Pause',
|
|
|
|
action: MediaAction.pause,
|
|
|
|
);
|
|
|
|
MediaControl stopControl = const MediaControl(
|
|
|
|
androidIcon: 'drawable/ic_action_stop',
|
|
|
|
label: 'Stop',
|
|
|
|
action: MediaAction.stop,
|
|
|
|
);
|