This commit is contained in:
lz_db
2026-10-25 11:46:44 +08:00
parent 893dfed0ed
commit 494f667719
63 changed files with 5213 additions and 239 deletions
+15
View File
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
import '../log/action_logger.dart';
import '../media/local_media_server.dart';
/// 一个播放槽位:Player + 视图控制器 + 当前绑定的视频
@@ -192,6 +193,10 @@ class FeedPlayerPool {
/// 只有 stop 能可靠断开下载;位置存到 _resumePosition,恢复时 rebind
/// 重新 open + seek 续播(分片走本地代理磁盘缓存,零流量)
void suspend() {
ActionLogger.I.log('player_suspend', page: 'feed_pool', detail: {
'generation': _generation,
'currentIndex': _currentIndex,
});
_suspended = true;
// 使在途 bindWindow 过期:其 open 完成后不得再 play
_generation++;
@@ -213,6 +218,11 @@ class FeedPlayerPool {
/// 挂起并 play。_suspended 必须在 await 之后才解除——否则等待期间 completed
/// listener 的 auto-loop 会因为看到 _suspended=false 而提前 play
Future<void> resume() async {
ActionLogger.I.log('player_resume', page: 'feed_pool', detail: {
'generation': _generation,
'currentIndex': _currentIndex,
'suspended': _suspended,
});
final pending = _pendingBind;
if (pending != null) {
try {
@@ -274,6 +284,11 @@ class FeedPlayerPool {
/// 与 pause 不同,stop 后缓存下载断开,且槽内无媒体不会幽灵出声。
/// 返回 Feed 后需重新 bindWindow 恢复当前页。
void stopAll() {
ActionLogger.I.log('player_stopall', page: 'feed_pool', detail: {
'generation': _generation,
'currentIndex': _currentIndex,
'slots': [for (final s in _slots) s.videoId],
});
// 使所有进行中的 bindWindow 过期(其 await 恢复后不会再 play)
_generation++;
// stopAll 后通常跟着 rebind 重新播放(如从登录页返回),解除挂起态