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); }
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; } }
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); }
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); }