import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request_helper.dart'; import 'package:just_audio/just_audio.dart'; class VoiceService { static final audioPlayer = AudioPlayer(); static int? index; static ConcatenatingAudioSource? _playlist; VoiceService({required final List audios}) { _playlist = ConcatenatingAudioSource( // Start loading next item just before reaching it useLazyPreparation: true, // Customise the shuffle algorithm shuffleOrder: DefaultShuffleOrder(), // Specify the playlist items children: audios, ); } static Future getDuration({ required String src, }) async { if (src.startsWith('/uploads')) { return await audioPlayer.setUrl( '${RequestHelper.baseUrl + src}?accessToken=${RequestService.token}'); } else if (src.startsWith('blob:')) { return await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(src))); } else { return await audioPlayer.setFilePath(src); } } static Future voiceHelper({required int index}) async { try { if (VoiceService.index == index) { if (audioPlayer.playerState == PlayerState(true, ProcessingState.ready)) { await audioPlayer.pause(); } else { await audioPlayer.play(); } return true; } VoiceService.index = index; await audioPlayer.setAudioSource(_playlist!, initialIndex: index, initialPosition: Duration.zero); await audioPlayer .setLoopMode(LoopMode.off); // Set playlist to loop (off|all|one) await audioPlayer.play(); return true; } catch (e) { resetVoicePlayer(); // rethrow; return false; } } static Future resetVoicePlayer() async { index = null; await audioPlayer.stop(); } }