コード例 #1
0
        public TvResult Tune(ITvCardHandler tvcard, ref IUser user, IChannel channel, int idChannel, ICardTuneReservationTicket ticket)
        {
            TvResult tvResult = TvResult.AllCardsBusy;
            bool     ticketFound;
            bool     isTuningPending = CardReservationHelper.GetIsTuningPending(tvcard, ticket, out ticketFound);

            try
            {
                if (isTuningPending && ticketFound)
                {
                    tvResult = tvcard.Tuner.Tune(ref user, channel, idChannel);

                    bool succes = (tvResult == TvResult.Succeeded);
                    if (succes)
                    {
                        if (!OnStartTune(user))
                        {
                            tvResult = TvResult.AllCardsBusy;
                        }
                    }
                    CardReservationHelper.SetCardStateBasedOnTVresult(tvcard, tvResult);
                }
                else // state is not tuning, some other card tune session is busy.
                {
                }
            }
            finally
            {
                CardReservationHelper.RemoveTuneTicket(tvcard, ticket, ticketFound);
                tvcard.Tuner.CleanUpPendingTune(ticket.PendingSubchannel);
            }
            return(tvResult);
        }
コード例 #2
0
ファイル: EpgCard.cs プロジェクト: thomasr3/MediaPortal-1
        private bool TuneEPGgrabber(Channel channel, IChannel tuning, Card card, TvResult result)
        {
            try
            {
                _user.CardId = Card.IdCard;
                ITvCardHandler cardHandler;
                if (_tvController.CardCollection.TryGetValue(Card.IdCard, out cardHandler))
                {
                    ICardTuneReservationTicket ticket = null;
                    try
                    {
                        ICardReservation cardReservationImpl = new CardReservationTimeshifting(_tvController);
                        ticket = cardReservationImpl.RequestCardTuneReservation(cardHandler, tuning, _user, channel.IdChannel);

                        if (ticket != null)
                        {
                            result = _tvController.Tune(ref _user, tuning, channel.IdChannel, ticket);
                            if (result == TvResult.Succeeded)
                            {
                                if (!_isRunning || false == _tvController.GrabEpg(this, Card.IdCard))
                                {
                                    if (!_isRunning)
                                    {
                                        Log.Epg("Tuning finished but EpgGrabber no longer enabled");
                                    }
                                    _tvController.StopGrabbingEpg(_user);
                                    _user.CardId = -1;
                                    Log.Epg("Epg: card:{0} could not start dvbt grabbing", Card.IdCard);
                                    return(false);
                                }
                                _user.CardId = Card.IdCard;
                                return(true);
                            }
                        }
                    }
                    catch (Exception)
                    {
                        CardReservationHelper.CancelCardReservation(cardHandler, ticket);
                        throw;
                    }
                }
                _user.CardId = -1;
                Log.Epg("Epg: card:{0} could not tune to channel:{1}", Card.IdCard, result.ToString());
                return(false);
            }
            catch (Exception ex)
            {
                Log.Write(ex);
                throw;
            }
        }
コード例 #3
0
        public TvResult CardTune(ITvCardHandler tvcard, ref IUser user, IChannel channel, Channel dbChannel, ICardTuneReservationTicket ticket)
        {
            TvResult tvResult = TvResult.AllCardsBusy;
            bool     ticketFound;
            bool     isTuningPending = CardReservationHelper.GetIsTuningPending(tvcard, ticket, out ticketFound);

            try
            {
                if (isTuningPending && ticketFound)
                {
                    user.IsFreeToAir = ticket.TuningDetail.FreeToAir;
                    Log.Debug("CardReservationBase.CardTune: tvcard={0}, user={1}, dbChannel={2}, ticket={3}, tunestate={4}, stopstate={5}, ticketFTA={6}", tvcard.DataBaseCard.IdCard, user.Name, dbChannel.IdChannel, ticket.Id, tvcard.Tuner.CardTuneState, tvcard.Tuner.CardStopState, ticket.TuningDetail.FreeToAir);
                    tvResult = tvcard.Tuner.CardTune(ref user, channel, dbChannel);

                    if (tvResult == TvResult.Succeeded)
                    {
                        if (OnStartCardTune != null)
                        {
                            if (!_tvController.IsTimeShifting(ref user))
                            {
                                CleanTimeShiftFiles(tvcard.DataBaseCard.TimeShiftFolder,
                                                    String.Format("live{0}-{1}.ts", user.CardId, user.SubChannel));
                            }

                            string timeshiftFileName = String.Format(@"{0}\live{1}-{2}.ts", tvcard.DataBaseCard.TimeShiftFolder,
                                                                     user.CardId,
                                                                     user.SubChannel);
                            tvResult = OnStartCardTune(ref user, ref timeshiftFileName);
                        }
                    }

                    CardReservationHelper.SetCardStateBasedOnTVresult(tvcard, tvResult);
                }
                else // state is not tuning, some other card tune session is busy.
                {
                }
            }
            finally
            {
                CardReservationHelper.RemoveTuneTicket(tvcard, ticket, ticketFound);
                tvcard.Tuner.CleanUpPendingTune(ticket.PendingSubchannel);
            }
            return(tvResult);
        }
