/// <summary> /// destroys the graph and cleans up any resources /// </summary> protected void Decompose() { if (_graphBuilder == null || !CheckThreadId()) return; Log.Log.WriteFile("dvb:Decompose"); if (_epgGrabbing) { if (_epgGrabberCallback != null && _epgGrabbing) { Log.Log.Epg("dvb:cancel epg->decompose"); _epgGrabberCallback.OnEpgCancelled(); } _epgGrabbing = false; } FreeAllSubChannels(); Log.Log.WriteFile(" stop"); // Decompose the graph int counter = 0, hr = 0; FilterState state = FilterState.Running; hr = ((IMediaControl)_graphBuilder).Stop(); while (state != FilterState.Stopped) { System.Threading.Thread.Sleep(100); hr = ((IMediaControl)_graphBuilder).GetState(10, out state); counter++; if (counter >= 30) { if (state != FilterState.Stopped) Log.Log.Error("dvb:graph still running"); break; } } //In case MDPlugs exists then close and release them if (_mdplugs != null) { Log.Log.Info(" Closing MDAPI Plugins"); _mdplugs.Close(); _mdplugs = null; } if (_conditionalAccess != null) { Log.Log.Info(" Disposing ConditionalAccess"); _conditionalAccess.Dispose(); _conditionalAccess = null; } Log.Log.WriteFile(" free..."); _interfaceChannelScan = null; _interfaceEpgGrabber = null; _previousChannel = null; if (_filterMpeg2DemuxTif != null) { Release.ComObject("_filterMpeg2DemuxTif filter", _filterMpeg2DemuxTif); _filterMpeg2DemuxTif = null; } if (_filterNetworkProvider != null) { Release.ComObject("_filterNetworkProvider filter", _filterNetworkProvider); _filterNetworkProvider = null; } if (_infTeeMain != null) { Release.ComObject("main inftee filter", _infTeeMain); _infTeeMain = null; } if (_infTeeSecond != null) { Release.ComObject("second inftee filter", _infTeeSecond); _infTeeSecond = null; } if (_filterTuner != null) { while (Release.ComObject(_filterTuner) > 0) ; _filterTuner = null; } if (_filterCapture != null) { while (Release.ComObject(_filterCapture) > 0) ; _filterCapture = null; } if (_filterWinTvUsb != null) { Log.Log.Info(" Stopping WinTVCI module"); winTvCiHandler.Shutdown(); while (Release.ComObject(_filterWinTvUsb) > 0) ; _filterWinTvUsb = null; } if (_filterTIF != null) { Release.ComObject("TIF filter", _filterTIF); _filterTIF = null; } //if (_filterSectionsAndTables != null) //{ // Release.ComObject("secions&tables filter", _filterSectionsAndTables); _filterSectionsAndTables = null; //} Log.Log.WriteFile(" free pins..."); if (_filterTsWriter as IBaseFilter != null) { Release.ComObject("TSWriter filter", _filterTsWriter); _filterTsWriter = null; } else { Log.Log.Debug("!!! Error releasing TSWriter filter (_filterTsWriter as IBaseFilter was null!)"); _filterTsWriter = null; } Log.Log.WriteFile(" free graph..."); if (_rotEntry != null) { _rotEntry.Dispose(); _rotEntry = null; } if (_capBuilder != null) { Release.ComObject("capture builder", _capBuilder); _capBuilder = null; } if (_graphBuilder != null) { FilterGraphTools.RemoveAllFilters(_graphBuilder); Release.ComObject("graph builder", _graphBuilder); _graphBuilder = null; } Log.Log.WriteFile(" free devices..."); if (_deviceWinTvUsb != null) { DevicesInUse.Instance.Remove(_deviceWinTvUsb); _deviceWinTvUsb = null; } if (_tunerDevice != null) { DevicesInUse.Instance.Remove(_tunerDevice); _tunerDevice = null; } if (_captureDevice != null) { DevicesInUse.Instance.Remove(_captureDevice); _captureDevice = null; } if (_tunerStatistics != null) { for (int i = 0; i < _tunerStatistics.Count; i++) { IBDA_SignalStatistics stat = _tunerStatistics[i]; while (Release.ComObject(stat) > 0) ; } _tunerStatistics.Clear(); } Log.Log.WriteFile(" decompose done..."); _graphState = GraphState.Idle; }
/// <summary> /// Initializes a new instance of the <see cref="TvDvbChannel"/> class. /// </summary> /// <param name="graphBuilder">The graph builder.</param> /// <param name="ca">The ca.</param> /// <param name="mdplugs">The mdplugs class.</param> /// <param name="tif">The tif filter.</param> /// <param name="tsWriter">The ts writer filter.</param> /// <param name="subChannelId">The subchannel id</param> /// <param name="channel">The corresponding channel</param> public TvDvbChannel(IFilterGraph2 graphBuilder, ConditionalAccess ca, MDPlugs mdplugs, IBaseFilter tif, IBaseFilter tsWriter, int subChannelId, IChannel channel) { _cancelled = false; _listenCA = false; _eventPMT = new ManualResetEvent(false); _eventCA = new ManualResetEvent(false); _graphState = GraphState.Created; _graphBuilder = graphBuilder; _conditionalAccess = ca; _mdplugs = mdplugs; _filterTIF = tif; _teletextDecoder = new DVBTeletext(); _packetHeader = new TSHelperTools.TSHeader(); _tsHelper = new TSHelperTools(); _channelInfo = new ChannelInfo(); _pmtPid = -1; _subChannelIndex = -1; _tsFilterInterface = (ITsFilter)tsWriter; _tsFilterInterface.AddChannel(ref _subChannelIndex); Log.Log.WriteFile("TvDvbChannel ctor new subchIndex:{0}", _subChannelIndex); _subChannelId = subChannelId; _conditionalAccess.AddSubChannel(_subChannelId, channel); _timeshiftFileName = ""; _recordingFileName = ""; _pmtData = null; _pmtLength = 0; }
/// <summary> /// Add MD Plugs /// </summary> /// <param name="lastFilter">Last Filter in the graph</param> protected void AddMdPlugs(ref IBaseFilter lastFilter) { int hr = -1; if (_cardType == CardType.DvbIP) { _mdplugs = MDPlugs.Create(Name, DevicePath); } else { DsDevice dv = _captureDevice ?? _tunerDevice; string DisplayMoniker; dv.Mon.GetDisplayName(null, null, out DisplayMoniker); _mdplugs = MDPlugs.Create(dv.Name, DisplayMoniker); } if (_mdplugs != null) { _infTeeSecond = (IBaseFilter)new InfTee(); hr = _graphBuilder.AddFilter(_infTeeSecond, "Inf Tee Second"); if (hr != 0) { Log.Log.Error("dvb:Add second InfTee returns:0x{0:X}", hr); throw new TvException("Unable to add second InfTee"); } Log.Log.WriteFile("dvb: Render ...->[inftee] second "); hr = _capBuilder.RenderStream(null, null, lastFilter, null, _infTeeSecond); if (hr != 0) { Log.Log.Error("dvb:Unable to connect InfTee second returns:0x{0:X}", hr); throw new TvExceptionGraphBuildingFailed("Could not connect InfTee second Filter to last Filter"); } lastFilter = _infTeeSecond; _mdplugs.Connectmdapifilter(_graphBuilder, ref lastFilter); } }
/// <summary> /// MDPlugs public static Creator to test condition before create an instance /// </summary> public static MDPlugs Create(string deviceName, string devicePath) { string CardFolder; int InstanceNumber; if (IsMDApiEnabled(deviceName, devicePath, out CardFolder, out InstanceNumber)) { Log.Log.Info("mdplugs: Create - IsMDApiEnabled for {0} - {1}", CardFolder, InstanceNumber); MDPlugs ret = new MDPlugs(CardFolder, InstanceNumber); return ret; } return null; }