/*** Autogenerated by WIDL 1.5.29 from /tmp/build-mingw64-toolchain-joshualang/src/mingw-w64-svn-r5861/mingw-w64-headers/include/endpointvolume.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#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;
#endif

#ifndef __IAudioEndpointVolume_FWD_DEFINED__
#define __IAudioEndpointVolume_FWD_DEFINED__
typedef interface IAudioEndpointVolume IAudioEndpointVolume;
#endif

#ifndef __IAudioEndpointVolumeEx_FWD_DEFINED__
#define __IAudioEndpointVolumeEx_FWD_DEFINED__
typedef interface IAudioEndpointVolumeEx IAudioEndpointVolumeEx;
#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;
#endif

#ifndef __IAudioEndpointVolume_FWD_DEFINED__
#define __IAudioEndpointVolume_FWD_DEFINED__
typedef interface IAudioEndpointVolume IAudioEndpointVolume;
#endif

#ifndef __IAudioEndpointVolumeEx_FWD_DEFINED__
#define __IAudioEndpointVolumeEx_FWD_DEFINED__
typedef interface IAudioEndpointVolumeEx IAudioEndpointVolumeEx;
#endif

#ifndef __IAudioMeterInformation_FWD_DEFINED__
#define __IAudioMeterInformation_FWD_DEFINED__
typedef interface IAudioMeterInformation IAudioMeterInformation;
#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 FORCEINLINE HRESULT IAudioEndpointVolumeCallback_QueryInterface(IAudioEndpointVolumeCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioEndpointVolumeCallback_AddRef(IAudioEndpointVolumeCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioEndpointVolumeCallback_Release(IAudioEndpointVolumeCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioEndpointVolumeCallback methods ***/
static FORCEINLINE HRESULT IAudioEndpointVolumeCallback_OnNotify(IAudioEndpointVolumeCallback* This,AUDIO_VOLUME_NOTIFICATION_DATA *pNotify) {
    return This->lpVtbl->OnNotify(This,pNotify);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioEndpointVolumeCallback_OnNotify_Proxy(
    IAudioEndpointVolumeCallback* This,
    AUDIO_VOLUME_NOTIFICATION_DATA *pNotify);
void __RPC_STUB IAudioEndpointVolumeCallback_OnNotify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

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

#endif

HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_RegisterControlChangeNotify_Proxy(
    IAudioEndpointVolume* This,
    IAudioEndpointVolumeCallback *pNotify);
void __RPC_STUB IAudioEndpointVolume_RegisterControlChangeNotify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_UnregisterControlChangeNotify_Proxy(
    IAudioEndpointVolume* This,
    IAudioEndpointVolumeCallback *pNotify);
void __RPC_STUB IAudioEndpointVolume_UnregisterControlChangeNotify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetChannelCount_Proxy(
    IAudioEndpointVolume* This,
    UINT *pnChannelCount);
void __RPC_STUB IAudioEndpointVolume_GetChannelCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_SetMasterVolumeLevel_Proxy(
    IAudioEndpointVolume* This,
    FLOAT fLevelDB,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_SetMasterVolumeLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_SetMasterVolumeLevelScalar_Proxy(
    IAudioEndpointVolume* This,
    FLOAT fLevel,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_SetMasterVolumeLevelScalar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetMasterVolumeLevel_Proxy(
    IAudioEndpointVolume* This,
    FLOAT *fLevelDB);
void __RPC_STUB IAudioEndpointVolume_GetMasterVolumeLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetMasterVolumeLevelScalar_Proxy(
    IAudioEndpointVolume* This,
    FLOAT *fLevel);
void __RPC_STUB IAudioEndpointVolume_GetMasterVolumeLevelScalar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_SetChannelVolumeLevel_Proxy(
    IAudioEndpointVolume* This,
    UINT nChannel,
    FLOAT fLevelDB,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_SetChannelVolumeLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_SetChannelVolumeLevelScalar_Proxy(
    IAudioEndpointVolume* This,
    UINT nChannel,
    FLOAT fLevel,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_SetChannelVolumeLevelScalar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetChannelVolumeLevel_Proxy(
    IAudioEndpointVolume* This,
    UINT nChannel,
    FLOAT *fLevelDB);
void __RPC_STUB IAudioEndpointVolume_GetChannelVolumeLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetChannelVolumeLevelScalar_Proxy(
    IAudioEndpointVolume* This,
    UINT nChannel,
    FLOAT *fLevel);
void __RPC_STUB IAudioEndpointVolume_GetChannelVolumeLevelScalar_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_SetMute_Proxy(
    IAudioEndpointVolume* This,
    WINBOOL bMute,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_SetMute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetMute_Proxy(
    IAudioEndpointVolume* This,
    WINBOOL *bMute);
void __RPC_STUB IAudioEndpointVolume_GetMute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetVolumeStepInfo_Proxy(
    IAudioEndpointVolume* This,
    UINT *pnStep,
    UINT *pnStepCount);
void __RPC_STUB IAudioEndpointVolume_GetVolumeStepInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_VolumeStepUp_Proxy(
    IAudioEndpointVolume* This,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_VolumeStepUp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_VolumeStepDown_Proxy(
    IAudioEndpointVolume* This,
    LPCGUID pguidEventContext);
void __RPC_STUB IAudioEndpointVolume_VolumeStepDown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_QueryHardwareSupport_Proxy(
    IAudioEndpointVolume* This,
    DWORD *pdwHardwareSupportMask);
void __RPC_STUB IAudioEndpointVolume_QueryHardwareSupport_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioEndpointVolume_GetVolumeRange_Proxy(
    IAudioEndpointVolume* This,
    FLOAT *pflVolumeMindB,
    FLOAT *pflVolumeMaxdB,
    FLOAT *pflVolumeIncrementdB);
void __RPC_STUB IAudioEndpointVolume_GetVolumeRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

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

HRESULT STDMETHODCALLTYPE IAudioEndpointVolumeEx_GetVolumeRangeChannel_Proxy(
    IAudioEndpointVolumeEx* This,
    UINT iChannel,
    FLOAT *pflVolumeMindB,
    FLOAT *pflVolumeMaxdB,
    FLOAT *pflVolumeIncrementdB);
void __RPC_STUB IAudioEndpointVolumeEx_GetVolumeRangeChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAudioEndpointVolumeEx_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __endpointvolume_h__ */
