/// <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); }
/// <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); }
/// <summary> /// Retreives detailed information about all pins on a given filter. /// Caller must release all returned data. See IEnumerable<DetailPinInfo>.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); } }
/// <summary> /// Frees references held by this PinInfo /// </summary> /// <param name="info"></param> public static void Release(this PinInfo info) { DsUtils.FreePinInfo(info); }