using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
namespace FaceAI
{
[ComVisible(false)]
public class FilterCategory // uuids.h : CLSID_*
{
/// CLSID_AudioInputDeviceCategory, audio capture category
public static readonly Guid AudioInputDevice = new Guid(0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
/// CLSID_VideoInputDeviceCategory, video capture category
public static readonly Guid VideoInputDevice = new Guid(0x860BB310, 0x5D01, 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
}
[ComVisible(false)]
public class Clsid // uuids.h : CLSID_*
{
/// CLSID_SystemDeviceEnum for ICreateDevEnum
public static readonly Guid SystemDeviceEnum = new Guid(0x62BE5D10, 0x60EB, 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
/// CLSID_FilterGraph, filter Graph
public static readonly Guid FilterGraph = new Guid(0xe436ebb3, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
/// CLSID_CaptureGraphBuilder2, new Capture graph building
public static readonly Guid CaptureGraphBuilder2 = new Guid(0xBF87B6E1, 0x8C27, 0x11d0, 0xB3, 0xF0, 0x0, 0xAA, 0x00, 0x37, 0x61, 0xC5);
/// CLSID_SampleGrabber, Sample Grabber filter
public static readonly Guid SampleGrabber = new Guid(0xC1F400A0, 0x3F08, 0x11D3, 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37);
/// CLSID_DvdGraphBuilder, DVD graph builder
public static readonly Guid DvdGraphBuilder = new Guid(0xFCC152B7, 0xF372, 0x11d0, 0x8E, 0x00, 0x00, 0xC0, 0x4F, 0xD7, 0xC0, 0x8B);
}
[ComVisible(false)]
public class DevEnum
{
public static bool GetDevicesOfCat(Guid cat, out ArrayList devs)
{
devs = null;
int hr;
object comObj = null;
ICreateDevEnum enumDev = null;
IEnumMoniker enumMon = null;
IMoniker[] mon = new IMoniker[1];
try
{
Type srvType = Type.GetTypeFromCLSID(Clsid.SystemDeviceEnum);
if (srvType == null)
throw new NotImplementedException("System Device Enumerator");
comObj = Activator.CreateInstance(srvType);
enumDev = (ICreateDevEnum)comObj;
hr = enumDev.CreateClassEnumerator(ref cat, out enumMon, 0);
if (hr != 0)
throw new NotSupportedException("No devices of the category");
int /*f, */count = 0;
IntPtr ptr = new IntPtr();
do
{
hr = enumMon.Next(1, mon, ptr);
if ((hr != 0) || (mon[0] == null))
break;
DsDevice dev = new DsDevice();
GetFriendlyName(mon[0], ref dev.Name, ref dev.Path);
if (devs == null)
devs = new ArrayList();
dev.id = count;
dev.Mon = mon[0]; mon[0] = null;
devs.Add(dev); dev = null;
count++;
}
while (true);
return count > 0;
}
catch (Exception)
{
if (devs != null)
{
foreach (DsDevice d in devs)
d.Dispose();
devs = null;
}
return false;
}
finally
{
enumDev = null;
if (mon[0] != null)
Marshal.ReleaseComObject(mon[0]); mon[0] = null;
if (enumMon != null)
Marshal.ReleaseComObject(enumMon); enumMon = null;
if (comObj != null)
Marshal.ReleaseComObject(comObj); comObj = null;
}
}
private static bool GetFriendlyName(IMoniker mon, ref string devname, ref string devpath)
{
object bagObj = null;
IPropertyBag bag = null;
try
{
Guid bagId = typeof(IPropertyBag).GUID;
mon.BindToStorage(null, null, ref bagId, out bagObj);
bag = (IPropertyBag)bagObj;
object val = "";
int hr = bag.Read("Description", ref val, IntPtr.Zero);
if(hr != 0)
hr = bag.Read("FriendlyName", ref val, IntPtr.Zero);
if (hr != 0)
Marshal.ThrowExceptionForHR(hr);
devname = val as string;
if ((devname == null) || (devname.Length < 1))
throw new NotImplementedException("Device FriendlyName");
val = "";
hr = bag.Read("DevicePath", ref val, IntPtr.Zero);
if (hr != 0)
Marshal.ThrowExceptionForHR(hr);
devpath = val as string;
if((devpath == null) || (devpath.Length < 1))
throw new NotImplementedException("Device Path");
return true;
}
catch (Exception)
{
return false;
}
finally
{
bag = null;
if (bagObj != null)
Marshal.ReleaseComObject(bagObj); bagObj = null;
}
}
}
[ComVisible(false)]
public class DsDevice : IDisposable
{
public int id;
public string Name;
public string Path;
public IMoniker Mon;
public void Dispose()
{
if (Mon != null)
Marshal.ReleaseComObject(Mon); Mon = null;
}
}
[ComVisible(true), ComImport,
Guid("29840822-5B84-11D0-BD3B-00A0C911CE86"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICreateDevEnum
{
[PreserveSig]
int CreateClassEnumerator(
[In] ref Guid pType,
[Out] out IEnumMoniker ppEnumMoniker,
[In] int dwFlags);
}
[ComVisible(true), ComImport,
Guid("55272A00-42CB-11CE-8135-00AA004BB851"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPropertyBag
{
[PreserveSig]
int Read(
[In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName,
[In, Out, MarshalAs(UnmanagedType.Struct)] ref object pVar,
IntPtr pErrorLog);
[PreserveSig]
int Write(
[In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName,
[In, MarshalAs(UnmanagedType.Struct)] ref object pVar);
}
}