waitUntilStopped method

Future<bool> waitUntilStopped({
  1. Duration startTimeout = const Duration(seconds: 3),
  2. Duration timeout = const Duration(minutes: 2),
  3. bool forceStopOnTimeout = true,
})
inherited

Wait until playback stops/completes

Flow:

  1. If not already playing, first waits for start (with startTimeout).
  2. Resolves when either:

Returns true if it stopped/completed before timeout. Throws UnsupportedError if releaseMode=loop or the channel supports multiple concurrent players (e.g., pooling).

Implementation

Future<bool> waitUntilStopped({
  Duration startTimeout = const Duration(seconds: 3),
  Duration timeout = const Duration(minutes: 2),
  bool forceStopOnTimeout = true,
}) async {
  ensureWaitSupported('waitUntilStopped');

  if (!_isPlaying) {
    final started = await waitUntilStarted(timeout: startTimeout);
    if (!started) return false;
  }

  try {
    await Future.any([
      onPlayerComplete.first,
      onIsPlayingChanged.where((v) => v == false).first,
    ]).timeout(timeout);
    return true;
  } on TimeoutException {
    FiftyAudioLogger.log('waitUntilStopped() timed out.');
    if (forceStopOnTimeout) {
      await stop();
    }
    return false;
  }
}