fix: buffer size not working

This commit is contained in:
edde746
2025-11-01 08:04:33 +01:00
parent ad9502d3c7
commit 66f00d192f
3 changed files with 63 additions and 69 deletions
+11 -27
View File
@@ -22,8 +22,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
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<SettingsScreen> {
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<SettingsScreen> {
),
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<SettingsScreen> {
);
}
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);
},
+44 -22
View File
@@ -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<VideoPlayerScreen> {
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<VideoPlayerScreen> {
]);
}
Future<void> _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<void> _loadAdjacentEpisodes() async {
if (widget.metadata.type.toLowerCase() != 'episode') {
return;
@@ -682,7 +698,13 @@ class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
@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(
+8 -20
View File
@@ -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<void> setVideoBufferSize(int sizeInMB) async {
await _prefs.setInt(_keyVideoBufferSize, sizeInMB);
// Buffer Size (in MB)
Future<void> setBufferSize(int sizeInMB) async {
await _prefs.setInt(_keyBufferSize, sizeInMB);
}
int getVideoBufferSize() {
return _prefs.getInt(_keyVideoBufferSize) ?? 64; // Default 64MB
}
// Audio Buffer Size (in MB)
Future<void> 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(),