/*** Autogenerated by WIDL 5.0.5 from mmdeviceapi.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 __mmdeviceapi_h__
#define __mmdeviceapi_h__

/* Forward declarations */

#ifndef __IMMNotificationClient_FWD_DEFINED__
#define __IMMNotificationClient_FWD_DEFINED__
typedef interface IMMNotificationClient IMMNotificationClient;
#ifdef __cplusplus
interface IMMNotificationClient;
#endif /* __cplusplus */
#endif

#ifndef __IMMDevice_FWD_DEFINED__
#define __IMMDevice_FWD_DEFINED__
typedef interface IMMDevice IMMDevice;
#ifdef __cplusplus
interface IMMDevice;
#endif /* __cplusplus */
#endif

#ifndef __IMMDeviceCollection_FWD_DEFINED__
#define __IMMDeviceCollection_FWD_DEFINED__
typedef interface IMMDeviceCollection IMMDeviceCollection;
#ifdef __cplusplus
interface IMMDeviceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IMMEndpoint_FWD_DEFINED__
#define __IMMEndpoint_FWD_DEFINED__
typedef interface IMMEndpoint IMMEndpoint;
#ifdef __cplusplus
interface IMMEndpoint;
#endif /* __cplusplus */
#endif

#ifndef __IMMDeviceEnumerator_FWD_DEFINED__
#define __IMMDeviceEnumerator_FWD_DEFINED__
typedef interface IMMDeviceEnumerator IMMDeviceEnumerator;
#ifdef __cplusplus
interface IMMDeviceEnumerator;
#endif /* __cplusplus */
#endif

#ifndef __IMMDeviceActivator_FWD_DEFINED__
#define __IMMDeviceActivator_FWD_DEFINED__
typedef interface IMMDeviceActivator IMMDeviceActivator;
#ifdef __cplusplus
interface IMMDeviceActivator;
#endif /* __cplusplus */
#endif

#ifndef __MMDeviceEnumerator_FWD_DEFINED__
#define __MMDeviceEnumerator_FWD_DEFINED__
#ifdef __cplusplus
typedef class MMDeviceEnumerator MMDeviceEnumerator;
#else
typedef struct MMDeviceEnumerator MMDeviceEnumerator;
#endif /* defined __cplusplus */
#endif /* defined __MMDeviceEnumerator_FWD_DEFINED__ */

/* Headers for imported files */

#include <unknwn.h>
#include <propsys.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef E_NOTFOUND
#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
#endif
#ifndef E_UNSUPPORTED_TYPE
#define E_UNSUPPORTED_TYPE HRESULT_FROM_WIN32(ERROR_UNSUPPORTED_TYPE)
#endif
#define DEVICE_STATE_ACTIVE 0x1
#define DEVICE_STATE_DISABLED 0x2
#define DEVICE_STATE_NOTPRESENT 0x4
#define DEVICE_STATE_UNPLUGGED 0x8
#define DEVICE_STATEMASK_ALL 0xf
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FormFactor,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,0);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_ControlPanelPageProvider,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,1);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_Association,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,2);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_PhysicalSpeakers,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,3);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,4);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_Disable_SysFx,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,5);
#define ENDPOINT_SYSFX_ENABLED 0
#define ENDPOINT_SYSFX_DISABLED 1
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_FullRangeSpeakers,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,6);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_Supports_EventDriven_Mode,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,7);
DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_JackSubType,0x1da5d803,0xd492,0x4edd,0x8c,0x23,0xe0,0xc0,0xff,0xee,0x7f,0x0e,8);
DEFINE_PROPERTYKEY(PKEY_AudioEngine_DeviceFormat,0xf19f064d,0x082c,0x4e27,0xbc,0x73,0x68,0x82,0xa1,0xbb,0x8e,0x4c,0);
DEFINE_PROPERTYKEY(PKEY_AudioEngine_OEMFormat,0xe4870e26,0x3cc5,0x4cd2,0xba,0x46,0xca,0x0a,0x9a,0x70,0xed,0x04,3);
typedef struct tagDIRECTX_AUDIO_ACTIVATION_PARAMS {
    DWORD cbDirectXAudioActivationParams;
    GUID guidAudioSession;
    DWORD dwAudioStreamFlags;
} DIRECTX_AUDIO_ACTIVATION_PARAMS;
typedef struct tagDIRECTX_AUDIO_ACTIVATION_PARAMS *PDIRECTX_AUDIO_ACTIVATION_PARAMS;
typedef enum _EDataFlow {
    eRender = 0,
    eCapture = 1,
    eAll = 2,
    EDataFlow_enum_count = 3
} EDataFlow;
typedef enum _ERole {
    eConsole = 0,
    eMultimedia = 1,
    eCommunications = 2,
    ERole_enum_count = 3
} ERole;
typedef enum _EndpointFormFactor {
    RemoteNetworkDevice = 0,
    Speakers = 1,
    LineLevel = 2,
    Headphones = 3,
    Microphone = 4,
    Headset = 5,
    Handset = 6,
    UnknownDigitalPassthrough = 7,
    SPDIF = 8,
    DigitalAudioDisplayDevice = 9,
    UnknownFormFactor = 10,
    EndpointFormFactor_enum_count = 11
} EndpointFormFactor;
#define HDMI DigitalAudioDisplayDevice
/*****************************************************************************
 * IMMNotificationClient interface
 */
