import 'dart:async'; import 'package:audio_session/audio_session.dart'; import 'package:flutter/foundation.dart'; import 'package:just_audio_background/just_audio_background.dart'; import 'package:just_audio/just_audio.dart'; class StreamingAudioBusinessObject extends ChangeNotifier { StreamingAudioBusinessObject({ this.streamUrl = 'https://kryz.out.airtime.pro/kryz_a', }) { _playerStateSubscription = _player.playerStateStream.listen((state) { final isCurrentlyPlaying = state.playing && state.processingState != ProcessingState.completed; if (_isPlaying != isCurrentlyPlaying) { _isPlaying = isCurrentlyPlaying; notifyListeners(); } }); } final String streamUrl; final AudioPlayer _player = AudioPlayer(); late final StreamSubscription _playerStateSubscription; bool _isSourceLoaded = false; bool _isPlaying = false; bool _isAudioSessionConfigured = false; bool get isPlaying => _isPlaying; Future _configureAudioSessionIfNeeded() async { if (_isAudioSessionConfigured) { return; } final session = await AudioSession.instance; await session.configure(const AudioSessionConfiguration.music()); _isAudioSessionConfigured = true; } Future play() async { await _configureAudioSessionIfNeeded(); if (!_isSourceLoaded) { await _player.setAudioSource( AudioSource.uri( Uri.parse(streamUrl), tag: const MediaItem( id: 'kryz-live-stream', title: 'KRYZ Live Stream', artist: 'KRYZ Radio', album: 'Live', ), ), ); _isSourceLoaded = true; } final session = await AudioSession.instance; await session.setActive(true); await _player.play(); } Future stop() async { await _player.stop(); } @override void dispose() { _playerStateSubscription.cancel(); _player.dispose(); super.dispose(); } }