/// <summary> /// Connects two filters' pins together based on the media types specified /// </summary> /// <param name="upFilter">upstream filter</param> /// <param name="upMajor">upstream pin major media type</param> /// <param name="upSub">upstream pin sub media type</param> /// <param name="downFilter">downstream filter</param> /// <param name="downMajor">downstream pin major media type</param> /// <param name="downSub">downstream pin minor media type</param> /// <param name="useIntelligentConnect"> /// TRUE to use intelligent connect inserting filters if needed /// FALSE to directly connect filters /// </param> protected void ConnectFilters(IBaseFilter upFilter, Guid upMajor, Guid upSub, IBaseFilter downFilter, Guid downMajor, Guid downSub, bool useIntelligentConnect) { IPin downstreamPin = null; IPin upstreamPin = null; try { try { upstreamPin = FindPinWithMediaType(upFilter, PinDirection.Output, upMajor, upSub); } catch (Exception ex) { throw new Exception("Upstream filter has no such pin", ex); } try { downstreamPin = FindPinWithMediaType(downFilter, PinDirection.Input, downMajor, downSub); } catch (Exception ex) { throw new Exception("Downstream filter has no such pin", ex); } ConnectFilters(upstreamPin, downstreamPin, useIntelligentConnect); } finally { downstreamPin.Release(); upstreamPin.Release(); } }
/// <summary> /// Connects an upstream filter, with a pin matching a specific media type, to the named pin on the downstream filter. /// Finds the /// </summary> /// <param name="upFilter">upstream filter</param> /// <param name="upPinMajor">upstream pin major media type</param> /// <param name="upPinSub">upstream pin sub media type</param> /// <param name="downFilter">downstream filter</param> /// <param name="downPinName">downstream pin name</param> /// <param name="useIntelligentConnect"> /// TRUE to use intelligent connect inserting filters if needed /// FALSE to directly connect filters /// </param> protected void ConnectFilters(IBaseFilter upFilter, Guid upPinMajor, Guid upPinSub, IBaseFilter downFilter, string downPinName, bool useIntelligentConnect) { IPin downstreamPin = null; IPin upstreamPin = null; try { try { upstreamPin = FindPinWithMediaType(upFilter, PinDirection.Output, upPinMajor, upPinSub); } catch (Exception ex) { throw new Exception("Upstream filter has no such pin!", ex); } downFilter.FindPin(downPinName, out downstreamPin); if (downstreamPin == null) { throw new Exception("Downstream filter has no pin \"" + downPinName + "\"!"); } ConnectFilters(upstreamPin, downstreamPin, useIntelligentConnect); } finally { upstreamPin.Release(); downstreamPin.Release(); } }
/// <summary> /// Attach this graph to a source /// </summary> /// <param name="source">the source sub graph</param> public void SetSource(ISourceSubGraph source) { Debug.WriteLine("LTNetworkSink.SetSource: " + source.GetType().ToString()); List <DetailPinInfo> pins = null; try { netMux = (IBaseFilter) new LMNetMuxClass(); graph.AddFilter(netMux, @"LEAD Network Multiplexer (2.0)"); lmNetMux = (LMNetMux)netMux; lmNetMux.LiveSource = this.LiveSource; Debug.WriteLine(String.Format("LiveSource={0}", lmNetMux.LiveSource)); lmNetMux.MaxQueueDuration = this.MaxQueueDuration; netSnk = (IBaseFilter) new LMNetSnkClass(); graph.AddFilter(netSnk, "LEAD Network Sink (2.0)"); InitializeNetworkSink(); input = (IBaseFilter)source.Controller.InsertSourceFilter(source.Output, this.graph); pins = input.EnumPinsDetails(); int muxInputNumber = 1; foreach (DetailPinInfo i in pins) { IPin muxPin = null; try { muxPin = DsFindPin.ByName(netMux, "Input " + muxInputNumber.ToString("D2")); FilterGraphTools.ConnectFilters(this.graph, i.Pin, muxPin, false); } finally { if (muxPin != null) { muxPin.Release(); } } muxInputNumber++; } FilterGraphTools.ConnectFilters(this.graph, netMux, "Output 01", netSnk, "Input", false); } finally { if (pins != null) { pins.Release(); } } }
/// <summary> /// Connects the last filter in the audio chain to the audio volume filter (if AddAudioVolumeFilter has been called), and then /// to the audio renderer /// </summary> /// <remarks> /// First call AddAudioVolumeFilter() and AddAudioRenderer() /// </remarks> /// <param name="audioFilter">a filter in the graph that will be delivering the audio</param> /// <param name="audioOutPin">the pin on said filter that the audio stream comes from</param> /// <param name="useIntelligentConnect">true to use intelligent connect, false otherwise</param> protected void ConnectToAudio(IBaseFilter audioFilter, string audioOutPin, bool useIntelligentConnect) { IPin theAudioOutPin = null; try { theAudioOutPin = DsFindPin.ByName(audioFilter, audioOutPin); ConnectToAudio(theAudioOutPin, useIntelligentConnect); } finally { theAudioOutPin.Release(); } }
/// <summary> /// Finds a pin on the selected filter /// </summary> /// <param name="filter">filter to search</param> /// <param name="direction">direction the pin is in</param> /// <param name="major">major media type</param> /// <param name="sub">sub media type</param> /// <returns>matching IPin. Caller must release</returns> private IPin FindPinWithMediaType(IBaseFilter filter, PinDirection direction, Guid major, Guid sub) { List <DetailPinInfo> details = null; IPin preConnectedTo = null; try { details = filter.EnumPinsDetails(); foreach (DetailPinInfo pin in details) { if ((pin.Info.dir == direction) && (pin.Type != null)) { if ((pin.Type.majorType == major) && (pin.Type.subType == sub)) { //check if the pin we found matching is already connected if (pin.Pin.ConnectedTo(out preConnectedTo) == 0) { if (preConnectedTo != null) { preConnectedTo.Release(); preConnectedTo = null; continue; } } //make sure that releasing the details doesn't release the IPin IPin toReturn = pin.Pin; pin.Pin = null; return(toReturn); } } } throw new Exception("No pin found with major=" + major.ToString() + " and sub=" + sub.ToString() + ", or pin already connected!"); } finally { details.Release(); } }