namespace dshow.Core
{
	using System;
	using System.Runtime.InteropServices;

	// IFilterGraph interface
	//
	// The IFilterGraph interface is an abstraction representing
	// a graph of filters
	//
	[ComImport,
	Guid("56A8689F-0AD4-11CE-B03A-0020AF0BA770"),
	InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
	public interface IFilterGraph
	{
		// Adds a filter to the graph and names it
		// by using the pName parameter
		[PreserveSig]
		int AddFilter(
			[In] IBaseFilter pFilter,
			[In, MarshalAs(UnmanagedType.LPWStr)] string pName);

		// Removes a filter from the graph
		[PreserveSig]
		int RemoveFilter(
			[In] IBaseFilter pFilter);

		// Provides an enumerator for all filters in the graph
		[PreserveSig]
//		int EnumFilters(
//			[Out] out IEnumFilters ppEnum);
		int EnumFilters(
			[Out] out IntPtr ppEnum);

		// Finds a filter that was added
		// to the filter graph with a specific name
		[PreserveSig]
		int FindFilterByName(
			[In, MarshalAs(UnmanagedType.LPWStr)] string pName,
			[Out] out IBaseFilter ppFilter);

		// Connects the two pins directly
		[PreserveSig]
		int ConnectDirect(
			[In] IPin ppinOut,
			[In] IPin ppinIn,
			[In, MarshalAs(UnmanagedType.LPStruct)] AMMediaType	pmt);

		// Disconnects this and the pin to which it connects and
		// then reconnects it to the same pin
		[PreserveSig]
		int Reconnect(
			[In] IPin ppin);

		// Disconnects this pin
		[PreserveSig]
		int Disconnect(
			[In] IPin ppin);

		// Sets the default source of synchronization
		[PreserveSig]
		int SetDefaultSyncSource();
	}
}
