/*** Autogenerated by WIDL 10.4 from include/endpointvolume.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 __endpointvolume_h__
#define __endpointvolume_h__

/* Forward declarations */

#ifndef __IAudioEndpointVolumeCallback_FWD_DEFINED__
#define __IAudioEndpointVolumeCallback_FWD_DEFINED__
typedef interface IAudioEndpointVolumeCallback IAudioEndpointVolumeCallback;
#ifdef __cplusplus
interface IAudioEndpointVolumeCallback;
#endif /* __cplusplus */
#endif

#ifndef __IAudioEndpointVolume_FWD_DEFINED__
#define __IAudioEndpointVolume_FWD_DEFINED__
typedef interface IAudioEndpointVolume IAudioEndpointVolume;
#ifdef __cplusplus
interface IAudioEndpointVolume;
#endif /* __cplusplus */
#endif

#ifndef __IAudioEndpointVolumeEx_FWD_DEFINED__
#define __IAudioEndpointVolumeEx_FWD_DEFINED__
typedef interface IAudioEndpointVolumeEx IAudioEndpointVolumeEx;
#ifdef __cplusplus
interface IAudioEndpointVolumeEx;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <devicetopology.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct AUDIO_VOLUME_NOTIFICATION_DATA {
    GUID guidEventContext;
    WINBOOL bMuted;
    FLOAT fMasterVolume;
    UINT nChannels;
    FLOAT afChannelVolumes[1];
} AUDIO_VOLUME_NOTIFICATION_DATA;
typedef struct AUDIO_VOLUME_NOTIFICATION_DATA *PAUDIO_VOLUME_NOTIFICATION_DATA;
#define ENDPOINT_HARDWARE_SUPPORT_VOLUME 0x1
#define ENDPOINT_HARDWARE_SUPPORT_MUTE 0x2
#define ENDPOINT_HARDWARE_SUPPORT_METER 0x4
#ifndef __IAudioEndpointVolumeCallback_FWD_DEFINED__
#define __IAudioEndpointVolumeCallback_FWD_DEFINED__
typedef interface IAudioEndpointVolumeCallback IAudioEndpointVolumeCallback;
#ifdef __cplusplus
interface IAudioEndpointVolumeCallback;
#endif /* __cplusplus */
#endif

#ifndef __IAudioEndpointVolume_FWD_DEFINED__
#define __IAudioEndpointVolume_FWD_DEFINED__
typedef interface IAudioEndpointVolume IAudioEndpointVolume;
#ifdef __cplusplus
interface IAudioEndpointVolume;
#endif /* __cplusplus */
#endif

#ifndef __IAudioEndpointVolumeEx_FWD_DEFINED__
#define __IAudioEndpointVolumeEx_FWD_DEFINED__
typedef interface IAudioEndpointVolumeEx IAudioEndpointVolumeEx;
#ifdef __cplusplus
interface IAudioEndpointVolumeEx;
#endif /* __cplusplus */
#endif

#ifndef __IAudioMeterInformation_FWD_DEFINED__
#define __IAudioMeterInformation_FWD_DEFINED__
typedef interface IAudioMeterInformation IAudioMeterInformation;
#ifdef __cplusplus
interface IAudioMeterInformation;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IAudioEndpointVolumeCallback interface
 */
#ifndef __IAudioEndpointVolumeCallback_INTERFACE_DEFINED__
#define __IAudioEndpointVolumeCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioEndpointVolumeCallback, 0x657804fa, 0xd6ad, 0x4496, 0x8a,0x60, 0x35,0x27,0x52,0xaf,0x4f,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("657804fa-d6ad-4496-8a60-352752af4f89")
IAudioEndpointVolumeCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnNotify(
        AUDIO_VOLUME_NOTIFICATION_DATA *pNotify) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioEndpointVolumeCallback, 0x657804fa, 0xd6ad, 0x4496, 0x8a,0x60, 0x35,0x27,0x52,0xaf,0x4f,0x89)
#endif
#else
typedef struct IAudioEndpointVolumeCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioEndpointVolumeCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnNotify)(
        IAudioEndpointVolumeCallback *This,
        AUDIO_VOLUME_NOTIFICATION_DATA *pNotify);

    END_INTERFACE
} IAudioEndpointVolumeCallbackVtbl;

