コード例 #1
0
ファイル: ExtensionsForDsLib.cs プロジェクト: ewin66/media
        /// <summary>
        /// Gets the filter that owns the specified pin.
        /// </summary>
        /// <param name="pin">pin to get owner of</param>
        /// <returns>Caller is responsible for freeing this filter</returns>
        public static IBaseFilter GetFilter(this IPin pin)
        {
            PinInfo info = default(PinInfo);
            int     hr   = pin.QueryPinInfo(out info);

            DsError.ThrowExceptionForHR(hr);
            return(info.filter);
        }
コード例 #2
0
ファイル: DetailPinInfo.cs プロジェクト: ewin66/media
        /// <summary>
        /// Constructs a DetailPinInfo for the specified pin
        /// </summary>
        /// <param name="pin">IPin interface to get info about</param>
        public DetailPinInfo(IPin pin)
        {
            PinInfo pinInfo = new PinInfo();
            int     hr      = pin.QueryPinInfo(out pinInfo);

            DsError.ThrowExceptionForHR(hr);

            IEnumMediaTypes enumMediaTypes;

            hr = pin.EnumMediaTypes(out enumMediaTypes);
            DsError.ThrowExceptionForHR(hr);

            AMMediaType[] curMediaType = new AMMediaType[1];

            IntPtr fetched2 = Marshal.AllocCoTaskMem(4);

            try
            {
                if (enumMediaTypes.Next(1, curMediaType, fetched2) == 0)
                {
                    if (Marshal.ReadInt32(fetched2) != 1)
                    {
                        throw new Exception("Cannot enumerate media types for pin!");
                    }
                }
            }
            finally
            {
                Marshal.FreeCoTaskMem(fetched2);
            }

            this.Pin  = pin;
            this.Info = pinInfo;
            this.Type = curMediaType[0];

            BaseDSGraph.Release(enumMediaTypes);
        }
コード例 #3
0
ファイル: ExtensionsForDsLib.cs プロジェクト: ewin66/media
        /// <summary>
        /// Retreives detailed information about all pins on a given filter.
        /// Caller must release all returned data. See IEnumerable&lt;DetailPinInfo&gt;.Release()
        /// </summary>
        /// <remarks>
        /// If an exception occurs, it frees all objects that may already be enumerated
        /// </remarks>
        /// <param name="filter">filter to get information about</param>
        public static List <DetailPinInfo> EnumPinsDetails(this IBaseFilter filter)
        {
            List <DetailPinInfo> info = new List <DetailPinInfo>();

            int hr;

            IEnumPins       enumPins;
            IEnumMediaTypes enumMediaTypes = null;

            IPin[]  curPin     = new IPin[1];
            PinInfo curPinInfo = new PinInfo();

            AMMediaType[] curMediaType = new AMMediaType[1];

            hr = filter.EnumPins(out enumPins);
            DsError.ThrowExceptionForHR(hr);
            try
            {
                IntPtr fetched = Marshal.AllocCoTaskMem(4);
                try
                {
                    while (enumPins.Next(curPin.Length, curPin, fetched) == 0)
                    {
                        if (Marshal.ReadInt32(fetched) == 1)
                        {
                            info.Add(new DetailPinInfo(curPin[0]));
                        }
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(fetched);
                }

                return(info);
            }
            catch (Exception ex)
            {
                ErrorLogger.DumpToDebug(ex);
                try
                {
                    BaseDSGraph.Release(curPin[0]);
                    if (curMediaType[0] != null)
                    {
                        DsUtils.FreeAMMediaType(curMediaType[0]);
                    }
                    DsUtils.FreePinInfo(curPinInfo);
                    info.Release();
                }
                catch (Exception cleanUpEx)
                {
                    ErrorLogger.DumpToDebug(cleanUpEx);
                }
                throw;
            }
            finally
            {
                BaseDSGraph.Release(enumPins);
                BaseDSGraph.Release(enumMediaTypes);
            }
        }
コード例 #4
0
ファイル: ExtensionsForDsLib.cs プロジェクト: ewin66/media
 /// <summary>
 /// Frees references held by this PinInfo
 /// </summary>
 /// <param name="info"></param>
 public static void Release(this PinInfo info)
 {
     DsUtils.FreePinInfo(info);
 }