/*** Autogenerated by WIDL 9.8 from include/mfmediacapture.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __mfmediacapture_h__
#define __mfmediacapture_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IAdvancedMediaCaptureInitializationSettings_FWD_DEFINED__
#define __IAdvancedMediaCaptureInitializationSettings_FWD_DEFINED__
typedef interface IAdvancedMediaCaptureInitializationSettings IAdvancedMediaCaptureInitializationSettings;
#ifdef __cplusplus
interface IAdvancedMediaCaptureInitializationSettings;
#endif /* __cplusplus */
#endif

#ifndef __IAdvancedMediaCaptureSettings_FWD_DEFINED__
#define __IAdvancedMediaCaptureSettings_FWD_DEFINED__
typedef interface IAdvancedMediaCaptureSettings IAdvancedMediaCaptureSettings;
#ifdef __cplusplus
interface IAdvancedMediaCaptureSettings;
#endif /* __cplusplus */
#endif

#ifndef __IAdvancedMediaCapture_FWD_DEFINED__
#define __IAdvancedMediaCapture_FWD_DEFINED__
typedef interface IAdvancedMediaCapture IAdvancedMediaCapture;
#ifdef __cplusplus
interface IAdvancedMediaCapture;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <mfobjects.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if NTDDI_VERSION >= NTDDI_WIN8
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
/*****************************************************************************
 * IAdvancedMediaCaptureInitializationSettings interface
 */
#ifndef __IAdvancedMediaCaptureInitializationSettings_INTERFACE_DEFINED__
#define __IAdvancedMediaCaptureInitializationSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAdvancedMediaCaptureInitializationSettings, 0x3de21209, 0x8ba6, 0x4f2a, 0xa5,0x77, 0x28,0x19,0xb5,0x6f,0xf1,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3de21209-8ba6-4f2a-a577-2819b56ff14d")
IAdvancedMediaCaptureInitializationSettings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDirectxDeviceManager(
        IMFDXGIDeviceManager *pManager) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAdvancedMediaCaptureInitializationSettings, 0x3de21209, 0x8ba6, 0x4f2a, 0xa5,0x77, 0x28,0x19,0xb5,0x6f,0xf1,0x4d)
#endif
#else
typedef struct IAdvancedMediaCaptureInitializationSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAdvancedMediaCaptureInitializationSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAdvancedMediaCaptureInitializationSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAdvancedMediaCaptureInitializationSettings *This);

    /*** IAdvancedMediaCaptureInitializationSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDirectxDeviceManager)(
        IAdvancedMediaCaptureInitializationSettings *This,
        IMFDXGIDeviceManager *pManager);

    END_INTERFACE
} IAdvancedMediaCaptureInitializationSettingsVtbl;

interface IAdvancedMediaCaptureInitializationSettings {
    CONST_VTBL IAdvancedMediaCaptureInitializationSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAdvancedMediaCaptureInitializationSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAdvancedMediaCaptureInitializationSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAdvancedMediaCaptureInitializationSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IAdvancedMediaCaptureInitializationSettings methods ***/
#define IAdvancedMediaCaptureInitializationSettings_SetDirectxDeviceManager(This,pManager) (This)->lpVtbl->SetDirectxDeviceManager(This,pManager)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IAdvancedMediaCaptureInitializationSettings_QueryInterface(IAdvancedMediaCaptureInitializationSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAdvancedMediaCaptureInitializationSettings_AddRef(IAdvancedMediaCaptureInitializationSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAdvancedMediaCaptureInitializationSettings_Release(IAdvancedMediaCaptureInitializationSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IAdvancedMediaCaptureInitializationSettings methods ***/
static __WIDL_INLINE HRESULT IAdvancedMediaCaptureInitializationSettings_SetDirectxDeviceManager(IAdvancedMediaCaptureInitializationSettings* This,IMFDXGIDeviceManager *pManager) {
    return This->lpVtbl->SetDirectxDeviceManager(This,pManager);
}
#endif
#endif

#endif


#endif  /* __IAdvancedMediaCaptureInitializationSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAdvancedMediaCaptureSettings interface
 */
#ifndef __IAdvancedMediaCaptureSettings_INTERFACE_DEFINED__
#define __IAdvancedMediaCaptureSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAdvancedMediaCaptureSettings, 0x24e0485f, 0xa33e, 0x4aa1, 0xb5,0x64, 0x60,0x19,0xb1,0xd1,0x4f,0x65);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24e0485f-a33e-4aa1-b564-6019b1d14f65")
IAdvancedMediaCaptureSettings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDirectxDeviceManager(
        IMFDXGIDeviceManager **ppManager) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAdvancedMediaCaptureSettings, 0x24e0485f, 0xa33e, 0x4aa1, 0xb5,0x64, 0x60,0x19,0xb1,0xd1,0x4f,0x65)