#ifndef __IMMNotificationClient_INTERFACE_DEFINED__
#define __IMMNotificationClient_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMMNotificationClient, 0x7991eec9, 0x7e89, 0x4d85, 0x83,0x90, 0x6c,0x70,0x3c,0xec,0x60,0xc0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7991eec9-7e89-4d85-8390-6c703cec60c0")
IMMNotificationClient : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDeviceStateChanged(
        LPCWSTR pwstrDeviceId,
        DWORD dwNewState) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDeviceAdded(
        LPCWSTR pwstrDeviceId) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDeviceRemoved(
        LPCWSTR pwstrDeviceId) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged(
        EDataFlow flow,
        ERole role,
        LPCWSTR pwstrDeviceId) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnPropertyValueChanged(
        LPCWSTR pwstrDeviceId,
        const PROPERTYKEY key) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMMNotificationClient, 0x7991eec9, 0x7e89, 0x4d85, 0x83,0x90, 0x6c,0x70,0x3c,0xec,0x60,0xc0)
#endif
#else
typedef struct IMMNotificationClientVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMMNotificationClient methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDeviceStateChanged)(
        IMMNotificationClient *This,
        LPCWSTR pwstrDeviceId,
        DWORD dwNewState);

    HRESULT (STDMETHODCALLTYPE *OnDeviceAdded)(
        IMMNotificationClient *This,
        LPCWSTR pwstrDeviceId);

    HRESULT (STDMETHODCALLTYPE *OnDeviceRemoved)(
        IMMNotificationClient *This,
        LPCWSTR pwstrDeviceId);

    HRESULT (STDMETHODCALLTYPE *OnDefaultDeviceChanged)(
        IMMNotificationClient *This,
        EDataFlow flow,
        ERole role,
        LPCWSTR pwstrDeviceId);

    HRESULT (STDMETHODCALLTYPE *OnPropertyValueChanged)(
        IMMNotificationClient *This,
        LPCWSTR pwstrDeviceId,
        const PROPERTYKEY key);

    END_INTERFACE
} IMMNotificationClientVtbl;

