diff --git a/Emby.Server.Implementations/SyncPlay/Group.cs b/Emby.Server.Implementations/SyncPlay/Group.cs
index d47e477938..d03690592e 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
}
}