fix: buffer size not working
This commit is contained in:
@@ -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);
|
||||
},
|
||||
|
||||
@@ -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,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(),
|
||||
|
||||
Reference in New Issue
Block a user