interface IAudioEndpointVolumeCallback {
    CONST_VTBL IAudioEndpointVolumeCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioEndpointVolumeCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioEndpointVolumeCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioEndpointVolumeCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioEndpointVolumeCallback methods ***/
#define IAudioEndpointVolumeCallback_OnNotify(This,pNotify) (This)->lpVtbl->OnNotify(This,pNotify)
#else
/*** IUnknown methods ***/
static inline HRESULT IAudioEndpointVolumeCallback_QueryInterface(IAudioEndpointVolumeCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioEndpointVolumeCallback_AddRef(IAudioEndpointVolumeCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioEndpointVolumeCallback_Release(IAudioEndpointVolumeCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioEndpointVolumeCallback methods ***/
static inline HRESULT IAudioEndpointVolumeCallback_OnNotify(IAudioEndpointVolumeCallback* This,AUDIO_VOLUME_NOTIFICATION_DATA *pNotify) {
    return This->lpVtbl->OnNotify(This,pNotify);
}
#endif
#endif

#endif


#endif  /* __IAudioEndpointVolumeCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAudioEndpointVolume interface
 */
#ifndef __IAudioEndpointVolume_INTERFACE_DEFINED__
#define __IAudioEndpointVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioEndpointVolume, 0x5cdf2c82, 0x841e, 0x4546, 0x97,0x22, 0x0c,0xf7,0x40,0x78,0x22,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5cdf2c82-841e-4546-9722-0cf74078229a")
IAudioEndpointVolume : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterControlChangeNotify(
        IAudioEndpointVolumeCallback *pNotify) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterControlChangeNotify(
        IAudioEndpointVolumeCallback *pNotify) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChannelCount(
        UINT *pnChannelCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMasterVolumeLevel(
        FLOAT fLevelDB,
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMasterVolumeLevelScalar(
        FLOAT fLevel,
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMasterVolumeLevel(
        FLOAT *fLevelDB) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMasterVolumeLevelScalar(
        FLOAT *fLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChannelVolumeLevel(
        UINT nChannel,
        FLOAT fLevelDB,
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChannelVolumeLevelScalar(
        UINT nChannel,
        FLOAT fLevel,
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChannelVolumeLevel(
        UINT nChannel,
        FLOAT *fLevelDB) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChannelVolumeLevelScalar(
        UINT nChannel,
        FLOAT *fLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMute(
        WINBOOL bMute,
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMute(
        WINBOOL *bMute) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVolumeStepInfo(
        UINT *pnStep,
        UINT *pnStepCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE VolumeStepUp(
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE VolumeStepDown(
        LPCGUID pguidEventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryHardwareSupport(
        DWORD *pdwHardwareSupportMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVolumeRange(
        FLOAT *pflVolumeMindB,
        FLOAT *pflVolumeMaxdB,
        FLOAT *pflVolumeIncrementdB) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioEndpointVolume, 0x5cdf2c82, 0x841e, 0x4546, 0x97,0x22, 0x0c,0xf7,0x40,0x78,0x22,0x9a)
#endif
#else
typedef struct IAudioEndpointVolumeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioEndpointVolume methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterControlChangeNotify)(
        IAudioEndpointVolume *This,
        IAudioEndpointVolumeCallback *pNotify);

    HRESULT (STDMETHODCALLTYPE *UnregisterControlChangeNotify)(
        IAudioEndpointVolume *This,
        IAudioEndpointVolumeCallback *pNotify);

    HRESULT (STDMETHODCALLTYPE *GetChannelCount)(
        IAudioEndpointVolume *This,
        UINT *pnChannelCount);

    HRESULT (STDMETHODCALLTYPE *SetMasterVolumeLevel)(
        IAudioEndpointVolume *This,
        FLOAT fLevelDB,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *SetMasterVolumeLevelScalar)(
        IAudioEndpointVolume *This,
        FLOAT fLevel,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *GetMasterVolumeLevel)(
        IAudioEndpointVolume *This,
        FLOAT *fLevelDB);

    HRESULT (STDMETHODCALLTYPE *GetMasterVolumeLevelScalar)(
        IAudioEndpointVolume *This,
        FLOAT *fLevel);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumeLevel)(
        IAudioEndpointVolume *This,
        UINT nChannel,
        FLOAT fLevelDB,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumeLevelScalar)(
        IAudioEndpointVolume *This,
        UINT nChannel,
        FLOAT fLevel,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *GetChannelVolumeLevel)(
        IAudioEndpointVolume *This,
        UINT nChannel,
        FLOAT *fLevelDB);

    HRESULT (STDMETHODCALLTYPE *GetChannelVolumeLevelScalar)(
        IAudioEndpointVolume *This,
        UINT nChannel,
        FLOAT *fLevel);

    HRESULT (STDMETHODCALLTYPE *SetMute)(
        IAudioEndpointVolume *This,
        WINBOOL bMute,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *GetMute)(
        IAudioEndpointVolume *This,
        WINBOOL *bMute);

    HRESULT (STDMETHODCALLTYPE *GetVolumeStepInfo)(
        IAudioEndpointVolume *This,
        UINT *pnStep,
        UINT *pnStepCount);

    HRESULT (STDMETHODCALLTYPE *VolumeStepUp)(
        IAudioEndpointVolume *This,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *VolumeStepDown)(
        IAudioEndpointVolume *This,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *QueryHardwareSupport)(
        IAudioEndpointVolume *This,
        DWORD *pdwHardwareSupportMask);

    HRESULT (STDMETHODCALLTYPE *GetVolumeRange)(
        IAudioEndpointVolume *This,
        FLOAT *pflVolumeMindB,
        FLOAT *pflVolumeMaxdB,
        FLOAT *pflVolumeIncrementdB);

    END_INTERFACE
} IAudioEndpointVolumeVtbl;

interface IAudioEndpointVolume {
    CONST_VTBL IAudioEndpointVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioEndpointVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioEndpointVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioEndpointVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioEndpointVolume methods ***/
#define IAudioEndpointVolume_RegisterControlChangeNotify(This,pNotify) (This)->lpVtbl->RegisterControlChangeNotify(This,pNotify)
#define IAudioEndpointVolume_UnregisterControlChangeNotify(This,pNotify) (This)->lpVtbl->UnregisterControlChangeNotify(This,pNotify)
#define IAudioEndpointVolume_GetChannelCount(This,pnChannelCount) (This)->lpVtbl->GetChannelCount(This,pnChannelCount)
#define IAudioEndpointVolume_SetMasterVolumeLevel(This,fLevelDB,pguidEventContext) (This)->lpVtbl->SetMasterVolumeLevel(This,fLevelDB,pguidEventContext)
#define IAudioEndpointVolume_SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext) (This)->lpVtbl->SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext)
#define IAudioEndpointVolume_GetMasterVolumeLevel(This,fLevelDB) (This)->lpVtbl->GetMasterVolumeLevel(This,fLevelDB)
#define IAudioEndpointVolume_GetMasterVolumeLevelScalar(This,fLevel) (This)->lpVtbl->GetMasterVolumeLevelScalar(This,fLevel)
#define IAudioEndpointVolume_SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext) (This)->lpVtbl->SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext)
#define IAudioEndpointVolume_SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext) (This)->lpVtbl->SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext)
#define IAudioEndpointVolume_GetChannelVolumeLevel(This,nChannel,fLevelDB) (This)->lpVtbl->GetChannelVolumeLevel(This,nChannel,fLevelDB)
#define IAudioEndpointVolume_GetChannelVolumeLevelScalar(This,nChannel,fLevel) (This)->lpVtbl->GetChannelVolumeLevelScalar(This,nChannel,fLevel)
#define IAudioEndpointVolume_SetMute(This,bMute,pguidEventContext) (This)->lpVtbl->SetMute(This,bMute,pguidEventContext)
#define IAudioEndpointVolume_GetMute(This,bMute) (This)->lpVtbl->GetMute(This,bMute)
#define IAudioEndpointVolume_GetVolumeStepInfo(This,pnStep,pnStepCount) (This)->lpVtbl->GetVolumeStepInfo(This,pnStep,pnStepCount)
#define IAudioEndpointVolume_VolumeStepUp(This,pguidEventContext) (This)->lpVtbl->VolumeStepUp(This,pguidEventContext)
#define IAudioEndpointVolume_VolumeStepDown(This,pguidEventContext) (This)->lpVtbl->VolumeStepDown(This,pguidEventContext)
#define IAudioEndpointVolume_QueryHardwareSupport(This,pdwHardwareSupportMask) (This)->lpVtbl->QueryHardwareSupport(This,pdwHardwareSupportMask)
#define IAudioEndpointVolume_GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB) (This)->lpVtbl->GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB)
#else
/*** IUnknown methods ***/
static inline HRESULT IAudioEndpointVolume_QueryInterface(IAudioEndpointVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioEndpointVolume_AddRef(IAudioEndpointVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioEndpointVolume_Release(IAudioEndpointVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioEndpointVolume methods ***/
static inline HRESULT IAudioEndpointVolume_RegisterControlChangeNotify(IAudioEndpointVolume* This,IAudioEndpointVolumeCallback *pNotify) {
    return This->lpVtbl->RegisterControlChangeNotify(This,pNotify);
}
static inline HRESULT IAudioEndpointVolume_UnregisterControlChangeNotify(IAudioEndpointVolume* This,IAudioEndpointVolumeCallback *pNotify) {
    return This->lpVtbl->UnregisterControlChangeNotify(This,pNotify);
}
static inline HRESULT IAudioEndpointVolume_GetChannelCount(IAudioEndpointVolume* This,UINT *pnChannelCount) {
    return This->lpVtbl->GetChannelCount(This,pnChannelCount);
}
static inline HRESULT IAudioEndpointVolume_SetMasterVolumeLevel(IAudioEndpointVolume* This,FLOAT fLevelDB,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetMasterVolumeLevel(This,fLevelDB,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_SetMasterVolumeLevelScalar(IAudioEndpointVolume* This,FLOAT fLevel,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_GetMasterVolumeLevel(IAudioEndpointVolume* This,FLOAT *fLevelDB) {
    return This->lpVtbl->GetMasterVolumeLevel(This,fLevelDB);
}
static inline HRESULT IAudioEndpointVolume_GetMasterVolumeLevelScalar(IAudioEndpointVolume* This,FLOAT *fLevel) {
    return This->lpVtbl->GetMasterVolumeLevelScalar(This,fLevel);
}
static inline HRESULT IAudioEndpointVolume_SetChannelVolumeLevel(IAudioEndpointVolume* This,UINT nChannel,FLOAT fLevelDB,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_SetChannelVolumeLevelScalar(IAudioEndpointVolume* This,UINT nChannel,FLOAT fLevel,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_GetChannelVolumeLevel(IAudioEndpointVolume* This,UINT nChannel,FLOAT *fLevelDB) {
    return This->lpVtbl->GetChannelVolumeLevel(This,nChannel,fLevelDB);
}
static inline HRESULT IAudioEndpointVolume_GetChannelVolumeLevelScalar(IAudioEndpointVolume* This,UINT nChannel,FLOAT *fLevel) {
    return This->lpVtbl->GetChannelVolumeLevelScalar(This,nChannel,fLevel);
}
static inline HRESULT IAudioEndpointVolume_SetMute(IAudioEndpointVolume* This,WINBOOL bMute,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetMute(This,bMute,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_GetMute(IAudioEndpointVolume* This,WINBOOL *bMute) {
    return This->lpVtbl->GetMute(This,bMute);
}
static inline HRESULT IAudioEndpointVolume_GetVolumeStepInfo(IAudioEndpointVolume* This,UINT *pnStep,UINT *pnStepCount) {
    return This->lpVtbl->GetVolumeStepInfo(This,pnStep,pnStepCount);
}
static inline HRESULT IAudioEndpointVolume_VolumeStepUp(IAudioEndpointVolume* This,LPCGUID pguidEventContext) {
    return This->lpVtbl->VolumeStepUp(This,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_VolumeStepDown(IAudioEndpointVolume* This,LPCGUID pguidEventContext) {
    return This->lpVtbl->VolumeStepDown(This,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolume_QueryHardwareSupport(IAudioEndpointVolume* This,DWORD *pdwHardwareSupportMask) {
    return This->lpVtbl->QueryHardwareSupport(This,pdwHardwareSupportMask);
}
static inline HRESULT IAudioEndpointVolume_GetVolumeRange(IAudioEndpointVolume* This,FLOAT *pflVolumeMindB,FLOAT *pflVolumeMaxdB,FLOAT *pflVolumeIncrementdB) {
    return This->lpVtbl->GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB);
}
#endif
#endif

#endif


#endif  /* __IAudioEndpointVolume_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAudioEndpointVolumeEx interface
 */
#ifndef __IAudioEndpointVolumeEx_INTERFACE_DEFINED__
#define __IAudioEndpointVolumeEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioEndpointVolumeEx, 0x66e11784, 0xf695, 0x4f28, 0xa5,0x05, 0xa7,0x08,0x00,0x81,0xa7,0x8f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("66e11784-f695-4f28-a505-a7080081a78f")
IAudioEndpointVolumeEx : public IAudioEndpointVolume
{
    virtual HRESULT STDMETHODCALLTYPE GetVolumeRangeChannel(
        UINT iChannel,
        FLOAT *pflVolumeMindB,
        FLOAT *pflVolumeMaxdB,
        FLOAT *pflVolumeIncrementdB) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioEndpointVolumeEx, 0x66e11784, 0xf695, 0x4f28, 0xa5,0x05, 0xa7,0x08,0x00,0x81,0xa7,0x8f)
#endif
#else
typedef struct IAudioEndpointVolumeExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioEndpointVolume methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterControlChangeNotify)(
        IAudioEndpointVolumeEx *This,
        IAudioEndpointVolumeCallback *pNotify);

    HRESULT (STDMETHODCALLTYPE *UnregisterControlChangeNotify)(
        IAudioEndpointVolumeEx *This,
        IAudioEndpointVolumeCallback *pNotify);

    HRESULT (STDMETHODCALLTYPE *GetChannelCount)(
        IAudioEndpointVolumeEx *This,
        UINT *pnChannelCount);

    HRESULT (STDMETHODCALLTYPE *SetMasterVolumeLevel)(
        IAudioEndpointVolumeEx *This,
        FLOAT fLevelDB,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *SetMasterVolumeLevelScalar)(
        IAudioEndpointVolumeEx *This,
        FLOAT fLevel,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *GetMasterVolumeLevel)(
        IAudioEndpointVolumeEx *This,
        FLOAT *fLevelDB);

    HRESULT (STDMETHODCALLTYPE *GetMasterVolumeLevelScalar)(
        IAudioEndpointVolumeEx *This,
        FLOAT *fLevel);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumeLevel)(
        IAudioEndpointVolumeEx *This,
        UINT nChannel,
        FLOAT fLevelDB,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *SetChannelVolumeLevelScalar)(
        IAudioEndpointVolumeEx *This,
        UINT nChannel,
        FLOAT fLevel,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *GetChannelVolumeLevel)(
        IAudioEndpointVolumeEx *This,
        UINT nChannel,
        FLOAT *fLevelDB);

    HRESULT (STDMETHODCALLTYPE *GetChannelVolumeLevelScalar)(
        IAudioEndpointVolumeEx *This,
        UINT nChannel,
        FLOAT *fLevel);

    HRESULT (STDMETHODCALLTYPE *SetMute)(
        IAudioEndpointVolumeEx *This,
        WINBOOL bMute,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *GetMute)(
        IAudioEndpointVolumeEx *This,
        WINBOOL *bMute);

    HRESULT (STDMETHODCALLTYPE *GetVolumeStepInfo)(
        IAudioEndpointVolumeEx *This,
        UINT *pnStep,
        UINT *pnStepCount);

    HRESULT (STDMETHODCALLTYPE *VolumeStepUp)(
        IAudioEndpointVolumeEx *This,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *VolumeStepDown)(
        IAudioEndpointVolumeEx *This,
        LPCGUID pguidEventContext);

    HRESULT (STDMETHODCALLTYPE *QueryHardwareSupport)(
        IAudioEndpointVolumeEx *This,
        DWORD *pdwHardwareSupportMask);

    HRESULT (STDMETHODCALLTYPE *GetVolumeRange)(
        IAudioEndpointVolumeEx *This,
        FLOAT *pflVolumeMindB,
        FLOAT *pflVolumeMaxdB,
        FLOAT *pflVolumeIncrementdB);

    /*** IAudioEndpointVolumeEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVolumeRangeChannel)(
        IAudioEndpointVolumeEx *This,
        UINT iChannel,
        FLOAT *pflVolumeMindB,
        FLOAT *pflVolumeMaxdB,
        FLOAT *pflVolumeIncrementdB);

    END_INTERFACE
} IAudioEndpointVolumeExVtbl;

interface IAudioEndpointVolumeEx {
    CONST_VTBL IAudioEndpointVolumeExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioEndpointVolumeEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioEndpointVolumeEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioEndpointVolumeEx_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioEndpointVolume methods ***/
#define IAudioEndpointVolumeEx_RegisterControlChangeNotify(This,pNotify) (This)->lpVtbl->RegisterControlChangeNotify(This,pNotify)
#define IAudioEndpointVolumeEx_UnregisterControlChangeNotify(This,pNotify) (This)->lpVtbl->UnregisterControlChangeNotify(This,pNotify)
#define IAudioEndpointVolumeEx_GetChannelCount(This,pnChannelCount) (This)->lpVtbl->GetChannelCount(This,pnChannelCount)
#define IAudioEndpointVolumeEx_SetMasterVolumeLevel(This,fLevelDB,pguidEventContext) (This)->lpVtbl->SetMasterVolumeLevel(This,fLevelDB,pguidEventContext)
#define IAudioEndpointVolumeEx_SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext) (This)->lpVtbl->SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext)
#define IAudioEndpointVolumeEx_GetMasterVolumeLevel(This,fLevelDB) (This)->lpVtbl->GetMasterVolumeLevel(This,fLevelDB)
#define IAudioEndpointVolumeEx_GetMasterVolumeLevelScalar(This,fLevel) (This)->lpVtbl->GetMasterVolumeLevelScalar(This,fLevel)
#define IAudioEndpointVolumeEx_SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext) (This)->lpVtbl->SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext)
#define IAudioEndpointVolumeEx_SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext) (This)->lpVtbl->SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext)
#define IAudioEndpointVolumeEx_GetChannelVolumeLevel(This,nChannel,fLevelDB) (This)->lpVtbl->GetChannelVolumeLevel(This,nChannel,fLevelDB)
#define IAudioEndpointVolumeEx_GetChannelVolumeLevelScalar(This,nChannel,fLevel) (This)->lpVtbl->GetChannelVolumeLevelScalar(This,nChannel,fLevel)
#define IAudioEndpointVolumeEx_SetMute(This,bMute,pguidEventContext) (This)->lpVtbl->SetMute(This,bMute,pguidEventContext)
#define IAudioEndpointVolumeEx_GetMute(This,bMute) (This)->lpVtbl->GetMute(This,bMute)
#define IAudioEndpointVolumeEx_GetVolumeStepInfo(This,pnStep,pnStepCount) (This)->lpVtbl->GetVolumeStepInfo(This,pnStep,pnStepCount)
#define IAudioEndpointVolumeEx_VolumeStepUp(This,pguidEventContext) (This)->lpVtbl->VolumeStepUp(This,pguidEventContext)
#define IAudioEndpointVolumeEx_VolumeStepDown(This,pguidEventContext) (This)->lpVtbl->VolumeStepDown(This,pguidEventContext)
#define IAudioEndpointVolumeEx_QueryHardwareSupport(This,pdwHardwareSupportMask) (This)->lpVtbl->QueryHardwareSupport(This,pdwHardwareSupportMask)
#define IAudioEndpointVolumeEx_GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB) (This)->lpVtbl->GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB)
/*** IAudioEndpointVolumeEx methods ***/
#define IAudioEndpointVolumeEx_GetVolumeRangeChannel(This,iChannel,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB) (This)->lpVtbl->GetVolumeRangeChannel(This,iChannel,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB)
#else
/*** IUnknown methods ***/
static inline HRESULT IAudioEndpointVolumeEx_QueryInterface(IAudioEndpointVolumeEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioEndpointVolumeEx_AddRef(IAudioEndpointVolumeEx* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioEndpointVolumeEx_Release(IAudioEndpointVolumeEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioEndpointVolume methods ***/
static inline HRESULT IAudioEndpointVolumeEx_RegisterControlChangeNotify(IAudioEndpointVolumeEx* This,IAudioEndpointVolumeCallback *pNotify) {
    return This->lpVtbl->RegisterControlChangeNotify(This,pNotify);
}
static inline HRESULT IAudioEndpointVolumeEx_UnregisterControlChangeNotify(IAudioEndpointVolumeEx* This,IAudioEndpointVolumeCallback *pNotify) {
    return This->lpVtbl->UnregisterControlChangeNotify(This,pNotify);
}
static inline HRESULT IAudioEndpointVolumeEx_GetChannelCount(IAudioEndpointVolumeEx* This,UINT *pnChannelCount) {
    return This->lpVtbl->GetChannelCount(This,pnChannelCount);
}
static inline HRESULT IAudioEndpointVolumeEx_SetMasterVolumeLevel(IAudioEndpointVolumeEx* This,FLOAT fLevelDB,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetMasterVolumeLevel(This,fLevelDB,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_SetMasterVolumeLevelScalar(IAudioEndpointVolumeEx* This,FLOAT fLevel,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetMasterVolumeLevelScalar(This,fLevel,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_GetMasterVolumeLevel(IAudioEndpointVolumeEx* This,FLOAT *fLevelDB) {
    return This->lpVtbl->GetMasterVolumeLevel(This,fLevelDB);
}
static inline HRESULT IAudioEndpointVolumeEx_GetMasterVolumeLevelScalar(IAudioEndpointVolumeEx* This,FLOAT *fLevel) {
    return This->lpVtbl->GetMasterVolumeLevelScalar(This,fLevel);
}
static inline HRESULT IAudioEndpointVolumeEx_SetChannelVolumeLevel(IAudioEndpointVolumeEx* This,UINT nChannel,FLOAT fLevelDB,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetChannelVolumeLevel(This,nChannel,fLevelDB,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_SetChannelVolumeLevelScalar(IAudioEndpointVolumeEx* This,UINT nChannel,FLOAT fLevel,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetChannelVolumeLevelScalar(This,nChannel,fLevel,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_GetChannelVolumeLevel(IAudioEndpointVolumeEx* This,UINT nChannel,FLOAT *fLevelDB) {
    return This->lpVtbl->GetChannelVolumeLevel(This,nChannel,fLevelDB);
}
static inline HRESULT IAudioEndpointVolumeEx_GetChannelVolumeLevelScalar(IAudioEndpointVolumeEx* This,UINT nChannel,FLOAT *fLevel) {
    return This->lpVtbl->GetChannelVolumeLevelScalar(This,nChannel,fLevel);
}
static inline HRESULT IAudioEndpointVolumeEx_SetMute(IAudioEndpointVolumeEx* This,WINBOOL bMute,LPCGUID pguidEventContext) {
    return This->lpVtbl->SetMute(This,bMute,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_GetMute(IAudioEndpointVolumeEx* This,WINBOOL *bMute) {
    return This->lpVtbl->GetMute(This,bMute);
}
static inline HRESULT IAudioEndpointVolumeEx_GetVolumeStepInfo(IAudioEndpointVolumeEx* This,UINT *pnStep,UINT *pnStepCount) {
    return This->lpVtbl->GetVolumeStepInfo(This,pnStep,pnStepCount);
}
static inline HRESULT IAudioEndpointVolumeEx_VolumeStepUp(IAudioEndpointVolumeEx* This,LPCGUID pguidEventContext) {
    return This->lpVtbl->VolumeStepUp(This,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_VolumeStepDown(IAudioEndpointVolumeEx* This,LPCGUID pguidEventContext) {
    return This->lpVtbl->VolumeStepDown(This,pguidEventContext);
}
static inline HRESULT IAudioEndpointVolumeEx_QueryHardwareSupport(IAudioEndpointVolumeEx* This,DWORD *pdwHardwareSupportMask) {
    return This->lpVtbl->QueryHardwareSupport(This,pdwHardwareSupportMask);
}
static inline HRESULT IAudioEndpointVolumeEx_GetVolumeRange(IAudioEndpointVolumeEx* This,FLOAT *pflVolumeMindB,FLOAT *pflVolumeMaxdB,FLOAT *pflVolumeIncrementdB) {
    return This->lpVtbl->GetVolumeRange(This,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB);
}
/*** IAudioEndpointVolumeEx methods ***/
static inline HRESULT IAudioEndpointVolumeEx_GetVolumeRangeChannel(IAudioEndpointVolumeEx* This,UINT iChannel,FLOAT *pflVolumeMindB,FLOAT *pflVolumeMaxdB,FLOAT *pflVolumeIncrementdB) {
    return This->lpVtbl->GetVolumeRangeChannel(This,iChannel,pflVolumeMindB,pflVolumeMaxdB,pflVolumeIncrementdB);
}
#endif
#endif

#endif


#endif  /* __IAudioEndpointVolumeEx_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __endpointvolume_h__ */
