From f4d0d6f35ec375c9b65e540f20aeb34a1c900d11 Mon Sep 17 00:00:00 2001 From: Tung Huynh Date: Thu, 2 Jan 2025 23:32:36 -0800 Subject: [PATCH] add an option to change the SMTC update interval min 1s, max 6s, default 5s --- Screenbox.Core/Services/ISettingsService.cs | 1 + .../ISystemMediaTransportControlsService.cs | 2 +- Screenbox.Core/Services/SettingsService.cs | 8 ++++++++ .../SystemMediaTransportControlsService.cs | 5 +++-- .../ViewModels/PlayerElementViewModel.cs | 4 +++- .../ViewModels/SettingsPageViewModel.cs | 8 ++++++++ Screenbox/Pages/SettingsPage.xaml | 15 +++++++++++++++ 7 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Screenbox.Core/Services/ISettingsService.cs b/Screenbox.Core/Services/ISettingsService.cs index 1506d1503..12142e48b 100644 --- a/Screenbox.Core/Services/ISettingsService.cs +++ b/Screenbox.Core/Services/ISettingsService.cs @@ -19,6 +19,7 @@ public interface ISettingsService string GlobalArguments { get; set; } bool AdvancedMode { get; set; } bool UseMultipleInstances { get; set; } + double SmtcUpdateInterval { get; set; } string LivelyActivePath { get; set; } MediaPlaybackAutoRepeatMode PersistentRepeatMode { get; set; } } diff --git a/Screenbox.Core/Services/ISystemMediaTransportControlsService.cs b/Screenbox.Core/Services/ISystemMediaTransportControlsService.cs index 1163d2a87..b51927bfe 100644 --- a/Screenbox.Core/Services/ISystemMediaTransportControlsService.cs +++ b/Screenbox.Core/Services/ISystemMediaTransportControlsService.cs @@ -13,7 +13,7 @@ public interface ISystemMediaTransportControlsService { SystemMediaTransportControls TransportControls { get; } Task UpdateTransportControlsDisplayAsync(MediaViewModel? item); - void UpdatePlaybackPosition(TimeSpan position, TimeSpan startTime, TimeSpan endTime); + void UpdatePlaybackPosition(TimeSpan position, TimeSpan startTime, TimeSpan endTime, TimeSpan updateInterval = default); void UpdatePlaybackStatus(MediaPlaybackState state); void ClosePlayback(); } diff --git a/Screenbox.Core/Services/SettingsService.cs b/Screenbox.Core/Services/SettingsService.cs index e67a963bd..1a4422c58 100644 --- a/Screenbox.Core/Services/SettingsService.cs +++ b/Screenbox.Core/Services/SettingsService.cs @@ -26,6 +26,7 @@ public sealed class SettingsService : ISettingsService private const string GeneralEnqueueAllInFolder = "General/EnqueueAllInFolder"; private const string AdvancedModeKey = "Advanced/IsEnabled"; private const string AdvancedMultipleInstancesKey = "Advanced/MultipleInstances"; + private const string AdvancedSmtcUpdateIntervalKey = "Advanced/SMTCUpdateInterval"; private const string GlobalArgumentsKey = "Values/GlobalArguments"; private const string PersistentVolumeKey = "Values/Volume"; private const string MaxVolumeKey = "Values/MaxVolume"; @@ -127,6 +128,12 @@ public string LivelyActivePath set => SetValue(PlayerLivelyPathKey, value); } + public double SmtcUpdateInterval + { + get => GetValue(AdvancedSmtcUpdateIntervalKey); + set => SetValue(AdvancedSmtcUpdateIntervalKey, value); + } + public SettingsService() { SetDefault(PlayerAutoResizeKey, (int)PlayerAutoResizeOption.Always); @@ -142,6 +149,7 @@ public SettingsService() SetDefault(PersistentRepeatModeKey, (int)MediaPlaybackAutoRepeatMode.None); SetDefault(AdvancedModeKey, false); SetDefault(AdvancedMultipleInstancesKey, false); + SetDefault(AdvancedSmtcUpdateIntervalKey, 5.0); SetDefault(GlobalArgumentsKey, string.Empty); // Device family specific overrides diff --git a/Screenbox.Core/Services/SystemMediaTransportControlsService.cs b/Screenbox.Core/Services/SystemMediaTransportControlsService.cs index ff6d87606..48d9eef62 100644 --- a/Screenbox.Core/Services/SystemMediaTransportControlsService.cs +++ b/Screenbox.Core/Services/SystemMediaTransportControlsService.cs @@ -79,9 +79,10 @@ public async Task UpdateTransportControlsDisplayAsync(MediaViewModel? item) } } - public void UpdatePlaybackPosition(TimeSpan position, TimeSpan startTime, TimeSpan endTime) + public void UpdatePlaybackPosition(TimeSpan position, TimeSpan startTime, TimeSpan endTime, TimeSpan updateInterval = default) { - if (DateTime.Now - _lastUpdated < TimeSpan.FromSeconds(5)) return; + if (updateInterval < TimeSpan.FromSeconds(1)) updateInterval = TimeSpan.FromSeconds(5); + if (DateTime.Now - _lastUpdated < updateInterval) return; _lastUpdated = DateTime.Now; SystemMediaTransportControlsTimelineProperties timelineProps = new() { diff --git a/Screenbox.Core/ViewModels/PlayerElementViewModel.cs b/Screenbox.Core/ViewModels/PlayerElementViewModel.cs index ff824b224..55984d163 100644 --- a/Screenbox.Core/ViewModels/PlayerElementViewModel.cs +++ b/Screenbox.Core/ViewModels/PlayerElementViewModel.cs @@ -45,6 +45,7 @@ public sealed partial class PlayerElementViewModel : ObservableRecipient, private VlcMediaPlayer? _mediaPlayer; private ManipulationLock _manipulationLock; private TimeSpan _timeBeforeManipulation; + private TimeSpan _smtcUpdateInterval; private bool _playerSeekGesture; private bool _playerVolumeGesture; @@ -209,7 +210,7 @@ private void OnMediaFailed(IMediaPlayer sender, object? args) private void OnPositionChanged(IMediaPlayer sender, object? args) { - _transportControlsService.UpdatePlaybackPosition(sender.Position, TimeSpan.Zero, sender.NaturalDuration); + _transportControlsService.UpdatePlaybackPosition(sender.Position, TimeSpan.Zero, sender.NaturalDuration, _smtcUpdateInterval); } public void OnSizeChanged(object sender, SizeChangedEventArgs args) @@ -290,6 +291,7 @@ private void LoadSettings() { _playerSeekGesture = _settingsService.PlayerSeekGesture; _playerVolumeGesture = _settingsService.PlayerVolumeGesture; + _smtcUpdateInterval = TimeSpan.FromSeconds(_settingsService.SmtcUpdateInterval); } private void DisposeMediaPlayer() diff --git a/Screenbox.Core/ViewModels/SettingsPageViewModel.cs b/Screenbox.Core/ViewModels/SettingsPageViewModel.cs index 20c6d9ae1..0f32e2f00 100644 --- a/Screenbox.Core/ViewModels/SettingsPageViewModel.cs +++ b/Screenbox.Core/ViewModels/SettingsPageViewModel.cs @@ -32,6 +32,7 @@ public sealed partial class SettingsPageViewModel : ObservableRecipient [ObservableProperty] private bool _searchRemovableStorage; [ObservableProperty] private bool _advancedMode; [ObservableProperty] private bool _useMultipleInstances; + [ObservableProperty] private double _smtcUpdateInterval; [ObservableProperty] private string _globalArguments; [ObservableProperty] private bool _isRelaunchRequired; @@ -81,6 +82,7 @@ public SettingsPageViewModel(ISettingsService settingsService, ILibraryService l _searchRemovableStorage = _settingsService.SearchRemovableStorage; _advancedMode = _settingsService.AdvancedMode; _useMultipleInstances = _settingsService.UseMultipleInstances; + _smtcUpdateInterval = _settingsService.SmtcUpdateInterval; _globalArguments = _settingsService.GlobalArguments; _originalAdvancedMode ??= _advancedMode; _originalGlobalArguments ??= _globalArguments; @@ -181,6 +183,12 @@ partial void OnUseMultipleInstancesChanged(bool value) Messenger.Send(new SettingsChangedMessage(nameof(UseMultipleInstances), typeof(SettingsPageViewModel))); } + partial void OnSmtcUpdateIntervalChanged(double value) + { + _settingsService.SmtcUpdateInterval = value; + Messenger.Send(new SettingsChangedMessage(nameof(SmtcUpdateInterval), typeof(SettingsPageViewModel))); + } + partial void OnGlobalArgumentsChanged(string value) { // No need to broadcast SettingsChangedMessage for this option diff --git a/Screenbox/Pages/SettingsPage.xaml b/Screenbox/Pages/SettingsPage.xaml index 4df957cef..d1a78b370 100644 --- a/Screenbox/Pages/SettingsPage.xaml +++ b/Screenbox/Pages/SettingsPage.xaml @@ -456,6 +456,21 @@ + + + +