import 'dart:async'; import 'package:aves/model/entry.dart'; import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/widgets/viewer/video/controller.dart'; import 'package:aves/widgets/viewer/video/fijkplayer.dart'; import 'package:collection/collection.dart'; class VideoConductor { final List _controllers = []; final List _subscriptions = []; static const _defaultMaxControllerCount = 3; VideoConductor(); Future dispose() async { await disposeAll(); _subscriptions ..forEach((sub) => sub.cancel()) ..clear(); _controllers.clear(); if (settings.keepScreenOn == KeepScreenOn.videoPlayback) { await windowService.keepScreenOn(false); } } AvesVideoController getOrCreateController(AvesEntry entry, {int? maxControllerCount}) { var controller = getController(entry); if (controller != null) { _controllers.remove(controller); } else { controller = IjkPlayerAvesVideoController(entry, persistPlayback: true); _subscriptions.add(controller.statusStream.listen(_onControllerStatusChanged)); } _controllers.insert(0, controller); while (_controllers.length > (maxControllerCount ?? _defaultMaxControllerCount)) { _controllers.removeLast().dispose(); } return controller; } AvesVideoController? getController(AvesEntry entry) { return _controllers.firstWhereOrNull((c) => c.entry.uri == entry.uri && c.entry.pageId == entry.pageId); } Future _onControllerStatusChanged(VideoStatus status) async { if (settings.keepScreenOn == KeepScreenOn.videoPlayback) { await windowService.keepScreenOn(status == VideoStatus.playing); } } Future _applyToAll(FutureOr Function(AvesVideoController controller) action) => Future.forEach(_controllers, action); Future disposeAll() => _applyToAll((controller) => controller.dispose()); Future pauseAll() => _applyToAll((controller) => controller.pause()); Future muteAll(bool muted) => _applyToAll((controller) => controller.mute(muted)); }