public GraphBuilderTV TuneChannel(Channel channel, bool needRebuild, GraphBuilderBase currentGraph, VideoControl hostingControl) { if (needRebuild && currentGraph != null) { ClearGraph(); //OnGraphStop(); //currentGraph.Dispose(); //currentGraph = null; } GraphBuilderTV currentGraphTV = currentGraph as GraphBuilderTV; if (channel is ChannelDVB) { ChannelDVB channelDVB = channel as ChannelDVB; if (needRebuild) { GraphBuilderBDA newGraph = null; switch(this.graphBuilderType) { case GraphBuilderType.BDA: newGraph = new GraphBuilderBDA(hostingControl); break; case GraphBuilderType.BDATimeShifting: newGraph = new GraphBuilderBDATimeShifting(hostingControl); break; case GraphBuilderType.BDAMosaic: newGraph = new GraphBuilderBDAMosaic(hostingControl); break; } newGraph.GraphStarted += new EventHandler(newGraph_GraphStarted); newGraph.GraphEnded += new EventHandler(newGraph_GraphEnded); newGraph.PossibleChanged += new EventHandler<GraphBuilderBase.PossibleEventArgs>(newGraph_PossibleChanged); newGraph.Settings = Settings; currentGraphTV = newGraph; newGraph.ReferenceClock = channelDVB.ReferenceClock; newGraph.AudioDecoderType = channelDVB.AudioDecoderType; DsDevice device; if (!string.IsNullOrEmpty(channelDVB.AudioDecoderDevice)) { if (GraphBuilderBDA.AudioDecoderDevices.TryGetValue(channelDVB.AudioDecoderDevice, out device)) newGraph.AudioDecoderDevice = device; else throw new Exception(string.Format(Properties.Resources.AudioDeviceNotFound, channelDVB.AudioDecoderDevice)); } if (channelDVB.VideoDecoderType == ChannelDVB.VideoType.MPEG2) { if (!string.IsNullOrEmpty(channelDVB.MPEG2DecoderDevice)) { if (GraphBuilderBDA.MPEG2DecoderDevices.TryGetValue(channelDVB.MPEG2DecoderDevice, out device)) newGraph.Mpeg2DecoderDevice = device; else throw new Exception(string.Format(Properties.Resources.MPEG2DecoderDeviceNotFound, channelDVB.MPEG2DecoderDevice)); } } else { if (!string.IsNullOrEmpty(channelDVB.H264DecoderDevice)) { if (GraphBuilderBDA.H264DecoderDevices.TryGetValue(channelDVB.H264DecoderDevice, out device)) newGraph.H264DecoderDevice = device; else throw new Exception(string.Format(Properties.Resources.H264DecoderDeviceNotFound, channelDVB.H264DecoderDevice)); } } if (!string.IsNullOrEmpty(channelDVB.AudioRendererDevice)) { if (GraphBuilderBDA.AudioRendererDevices.TryGetValue(channelDVB.AudioRendererDevice, out device)) newGraph.AudioRendererDevice = device; else throw new Exception(string.Format(Properties.Resources.AudioRendererDeviceNotFound, channelDVB.AudioRendererDevice)); } if (!string.IsNullOrEmpty(channelDVB.TunerDevice)) { if (GraphBuilderBDA.TunerDevices.TryGetValue(channelDVB.TunerDevice, out device)) newGraph.TunerDevice = device; else throw new Exception(string.Format(Properties.Resources.TunerDeviceNotFound, channelDVB.TunerDevice)); } if (!string.IsNullOrEmpty(channelDVB.CaptureDevice)) { if (GraphBuilderBDA.CaptureDevices.TryGetValue(channelDVB.CaptureDevice, out device)) newGraph.CaptureDevice = device; else throw new Exception(string.Format(Properties.Resources.CaptureDeviceNotFound, channelDVB.CaptureDevice)); } IDVBTuningSpace tuningSpace = (IDVBTuningSpace)new DVBTuningSpace(); if (channel is ChannelDVBT) { tuningSpace.put_UniqueName("DVBT TuningSpace"); tuningSpace.put_FriendlyName("DVBT TuningSpace"); tuningSpace.put_NetworkType(CLSID.DVBTNetworkProvider); tuningSpace.put_SystemType(DVBSystemType.Terrestrial); } else if (channel is ChannelDVBC) { tuningSpace.put_UniqueName("DVBC TuningSpace"); tuningSpace.put_FriendlyName("DVBC TuningSpace"); tuningSpace.put_NetworkType(CLSID.DVBCNetworkProvider); tuningSpace.put_SystemType(DVBSystemType.Cable); } else if (channel is ChannelDVBS) { tuningSpace.put_UniqueName("DVBS TuningSpace"); tuningSpace.put_FriendlyName("DVBS TuningSpace"); tuningSpace.put_NetworkType(CLSID.DVBSNetworkProvider); tuningSpace.put_SystemType(DVBSystemType.Satellite); } newGraph.TuningSpace = tuningSpace as ITuningSpace; newGraph.BuildGraph(); } currentGraphTV.SubmitTuneRequest(channel); currentGraphTV.VideoZoomMode = channelDVB.VideoZoomMode; currentGraphTV.VideoKeepAspectRatio = channelDVB.VideoKeepAspectRatio; currentGraphTV.VideoOffset = channelDVB.VideoOffset; currentGraphTV.VideoZoom = channelDVB.VideoZoom; currentGraphTV.VideoAspectRatioFactor = channelDVB.VideoAspectRatioFactor; currentGraphTV.RunGraph(); //currentGraph.VideoResizer(); currentGraphTV.CurrentChannel = channel; } else if (channel is ChannelAnalogic) { ChannelAnalogic channelAnalogic = channel as ChannelAnalogic; if (needRebuild) { GraphBuilderWDM newGraph = new GraphBuilderWDM(hostingControl); newGraph.GraphStarted += new EventHandler(newGraph_GraphStarted); newGraph.GraphEnded += new EventHandler(newGraph_GraphEnded); newGraph.PossibleChanged += new EventHandler<GraphBuilderBase.PossibleEventArgs>(newGraph_PossibleChanged); newGraph.Settings = Settings; currentGraphTV = newGraph; DsDevice device; if (GraphBuilderWDM.AudioRendererDevices.TryGetValue(channelAnalogic.AudioRendererDevice, out device)) newGraph.AudioRendererDevice = device; if (GraphBuilderWDM.VideoInputDevices.TryGetValue(channelAnalogic.VideoCaptureDeviceName, out device)) newGraph.VideoCaptureDevice = device; if (GraphBuilderWDM.AudioInputDevices.TryGetValue(channelAnalogic.AudioCaptureDeviceName, out device)) newGraph.AudioCaptureDevice = device; newGraph.FormatOfCapture = channelAnalogic.FormatOfCapture; newGraph.BuildGraph(); } bool goodTuning = true; try { currentGraphTV.SubmitTuneRequest(channel); } catch (COMException) { goodTuning = false; } if (goodTuning) { currentGraphTV.VideoZoomMode = channelAnalogic.VideoZoomMode; currentGraphTV.VideoKeepAspectRatio = channelAnalogic.VideoKeepAspectRatio; currentGraphTV.VideoOffset = channelAnalogic.VideoOffset; currentGraphTV.VideoZoom = channelAnalogic.VideoZoom; currentGraphTV.VideoAspectRatioFactor = channelAnalogic.VideoAspectRatioFactor; currentGraphTV.RunGraph(); //currentGraph.VideoResizer(); currentGraphTV.CurrentChannel = channel; } else currentGraphTV.CurrentChannel = null; } return currentGraphTV; }