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); }
/// <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); }
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); }
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); }
/// <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); }
/// <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]; } }
// 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); }
public int EnumPins(out IEnumPins enumPins) { enumPins = new MyWavEnumPins(this); Console.WriteLine("EnumPins"); return 0; //throw new NotImplementedException(); }
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); }
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); }
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); }
public int Clone(out IEnumPins ppEnum) { ppEnum = new PinEnumerator(filter) { index = index }; return(S_OK); }
/// <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); }
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); }
/// <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); }
/// <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); }
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); }
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; }
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); }
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); }
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); } }
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); }
/// <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"); }
/// <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); }
// 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; }
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); }
/// <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); }
/// <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); } }
/// <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); }
//初始化当前引脚 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); }
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); }
public int Clone(out IEnumPins ppEnum) { ppEnum = new PinEnumerator(filter) { index = index }; return S_OK; }
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; }
public int Clone(out IEnumPins enumPins) { enumPins = new MyWavEnumPins(MyWavDest); return 0; }
public int EnumPins(out IEnumPins enumPins) { var Result = BaseFilter.EnumPins(out enumPins); Console.WriteLine("WavDestProxy.EnumPins: {0}, {1}", Result, enumPins); return Result; }