interface IMMNotificationClient {
    CONST_VTBL IMMNotificationClientVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMMNotificationClient_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMMNotificationClient_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMMNotificationClient_Release(This) (This)->lpVtbl->Release(This)
/*** IMMNotificationClient methods ***/
#define IMMNotificationClient_OnDeviceStateChanged(This,pwstrDeviceId,dwNewState) (This)->lpVtbl->OnDeviceStateChanged(This,pwstrDeviceId,dwNewState)
#define IMMNotificationClient_OnDeviceAdded(This,pwstrDeviceId) (This)->lpVtbl->OnDeviceAdded(This,pwstrDeviceId)
#define IMMNotificationClient_OnDeviceRemoved(This,pwstrDeviceId) (This)->lpVtbl->OnDeviceRemoved(This,pwstrDeviceId)
#define IMMNotificationClient_OnDefaultDeviceChanged(This,flow,role,pwstrDeviceId) (This)->lpVtbl->OnDefaultDeviceChanged(This,flow,role,pwstrDeviceId)
#define IMMNotificationClient_OnPropertyValueChanged(This,pwstrDeviceId,key) (This)->lpVtbl->OnPropertyValueChanged(This,pwstrDeviceId,key)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMMNotificationClient_QueryInterface(IMMNotificationClient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMMNotificationClient_AddRef(IMMNotificationClient* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMMNotificationClient_Release(IMMNotificationClient* This) {
    return This->lpVtbl->Release(This);
}
/*** IMMNotificationClient methods ***/
static FORCEINLINE HRESULT IMMNotificationClient_OnDeviceStateChanged(IMMNotificationClient* This,LPCWSTR pwstrDeviceId,DWORD dwNewState) {
    return This->lpVtbl->OnDeviceStateChanged(This,pwstrDeviceId,dwNewState);
}
static FORCEINLINE HRESULT IMMNotificationClient_OnDeviceAdded(IMMNotificationClient* This,LPCWSTR pwstrDeviceId) {
    return This->lpVtbl->OnDeviceAdded(This,pwstrDeviceId);
}
static FORCEINLINE HRESULT IMMNotificationClient_OnDeviceRemoved(IMMNotificationClient* This,LPCWSTR pwstrDeviceId) {
    return This->lpVtbl->OnDeviceRemoved(This,pwstrDeviceId);
}
static FORCEINLINE HRESULT IMMNotificationClient_OnDefaultDeviceChanged(IMMNotificationClient* This,EDataFlow flow,ERole role,LPCWSTR pwstrDeviceId) {
    return This->lpVtbl->OnDefaultDeviceChanged(This,flow,role,pwstrDeviceId);
}
static FORCEINLINE HRESULT IMMNotificationClient_OnPropertyValueChanged(IMMNotificationClient* This,LPCWSTR pwstrDeviceId,const PROPERTYKEY key) {
    return This->lpVtbl->OnPropertyValueChanged(This,pwstrDeviceId,key);
}
#endif
#endif

#endif


#endif  /* __IMMNotificationClient_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMMDevice interface
 */
#ifndef __IMMDevice_INTERFACE_DEFINED__
#define __IMMDevice_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMMDevice, 0xd666063f, 0x1587, 0x4e43, 0x81,0xf1, 0xb9,0x48,0xe8,0x07,0x36,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d666063f-1587-4e43-81f1-b948e807363f")
IMMDevice : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Activate(
        REFIID iid,
        DWORD dwClsCtx,
        PROPVARIANT *pActivationParams,
        void **ppv) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenPropertyStore(
        DWORD stgmAccess,
        IPropertyStore **ppProperties) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetId(
        LPWSTR *ppstrId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetState(
        DWORD *pdwState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMMDevice, 0xd666063f, 0x1587, 0x4e43, 0x81,0xf1, 0xb9,0x48,0xe8,0x07,0x36,0x3f)
#endif
#else
typedef struct IMMDeviceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMMDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        IMMDevice *This,
        REFIID iid,
        DWORD dwClsCtx,
        PROPVARIANT *pActivationParams,
        void **ppv);

    HRESULT (STDMETHODCALLTYPE *OpenPropertyStore)(
        IMMDevice *This,
        DWORD stgmAccess,
        IPropertyStore **ppProperties);

    HRESULT (STDMETHODCALLTYPE *GetId)(
        IMMDevice *This,
        LPWSTR *ppstrId);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IMMDevice *This,
        DWORD *pdwState);

    END_INTERFACE
} IMMDeviceVtbl;

