start method

Future<Stoppable> start({
  1. double volume = 1.0,
})

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;
  });
}