Пример #1
0
        internal IPin FindPin(IBaseFilter filter, string name)
        {
            IEnumPins enumPins = null;

            IPin[] pins = new IPin[1];

            reply = filter.EnumPins(out enumPins);
            DsError.ThrowExceptionForHR(reply);

            while (enumPins.Next(pins.Length, pins, IntPtr.Zero) == 0)
            {
                PinInfo pinInfo;
                reply = pins[0].QueryPinInfo(out pinInfo);
                if (reply != 0)
                {
                    FilterInfo filterInfo;
                    filter.QueryFilterInfo(out filterInfo);
                    throw (new InvalidOperationException("The pin '" + name + "' could not be located for filter '" + filterInfo.achName + "'"));
                }

                if (pinInfo.name.StartsWith(name))
                {
                    Marshal.ReleaseComObject(enumPins);
                    return(pins[0]);
                }
            }

            Marshal.ReleaseComObject(enumPins);

            return(null);
        }
Пример #2
0
        /// <summary>
        /// Disconnect all output pins of the specified filter.
        /// </summary>
        /// <param name="pFilter">Specifies the filter whos output pins are to be disconnected.</param>
        /// <returns>On success, 0 is returned, otherwise an error is returned.</returns>
        public static int DisconnectAllOutputPins(IBaseFilter pFilter)
        {
            IEnumPins iEnum = null;

            int hr = pFilter.EnumPins(out iEnum);

            if (hr < 0)
            {
                Marshal.ThrowExceptionForHR(hr);
            }

            IPin[] rgPin = new IPin[1];
            int    nFetched;

            while (iEnum.Next(1, rgPin, out nFetched) == 0)
            {
                PinInfo pinInfo;
                hr = rgPin[0].QueryPinInfo(out pinInfo);
                if (hr < 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }

                if (pinInfo.dir == PinDirection.Output)
                {
                    rgPin[0].Disconnect();
                }

                Marshal.ReleaseComObject(rgPin[0]);
            }

            return(0);
        }
Пример #3
0
        private static IPin EnumeratePinsUntil(this IBaseFilter filter, Func <IPin, int, bool> predicate)
        {
            // Declare variables
            IPin foundPin = null;

            IPin[]    pin      = new IPin[1];
            IEnumPins pinsEnum = null;

            // Enumerator the pins
            if (filter.EnumPins(out pinsEnum) == 0)
            {
                int n = 0;

                // Loop the pins
                while (pinsEnum.Next(1, pin, out n) == 0)
                {
                    if (predicate(pin[0], n - 1))
                    {
                        foundPin = pin[0];
                        break;
                    }

                    // Release the pin, this is not the one we are looking for
                    Marshal.ReleaseComObject(pin[0]);
                    pin[0] = null;
                }
            }

            // Not found
            return(foundPin);
        }
Пример #4
0
        internal IPin FindPin(IBaseFilter filter, PinDirection direction)
        {
            IEnumPins enumPins = null;

            IPin[] pins = new IPin[1];

            reply = filter.EnumPins(out enumPins);
            DsError.ThrowExceptionForHR(reply);

            while (enumPins.Next(pins.Length, pins, IntPtr.Zero) == 0)
            {
                PinDirection pinDirection;

                reply = pins[0].QueryDirection(out pinDirection);
                DsError.ThrowExceptionForHR(reply);

                if (pinDirection == direction)
                {
                    Marshal.ReleaseComObject(enumPins);
                    return(pins[0]);
                }
            }

            Marshal.ReleaseComObject(enumPins);

            return(null);
        }
Пример #5
0
        /// <summary>
        /// ピンの検索
        /// </summary>
        /// <param name="filter">フィルタ</param>
        /// <param name="name">ピン名称</param>
        /// <returns>
        ///		見つかった場合は、ピンの IPin インターフェースを返します。
        ///		見つからなかった場合は、 null を返します。
        ///	</returns>
        public static IPin FindPin(IBaseFilter filter, string name)
        {
            IEnumPins enumpins = null;
            IPin      pin      = null;

            try
            {
                filter.EnumPins(ref enumpins);

                int fetched = 0;
                while (enumpins.Next(1, ref pin, ref fetched) == 0)
                {
                    if (fetched == 0)
                    {
                        break;
                    }

                    var info = new PIN_INFO();

                    try
                    {
                        pin.QueryPinInfo(info);
                        if (info.achName == name)
                        {
                            return(pin);
                        }

                        if (pin != null)
                        {
                            Marshal.ReleaseComObject(pin);
                        }
                        pin = null;
                    }
                    finally
                    {
                        if (info.pFilter != null)
                        {
                            Marshal.ReleaseComObject(info.pFilter);
                        }
                    }
                }
            }
            catch
            {
                if (pin != null)
                {
                    Marshal.ReleaseComObject(pin);
                }
                throw;
            }
            finally
            {
                if (enumpins != null)
                {
                    Marshal.ReleaseComObject(enumpins);
                }
            }

            return(null);
        }
