/// <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> /// Gets the video audio pins. /// </summary> protected void AddTsWriterFilterToGraph() { if (_filterTsWriter == null) { Log.Log.WriteFile("dvb: Add Mediaportal TsWriter filter"); _filterTsWriter = (IBaseFilter)new MpTsAnalyzer(); int hr = _graphBuilder.AddFilter(_filterTsWriter, "MediaPortal Ts Analyzer"); if (hr != 0) { Log.Log.Error("dvb: Add main Ts Analyzer returns:0x{0:X}", hr); throw new TvException("Unable to add Ts Analyzer filter"); } _interfaceChannelScan = (ITsChannelScan)_filterTsWriter; _interfaceEpgGrabber = (ITsEpgScanner)_filterTsWriter; _interfaceChannelLinkageScanner = (ITsChannelLinkageScanner)_filterTsWriter; } }