interface IMMDevice {
    CONST_VTBL IMMDeviceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMMDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMMDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMMDevice_Release(This) (This)->lpVtbl->Release(This)
/*** IMMDevice methods ***/
#define IMMDevice_Activate(This,iid,dwClsCtx,pActivationParams,ppv) (This)->lpVtbl->Activate(This,iid,dwClsCtx,pActivationParams,ppv)
#define IMMDevice_OpenPropertyStore(This,stgmAccess,ppProperties) (This)->lpVtbl->OpenPropertyStore(This,stgmAccess,ppProperties)
#define IMMDevice_GetId(This,ppstrId) (This)->lpVtbl->GetId(This,ppstrId)
#define IMMDevice_GetState(This,pdwState) (This)->lpVtbl->GetState(This,pdwState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMMDevice_QueryInterface(IMMDevice* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMMDevice_AddRef(IMMDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMMDevice_Release(IMMDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** IMMDevice methods ***/
static FORCEINLINE HRESULT IMMDevice_Activate(IMMDevice* This,REFIID iid,DWORD dwClsCtx,PROPVARIANT *pActivationParams,void **ppv) {
    return This->lpVtbl->Activate(This,iid,dwClsCtx,pActivationParams,ppv);
}
static FORCEINLINE HRESULT IMMDevice_OpenPropertyStore(IMMDevice* This,DWORD stgmAccess,IPropertyStore **ppProperties) {
    return This->lpVtbl->OpenPropertyStore(This,stgmAccess,ppProperties);
}
static FORCEINLINE HRESULT IMMDevice_GetId(IMMDevice* This,LPWSTR *ppstrId) {
    return This->lpVtbl->GetId(This,ppstrId);
}
static FORCEINLINE HRESULT IMMDevice_GetState(IMMDevice* This,DWORD *pdwState) {
    return This->lpVtbl->GetState(This,pdwState);
}
#endif
#endif

#endif


#endif  /* __IMMDevice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMMDeviceCollection interface
 */
#ifndef __IMMDeviceCollection_INTERFACE_DEFINED__
#define __IMMDeviceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMMDeviceCollection, 0x0bd7a1be, 0x7a1a, 0x44db, 0x83,0x97, 0xcc,0x53,0x92,0x38,0x7b,0x5e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0bd7a1be-7a1a-44db-8397-cc5392387b5e")
IMMDeviceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT *pcDevices) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        UINT nDevice,
        IMMDevice **ppdevice) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMMDeviceCollection, 0x0bd7a1be, 0x7a1a, 0x44db, 0x83,0x97, 0xcc,0x53,0x92,0x38,0x7b,0x5e)
#endif
#else
typedef struct IMMDeviceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMMDeviceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IMMDeviceCollection *This,
        UINT *pcDevices);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IMMDeviceCollection *This,
        UINT nDevice,
        IMMDevice **ppdevice);

    END_INTERFACE
} IMMDeviceCollectionVtbl;

interface IMMDeviceCollection {
    CONST_VTBL IMMDeviceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMMDeviceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMMDeviceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMMDeviceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IMMDeviceCollection methods ***/
#define IMMDeviceCollection_GetCount(This,pcDevices) (This)->lpVtbl->GetCount(This,pcDevices)
#define IMMDeviceCollection_Item(This,nDevice,ppdevice) (This)->lpVtbl->Item(This,nDevice,ppdevice)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMMDeviceCollection_QueryInterface(IMMDeviceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMMDeviceCollection_AddRef(IMMDeviceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMMDeviceCollection_Release(IMMDeviceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IMMDeviceCollection methods ***/
static FORCEINLINE HRESULT IMMDeviceCollection_GetCount(IMMDeviceCollection* This,UINT *pcDevices) {
    return This->lpVtbl->GetCount(This,pcDevices);
}
static FORCEINLINE HRESULT IMMDeviceCollection_Item(IMMDeviceCollection* This,UINT nDevice,IMMDevice **ppdevice) {
    return This->lpVtbl->Item(This,nDevice,ppdevice);
}
#endif
#endif

#endif


#endif  /* __IMMDeviceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMMEndpoint interface
 */
#ifndef __IMMEndpoint_INTERFACE_DEFINED__
#define __IMMEndpoint_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMMEndpoint, 0x1be09788, 0x6894, 0x4089, 0x85,0x86, 0x9a,0x2a,0x6c,0x26,0x5a,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1be09788-6894-4089-8586-9a2a6c265ac5")
IMMEndpoint : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDataFlow(
        EDataFlow *pDataFlow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMMEndpoint, 0x1be09788, 0x6894, 0x4089, 0x85,0x86, 0x9a,0x2a,0x6c,0x26,0x5a,0xc5)
#endif
#else
typedef struct IMMEndpointVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMMEndpoint methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDataFlow)(
        IMMEndpoint *This,
        EDataFlow *pDataFlow);

    END_INTERFACE
} IMMEndpointVtbl;