コード例 #4
0
        public ICardTuneReservationTicket RequestCardTuneReservation(ITvCardHandler tvcard, IChannel tuningDetail, IUser user, int idChannel)
        {
            ICardTuneReservationTicket cardTuneReservationTicket = null;
            var layer = new TvBusinessLayer();

            CardTuneState cardTuneState;
            int           ticketId = 0;
            bool          isCardAvail;
            bool          hasUserHigherPriorityThanBlockingUser = false;

            lock (tvcard.Tuner.CardReservationsLock)
            {
                isCardAvail = IsCardAvail(tvcard);
                if (!isCardAvail)
                {
                    if (tvcard.Tuner.CardTuneState != CardTuneState.TuneCancelled)
                    {
                        IUser blockingUser = GetBlockingUser(tvcard);
                        hasUserHigherPriorityThanBlockingUser = (HasUserHigherPriorityThanBlockingUser(user, blockingUser));
                        if (hasUserHigherPriorityThanBlockingUser)
                        {
                            tvcard.Tuner.CardTuneState = CardTuneState.TuneCancelled;
                        }
                    }
                }
            }
            if (!isCardAvail)
            {
                if (hasUserHigherPriorityThanBlockingUser)
                {
                    tvcard.Tuner.CancelTune(tvcard.Tuner.ActiveCardTuneReservationTicket.PendingSubchannel);
                    lock (tvcard.Tuner.CardReservationsLock)
                    {
                        isCardAvail = IsCardAvail(tvcard);
                    }
                }
            }

            lock (tvcard.Tuner.CardReservationsLock)
            {
                if (isCardAvail)
                {
                    tvcard.Tuner.CardTuneState = CardTuneState.TunePending;
                    bool isTunedToTransponder = IsTunedToTransponder(tvcard, tuningDetail);

                    int ownerSubchannel = -1;
                    int numberOfUsersOnSameCurrentChannel = 0;
                    int numberOfOtherUsersOnSameChannel   = 0;
                    int numberOfOtherUsersOnCurrentCard   = 0;

                    bool hasUserHighestPriority       = false;
                    bool hasUserEqualOrHigherPriority = false;
                    bool isCamAlreadyDecodingChannel  = false;
                    bool conflictingSubchannelFound   = false;
                    bool isRecordingAnyUser           = false;
                    bool isAnySubChannelTimeshifting  = tvcard.TimeShifter.IsAnySubChannelTimeshifting;
                    bool isOwner       = tvcard.Users.IsOwner(user);
                    var  users         = new List <IUser>(tvcard.Users.GetUsers());
                    var  inactiveUsers = new List <IUser>();
                    var  activeUsers   = new List <IUser>();
                    var  recUsers      = new List <IUser>();
                    var  tsUsers       = new List <IUser>();

                    var context = tvcard.Card.Context as ITvCardContext;
                    if (context != null)
                    {
                        context.GetUser(ref user);
                        hasUserHighestPriority       = context.HasUserHighestPriority(user);
                        hasUserEqualOrHigherPriority = context.HasUserEqualOrHigherPriority(user);
                    }

                    int currentChannelId = tvcard.CurrentDbChannel(ref user);

                    for (int i = users.Count - 1; i > -1; i--)
                    {
                        IUser actualUser = users[i];
                        CardReservationHelper.AddUserIfRecording(tvcard, ref actualUser, recUsers);
                        CardReservationHelper.AddUserIfTimeshifting(tvcard, ref actualUser, tsUsers);

                        bool isCurrentUser = user.Name.Equals(actualUser.Name);

                        IChannel userChannel    = tvcard.CurrentChannel(ref actualUser);
                        var      userDVBchannel = userChannel as DVBBaseChannel;

                        if (!isCurrentUser)
                        {
                            if (!isRecordingAnyUser)
                            {
                                isRecordingAnyUser = CardReservationHelper.IsRecordingUser(tvcard, user, ref actualUser);
                            }

                            if (actualUser.SubChannel == user.SubChannel && user.IdChannel > 0)
                            {
                                conflictingSubchannelFound = true;
                            }
                            numberOfOtherUsersOnCurrentCard = CardReservationHelper.GetNumberOfOtherUsersOnCurrentCard(user,
                                                                                                                       numberOfOtherUsersOnCurrentCard);


                            if (userChannel == null)
                            {
                                inactiveUsers.Add(actualUser);
                            }
                            else
                            {
                                if (userDVBchannel != null)
                                {
                                    actualUser.IdChannel = layer.GetTuningDetail(userDVBchannel).IdChannel;
                                }

                                bool isDiffTS = tuningDetail.IsDifferentTransponder(userChannel);

                                if (isDiffTS)
                                {
                                    activeUsers.Add(actualUser);
                                }
                                else
                                {
                                    if (!isOwner)
                                    {
                                        bool isUserOnSameChannel = CardReservationHelper.IsUserOnSameChannel(tuningDetail, layer,
                                                                                                             userDVBchannel);
                                        if (isUserOnSameChannel)
                                        {
                                            numberOfOtherUsersOnSameChannel++;
                                            //we do not want to hook up on schedulers existing subchannel
                                            if (!actualUser.IsAdmin)
                                            {
                                                ownerSubchannel = actualUser.SubChannel;
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        bool isUserOnSameCurrentChannel = CardReservationHelper.IsUserOnSameCurrentChannel(currentChannelId, actualUser);
                        if (isUserOnSameCurrentChannel)
                        {
                            numberOfUsersOnSameCurrentChannel++;
                        }

                        if (!isCamAlreadyDecodingChannel)
                        {
                            isCamAlreadyDecodingChannel = IsCamAlreadyDecodingChannel(tuningDetail, userChannel);
                        }
                    }

                    bool isFreeToAir = CardReservationHelper.IsFreeToAir(tvcard, user);

                    cardTuneReservationTicket = new CardTuneReservationTicket
                                                (
                        user,
                        tuningDetail,
                        isTunedToTransponder,
                        numberOfOtherUsersOnSameChannel,
                        isAnySubChannelTimeshifting,
                        inactiveUsers,
                        activeUsers,
                        users,
                        ownerSubchannel,
                        isOwner,
                        tvcard.DataBaseCard.IdCard,
                        tvcard.NumberOfChannelsDecrypting,
                        isFreeToAir,
                        numberOfOtherUsersOnCurrentCard,
                        recUsers,
                        tsUsers,
                        conflictingSubchannelFound,
                        numberOfUsersOnSameCurrentChannel,
                        isCamAlreadyDecodingChannel,
                        hasUserHighestPriority,
                        hasUserEqualOrHigherPriority);
                    tvcard.Tuner.ActiveCardTuneReservationTicket = cardTuneReservationTicket;
                    tvcard.Tuner.ReservationsForTune.Add(cardTuneReservationTicket);
                }

                cardTuneState = tvcard.Tuner.CardTuneState;
                if (tvcard.Tuner.ActiveCardTuneReservationTicket != null)
                {
                    ticketId = tvcard.Tuner.ActiveCardTuneReservationTicket.Id;
                }
            }


            if (cardTuneReservationTicket != null)
            {
                Log.Debug("RequestCardTuneReservation: placed reservation with id={0}, tuningdetails={1}", cardTuneReservationTicket.Id, cardTuneReservationTicket.TuningDetail);
            }
            else
            {
                if (ticketId > 0)
                {
                    Log.Debug("RequestCardTuneReservation: failed reservation tuningdetails={0}, res id blocking={1}, state={2}", tuningDetail, ticketId, cardTuneState);
                }
                else
                {
                    Log.Debug("RequestCardTuneReservation: failed reservation tuningdetails={0}, res id blocking={1}, state={2}", tuningDetail, "n/a", cardTuneState);
                }
            }
            return(cardTuneReservationTicket);
        }