Index: TVLibrary/TVLibrary/Implementations/Analog/Graphs/Analog/AnalogSubChannel.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/Analog/Graphs/Analog/AnalogSubChannel.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/Analog/Graphs/Analog/AnalogSubChannel.cs (working copy) @@ -107,6 +107,7 @@ { _teletextDecoder.ClearBuffer(); } + OnAfterTuneEvent(); } /// @@ -117,6 +118,7 @@ { Log.Log.WriteFile("analog subch:{0} OnGraphStarted", _subChannelId); _dateTimeShiftStarted = DateTime.MinValue; + OnAfterTuneEvent(); } /// Index: TVLibrary/TVLibrary/Implementations/Analog/Graphs/Analog/TvCardAnalog.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/Analog/Graphs/Analog/TvCardAnalog.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/Analog/Graphs/Analog/TvCardAnalog.cs (working copy) @@ -707,6 +707,8 @@ throw new TvExceptionNoSignal("Unable to tune to channel - no signal"); } } + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStart(); } @@ -739,6 +741,8 @@ { throw new TvExceptionNoSignal("Unable to tune to channel - no signal"); } + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStarted(); } Index: TVLibrary/TVLibrary/Implementations/Analog/Graphs/HDPVR/HDPVRChannel.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/Analog/Graphs/HDPVR/HDPVRChannel.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/Analog/Graphs/HDPVR/HDPVRChannel.cs (working copy) @@ -143,6 +143,8 @@ Log.Log.Write("subch:{0} set pmt grabber pmt:{1:X} sid:{2:X}", _subChannelId, pmtPid, serviceId); _tsFilterInterface.PmtSetCallBack(_subChannelId, this); _tsFilterInterface.PmtSetPmtPid(_subChannelId, pmtPid, serviceId); + + OnAfterTuneEvent(); return true; } Index: TVLibrary/TVLibrary/Implementations/Analog/Graphs/HDPVR/TVCardHDPVR.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/Analog/Graphs/HDPVR/TVCardHDPVR.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/Analog/Graphs/HDPVR/TVCardHDPVR.cs (working copy) @@ -816,6 +816,8 @@ if (_mapSubChannels.ContainsKey(subChannel)) { + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStarted(); } @@ -844,6 +846,8 @@ } if (_mapSubChannels.ContainsKey(subChannel)) { + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStarted(); } } Index: TVLibrary/TVLibrary/Implementations/BaseSubChannel.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/BaseSubChannel.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/BaseSubChannel.cs (working copy) @@ -36,21 +36,21 @@ /// public abstract class BaseSubChannel : ITvSubChannel { - #region Audio/Video Observer event and method + #region events /// - /// Delegate for the audio video oberserver events + /// Delegate for the audio/video oberserver events. /// /// Type of the pid public delegate void AudioVideoObserverEvent(PidType pidType); /// - /// Audio observer event + /// Audio/video observer event. /// public event AudioVideoObserverEvent AudioVideoEvent; /// - /// Handles the audio video observer event + /// Handles the audio/video observer event. /// /// Type of the pid protected void OnAudioVideoEvent(PidType pidType) @@ -61,6 +61,28 @@ } } + /// + /// Delegate for the after tune event. + /// + public delegate void OnAfterTuneDelegate(); + + /// + /// After tune observer event. + /// + public event OnAfterTuneDelegate AfterTuneEvent; + + /// + /// Handles the after tune observer event. + /// + /// Type of the pid + protected void OnAfterTuneEvent() + { + if (AfterTuneEvent != null) + { + AfterTuneEvent(); + } + } + #endregion #region variables Index: TVLibrary/TVLibrary/Implementations/DVB/Graphs/DVBIP/TvCardDVBIPBuiltIn.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/DVB/Graphs/DVBIP/TvCardDVBIPBuiltIn.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/DVB/Graphs/DVBIP/TvCardDVBIPBuiltIn.cs (working copy) @@ -115,8 +115,8 @@ } if (_mapSubChannels.ContainsKey(subChannel)) { - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent -= new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent += new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStart(); } RemoveStreamSourceFilter(); @@ -132,8 +132,8 @@ _epgGrabbing = false; if (_mapSubChannels.ContainsKey(subChannel)) { - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent -= new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent += new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStarted(); } } Index: TVLibrary/TVLibrary/Implementations/DVB/Graphs/DVBIP/TvCardDVBIPElecard.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/DVB/Graphs/DVBIP/TvCardDVBIPElecard.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/DVB/Graphs/DVBIP/TvCardDVBIPElecard.cs (working copy) @@ -115,8 +115,8 @@ } if (_mapSubChannels.ContainsKey(subChannel)) { - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent -= new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent += new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStart(); } RemoveStreamSourceFilter(); @@ -132,8 +132,8 @@ _epgGrabbing = false; if (_mapSubChannels.ContainsKey(subChannel)) { - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent -= new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent += new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStarted(); } } Index: TVLibrary/TVLibrary/Implementations/DVB/Graphs/TvCardDvbBase.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/DVB/Graphs/TvCardDvbBase.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/DVB/Graphs/TvCardDvbBase.cs (working copy) @@ -277,13 +277,6 @@ #endregion - #region events - - public event OnAfterTuneDelegate OnAfterTuneEvent; - public delegate void OnAfterTuneDelegate(); - - #endregion - #region tuning protected virtual void OnAfterTune (IChannel channel) @@ -684,8 +677,8 @@ throw new TvExceptionNoSignal("Unable to tune to channel - no signal"); } } - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent -= new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent += new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStart(); } @@ -715,20 +708,12 @@ //Log.Log.WriteFile("Unable to tune to channel - no signal"); throw new TvExceptionNoSignal("Unable to tune to channel - no signal"); } - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent -= new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); - ((TvDvbChannel)_mapSubChannels[subChannel]).OnAfterTuneEvent += new TvDvbChannel.OnAfterTuneDelegate(TvCardDvbBase_OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent -= new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); + _mapSubChannels[subChannel].AfterTuneEvent += new BaseSubChannel.OnAfterTuneDelegate(OnAfterTuneEvent); _mapSubChannels[subChannel].OnGraphStarted(); } } - protected void TvCardDvbBase_OnAfterTuneEvent() - { - if (OnAfterTuneEvent != null) - { - OnAfterTuneEvent(); - } - } - /// /// Methods which pauses the graph /// Index: TVLibrary/TVLibrary/Implementations/DVB/Graphs/TvDvbChannel.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/DVB/Graphs/TvDvbChannel.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/DVB/Graphs/TvDvbChannel.cs (working copy) @@ -40,14 +40,6 @@ public class TvDvbChannel : BaseSubChannel, ITeletextCallBack, IPMTCallback, ICACallback, ITvSubChannel, IVideoAudioObserver { - - #region events - - public event OnAfterTuneDelegate OnAfterTuneEvent; - public delegate void OnAfterTuneDelegate(); - - #endregion - #region variables #region local variables @@ -839,11 +831,7 @@ _tsFilterInterface.CaReset(_subChannelIndex); } - if (OnAfterTuneEvent != null) - { - OnAfterTuneEvent(); - } - + OnAfterTuneEvent(); return true; } Index: TVLibrary/TVLibrary/Implementations/Hybrid/HybridCard.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/Hybrid/HybridCard.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/Hybrid/HybridCard.cs (working copy) @@ -22,6 +22,7 @@ using TvLibrary.Interfaces; using TvLibrary.Epg; using TvLibrary.ChannelLinkage; +using System; namespace TvLibrary.Implementations.Hybrid { @@ -78,11 +79,25 @@ #region properties /// - /// Gets wether or not card supports pausing the graph. + /// Sets the after tune event listener on the internal card. /// + /// the delegate + public TvCardBase.OnAfterTuneDelegate AfterTuneEvent + { + set + { + (_internalCard as TvCardBase).AfterTuneEvent -= value; + (_internalCard as TvCardBase).AfterTuneEvent += value; + } + } + + /// + /// Gets whether or not card supports pausing the graph. + /// + /// true if the card supports pausing the graph, otherwise false public bool SupportsPauseGraph { - get { return true; } + get { return _internalCard.SupportsPauseGraph; } } /// @@ -97,7 +112,7 @@ /// /// Does the card have a CA module. /// - /// The number of channels decrypting. + /// true if the card supports conditional access, otherwise false public bool HasCA { get { return _internalCard.HasCA; } Index: TVLibrary/TVLibrary/Implementations/TvCardBase.cs =================================================================== --- TVLibrary/TVLibrary/Implementations/TvCardBase.cs (revision 26870) +++ TVLibrary/TVLibrary/Implementations/TvCardBase.cs (working copy) @@ -33,6 +33,31 @@ /// public abstract class TvCardBase { + #region events + + /// + /// Delegate for the after tune event. + /// + public delegate void OnAfterTuneDelegate(); + + /// + /// After tune observer event. + /// + public event OnAfterTuneDelegate AfterTuneEvent; + + /// + /// Handles the after tune observer event. + /// + protected void OnAfterTuneEvent() + { + if (AfterTuneEvent != null) + { + AfterTuneEvent(); + } + } + + #endregion + #region ctor /// Index: TVLibrary/TvService/CardManagement/CardHandler/CardTuner.cs =================================================================== --- TVLibrary/TvService/CardManagement/CardHandler/CardTuner.cs (revision 26870) +++ TVLibrary/TvService/CardManagement/CardHandler/CardTuner.cs (working copy) @@ -20,6 +20,7 @@ using System; using TvLibrary; +using TvLibrary.Implementations; using TvLibrary.Implementations.DVB; using TvLibrary.Implementations.Hybrid; using TvLibrary.Interfaces; @@ -327,12 +328,21 @@ { OnBeforeTuneEvent(_cardHandler); } - TvCardDvbBase dvbCard = _cardHandler.Card as TvCardDvbBase; - if (dvbCard != null) + + TvCardBase card = _cardHandler.Card as TvCardBase; + if (card != null) { - dvbCard.OnAfterTuneEvent -= new TvCardDvbBase.OnAfterTuneDelegate(dvbCard_OnAfterTuneEvent); - dvbCard.OnAfterTuneEvent += new TvCardDvbBase.OnAfterTuneDelegate(dvbCard_OnAfterTuneEvent); + card.AfterTuneEvent -= new TvCardBase.OnAfterTuneDelegate(Card_OnAfterTuneEvent); + card.AfterTuneEvent += new TvCardBase.OnAfterTuneDelegate(Card_OnAfterTuneEvent); } + else + { + HybridCard hybridCard = _cardHandler.Card as HybridCard; + if (hybridCard != null) + { + hybridCard.AfterTuneEvent = new TvCardBase.OnAfterTuneDelegate(Card_OnAfterTuneEvent); + } + } result = TvResult.Succeeded; return true; @@ -344,7 +354,7 @@ public event OnBeforeTuneDelegate OnBeforeTuneEvent; public delegate void OnBeforeTuneDelegate(ITvCardHandler cardHandler); - private void dvbCard_OnAfterTuneEvent() + private void Card_OnAfterTuneEvent() { if (OnAfterTuneEvent != null) { Index: TVLibrary/TvService/TVController.cs =================================================================== --- TVLibrary/TvService/TVController.cs (revision 26870) +++ TVLibrary/TvService/TVController.cs (working copy) @@ -3822,7 +3822,7 @@ _cards[user.CardId].Tuner.OnBeforeTuneEvent -= new CardTuner.OnBeforeTuneDelegate(Tuner_OnBeforeTuneEvent); _cards[user.CardId].Tuner.OnAfterTuneEvent += new CardTuner.OnAfterTuneDelegate(Tuner_OnAfterTuneEvent); - _cards[user.CardId].Tuner.OnBeforeTuneEvent += new CardTuner.OnBeforeTuneDelegate(Tuner_OnBeforeTuneEvent); + _cards[user.CardId].Tuner.OnBeforeTuneEvent += new CardTuner.OnBeforeTuneDelegate(Tuner_OnBeforeTuneEvent); TvResult result = _cards[user.CardId].Tuner.CardTune(ref user, channel, dbChannel); Log.Info("Controller: {0} {1} {2}", user.Name, user.CardId, user.SubChannel);