interface IMMEndpoint {
    CONST_VTBL IMMEndpointVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMMEndpoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMMEndpoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMMEndpoint_Release(This) (This)->lpVtbl->Release(This)
/*** IMMEndpoint methods ***/
#define IMMEndpoint_GetDataFlow(This,pDataFlow) (This)->lpVtbl->GetDataFlow(This,pDataFlow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMMEndpoint_QueryInterface(IMMEndpoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMMEndpoint_AddRef(IMMEndpoint* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMMEndpoint_Release(IMMEndpoint* This) {
    return This->lpVtbl->Release(This);
}
/*** IMMEndpoint methods ***/
static FORCEINLINE HRESULT IMMEndpoint_GetDataFlow(IMMEndpoint* This,EDataFlow *pDataFlow) {
    return This->lpVtbl->GetDataFlow(This,pDataFlow);
}
#endif
#endif

#endif


#endif  /* __IMMEndpoint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMMDeviceEnumerator interface
 */
#ifndef __IMMDeviceEnumerator_INTERFACE_DEFINED__
#define __IMMDeviceEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a95664d2-9614-4f35-a746-de8db63617e6")
IMMDeviceEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnumAudioEndpoints(
        EDataFlow dataFlow,
        DWORD dwStateMask,
        IMMDeviceCollection **ppDevices) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultAudioEndpoint(
        EDataFlow dataFlow,
        ERole role,
        IMMDevice **ppEndpoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDevice(
        LPCWSTR pwstrId,
        IMMDevice **ppDevice) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterEndpointNotificationCallback(
        IMMNotificationClient *pClient) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterEndpointNotificationCallback(
        IMMNotificationClient *pClient) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6)
#endif
#else
typedef struct IMMDeviceEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMMDeviceEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumAudioEndpoints)(
        IMMDeviceEnumerator *This,
        EDataFlow dataFlow,
        DWORD dwStateMask,
        IMMDeviceCollection **ppDevices);

    HRESULT (STDMETHODCALLTYPE *GetDefaultAudioEndpoint)(
        IMMDeviceEnumerator *This,
        EDataFlow dataFlow,
        ERole role,
        IMMDevice **ppEndpoint);

    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        IMMDeviceEnumerator *This,
        LPCWSTR pwstrId,
        IMMDevice **ppDevice);

    HRESULT (STDMETHODCALLTYPE *RegisterEndpointNotificationCallback)(
        IMMDeviceEnumerator *This,
        IMMNotificationClient *pClient);

    HRESULT (STDMETHODCALLTYPE *UnregisterEndpointNotificationCallback)(
        IMMDeviceEnumerator *This,
        IMMNotificationClient *pClient);

    END_INTERFACE
} IMMDeviceEnumeratorVtbl;

