From fa69f6fd511b88f2c10f37c45e1924b8bfe2e7ec Mon Sep 17 00:00:00 2001 From: Ionut Andrei Oanca Date: Sat, 14 Nov 2020 18:09:25 +0100 Subject: [PATCH] Handle ignore-wait request in waiting state in SyncPlay --- .../SyncPlay/GroupController.cs | 6 +- .../SyncPlay/GroupStates/IdleGroupState.cs | 8 +-- .../SyncPlay/GroupStates/PausedGroupState.cs | 8 +-- .../SyncPlay/GroupStates/PlayingGroupState.cs | 8 +-- .../SyncPlay/GroupStates/WaitingGroupState.cs | 34 +++++++-- .../SyncPlay/IGroupState.cs | 72 +++++++++---------- 6 files changed, 68 insertions(+), 68 deletions(-) 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);