IdleGroupState.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #nullable disable
  2. using System.Threading;
  3. using MediaBrowser.Controller.Session;
  4. using MediaBrowser.Controller.SyncPlay.PlaybackRequests;
  5. using MediaBrowser.Model.SyncPlay;
  6. using Microsoft.Extensions.Logging;
  7. namespace MediaBrowser.Controller.SyncPlay.GroupStates
  8. {
  9. /// <summary>
  10. /// Class IdleGroupState.
  11. /// </summary>
  12. /// <remarks>
  13. /// Class is not thread-safe, external locking is required when accessing methods.
  14. /// </remarks>
  15. public class IdleGroupState : AbstractGroupState
  16. {
  17. /// <summary>
  18. /// The logger.
  19. /// </summary>
  20. private readonly ILogger<IdleGroupState> _logger;
  21. /// <summary>
  22. /// Initializes a new instance of the <see cref="IdleGroupState"/> class.
  23. /// </summary>
  24. /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
  25. public IdleGroupState(ILoggerFactory loggerFactory)
  26. : base(loggerFactory)
  27. {
  28. _logger = LoggerFactory.CreateLogger<IdleGroupState>();
  29. }
  30. /// <inheritdoc />
  31. public override GroupStateType Type { get; } = GroupStateType.Idle;
  32. /// <inheritdoc />
  33. public override void SessionJoined(IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  34. {
  35. SendStopCommand(context, Type, session, cancellationToken);
  36. }
  37. /// <inheritdoc />
  38. public override void SessionLeaving(IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  39. {
  40. // Do nothing.
  41. }
  42. /// <inheritdoc />
  43. public override void HandleRequest(PlayGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  44. {
  45. // Change state.
  46. var waitingState = new WaitingGroupState(LoggerFactory);
  47. context.SetState(waitingState);
  48. waitingState.HandleRequest(request, context, Type, session, cancellationToken);
  49. }
  50. /// <inheritdoc />
  51. public override void HandleRequest(UnpauseGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  52. {
  53. // Change state.
  54. var waitingState = new WaitingGroupState(LoggerFactory);
  55. context.SetState(waitingState);
  56. waitingState.HandleRequest(request, context, Type, session, cancellationToken);
  57. }
  58. /// <inheritdoc />
  59. public override void HandleRequest(PauseGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  60. {
  61. SendStopCommand(context, prevState, session, cancellationToken);
  62. }
  63. /// <inheritdoc />
  64. public override void HandleRequest(StopGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  65. {
  66. SendStopCommand(context, prevState, session, cancellationToken);
  67. }
  68. /// <inheritdoc />
  69. public override void HandleRequest(SeekGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  70. {
  71. SendStopCommand(context, prevState, session, cancellationToken);
  72. }
  73. /// <inheritdoc />
  74. public override void HandleRequest(BufferGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  75. {
  76. SendStopCommand(context, prevState, session, cancellationToken);
  77. }
  78. /// <inheritdoc />
  79. public override void HandleRequest(ReadyGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  80. {
  81. SendStopCommand(context, prevState, session, cancellationToken);
  82. }
  83. /// <inheritdoc />
  84. public override void HandleRequest(NextItemGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  85. {
  86. // Change state.
  87. var waitingState = new WaitingGroupState(LoggerFactory);
  88. context.SetState(waitingState);
  89. waitingState.HandleRequest(request, context, Type, session, cancellationToken);
  90. }
  91. /// <inheritdoc />
  92. public override void HandleRequest(PreviousItemGroupRequest request, IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  93. {
  94. // Change state.
  95. var waitingState = new WaitingGroupState(LoggerFactory);
  96. context.SetState(waitingState);
  97. waitingState.HandleRequest(request, context, Type, session, cancellationToken);
  98. }
  99. private void SendStopCommand(IGroupStateContext context, GroupStateType prevState, SessionInfo session, CancellationToken cancellationToken)
  100. {
  101. var command = context.NewSyncPlayCommand(SendCommandType.Stop);
  102. if (!prevState.Equals(Type))
  103. {
  104. context.SendCommand(session, SyncPlayBroadcastType.AllGroup, command, cancellationToken);
  105. }
  106. else
  107. {
  108. context.SendCommand(session, SyncPlayBroadcastType.CurrentSession, command, cancellationToken);
  109. }
  110. }
  111. }
  112. }