Пример #6
0
        /// <summary>
        /// Meldet die nächsten Endpunkte.
        /// </summary>
        /// <param name="enum">Die zu erweiternde Schnittstelle.</param>
        /// <param name="pins">Die maximal zu meldende Anzahl von Endpunkten.</param>
        /// <param name="pinArray">Ein Speicher zur Aufnahme der Informationen.</param>
        /// <param name="fetched">Die tatsächlich übermittelte Anzahl von Endpunkten.</param>
        /// <returns>Das Ergebnis der Abfrage, negative Werte zeigen einen Fehler an.</returns>
        /// <exception cref="ArgumentNullException">Es wurde keine Schnittstelle angegeben.</exception>
        public static Int32 Next(this IEnumPins @enum, uint pins, IntPtr pinArray, ref uint fetched)
        {
            // Validate
            if (@enum == null)
            {
                throw new ArgumentNullException("enum");
            }

            // Helper
            var asArray = new[] { fetched };

            // Lock in memory
            var l = GCHandle.Alloc(asArray, GCHandleType.Pinned);

            try
            {
                // Process
                return(@enum.Next(pins, pinArray, l.AddrOfPinnedObject()));
            }
            finally
            {
                // Release the lock
                l.Free();

                // Copy back
                fetched = asArray[0];
            }
        }
Пример #7
0
        // Get pin of the filter
        public static IPin GetPin(IBaseFilter filter, PinDirection dir, int num)
        {
            IPin[] pin = new IPin[1];

            IEnumPins pinsEnum = null;

            // enum filter pins
            if (filter.EnumPins(out pinsEnum) == 0)
            {
                PinDirection pinDir;
                int          n;

                // get next pin
                while (pinsEnum.Next(1, pin, out n) == 0)
                {
                    // query pin`s direction
                    pin[0].QueryDirection(out pinDir);

                    if (pinDir == dir)
                    {
                        if (num == 0)
                        {
                            return(pin[0]);
                        }
                        num--;
                    }

                    Marshal.ReleaseComObject(pin[0]);
                    pin[0] = null;
                }
            }
            return(null);
        }
Пример #8
0
 public int EnumPins(out IEnumPins enumPins)
 {
     enumPins = new MyWavEnumPins(this);
     Console.WriteLine("EnumPins");
     return 0;
     //throw new NotImplementedException();
 }
