diff --git a/Emby.Server.Implementations/SyncPlay/GroupController.cs b/Emby.Server.Implementations/SyncPlay/GroupController.cs
index 5a3c707dbf..5447aad5dd 100644
--- a/Emby.Server.Implementations/SyncPlay/GroupController.cs
+++ b/Emby.Server.Implementations/SyncPlay/GroupController.cs
@@ -372,12 +372,10 @@ namespace Emby.Server.Implementations.SyncPlay
///
public void SetIgnoreGroupWait(SessionInfo session, bool ignoreGroupWait)
{
- if (!Participants.ContainsKey(session.Id))
+ if (Participants.TryGetValue(session.Id, out GroupMember value))
{
- return;
+ value.IgnoreGroupWait = ignoreGroupWait;
}
-
- Participants[session.Id].IgnoreGroupWait = ignoreGroupWait;
}
///
diff --git a/MediaBrowser.Controller/SyncPlay/GroupStates/IdleGroupState.cs b/MediaBrowser.Controller/SyncPlay/GroupStates/IdleGroupState.cs
index 1a507e044c..d9350cc9b9 100644
--- a/MediaBrowser.Controller/SyncPlay/GroupStates/IdleGroupState.cs
+++ b/MediaBrowser.Controller/SyncPlay/GroupStates/IdleGroupState.cs
@@ -24,13 +24,7 @@ namespace MediaBrowser.Controller.SyncPlay
}
///
- public override GroupStateType Type
- {
- get
- {
- return GroupStateType.Idle;
- }
- }
+ public override GroupStateType Type { get; } = GroupStateType.Idle;
///
public override void SessionJoined(IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Controller/SyncPlay/GroupStates/PausedGroupState.cs b/MediaBrowser.Controller/SyncPlay/GroupStates/PausedGroupState.cs
index 11f526d31d..5ae4786057 100644
--- a/MediaBrowser.Controller/SyncPlay/GroupStates/PausedGroupState.cs
+++ b/MediaBrowser.Controller/SyncPlay/GroupStates/PausedGroupState.cs
@@ -25,13 +25,7 @@ namespace MediaBrowser.Controller.SyncPlay
}
///
- public override GroupStateType Type
- {
- get
- {
- return GroupStateType.Paused;
- }
- }
+ public override GroupStateType Type { get; } = GroupStateType.Paused;
///
public override void SessionJoined(IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Controller/SyncPlay/GroupStates/PlayingGroupState.cs b/MediaBrowser.Controller/SyncPlay/GroupStates/PlayingGroupState.cs
index 2aa7598118..394c64e511 100644
--- a/MediaBrowser.Controller/SyncPlay/GroupStates/PlayingGroupState.cs
+++ b/MediaBrowser.Controller/SyncPlay/GroupStates/PlayingGroupState.cs
@@ -25,13 +25,7 @@ namespace MediaBrowser.Controller.SyncPlay
}
///
- public override GroupStateType Type
- {
- get
- {
- return GroupStateType.Playing;
- }
- }
+ public override GroupStateType Type { get; } = GroupStateType.Playing;
///
/// Gets or sets a value indicating whether requests for buffering should be ignored.
diff --git a/MediaBrowser.Controller/SyncPlay/GroupStates/WaitingGroupState.cs b/MediaBrowser.Controller/SyncPlay/GroupStates/WaitingGroupState.cs
index 7f454570a9..c78077b357 100644
--- a/MediaBrowser.Controller/SyncPlay/GroupStates/WaitingGroupState.cs
+++ b/MediaBrowser.Controller/SyncPlay/GroupStates/WaitingGroupState.cs
@@ -25,13 +25,7 @@ namespace MediaBrowser.Controller.SyncPlay
}
///
- public override GroupStateType Type
- {
- get
- {
- return GroupStateType.Waiting;
- }
- }
+ public override GroupStateType Type { get; } = GroupStateType.Waiting;
///
/// Gets or sets a value indicating whether playback should resume when group is ready.
@@ -651,5 +645,31 @@ namespace MediaBrowser.Controller.SyncPlay
Logger.LogDebug("HandleRequest: {0} in group {1}, no previous track available.", request.Type, context.GroupId.ToString());
}
}
+
+ ///
+ public override void HandleRequest(IGroupStateContext context, GroupStateType prevState, IgnoreWaitGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ context.SetIgnoreGroupWait(session, request.IgnoreWait);
+
+ if (!context.IsBuffering())
+ {
+ Logger.LogDebug("HandleRequest: {0} in group {1}, returning to previous state.", request.Type, context.GroupId.ToString());
+
+ if (ResumePlaying)
+ {
+ // Client, that was buffering, stopped following playback.
+ var playingState = new PlayingGroupState(Logger);
+ context.SetState(playingState);
+ var unpauseRequest = new UnpauseGroupRequest();
+ playingState.HandleRequest(context, Type, unpauseRequest, session, cancellationToken);
+ }
+ else
+ {
+ // Group is ready, returning to previous state.
+ var pausedState = new PausedGroupState(Logger);
+ context.SetState(pausedState);
+ }
+ }
+ }
}
}
diff --git a/MediaBrowser.Controller/SyncPlay/IGroupState.cs b/MediaBrowser.Controller/SyncPlay/IGroupState.cs
index 981b65221b..f6ebe2a58d 100644
--- a/MediaBrowser.Controller/SyncPlay/IGroupState.cs
+++ b/MediaBrowser.Controller/SyncPlay/IGroupState.cs
@@ -34,181 +34,181 @@ namespace MediaBrowser.Controller.SyncPlay
void SessionLeaving(IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken);
///
- /// Generic handle. Context's state can change.
+ /// Generic handler. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The generic action.
+ /// The generic request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, IGroupPlaybackRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a play action requested by a session. Context's state can change.
+ /// Handles a play request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The play action.
+ /// The play request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, PlayGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a playlist-item change requested by a session. Context's state can change.
+ /// Handles a set-playlist-item request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The playlist-item change action.
+ /// The set-playlist-item request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, SetPlaylistItemGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a remove-items change requested by a session. Context's state can change.
+ /// Handles a remove-items request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The remove-items change action.
+ /// The remove-items request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, RemoveFromPlaylistGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a move-item change requested by a session. Context's state should not change.
+ /// Handles a move-playlist-item request from a session. Context's state should not change.
///
/// The context of the state.
/// The previous state.
- /// The move-item change action.
+ /// The move-playlist-item request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, MovePlaylistItemGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a queue change requested by a session. Context's state should not change.
+ /// Handles a queue request from a session. Context's state should not change.
///
/// The context of the state.
/// The previous state.
- /// The queue action.
+ /// The queue request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, QueueGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles an unpause action requested by a session. Context's state can change.
+ /// Handles an unpause request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The unpause action.
+ /// The unpause request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, UnpauseGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a pause action requested by a session. Context's state can change.
+ /// Handles a pause request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The pause action.
+ /// The pause request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, PauseGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a stop action requested by a session. Context's state can change.
+ /// Handles a stop request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The stop action.
+ /// The stop request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, StopGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a seek action requested by a session. Context's state can change.
+ /// Handles a seek request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The seek action.
+ /// The seek request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, SeekGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a buffering action requested by a session. Context's state can change.
+ /// Handles a buffer request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The buffering action.
+ /// The buffer request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, BufferGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a buffering-done action requested by a session. Context's state can change.
+ /// Handles a ready request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The buffering-done action.
+ /// The ready request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, ReadyGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a next-track action requested by a session. Context's state can change.
+ /// Handles a next-track request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The next-track action.
+ /// The next-track request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, NextTrackGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a previous-track action requested by a session. Context's state can change.
+ /// Handles a previous-track request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The previous-track action.
+ /// The previous-track request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, PreviousTrackGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a repeat-mode change requested by a session. Context's state should not change.
+ /// Handles a set-repeat-mode request from a session. Context's state should not change.
///
/// The context of the state.
/// The previous state.
- /// The repeat-mode action.
+ /// The repeat-mode request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, SetRepeatModeGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Handles a shuffle-mode change requested by a session. Context's state should not change.
+ /// Handles a set-shuffle-mode request from a session. Context's state should not change.
///
/// The context of the state.
/// The previous state.
- /// The shuffle-mode action.
+ /// The shuffle-mode request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, SetShuffleModeGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Updates ping of a session. Context's state should not change.
+ /// Updates the ping of a session. Context's state should not change.
///
/// The context of the state.
/// The previous state.
- /// The buffering-done action.
+ /// The ping request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, PingGroupRequest request, SessionInfo session, CancellationToken cancellationToken);
///
- /// Updates whether the session should be considered during group wait. Context's state should not change.
+ /// Handles a ignore-wait request from a session. Context's state can change.
///
/// The context of the state.
/// The previous state.
- /// The ignore-wait action.
+ /// The ignore-wait request.
/// The session.
/// The cancellation token.
void HandleRequest(IGroupStateContext context, GroupStateType prevState, IgnoreWaitGroupRequest request, SessionInfo session, CancellationToken cancellationToken);