From 66f00d192f06b43eed741d359593e16940946abc Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sat, 1 Nov 2025 08:04:33 +0100 Subject: [PATCH] fix: buffer size not working --- lib/screens/settings_screen.dart | 38 +++++----------- lib/screens/video_player_screen.dart | 66 ++++++++++++++++++---------- lib/services/settings_service.dart | 28 ++++-------- 3 files changed, 63 insertions(+), 69 deletions(-) diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 78808679..ac32a9ed 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -22,8 +22,7 @@ class _SettingsScreenState extends State { bool _enableDebugLogging = false; bool _enableHardwareDecoding = true; - int _videoBufferSize = 64; - int _audioBufferSize = 8; + int _bufferSize = 128; @override void initState() { @@ -38,8 +37,7 @@ class _SettingsScreenState extends State { setState(() { _enableDebugLogging = _settingsService.getEnableDebugLogging(); _enableHardwareDecoding = _settingsService.getEnableHardwareDecoding(); - _videoBufferSize = _settingsService.getVideoBufferSize(); - _audioBufferSize = _settingsService.getAudioBufferSize(); + _bufferSize = _settingsService.getBufferSize(); _isLoading = false; }); } @@ -134,17 +132,10 @@ class _SettingsScreenState extends State { ), ListTile( leading: const Icon(Icons.memory), - title: const Text('Video Buffer Size'), - subtitle: Text('${_videoBufferSize}MB'), + title: const Text('Buffer Size'), + subtitle: Text('${_bufferSize}MB'), trailing: const Icon(Icons.chevron_right), - onTap: () => _showBufferSizeDialog(true), - ), - ListTile( - leading: const Icon(Icons.audiotrack), - title: const Text('Audio Buffer Size'), - subtitle: Text('${_audioBufferSize}MB'), - trailing: const Icon(Icons.chevron_right), - onTap: () => _showBufferSizeDialog(false), + onTap: () => _showBufferSizeDialog(), ), ], ), @@ -298,35 +289,28 @@ class _SettingsScreenState extends State { ); } - void _showBufferSizeDialog(bool isVideo) { - final currentSize = isVideo ? _videoBufferSize : _audioBufferSize; - final title = isVideo ? 'Video Buffer Size' : 'Audio Buffer Size'; - final options = isVideo ? [16, 32, 64, 128, 256] : [2, 4, 8, 16, 32]; + void _showBufferSizeDialog() { + final options = [64, 128, 256, 512, 1024]; showDialog( context: context, builder: (BuildContext context) { return AlertDialog( - title: Text(title), + title: const Text('Buffer Size'), content: Column( mainAxisSize: MainAxisSize.min, children: options.map((size) { return ListTile( leading: Icon( - currentSize == size + _bufferSize == size ? Icons.radio_button_checked : Icons.radio_button_unchecked, ), title: Text('${size}MB'), onTap: () { setState(() { - if (isVideo) { - _videoBufferSize = size; - _settingsService.setVideoBufferSize(size); - } else { - _audioBufferSize = size; - _settingsService.setAudioBufferSize(size); - } + _bufferSize = size; + _settingsService.setBufferSize(size); }); Navigator.pop(context); }, diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index ee466b1a..38e3e171 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -10,6 +10,7 @@ import '../utils/provider_extensions.dart'; import '../widgets/plex_video_controls.dart'; import '../utils/language_codes.dart'; import '../utils/app_logger.dart'; +import '../services/settings_service.dart'; class VideoPlayerScreen extends StatefulWidget { final PlexMetadata metadata; @@ -61,27 +62,8 @@ class _VideoPlayerScreenState extends State { appLogger.d('Preferred subtitle track: $subtitleDesc'); } - // Create player and controller - player = Player(configuration: PlayerConfiguration(libass: true)); - controller = VideoController(player); - - // Get the video URL and start playback - _startPlayback(); - - // Set fullscreen mode and landscape orientation - _setLandscapeOrientation(); - - // Listen to playback state changes - player.stream.playing.listen(_onPlayingStateChanged); - - // Listen to completion - player.stream.completed.listen(_onVideoCompleted); - - // Start periodic progress updates - _startProgressTracking(); - - // Load next/previous episodes - _loadAdjacentEpisodes(); + // Initialize player asynchronously with buffer size from settings + _initializePlayer(); } @override @@ -108,6 +90,40 @@ class _VideoPlayerScreenState extends State { ]); } + Future _initializePlayer() async { + // Load buffer size from settings + final settingsService = await SettingsService.getInstance(); + final bufferSizeMB = settingsService.getBufferSize(); + final bufferSizeBytes = bufferSizeMB * 1024 * 1024; + + // Create player with configuration + player = Player( + configuration: PlayerConfiguration( + libass: true, + bufferSize: bufferSizeBytes, + ), + ); + controller = VideoController(player); + + // Get the video URL and start playback + _startPlayback(); + + // Set fullscreen mode and landscape orientation + _setLandscapeOrientation(); + + // Listen to playback state changes + player.stream.playing.listen(_onPlayingStateChanged); + + // Listen to completion + player.stream.completed.listen(_onVideoCompleted); + + // Start periodic progress updates + _startProgressTracking(); + + // Load next/previous episodes + _loadAdjacentEpisodes(); + } + Future _loadAdjacentEpisodes() async { if (widget.metadata.type.toLowerCase() != 'episode') { return; @@ -682,7 +698,13 @@ class _VideoPlayerScreenState extends State { @override Widget build(BuildContext context) { return PopScope( - canPop: true, + canPop: false, // Disable swipe-back gesture to prevent interference with timeline scrubbing + onPopInvokedWithResult: (didPop, result) { + // Allow programmatic back navigation from UI controls + if (!didPop) { + Navigator.of(context).pop(true); + } + }, child: Scaffold( backgroundColor: Colors.black, body: Stack( diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index a451d286..01668be8 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -8,8 +8,7 @@ enum ThemeMode { system, light, dark } class SettingsService { static const String _keyThemeMode = 'theme_mode'; static const String _keyEnableDebugLogging = 'enable_debug_logging'; - static const String _keyVideoBufferSize = 'video_buffer_size'; - static const String _keyAudioBufferSize = 'audio_buffer_size'; + static const String _keyBufferSize = 'buffer_size'; static const String _keyKeyboardShortcuts = 'keyboard_shortcuts'; static const String _keyKeyboardHotkeys = 'keyboard_hotkeys'; static const String _keyEnableHardwareDecoding = 'enable_hardware_decoding'; @@ -55,22 +54,13 @@ class SettingsService { return _prefs.getBool(_keyEnableDebugLogging) ?? false; } - // Video Buffer Size (in MB) - Future setVideoBufferSize(int sizeInMB) async { - await _prefs.setInt(_keyVideoBufferSize, sizeInMB); + // Buffer Size (in MB) + Future setBufferSize(int sizeInMB) async { + await _prefs.setInt(_keyBufferSize, sizeInMB); } - int getVideoBufferSize() { - return _prefs.getInt(_keyVideoBufferSize) ?? 64; // Default 64MB - } - - // Audio Buffer Size (in MB) - Future setAudioBufferSize(int sizeInMB) async { - await _prefs.setInt(_keyAudioBufferSize, sizeInMB); - } - - int getAudioBufferSize() { - return _prefs.getInt(_keyAudioBufferSize) ?? 8; // Default 8MB + int getBufferSize() { + return _prefs.getInt(_keyBufferSize) ?? 128; // Default 128MB } // Hardware Decoding @@ -557,8 +547,7 @@ class SettingsService { await Future.wait([ _prefs.remove(_keyThemeMode), _prefs.remove(_keyEnableDebugLogging), - _prefs.remove(_keyVideoBufferSize), - _prefs.remove(_keyAudioBufferSize), + _prefs.remove(_keyBufferSize), _prefs.remove(_keyKeyboardShortcuts), _prefs.remove(_keyKeyboardHotkeys), _prefs.remove(_keyEnableHardwareDecoding), @@ -582,8 +571,7 @@ class SettingsService { return { 'themeMode': getThemeMode().name, 'enableDebugLogging': getEnableDebugLogging(), - 'videoBufferSize': getVideoBufferSize(), - 'audioBufferSize': getAudioBufferSize(), + 'bufferSize': getBufferSize(), 'enableHardwareDecoding': getEnableHardwareDecoding(), 'preferredVideoCodec': getPreferredVideoCodec(), 'preferredAudioCodec': getPreferredAudioCodec(),