protected void NotifyResumeState(IPlayer player)
        {
            IResumablePlayer resumablePlayer = player as IResumablePlayer;

            if (resumablePlayer == null)
            {
                return;
            }

            // Get the current MediaItem ID at this time, later the PSC is already closed (in case of PlayerEnded state) and MediaItem information is lost.
            object oContext;

            if (!ContextVariables.TryGetValue(PlayerContext.KEY_PLAYER_CONTEXT, out oContext) || !(oContext is IPlayerContext))
            {
                return;
            }

            IPlayerContext playerContext = (IPlayerContext)oContext;

            if (playerContext.CurrentMediaItem == null)
            {
                return;
            }

            IResumeState resumeState;

            if (resumablePlayer.GetResumeState(out resumeState))
            {
                PlayerManagerMessaging.SendPlayerResumeStateMessage(this, playerContext.CurrentMediaItem.MediaItemId, resumeState);
            }
        }
Пример #2
0
        protected void NotifyResumeState(IPlayer player)
        {
            IResumablePlayer resumablePlayer = player as IResumablePlayer;

            if (resumablePlayer == null)
            {
                return;
            }

            // Get the current MediaItem ID at this time, later the PSC is already closed (in case of PlayerEnded state) and MediaItem information is lost.
            object oContext;

            if (!ContextVariables.TryGetValue(PlayerContext.KEY_PLAYER_CONTEXT, out oContext) || !(oContext is IPlayerContext))
            {
                return;
            }

            IPlayerContext playerContext = (IPlayerContext)oContext;

            if (playerContext.CurrentMediaItem == null)
            {
                return;
            }

            try
            {
                IResumeState resumeState;
                if (resumablePlayer.GetResumeState(out resumeState))
                {
                    PlayerManagerMessaging.SendPlayerResumeStateMessage(this, playerContext.CurrentMediaItem, resumeState);
                }
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Warn("PlayerSlotController: Error getting resume state from player '{0}'", e, resumablePlayer);
            }
        }
        public bool Play(MediaItem mediaItem, StartTime startTime)
        {
            IPlayer player = null;

            try
            {
                IReusablePlayer rp;
                lock (SyncObj)
                {
                    CheckActive();
                    player = _player;
                    rp     = _player as IReusablePlayer;
                }
                if (rp != null)
                {
                    if (rp.NextItem(mediaItem, startTime))
                    {
                        OnPlayerStarted(rp);
                        return(true);
                    }
                }
                ReleasePlayer_NoLock();
                ICollection <Exception> exceptions;
                player = _playerManager.BuildPlayer_NoLock(mediaItem, out exceptions);
                if (player == null)
                {
                    HandleUnableToPlay(mediaItem, exceptions);
                    OnPlaybackError(null);
                }
                else
                {
                    IMediaPlaybackControl mpc;
                    IDisposable           disposePlayer = null;
                    lock (SyncObj)
                    {
                        if (_player != null)
                        {
                            disposePlayer = _player as IDisposable; // If we got a race condition between the locks
                        }
                        _player = player;
                        mpc     = player as IMediaPlaybackControl;
                    }
                    RegisterPlayerEvents_NoLock(player);
                    CheckAudio_NoLock();
                    if (disposePlayer != null)
                    {
                        disposePlayer.Dispose();
                    }
                    OnPlayerStarted(player);

                    // Handling of resume info.
                    object resumeObject;
                    if (ContextVariables.TryGetValue(PlayerContext.KEY_RESUME_STATE, out resumeObject))
                    {
                        IResumeState     resumeState     = (IResumeState)resumeObject;
                        IResumablePlayer resumablePlayer = player as IResumablePlayer;
                        if (resumablePlayer != null)
                        {
                            resumablePlayer.SetResumeState(resumeState);
                        }
                    }

                    if (mpc != null)
                    {
                        mpc.Resume();
                    }
                    return(true);
                }
                return(false);
            }
            catch (Exception e)
            {
                ServiceRegistration.Get <ILogger>().Warn("PlayerSlotController: Error playing '{0}'", e, mediaItem);
                IDisposable disposePlayer = player as IDisposable;
                if (disposePlayer != null)
                {
                    disposePlayer.Dispose();
                }
                return(false);
            }
        }