Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -984,6 +984,10 @@
"@settingsPlayerPlayPauseFadeTitle": {},
"settingsPlayerPlayPauseFadeDesc": "Fade volume in and out when playing or pausing",
"@settingsPlayerPlayPauseFadeDesc": {},
"settingsPlayerPlayPauseFadeDurationTitle": "Play/pause fade duration",
"@settingsPlayerPlayPauseFadeDurationTitle": {},
"settingsPlayerPlayPauseFadeDurationDesc": "How long the volume fade takes when playing or pausing. Lower values feel snappier; set to 0 for an instant response.",
"@settingsPlayerPlayPauseFadeDurationDesc": {},
"settingsPlayerBufferSizeDesc": "Configure the buffer size for video playback, determining how much data is loaded into the cache.",
"@settingsPlayerBufferSizeDesc": {},
"settingsPlayerTitle": "Player",
Expand Down
1 change: 1 addition & 0 deletions lib/models/settings/video_player_settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ abstract class VideoPlayerSettingsModel with _$VideoPlayerSettingsModel {
@Default(true) bool enableReplayGain,
@Default(ReplayGainVolumeLevel.quiet) ReplayGainVolumeLevel replayGainVolumeLevel,
@Default(true) bool enablePlayPauseFade,
@Default(175) int playPauseFadeDurationMs,
@Default(true) bool enableCrossfade,
@Default(400) int crossfadeDurationMs,
}) = _VideoPlayerSettingsModel;
Expand Down
31 changes: 29 additions & 2 deletions lib/models/settings/video_player_settings.freezed.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions lib/models/settings/video_player_settings.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions lib/providers/settings/video_player_settings_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ class VideoPlayerSettingsProviderNotifier extends StateNotifier<VideoPlayerSetti

void setEnablePlayPauseFade(bool value) => state = state.copyWith(enablePlayPauseFade: value);

void setPlayPauseFadeDurationMs(int value) => state = state.copyWith(playPauseFadeDurationMs: value.clamp(0, 1000));

void setReplayGainVolumeLevel(ReplayGainVolumeLevel value) => state = state.copyWith(replayGainVolumeLevel: value);

void setEnableCrossfade(bool value) {
Expand Down
38 changes: 38 additions & 0 deletions lib/screens/settings/player_settings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,44 @@ class _PlayerSettingsPageState extends ConsumerState<PlayerSettingsPage> {
onChanged: (value) => provider.setEnablePlayPauseFade(value),
),
),
if (currentPlayer == PlayerOptions.libMPV && videoSettings.enablePlayPauseFade)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
context.localized.settingsPlayerPlayPauseFadeDurationTitle,
style: Theme.of(context).textTheme.titleLarge,
),
Padding(
padding: const EdgeInsets.only(bottom: 8),
child: Text(
context.localized.settingsPlayerPlayPauseFadeDurationDesc,
style: Theme.of(context).textTheme.bodyMedium,
),
),
Row(
children: [
Expanded(
child: FladderSlider(
min: 0,
max: 1000,
value: videoSettings.playPauseFadeDurationMs.toDouble(),
divisions: 40,
onChanged: (value) => provider.setPlayPauseFadeDurationMs(value.round()),
),
),
const SizedBox(width: 12),
Text(
'${videoSettings.playPauseFadeDurationMs} ms',
style: Theme.of(context).textTheme.bodyLarge,
),
],
),
],
),
),
if (currentPlayer == PlayerOptions.libMPV)
SettingsListTile(
label: Text(context.localized.settingsPlayerBufferSizeTitle),
Expand Down
13 changes: 9 additions & 4 deletions lib/wrappers/players/lib_mpv.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class LibMPV extends BasePlayer {
double _preferredVolume = 100;
int _crossfadeGeneration = 0;
Timer? _fadeTimer;
Duration get playPauseFadeDuration => const Duration(milliseconds: 175);
Duration get playPauseFadeDuration => Duration(milliseconds: _settings.playPauseFadeDurationMs);

@override
Future<void> init(VideoPlayerSettingsModel settings) async {
Expand Down Expand Up @@ -372,17 +372,22 @@ class LibMPV extends BasePlayer {

_fadeTimer?.cancel();

if (!_settings.enablePlayPauseFade) {
const stepMs = 16;
final steps = playPauseFadeDuration.inMilliseconds ~/ stepMs;

// Skip the fade entirely when disabled or the configured duration is too
// short to produce at least one step. This makes play/pause hit mpv
// immediately for a snappy, mpc-like response.
if (!_settings.enablePlayPauseFade || steps <= 0) {
if (fadingIn) {
player.setVolume(_preferredVolume);
player.play();
} else {
player.pause();
}
return;
}

const stepMs = 16;
final steps = playPauseFadeDuration.inMilliseconds ~/ stepMs;
final stepSize = _preferredVolume / steps;

if (fadingIn) player.play();
Expand Down