예제 #1
0
파일: BaseGraph.cs 프로젝트: ewin66/media
        /// <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();
            }
        }
예제 #2
0
파일: BaseGraph.cs 프로젝트: ewin66/media
        /// <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();
            }
        }
예제 #3
0
        /// <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();
                }
            }
        }
예제 #4
0
파일: BaseGraph.cs 프로젝트: ewin66/media
        /// <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();
            }
        }
예제 #5
0
파일: BaseGraph.cs 프로젝트: ewin66/media
        /// <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();
            }
        }