aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/SyncPlay/GroupStates/IdleGroupState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/SyncPlay/GroupStates/IdleGroupState.cs')
-rw-r--r--Emby.Server.Implementations/SyncPlay/GroupStates/IdleGroupState.cs121
1 files changed, 121 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/SyncPlay/GroupStates/IdleGroupState.cs b/Emby.Server.Implementations/SyncPlay/GroupStates/IdleGroupState.cs
new file mode 100644
index 0000000000..d6b981c584
--- /dev/null
+++ b/Emby.Server.Implementations/SyncPlay/GroupStates/IdleGroupState.cs
@@ -0,0 +1,121 @@
+using System.Threading;
+using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.SyncPlay;
+using Microsoft.Extensions.Logging;
+
+namespace MediaBrowser.Controller.SyncPlay
+{
+ /// <summary>
+ /// Class IdleGroupState.
+ /// </summary>
+ /// <remarks>
+ /// Class is not thread-safe, external locking is required when accessing methods.
+ /// </remarks>
+ public class IdleGroupState : AbstractGroupState
+ {
+ /// <summary>
+ /// Default constructor.
+ /// </summary>
+ public IdleGroupState(ILogger logger) : base(logger)
+ {
+ // Do nothing
+ }
+
+ /// <inheritdoc />
+ public override GroupState GetGroupState()
+ {
+ return GroupState.Idle;
+ }
+
+ /// <inheritdoc />
+ public override void SessionJoined(ISyncPlayStateContext context, GroupState prevState, SessionInfo session, CancellationToken cancellationToken)
+ {
+ SendStopCommand(context, GetGroupState(), session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void SessionLeaving(ISyncPlayStateContext context, GroupState prevState, SessionInfo session, CancellationToken cancellationToken)
+ {
+ // Do nothing
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, PlayGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ // Change state
+ var waitingState = new WaitingGroupState(_logger);
+ context.SetState(waitingState);
+ waitingState.HandleRequest(context, GetGroupState(), request, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, UnpauseGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ // Change state
+ var waitingState = new WaitingGroupState(_logger);
+ context.SetState(waitingState);
+ waitingState.HandleRequest(context, GetGroupState(), request, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, PauseGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ SendStopCommand(context, prevState, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, StopGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ SendStopCommand(context, prevState, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, SeekGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ SendStopCommand(context, prevState, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, BufferGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ SendStopCommand(context, prevState, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, ReadyGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ SendStopCommand(context, prevState, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, NextTrackGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ // Change state
+ var waitingState = new WaitingGroupState(_logger);
+ context.SetState(waitingState);
+ waitingState.HandleRequest(context, GetGroupState(), request, session, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ public override void HandleRequest(ISyncPlayStateContext context, GroupState prevState, PreviousTrackGroupRequest request, SessionInfo session, CancellationToken cancellationToken)
+ {
+ // Change state
+ var waitingState = new WaitingGroupState(_logger);
+ context.SetState(waitingState);
+ waitingState.HandleRequest(context, GetGroupState(), request, session, cancellationToken);
+ }
+
+ private void SendStopCommand(ISyncPlayStateContext context, GroupState prevState, SessionInfo session, CancellationToken cancellationToken)
+ {
+ var command = context.NewSyncPlayCommand(SendCommandType.Stop);
+ if (!prevState.Equals(GetGroupState()))
+ {
+ context.SendCommand(session, SyncPlayBroadcastType.AllGroup, command, cancellationToken);
+ }
+ else
+ {
+ context.SendCommand(session, SyncPlayBroadcastType.CurrentSession, command, cancellationToken);
+ }
+ }
+ }
+}