interface IMMDeviceEnumerator {
    CONST_VTBL IMMDeviceEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMMDeviceEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMMDeviceEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMMDeviceEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IMMDeviceEnumerator methods ***/
#define IMMDeviceEnumerator_EnumAudioEndpoints(This,dataFlow,dwStateMask,ppDevices) (This)->lpVtbl->EnumAudioEndpoints(This,dataFlow,dwStateMask,ppDevices)
#define IMMDeviceEnumerator_GetDefaultAudioEndpoint(This,dataFlow,role,ppEndpoint) (This)->lpVtbl->GetDefaultAudioEndpoint(This,dataFlow,role,ppEndpoint)
#define IMMDeviceEnumerator_GetDevice(This,pwstrId,ppDevice) (This)->lpVtbl->GetDevice(This,pwstrId,ppDevice)
#define IMMDeviceEnumerator_RegisterEndpointNotificationCallback(This,pClient) (This)->lpVtbl->RegisterEndpointNotificationCallback(This,pClient)
#define IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(This,pClient) (This)->lpVtbl->UnregisterEndpointNotificationCallback(This,pClient)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMMDeviceEnumerator_QueryInterface(IMMDeviceEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMMDeviceEnumerator_AddRef(IMMDeviceEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMMDeviceEnumerator_Release(IMMDeviceEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IMMDeviceEnumerator methods ***/
static FORCEINLINE HRESULT IMMDeviceEnumerator_EnumAudioEndpoints(IMMDeviceEnumerator* This,EDataFlow dataFlow,DWORD dwStateMask,IMMDeviceCollection **ppDevices) {
    return This->lpVtbl->EnumAudioEndpoints(This,dataFlow,dwStateMask,ppDevices);
}
static FORCEINLINE HRESULT IMMDeviceEnumerator_GetDefaultAudioEndpoint(IMMDeviceEnumerator* This,EDataFlow dataFlow,ERole role,IMMDevice **ppEndpoint) {
    return This->lpVtbl->GetDefaultAudioEndpoint(This,dataFlow,role,ppEndpoint);
}
static FORCEINLINE HRESULT IMMDeviceEnumerator_GetDevice(IMMDeviceEnumerator* This,LPCWSTR pwstrId,IMMDevice **ppDevice) {
    return This->lpVtbl->GetDevice(This,pwstrId,ppDevice);
}
static FORCEINLINE HRESULT IMMDeviceEnumerator_RegisterEndpointNotificationCallback(IMMDeviceEnumerator* This,IMMNotificationClient *pClient) {
    return This->lpVtbl->RegisterEndpointNotificationCallback(This,pClient);
}
static FORCEINLINE HRESULT IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(IMMDeviceEnumerator* This,IMMNotificationClient *pClient) {
    return This->lpVtbl->UnregisterEndpointNotificationCallback(This,pClient);
}
#endif
#endif

#endif


#endif  /* __IMMDeviceEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMMDeviceActivator interface
 */
#ifndef __IMMDeviceActivator_INTERFACE_DEFINED__
#define __IMMDeviceActivator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMMDeviceActivator, 0x3b0d0ea4, 0xd0a9, 0x4b0e, 0x93,0x5b, 0x09,0x51,0x67,0x46,0xfa,0xc0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3b0d0ea4-d0a9-4b0e-935b-09516746fac0")
IMMDeviceActivator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Activate(
        REFIID iid,
        IMMDevice *pDevice,
        PROPVARIANT *pActivationParams,
        void **ppv) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMMDeviceActivator, 0x3b0d0ea4, 0xd0a9, 0x4b0e, 0x93,0x5b, 0x09,0x51,0x67,0x46,0xfa,0xc0)
#endif
#else
typedef struct IMMDeviceActivatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMMDeviceActivator methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        IMMDeviceActivator *This,
        REFIID iid,
        IMMDevice *pDevice,
        PROPVARIANT *pActivationParams,
        void **ppv);

    END_INTERFACE
} IMMDeviceActivatorVtbl;

interface IMMDeviceActivator {
    CONST_VTBL IMMDeviceActivatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMMDeviceActivator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMMDeviceActivator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMMDeviceActivator_Release(This) (This)->lpVtbl->Release(This)
/*** IMMDeviceActivator methods ***/
#define IMMDeviceActivator_Activate(This,iid,pDevice,pActivationParams,ppv) (This)->lpVtbl->Activate(This,iid,pDevice,pActivationParams,ppv)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMMDeviceActivator_QueryInterface(IMMDeviceActivator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMMDeviceActivator_AddRef(IMMDeviceActivator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMMDeviceActivator_Release(IMMDeviceActivator* This) {
    return This->lpVtbl->Release(This);
}
/*** IMMDeviceActivator methods ***/
static FORCEINLINE HRESULT IMMDeviceActivator_Activate(IMMDeviceActivator* This,REFIID iid,IMMDevice *pDevice,PROPVARIANT *pActivationParams,void **ppv) {
    return This->lpVtbl->Activate(This,iid,pDevice,pActivationParams,ppv);
}
#endif
#endif

#endif


#endif  /* __IMMDeviceActivator_INTERFACE_DEFINED__ */

typedef struct _AudioExtensionParams {
    LPARAM AddPageParam;
    IMMDevice *pEndPoint;
    IMMDevice *pPnpInterface;
    IMMDevice *pPnpDevnode;
} AudioExtensionParams;

DEFINE_GUID(LIBID_MMDeviceAPILib, 0x2fdaafa3, 0x7523, 0x4f66, 0x99,0x57, 0x9d,0x5e,0x7f,0xe6,0x98,0xf6);

/*****************************************************************************
 * MMDeviceEnumerator coclass
 */

DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e);

#ifdef __cplusplus
class DECLSPEC_UUID("bcde0395-e52f-467c-8e3d-c4579291692e") MMDeviceEnumerator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e)
#endif
#endif

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mmdeviceapi_h__ */
