start method
Starts playing the audio, returns a function that can stop the audio.
Implementation
Future<Stoppable> start({double volume = 1.0}) async {
return _lock.synchronized(() async {
if (_availablePlayers.isEmpty) {
_availablePlayers.add(await _createNewAudioPlayer());
}
final player = _availablePlayers.removeAt(0);
_currentPlayers[player.playerId] = player;
await player.setVolume(volume);
await player.resume();
late StreamSubscription<void> subscription;
void stop() {
_lock.synchronized(() async {
final p = _currentPlayers.remove(player.playerId);
if (p != null) {
subscription.cancel();
await p.stop();
if (_availablePlayers.length >= maxPlayers) {
await p.release();
} else {
_availablePlayers.add(p);
}
}
});
}
subscription = player.onPlayerComplete.listen((_) => stop());
return stop;
});
}