Пример #9
0
        public static IPin GetPin(IBaseFilter filter, PinDirection dir, int num)
        {
            IPin[]    array    = new IPin[1];
            IEnumPins enumPins = null;

            if (filter.EnumPins(out enumPins) == 0)
            {
                try
                {
                    int pinsFetched;
                    while (enumPins.Next(1, array, out pinsFetched) == 0)
                    {
                        array[0].QueryDirection(out PinDirection pinDirection);
                        if (pinDirection == dir)
                        {
                            if (num == 0)
                            {
                                return(array[0]);
                            }
                            num--;
                        }
                        Marshal.ReleaseComObject(array[0]);
                        array[0] = null;
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(enumPins);
                }
            }
            return(null);
        }
Пример #10
0
        public static IPin GetPin(this IBaseFilter filter, PinDirection dir, int num)
        {
            var       pin      = new IPin[1];
            IEnumPins pinsEnum = null;

            if (filter.EnumPins(out pinsEnum) == 0)
            {
                PinDirection pinDir;
                int          n;
                while (pinsEnum.Next(1, pin, out n) == 0)
                {
                    pin[0].QueryDirection(out pinDir);
                    if (pinDir == dir)
                    {
                        if (num == 0)
                        {
                            return(pin[0]);
                        }
                        num--;
                    }
                    Marshal.ReleaseComObject(pin[0]); pin[0] = null;
                }
            }
            return(null);
        }
Пример #11
0
        internal static IPin LocatePin(IBaseFilter filter, Guid mediaType, Guid mediaSubType, PinDirection direction)
        {
            int reply = 0;

            IEnumPins enumPins = null;

            IPin[] pins = new IPin[1];

            reply = filter.EnumPins(out enumPins);
            DsError.ThrowExceptionForHR(reply);

            while (enumPins.Next(pins.Length, pins, IntPtr.Zero) == 0)
            {
                PinDirection pinDirection;

                reply = pins[0].QueryDirection(out pinDirection);
                DsError.ThrowExceptionForHR(reply);

                if (pinDirection == direction)
                {
                    bool mediaReply = DirectShowGraph.checkMediaTypes(pins[0], mediaType, mediaSubType);
                    if (mediaReply)
                    {
                        Marshal.ReleaseComObject(enumPins);
                        return(pins[0]);
                    }
                }
            }

            Marshal.ReleaseComObject(enumPins);

            return(null);
        }
Пример #12
0
 public int Clone(out IEnumPins ppEnum)
 {
     ppEnum = new PinEnumerator(filter)
     {
         index = index
     };
     return(S_OK);
 }
Пример #13
0
        /// <summary>
        /// Return the first unconnected input or output pin.
        /// </summary>
        /// <param name="pFilter">Specifies the filter to check.</param>
        /// <param name="pinDir">Specifies the pin direction to look for.</param>
        /// <param name="ppPin">Returns the first unconnected pin in the direction specified.</param>
        /// <returns>An error value < 0 is returned or 0 for success.</returns>
        public static int FindUnconnectedPin(IBaseFilter pFilter, PinDirection pinDir, out IPin ppPin)
        {
            uint      VFW_E_NOT_FOUND = 0x80040216;
            IEnumPins pEnum           = null;
            bool      bFound          = false;

            ppPin = null;

            int hr = pFilter.EnumPins(out pEnum);

            if (hr < 0)
            {
                return(hr);
            }

            IPin[] rgPin = new IPin[1];
            int    nFetched;

            while (pEnum.Next(1, rgPin, out nFetched) == 0)
            {
                hr = MatchPin(rgPin[0], pinDir, false, out bFound);
                if (hr < 0)
                {
                    return(hr);
                }

                if (bFound)
                {
                    ppPin = rgPin[0];
                    break;
                }

                if (rgPin[0] != null)
                {
                    Marshal.ReleaseComObject(rgPin[0]);
                    rgPin[0] = null;
                }
            }

            if (!bFound)
            {
                hr = (int)VFW_E_NOT_FOUND;
            }

            if (rgPin[0] != null && ppPin == null)
            {
                Marshal.ReleaseComObject(rgPin[0]);
            }

            if (pEnum != null)
            {
                Marshal.ReleaseComObject(pEnum);
            }

            return(hr);
        }
Пример #14
0
        private void logPins(IBaseFilter filter)
        {
            IEnumPins enumPins = null;

            IPin[] pins = new IPin[1];

            reply = filter.EnumPins(out enumPins);
            DsError.ThrowExceptionForHR(reply);

            if (enumPins == null)
            {
                return;
            }

            while (enumPins.Next(pins.Length, pins, IntPtr.Zero) == 0)
            {
                PinInfo pinInfo;

                reply = pins[0].QueryPinInfo(out pinInfo);
                DsError.ThrowExceptionForHR(reply);

                IPin connectedPin = null;
                reply = pins[0].ConnectedTo(out connectedPin);
                if (connectedPin != null)
                {
                    PinInfo connectedPinInfo;
                    reply = connectedPin.QueryPinInfo(out connectedPinInfo);
                    DsError.ThrowExceptionForHR(reply);

                    FilterInfo filterInfo;
                    reply = connectedPinInfo.filter.QueryFilterInfo(out filterInfo);
                    DsError.ThrowExceptionForHR(reply);

                    LogMessage("Pin: " + pinInfo.name + " Connected to: " + filterInfo.achName);
                    logMediaTypes(pins[0]);
                    if (filterInfo.pGraph != null)
                    {
                        Marshal.ReleaseComObject(filterInfo.pGraph);
                    }
                }
                else
                {
                    LogMessage("Pin: " + pinInfo.name + " not connected");
                    logMediaTypes(pins[0]);
                }

                Marshal.ReleaseComObject(pins[0]);
                if (connectedPin != null)
                {
                    Marshal.ReleaseComObject(connectedPin);
                }
            }

            Marshal.ReleaseComObject(enumPins);
        }
Пример #15
0
        /// <summary>Pinを列挙する。</summary>
        private static IPin EnumPins(IBaseFilter filter, Func <PIN_INFO, bool> func)
        {
            IEnumPins pins = null;
            IPin      ipin = null;

            try
            {
                filter.EnumPins(ref pins);

                int fetched = 0;
                while (pins.Next(1, ref ipin, ref fetched) == 0)
                {
                    if (fetched == 0)
                    {
                        break;
                    }

                    var info = new PIN_INFO();
                    try
                    {
                        ipin.QueryPinInfo(info);
                        var rc = func(info);
                        if (rc)
                        {
                            return(ipin);
                        }
                    }
                    finally
                    {
                        if (info.pFilter != null)
                        {
                            Marshal.ReleaseComObject(info.pFilter);
                        }
                    }
                }
            }
            catch
            {
                if (ipin != null)
                {
                    Marshal.ReleaseComObject(ipin);
                }
                throw;
            }
            finally
            {
                if (pins != null)
                {
                    Marshal.ReleaseComObject(pins);
                }
            }

            return(null);
        }
Пример #16
0
        /// <summary>
        /// ピン一覧の取得
        /// </summary>
        /// <param name="filter">対象のフィルタ</param>
        /// <returns>
        ///		取得したピン情報のコレクションを返します。
        /// </returns>
        public static List <CxPinInfo> GetPinList(IBaseFilter filter)
        {
            var       result   = new List <CxPinInfo>();
            IEnumPins enumpins = null;

            try
            {
                filter.EnumPins(ref enumpins);

                while (true)
                {
                    IPin pin     = null;
                    int  fetched = 0;
                    if (enumpins.Next(1, ref pin, ref fetched) < 0)
                    {
                        break;
                    }
                    if (fetched == 0)
                    {
                        break;
                    }

                    var info = new PIN_INFO();

                    try
                    {
                        pin.QueryPinInfo(info);
                        var dpi = new CxPinInfo(info.achName, info.dir);
                        result.Add(dpi);
                    }
                    finally
                    {
                        if (info.pFilter != null)
                        {
                            Marshal.ReleaseComObject(info.pFilter);
                        }
                        if (pin != null)
                        {
                            Marshal.ReleaseComObject(pin);
                        }
                        pin = null;
                    }
                }
            }
            finally
            {
                if (enumpins != null)
                {
                    Marshal.ReleaseComObject(enumpins);
                }
            }

            return(result);
        }
Пример #17
0
        public void TestEnumPins()
        {
            int       hr       = 0;
            IEnumPins enumPins = null;

            hr = this.filter.EnumPins(out enumPins);
            Marshal.ThrowExceptionForHR(hr);

            Debug.Assert(enumPins != null, "IBaseFilter.EnumPins");

            Marshal.ReleaseComObject(enumPins);
        }
Пример #18
0
        private static void Connect_up(int dInput, int dOutput)
        {
            object source = null, inputD = null;

            DsDevice[] devices;
            devices = DsDevice.GetDevicesOfCat(FilterCategory.AudioRendererCategory);
            DsDevice device = devices[dOutput];
            Guid     iid    = typeof(IBaseFilter).GUID;

            device.Mon.BindToObject(null, null, ref iid, out source);

            m_objFilterGraph = (IGraphBuilder) new FilterGraph();
            m_objFilterGraph.AddFilter((IBaseFilter)source, "Audio Input pin (rendered)");

            devices = DsDevice.GetDevicesOfCat(FilterCategory.AudioInputDevice);
            device  = devices[dInput];
            // iid change?
            device.Mon.BindToObject(null, null, ref iid, out inputD);

            m_objFilterGraph.AddFilter((IBaseFilter)inputD, "Capture");

            int       result;
            IEnumPins pInputPin = null, pOutputPin = null; // Pin enumeration
            IPin      pIn = null, pOut = null;             // Pins

            try
            {
                IBaseFilter newI = (IBaseFilter)inputD;
                result = newI.EnumPins(out pInputPin);// Enumerate the pin
                if (result.Equals(0))
                {
                    // Get hold of the pin as seen in GraphEdit
                    newI.FindPin("Capture", out pIn);
                }
                IBaseFilter ibfO = (IBaseFilter)source;
                ibfO.EnumPins(out pOutputPin);//Enumerate the pin

                ibfO.FindPin("Audio Input pin (rendered)", out pOut);
                try
                {
                    pIn.Connect(pOut, null);  // Connect the input pin to output pin
                }
                catch (Exception ex)
                { Console.WriteLine(ex.Message); }
            }
            catch (Exception ex)
            { Console.WriteLine(ex.Message); }

            m_objBasicAudio   = m_objFilterGraph as IBasicAudio;
            m_objMediaControl = m_objFilterGraph as IMediaControl;
        }
Пример #19
0
        public static int GetPin(IBaseFilter filter, PinDirection pinDir, string name, out IPin ppPin)
        {
            ppPin = null;

            IEnumPins enumPins = null;

            IPin[] pins = new IPin[1] {
                null
            };

            try
            {
                int hr = filter.EnumPins(out enumPins);
                DsError.ThrowExceptionForHR(hr);

                while (enumPins.Next(1, pins, IntPtr.Zero) == 0)
                {
                    PinInfo pi;
                    hr = pins[0].QueryPinInfo(out pi);

                    bool found = false;
                    if (hr == 0 && pi.dir == pinDir && pi.name == name)
                    {
                        found = true;

                        ppPin = pins[0];

                        DsUtils.FreePinInfo(pi);
                    }

                    if (found)
                    {
                        return(0);
                    }

                    Util.ReleaseComObject(ref pins[0]);
                }

                // Did not find a matching pin.
            }
            catch (COMException)
            {
            }
            finally
            {
                Marshal.ReleaseComObject(enumPins);
            }

            return(WinAPI.E_FAIL);
        }
Пример #20
0
        public static int GetUnconnectedPin(IBaseFilter filter, PinDirection pinDir, out IPin ppPin)
        {
            ppPin = null;

            IEnumPins enumPins = null;

            IPin[] pins = new IPin[1] {
                null
            };
            IPin tmpPin = null;

            try
            {
                int hr = filter.EnumPins(out enumPins);
                DsError.ThrowExceptionForHR(hr);

                while (enumPins.Next(1, pins, IntPtr.Zero) == 0)
                {
                    PinDirection thisPinDir;
                    hr = pins[0].QueryDirection(out thisPinDir);

                    if (hr == 0 && thisPinDir == pinDir)
                    {
                        hr = pins[0].ConnectedTo(out tmpPin);
                        if (tmpPin != null)  // Already connected, not the pin we want.
                        {
                            Util.ReleaseComObject(ref tmpPin);
                        }
                        else  // Unconnected, this is the pin we want.
                        {
                            ppPin = pins[0];
                            return(0);
                        }
                    }

                    Util.ReleaseComObject(ref pins[0]);
                }

                // Did not find a matching pin.
            }
            catch (COMException)
            {
            }
            finally
            {
                Marshal.ReleaseComObject(enumPins);
            }

            return(WinAPI.E_FAIL);
        }
Пример #21
0
        public static void LogOutputPinsConnectionRecursive(IBaseFilter filter, string previous = "")
        {
            bool      log     = true;
            IEnumPins pinEnum = null;

            if (filter.EnumPins(out pinEnum) == 0)
            {
                FilterInfo sourceFilterInfo;
                filter.QueryFilterInfo(out sourceFilterInfo);
                int    fetched = 0;
                IPin[] pins    = new IPin[1];
                while (pinEnum.Next(1, pins, out fetched) == 0 && fetched > 0)
                {
                    IPin         pin = pins[0];
                    PinDirection pinDirection;
                    if (pin.QueryDirection(out pinDirection) == 0 && pinDirection == PinDirection.Output)
                    {
                        log = false;
                        IPin connectedPin;
                        if (pin.ConnectedTo(out connectedPin) == 0 && connectedPin != null)
                        {
                            PinInfo connectedPinInfo;
                            connectedPin.QueryPinInfo(out connectedPinInfo);
                            FilterInfo connectedFilterInfo;
                            connectedPinInfo.filter.QueryFilterInfo(out connectedFilterInfo);
                            if (previous == "")
                            {
                                previous = sourceFilterInfo.achName;
                            }
                            DirectShowUtil.ReleaseComObject(connectedPin, 2000);
                            IBaseFilter connectedFilter;
                            if (connectedFilterInfo.pGraph.FindFilterByName(connectedFilterInfo.achName, out connectedFilter) == 0 && connectedFilter != null)
                            {
                                LogOutputPinsConnectionRecursive(connectedFilter, previous + string.Format(" --> {0}", connectedFilterInfo.achName));
                                DirectShowUtil.ReleaseComObject(connectedFilter);
                            }
                        }
                        DirectShowUtil.ReleaseComObject(pin, 2000);
                    }
                }
            }
            DirectShowUtil.ReleaseComObject(pinEnum, 2000);

            if (log)
            {
                Log.Instance.Debug(previous);
            }
        }
Пример #22
0
        public void TestNext()
        {
            IEnumPins ppEnum = GetTestEnum();
            int       hr;

            IPin[] pPins = new IPin[1];
            IntPtr ip    = Marshal.AllocCoTaskMem(4);

            hr = ppEnum.Next(1, pPins, ip);

            Debug.Assert(Marshal.ReadInt32(ip) == 1, "Next");
            Marshal.FreeCoTaskMem(ip);

            DsError.ThrowExceptionForHR(hr);
            Marshal.ReleaseComObject(ppEnum);
        }
Пример #23
0
        /// <summary>
        /// Get any unconnected pin of the filter
        /// </summary>
        /// <param name="src">Source filter</param>
        /// <param name="pOut">Unconnected pin</param>
        /// <param name="direction">Desired direction of unconnected pin</param>
        public static void GetUnconnectedPin(IBaseFilter src, out IPin pOut, PinDirection direction)
        {
            pOut = null;

            IEnumPins pEnum = null;

            IPin[] pIn = new IPin[1];

            ///Enumerate the filter's pins
            if (src.EnumPins(out pEnum) != 0)
            {
                throw new Exception("Unable to enumerate source filter");
            }

            try
            {
                while (pEnum.Next(1, pIn, IntPtr.Zero) == 0)
                {
                    PinDirection pInDir;
                    ///Query the direction of the pin (input or output)
                    pIn[0].QueryDirection(out pInDir);

                    ///If the direction matches the desired direction
                    if (pInDir == direction)
                    {
                        IPin temp = null;
                        ///See if the pin is already connected, skip it
                        if (pIn[0].ConnectedTo(out temp) >= 0)
                        {
                            Marshal.ReleaseComObject(temp);
                        }
                        else ///Pin is not connected to anyone, return it
                        {
                            pOut = pIn[0];
                            return;
                        }
                    }
                    Marshal.ReleaseComObject(pIn[0]);
                }
            }
            finally
            {
                ///Dispose the enumerator
                Marshal.ReleaseComObject(pEnum);
            }
            throw new Exception("Unable to find any output pin");
        }
Пример #24
0
            /// <summary>

            /// 指定したフィルタから指定した条件を満たすピンを探し、最初に見つかったピンを返す。
            /// </summary>
            /// <param name="filter">フィルタ</param>
            /// <param name="pred">条件</param>
            /// <returns>最初に見つかったピン</returns>
            public static IPin FindPin(IBaseFilter filter, Predicate <IPin> pred)
            {
                IPin result = null;

                IEnumPins enumerator = null;

                try
                {
                    filter.EnumPins(out enumerator);
                    enumerator.Reset();

                    IPin pin = null;
                    try
                    {
                        while (enumerator.Next(1, out pin, IntPtr.Zero) == S_OK)
                        {
                            if (pin != null)
                            {
                                if (pred(pin))
                                {
                                    result = pin;
                                    pin    = null;
                                    break;
                                }
                                Marshal.ReleaseComObject(pin);
                                pin = null;
                            }
                        }
                    }
                    finally
                    {
                        if (pin != null)
                        {
                            Marshal.ReleaseComObject(pin);
                        }
                    }
                }
                finally
                {
                    if (enumerator != null)
                    {
                        Marshal.ReleaseComObject(enumerator);
                    }
                    enumerator = null;
                }
                return(result);
            }
Пример #25
0
        // Does not AddRef the returned *Pin
        private int GetCrossbarPinAtIndex(IAMCrossbar crossbar, int pinIndex, bool isInputPin, out IPin pin)
        {
            pin = null;

            if (crossbar == null)
            {
                return(-1);
            }

            int cntInPins, cntOutPins;

            if (crossbar.get_PinCounts(out cntOutPins, out cntInPins) != 0)
            {
                return(unchecked ((int)0x80004005));               //E_FAIL;
            }
            int trueIndex = isInputPin ? pinIndex : pinIndex + cntInPins;

            IBaseFilter filter = crossbar as IBaseFilter;

            if (filter != null)
            {
                IEnumPins enumPins = null;
                if (filter.EnumPins(out enumPins) == 0)
                {
                    int     i    = 0;
                    IPin [] pins = new IPin[1];
                    //22 int n;
                    //22 while(enumPins.Next(1, pins, out n) == 0)
                    while (enumPins.Next(1, pins, IntPtr.Zero) == 0)
                    {
                        //pP.Release();
                        if (i == trueIndex)
                        {
                            pin = pins[0];
                            break;
                        }
                        Marshal.ReleaseComObject(pins[0]);
                        i++;
                    }
                    Marshal.ReleaseComObject(enumPins);
                }
                //pFilter.Release();
            }

            return(pin != null ? 0 : unchecked ((int)0x80004005));           //E_FAIL;
        }
Пример #26
0
        public void TestClone()
        {
            int hr;

            IPin[] pPins = new IPin[1];

            IEnumPins ppEnum = GetTestEnum();
            IEnumPins cloneEnum;

            hr = ppEnum.Clone(out cloneEnum);
            DsError.ThrowExceptionForHR(hr);

            hr = cloneEnum.Next(1, pPins, IntPtr.Zero);
            DsError.ThrowExceptionForHR(hr);

            Marshal.ReleaseComObject(ppEnum);
            Marshal.ReleaseComObject(cloneEnum);
        }
Пример #27
0
        /// <summary>
        /// Get a pin of a certain direction.
        /// </summary>
        /// <param name="pFilter">Specifies the filter whos pin we want to get.</param>
        /// <param name="dir">Specifies the direction sought.</param>
        /// <param name="pin">Returns the pin found.</param>
        /// <param name="strName">Optionally, specifies a partial pin name to look.</param>
        /// <returns>On success, 0 is returned, otherwise an error is returned.</returns>
        public static int GetPin(IBaseFilter pFilter, PinDirection dir, out IPin pin, string strName = null)
        {
            uint      VFW_E_NOT_FOUND = 0x80040216;
            IEnumPins iEnum           = null;

            pin = null;

            int hr = pFilter.EnumPins(out iEnum);

            if (hr < 0)
            {
                Marshal.ThrowExceptionForHR(hr);
            }

            IPin[] rgPin = new IPin[1];
            int    nFetched;

            while (iEnum.Next(1, rgPin, out nFetched) == 0)
            {
                PinInfo pinInfo;
                hr = rgPin[0].QueryPinInfo(out pinInfo);
                if (hr < 0)
                {
                    Marshal.ThrowExceptionForHR(hr);
                }

                if (pinInfo.dir == dir && (strName == null || pinInfo.name.Contains(strName)))
                {
                    pin = rgPin[0];
                    break;
                }

                Marshal.ReleaseComObject(rgPin[0]);
            }

            Marshal.ReleaseComObject(iEnum);

            if (pin == null)
            {
                return((int)VFW_E_NOT_FOUND);
            }

            return(0);
        }
Пример #28
0
        /// <summary>
        /// This was used to retrieve all pin names. Now it is not being used.
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="PinDir"></param>
        /// <returns></returns>
        void DisplayPinNames(IBaseFilter filter)
        {
            IEnumPins enumPins = null;

            IPin[] localPins = new IPin[2];
            string pinName;
            int    hr;

            hr = filter.EnumPins(out enumPins);
            if (hr < 0)
            {
                Marshal.ThrowExceptionForHR(hr);
            }

            try
            {
                int count = 0;
                while (enumPins.Next(1, localPins, out count) == 0)
                {
                    PinDirection PinDirThis;
                    hr = localPins[0].QueryDirection(out PinDirThis);
                    if (hr < 0)
                    {
                        Marshal.ReleaseComObject(localPins[0]);
                        Marshal.ThrowExceptionForHR(hr);
                    }
                    localPins[0].QueryId(out pinName);
                    LogInfo(LogGroups.Console, pinName);
                    // Release the pin for the next time through the loop.
                    Marshal.ReleaseComObject(localPins[0]);
                }
                // No more pins. We did not find a match.
                //throw new Exception("pin not found");
                LogInfo(LogGroups.Console, "\n");
                return; // null;
            }
            finally
            {
                Marshal.ReleaseComObject(enumPins);
            }
        }
Пример #29
0
        /// <summary>
        /// Gets a specific pin of a specific filter
        /// </summary>
        /// <param name="filter">Filter to retrieve the pin for (defines which object should make this method available)</param>
        /// <param name="dir">Direction</param>
        /// <param name="num">Number</param>
        /// <returns>IPin object or null</returns>
        public static IPin GetPin(this IBaseFilter filter, PinDirection dir, int num)
        {
            // Declare variables
            IPin[]    pin      = new IPin[1];
            IEnumPins pinsEnum = null;

            // Enumerator the pins
            if (filter.EnumPins(out pinsEnum) == 0)
            {
                // Get the pin direction
                PinDirection pinDir;
                int          n = 0;;

                // Loop the pins
                while (pinsEnum.Next(1, pin, out n) == 0)
                {
                    // Query the direction
                    pin[0].QueryDirection(out pinDir);

                    // Is the pin direction correct?
                    if (pinDir == dir)
                    {
                        // Yes, check the pins
                        if (num == 0)
                        {
                            return(pin[0]);
                        }
                        num--;
                    }

                    // Release the pin, this is not the one we are looking for
                    Marshal.ReleaseComObject(pin[0]);
                    pin[0] = null;
                }
            }

            // Not found
            return(null);
        }
Пример #30
0
        //初始化当前引脚
        private void InitPins()
        {
            var       hr       = 0;
            IEnumPins enumPins = null;

            BaseFilter.EnumPins(out enumPins);
            DsError.ThrowExceptionForHR(hr);

            short  count  = 128;
            IntPtr pCount = Marshal.AllocHGlobal(sizeof(short));

            Marshal.WriteInt16(pCount, count);

            IPin[]       pinArr = new IPin[1];
            List <PinEx> pinExs = new List <PinEx>();

            while (enumPins.Next(1, pinArr, pCount) == 0)
            {
                pinExs.Add(new PinEx(pinArr[0]));
            }
            this.PinExs = pinExs;
            Marshal.ReleaseComObject(enumPins);
        }
Пример #31
0
        public static List <PinInfo2> GetPins(IBaseFilter filter)
        {
            List <PinInfo2> pins = new List <PinInfo2>();

            IPin[]    pina     = new IPin[1];
            IEnumPins pinsEnum = null;

            // enum filter pins
            if (filter.EnumPins(out pinsEnum) == 0)
            {
                PinDirection pinDir;
                int          n;

                try
                {
                    // get next pin
                    while (pinsEnum.Next(1, pina, out n) == 0)
                    {
                        // query pin's direction
                        pina[0].QueryDirection(out pinDir);

                        PinInfo pinInfo;
                        pina[0].QueryPinInfo(out pinInfo);

                        PinInfo2 pinInfo2;
                        pinInfo2.Pin     = pina[0];
                        pinInfo2.PinInfo = pinInfo;
                        pins.Add(pinInfo2);
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(pinsEnum);
                }
            }
            return(pins);
        }
Пример #32
0
 public int Clone(out IEnumPins ppEnum)
 {
     ppEnum = new PinEnumerator(filter) { index = index };
     return S_OK;
 }
Пример #33
0
 int IBaseFilter.EnumPins(out IEnumPins ppEnum)
 {
     ppEnum = new PinEnumerator(this);
     return S_OK;
 }
 public int EnumPins(out IEnumPins ppEnum)
 {
     ppEnum = new PinEnumerator(this);
     return S_OK;
 }
 public int Clone(out IEnumPins ppEnum)
 {
     PinEnumerator ans = new PinEnumerator(p);
     if(c != 0)
     {
         ans.Skip(c);
     }
     ppEnum = ans;
     return S_OK;
 }
Пример #36
0
		public int Clone(out IEnumPins enumPins)
		{
			enumPins = new MyWavEnumPins(MyWavDest);
			return 0;
		}
Пример #37
0
		public int EnumPins(out IEnumPins enumPins)
		{
			var Result = BaseFilter.EnumPins(out enumPins);
			Console.WriteLine("WavDestProxy.EnumPins: {0}, {1}", Result, enumPins);
			return Result;
		}