diff --git a/Emby.Server.Implementations/SyncPlay/Group.cs b/Emby.Server.Implementations/SyncPlay/Group.cs index a7821c0e0e..858363068d 100644 --- a/Emby.Server.Implementations/SyncPlay/Group.cs +++ b/Emby.Server.Implementations/SyncPlay/Group.cs @@ -62,6 +62,11 @@ namespace Emby.Server.Implementations.SyncPlay /// private IGroupState _state; + /// + /// The internal playback speed. + /// + private float? _playbackSpeed = 1.0f; + /// /// Initializes a new instance of the class. /// @@ -138,6 +143,16 @@ namespace Emby.Server.Implementations.SyncPlay /// The last activity. public DateTime LastActivity { get; set; } + /// + /// Gets or sets the playback speed. + /// + /// The playback speed. + public float? PlaybackSpeed + { + get => _playbackSpeed; + set => _playbackSpeed = value is null ? null : (float?)Math.Round(Math.Clamp(value.Value, 0.1f, 10.0f), 1); + } + /// /// Adds the session to the group. /// @@ -679,7 +694,8 @@ namespace Emby.Server.Implementations.SyncPlay startPositionTicks, isPlaying, PlayQueue.ShuffleMode, - PlayQueue.RepeatMode); + PlayQueue.RepeatMode, + PlaybackSpeed); } } } diff --git a/MediaBrowser.Model/Session/PlaybackProgressInfo.cs b/MediaBrowser.Model/Session/PlaybackProgressInfo.cs index 04a9d68674..415aad4a5f 100644 --- a/MediaBrowser.Model/Session/PlaybackProgressInfo.cs +++ b/MediaBrowser.Model/Session/PlaybackProgressInfo.cs @@ -11,6 +11,8 @@ namespace MediaBrowser.Model.Session /// public class PlaybackProgressInfo { + private float? _playbackSpeed = 1.0f; + /// /// Gets or sets a value indicating whether this instance can seek. /// @@ -116,5 +118,15 @@ namespace MediaBrowser.Model.Session public QueueItem[] NowPlayingQueue { get; set; } public string PlaylistItemId { get; set; } + + /// + /// Gets or sets the playback speed. + /// + /// The playback speed. + public float? PlaybackSpeed + { + get => _playbackSpeed; + set => _playbackSpeed = value is null ? null : (float?)Math.Round(Math.Clamp(value.Value, 0.1f, 10.0f), 1); + } } } diff --git a/MediaBrowser.Model/Session/PlayerStateInfo.cs b/MediaBrowser.Model/Session/PlayerStateInfo.cs index 35cd68fd15..98dd67145e 100644 --- a/MediaBrowser.Model/Session/PlayerStateInfo.cs +++ b/MediaBrowser.Model/Session/PlayerStateInfo.cs @@ -1,10 +1,14 @@ #nullable disable #pragma warning disable CS1591 +using System; + namespace MediaBrowser.Model.Session { public class PlayerStateInfo { + private float? _playbackSpeed = 1.0f; + /// /// Gets or sets the now playing position ticks. /// @@ -76,5 +80,15 @@ namespace MediaBrowser.Model.Session /// /// The live stream identifier. public string LiveStreamId { get; set; } + + /// + /// Gets or sets the playback speed. + /// + /// The playback speed. + public float? PlaybackSpeed + { + get => _playbackSpeed; + set => _playbackSpeed = value is null ? null : (float?)Math.Round(Math.Clamp(value.Value, 0.1f, 10.0f), 1); + } } } diff --git a/MediaBrowser.Model/SyncPlay/PlayQueueUpdate.cs b/MediaBrowser.Model/SyncPlay/PlayQueueUpdate.cs index 376d926c9a..5dd142de4c 100644 --- a/MediaBrowser.Model/SyncPlay/PlayQueueUpdate.cs +++ b/MediaBrowser.Model/SyncPlay/PlayQueueUpdate.cs @@ -19,7 +19,8 @@ namespace MediaBrowser.Model.SyncPlay /// The playing item status. /// The shuffle mode. /// The repeat mode. - public PlayQueueUpdate(PlayQueueUpdateReason reason, DateTime lastUpdate, IReadOnlyList playlist, int playingItemIndex, long startPositionTicks, bool isPlaying, GroupShuffleMode shuffleMode, GroupRepeatMode repeatMode) + /// The playback speed. + public PlayQueueUpdate(PlayQueueUpdateReason reason, DateTime lastUpdate, IReadOnlyList playlist, int playingItemIndex, long startPositionTicks, bool isPlaying, GroupShuffleMode shuffleMode, GroupRepeatMode repeatMode, float? playbackSpeed) { Reason = reason; LastUpdate = lastUpdate; @@ -29,6 +30,7 @@ namespace MediaBrowser.Model.SyncPlay IsPlaying = isPlaying; ShuffleMode = shuffleMode; RepeatMode = repeatMode; + PlaybackSpeed = playbackSpeed is null ? null : (float?)Math.Round(Math.Clamp(playbackSpeed.Value, 0.1f, 10.0f), 1); } /// @@ -78,5 +80,11 @@ namespace MediaBrowser.Model.SyncPlay /// /// The repeat mode. public GroupRepeatMode RepeatMode { get; } + + /// + /// Gets the PlaybackSpeed. + /// + /// The playback speed. + public float? PlaybackSpeed { get; } } } diff --git a/MediaBrowser.Model/SyncPlay/PlayQueueUpdateReason.cs b/MediaBrowser.Model/SyncPlay/PlayQueueUpdateReason.cs index b609f4b1bd..1145327884 100644 --- a/MediaBrowser.Model/SyncPlay/PlayQueueUpdateReason.cs +++ b/MediaBrowser.Model/SyncPlay/PlayQueueUpdateReason.cs @@ -53,6 +53,11 @@ namespace MediaBrowser.Model.SyncPlay /// /// A user is changing shuffle mode. /// - ShuffleMode = 9 + ShuffleMode = 9, + + /// + /// A user has changed the playback speed. + /// + PlaybackSpeedChange = 10 } } diff --git a/MediaBrowser.Model/SyncPlay/PlaybackRequestType.cs b/MediaBrowser.Model/SyncPlay/PlaybackRequestType.cs index 4429623dd9..f63e9a0660 100644 --- a/MediaBrowser.Model/SyncPlay/PlaybackRequestType.cs +++ b/MediaBrowser.Model/SyncPlay/PlaybackRequestType.cs @@ -88,6 +88,11 @@ namespace MediaBrowser.Model.SyncPlay /// /// A user is requesting to be ignored on group wait. /// - IgnoreWait = 16 + IgnoreWait = 16, + + /// + /// A user is requesting to change the playback speed. + /// + SetPlaybackSpeed = 17 } }