// lib/services/audio_service.dart import 'dart:async'; import 'package:flutter/material.dart'; import 'playback_service.dart'; class Song { final String id; final String title; final String artist; final String? url; Song({ required this.id, required this.title, required this.artist, this.url, }); } class AudioService extends ChangeNotifier { Song? _currentSong; bool _isPlaying = false; Duration _position = Duration.zero; Duration _duration = Duration.zero; Duration _bufferedPosition = Duration.zero; // ✅ 新增:缓冲位置 bool _listening = false; final List _subscriptions = []; Song? get currentSong => _currentSong; bool get isPlaying => _isPlaying; Duration get position => _position; Duration get duration => _duration; Duration get bufferedPosition => _bufferedPosition; // ✅ 新增 getter Future playSong(Song song) async { _currentSong = song; _position = Duration.zero; _duration = Duration.zero; _bufferedPosition = Duration.zero; _startListening(); notifyListeners(); if (song.url == null || song.url!.isEmpty) { return; } await PlaybackService().play(song.url!); } void togglePlay() { if (_currentSong == null) return; if (_isPlaying) { PlaybackService().pause(); } else { PlaybackService().resume(); } } void stopPlay() { _currentSong = null; _isPlaying = false; _position = Duration.zero; _duration = Duration.zero; _bufferedPosition = Duration.zero; _stopListening(); notifyListeners(); } void seekTo(Duration position) { PlaybackService().seek(position); _position = position; notifyListeners(); } void _startListening() { if (_listening) return; _listening = true; final player = PlaybackService().player; _subscriptions.add( player.stream.playing.listen((playing) { if (_isPlaying != playing) { _isPlaying = playing; notifyListeners(); } }), ); _subscriptions.add( player.stream.position.listen((position) { if (_position != position) { _position = position; notifyListeners(); } }), ); _subscriptions.add( player.stream.duration.listen((duration) { if (_duration != duration) { _duration = duration; notifyListeners(); } }), ); // ✅ 新增:监听缓冲位置 _subscriptions.add( player.stream.buffer.listen((buffer) { if (_bufferedPosition != buffer) { _bufferedPosition = buffer; notifyListeners(); } }), ); } void _stopListening() { _listening = false; for (final subscription in _subscriptions) { subscription.cancel(); } _subscriptions.clear(); } }