Tomas Baran
Tomas Baran

Reputation: 1983

Audio not looping in the background

My implementation loops in the foreground. It also works in the background. The issue is it does NOT loop in the background. The issue happens only on iOS physical device (not on Simulator, nor Android).

I'm using https://pub.dev/packages/audioplayers plugin since https://pub.dev/packages/just_audio was giving me all sorts of troubles especially with badly done audio caching which in the end always made every audio delay in the beginning of a track which was a no go for my case.

This is my audio_player_handler.dart file:

import 'package:ambee2/models/animations/light_animation.dart';
import 'package:audio_service/audio_service.dart';
import 'package:flutter/material.dart';
// import 'package:just_audio/just_audio.dart';
import 'package:audioplayers/audioplayers.dart';

class AudioPlayerHandler extends BaseAudioHandler {
  final _player = AudioPlayer();

  AudioPlayerHandler() {
    //set the audio to repeat itself once it's done
    _player.setReleaseMode(ReleaseMode.LOOP);
  }

  Future<void> setUrl(String url) async => await _player.setUrl(url);

  Future<void> playUrl(String url, double volumeValue) => _player.play(url, volume: volumeValue);

  Future<void> resume() => _player.resume();

  @override
  Future<void> pause() => _player.pause();

  @override
  Future<void> stop() => _player.stop();

  Future<void> setVolume(double newValue) => _player.setVolume(newValue);
}

I also have objects called: LightAnimation that has a property audioHandler defined like this:

class LightAnimation {
  AudioPlayerHandler audioHandler = AudioPlayerHandler();

  LightAnimation({
    this.audioUrl,
  });
}

Then I just access from a different part of my codebase like this:

await lightAnimation.audioHandler.playUrl(lightAnimation.audioUrl, volumeSetValue);

Is my implementation wrong or is it just bug on a package side (https://pub.dev/packages/audioplayers)?

Upvotes: 2

Views: 1145

Answers (2)

XiaoHui
XiaoHui

Reputation: 73

In my case it worked in IOS background physical devices. I followed this tutorial by Suragch. Check out his final repo.

In audio_handler.dart

@override
Future<void> setRepeatMode(AudioServiceRepeatMode repeatMode) async {
    switch (repeatMode) {
      case AudioServiceRepeatMode.none:
        _player.setLoopMode(LoopMode.off);
        break;
      case AudioServiceRepeatMode.one:
        _player.setLoopMode(LoopMode.one);
        break;
      case AudioServiceRepeatMode.group:
      case AudioServiceRepeatMode.all:
        _player.setLoopMode(LoopMode.all);
        break;
    }
  }

In page_manager.dart

  void repeat() {
    repeatButtonNotifier.nextState();
    final repeatMode = repeatButtonNotifier.value;
    switch (repeatMode) {
      case RepeatState.off:
        _audioHandler.setRepeatMode(AudioServiceRepeatMode.none);
        break;
      case RepeatState.repeatSong:
        _audioHandler.setRepeatMode(AudioServiceRepeatMode.one);
        break;
      case RepeatState.repeatPlaylist:
        _audioHandler.setRepeatMode(AudioServiceRepeatMode.all);
        break;
}

You can customize repeat() as your needs.

_audioHandler.setRepeatMode(AudioServiceRepeatMode.one)

Upvotes: 1

Michele Volpato
Michele Volpato

Reputation: 760

I am not an expert of audioplayers, but you can try to add the override

@override
  Future<void> setRepeatMode(AudioServiceRepeatMode repeatMode) async {
    var releaseMode = ReleaseMode.LOOP;
    switch(repeatMode) {
       ...
       // update releaseMode here
    }
    await _player.setReleaseMode(releaseMode);
}

But I doubt this will solve the problem.

Upvotes: 0

Related Questions