#endif
#else
typedef struct IAdvancedMediaCaptureSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAdvancedMediaCaptureSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAdvancedMediaCaptureSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAdvancedMediaCaptureSettings *This);

    /*** IAdvancedMediaCaptureSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDirectxDeviceManager)(
        IAdvancedMediaCaptureSettings *This,
        IMFDXGIDeviceManager **ppManager);

    END_INTERFACE
} IAdvancedMediaCaptureSettingsVtbl;

interface IAdvancedMediaCaptureSettings {
    CONST_VTBL IAdvancedMediaCaptureSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAdvancedMediaCaptureSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAdvancedMediaCaptureSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAdvancedMediaCaptureSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IAdvancedMediaCaptureSettings methods ***/
#define IAdvancedMediaCaptureSettings_GetDirectxDeviceManager(This,ppManager) (This)->lpVtbl->GetDirectxDeviceManager(This,ppManager)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IAdvancedMediaCaptureSettings_QueryInterface(IAdvancedMediaCaptureSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAdvancedMediaCaptureSettings_AddRef(IAdvancedMediaCaptureSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAdvancedMediaCaptureSettings_Release(IAdvancedMediaCaptureSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IAdvancedMediaCaptureSettings methods ***/
static __WIDL_INLINE HRESULT IAdvancedMediaCaptureSettings_GetDirectxDeviceManager(IAdvancedMediaCaptureSettings* This,IMFDXGIDeviceManager **ppManager) {
    return This->lpVtbl->GetDirectxDeviceManager(This,ppManager);
}
#endif
#endif

#endif


#endif  /* __IAdvancedMediaCaptureSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAdvancedMediaCapture interface
 */
#ifndef __IAdvancedMediaCapture_INTERFACE_DEFINED__
#define __IAdvancedMediaCapture_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAdvancedMediaCapture, 0xd0751585, 0xd216, 0x4344, 0xb5,0xbf, 0x46,0x3b,0x68,0xf9,0x77,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d0751585-d216-4344-b5bf-463b68f977bb")
IAdvancedMediaCapture : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAdvancedMediaCaptureSettings(
        IAdvancedMediaCaptureSettings **ppSettings) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAdvancedMediaCapture, 0xd0751585, 0xd216, 0x4344, 0xb5,0xbf, 0x46,0x3b,0x68,0xf9,0x77,0xbb)
#endif
#else
typedef struct IAdvancedMediaCaptureVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAdvancedMediaCapture *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAdvancedMediaCapture *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAdvancedMediaCapture *This);

    /*** IAdvancedMediaCapture methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAdvancedMediaCaptureSettings)(
        IAdvancedMediaCapture *This,
        IAdvancedMediaCaptureSettings **ppSettings);

    END_INTERFACE
} IAdvancedMediaCaptureVtbl;

interface IAdvancedMediaCapture {
    CONST_VTBL IAdvancedMediaCaptureVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAdvancedMediaCapture_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAdvancedMediaCapture_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAdvancedMediaCapture_Release(This) (This)->lpVtbl->Release(This)
/*** IAdvancedMediaCapture methods ***/
#define IAdvancedMediaCapture_GetAdvancedMediaCaptureSettings(This,ppSettings) (This)->lpVtbl->GetAdvancedMediaCaptureSettings(This,ppSettings)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IAdvancedMediaCapture_QueryInterface(IAdvancedMediaCapture* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAdvancedMediaCapture_AddRef(IAdvancedMediaCapture* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAdvancedMediaCapture_Release(IAdvancedMediaCapture* This) {
    return This->lpVtbl->Release(This);
}
/*** IAdvancedMediaCapture methods ***/
static __WIDL_INLINE HRESULT IAdvancedMediaCapture_GetAdvancedMediaCaptureSettings(IAdvancedMediaCapture* This,IAdvancedMediaCaptureSettings **ppSettings) {
    return This->lpVtbl->GetAdvancedMediaCaptureSettings(This,ppSettings);
}
#endif
#endif

#endif


#endif  /* __IAdvancedMediaCapture_INTERFACE_DEFINED__ */

#endif /* WINAPI_PARTITION_APP */
#endif /* NTDDI >= NTDDI_WIN8 */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mfmediacapture_h__ */
