/*** Autogenerated by WIDL 6.3 from include/audiopolicy.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 __audiopolicy_h__
#define __audiopolicy_h__

/* Forward declarations */

#ifndef __IAudioSessionEvents_FWD_DEFINED__
#define __IAudioSessionEvents_FWD_DEFINED__
typedef interface IAudioSessionEvents IAudioSessionEvents;
#ifdef __cplusplus
interface IAudioSessionEvents;
#endif /* __cplusplus */
#endif

#ifndef __IAudioSessionControl_FWD_DEFINED__
#define __IAudioSessionControl_FWD_DEFINED__
typedef interface IAudioSessionControl IAudioSessionControl;
#ifdef __cplusplus
interface IAudioSessionControl;
#endif /* __cplusplus */
#endif

#ifndef __IAudioSessionControl2_FWD_DEFINED__
#define __IAudioSessionControl2_FWD_DEFINED__
typedef interface IAudioSessionControl2 IAudioSessionControl2;
#ifdef __cplusplus
interface IAudioSessionControl2;
#endif /* __cplusplus */
#endif

#ifndef __IAudioSessionManager_FWD_DEFINED__
#define __IAudioSessionManager_FWD_DEFINED__
typedef interface IAudioSessionManager IAudioSessionManager;
#ifdef __cplusplus
interface IAudioSessionManager;
#endif /* __cplusplus */
#endif

#ifndef __IAudioVolumeDuckNotification_FWD_DEFINED__
#define __IAudioVolumeDuckNotification_FWD_DEFINED__
typedef interface IAudioVolumeDuckNotification IAudioVolumeDuckNotification;
#ifdef __cplusplus
interface IAudioVolumeDuckNotification;
#endif /* __cplusplus */
#endif

#ifndef __IAudioSessionNotification_FWD_DEFINED__
#define __IAudioSessionNotification_FWD_DEFINED__
typedef interface IAudioSessionNotification IAudioSessionNotification;
#ifdef __cplusplus
interface IAudioSessionNotification;
#endif /* __cplusplus */
#endif

#ifndef __IAudioSessionEnumerator_FWD_DEFINED__
#define __IAudioSessionEnumerator_FWD_DEFINED__
typedef interface IAudioSessionEnumerator IAudioSessionEnumerator;
#ifdef __cplusplus
interface IAudioSessionEnumerator;
#endif /* __cplusplus */
#endif

#ifndef __IAudioSessionManager2_FWD_DEFINED__
#define __IAudioSessionManager2_FWD_DEFINED__
typedef interface IAudioSessionManager2 IAudioSessionManager2;
#ifdef __cplusplus
interface IAudioSessionManager2;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <propidl.h>
#include <audiosessiontypes.h>
#include <audioclient.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>


#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
typedef enum AudioSessionDisconnectReason {
    DisconnectReasonDeviceRemoval = 0,
    DisconnectReasonServerShutdown = 1,
    DisconnectReasonFormatChanged = 2,
    DisconnectReasonSessionLogoff = 3,
    DisconnectReasonSessionDisconnected = 4,
    DisconnectReasonExclusiveModeOverride = 5
} AudioSessionDisconnectReason;

/*****************************************************************************
 * IAudioSessionEvents interface
 */
#ifndef __IAudioSessionEvents_INTERFACE_DEFINED__
#define __IAudioSessionEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionEvents, 0x24918acc, 0x64b3, 0x37c1, 0x8c,0xa9, 0x74,0xa6,0x6e,0x99,0x57,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24918acc-64b3-37c1-8ca9-74a66e9957a8")
IAudioSessionEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDisplayNameChanged(
        LPCWSTR NewDisplayName,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnIconPathChanged(
        LPCWSTR NewIconPath,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSimpleVolumeChanged(
        float NewVolume,
        WINBOOL NewMute,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnChannelVolumeChanged(
        DWORD ChannelCount,
        float NewChannelVolumeArray[],
        DWORD ChangedChannel,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnGroupingParamChanged(
        LPCGUID NewGroupingParam,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStateChanged(
        AudioSessionState NewState) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnSessionDisconnected(
        AudioSessionDisconnectReason DisconnectReason) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionEvents, 0x24918acc, 0x64b3, 0x37c1, 0x8c,0xa9, 0x74,0xa6,0x6e,0x99,0x57,0xa8)
#endif
#else
typedef struct IAudioSessionEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDisplayNameChanged)(
        IAudioSessionEvents *This,
        LPCWSTR NewDisplayName,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *OnIconPathChanged)(
        IAudioSessionEvents *This,
        LPCWSTR NewIconPath,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *OnSimpleVolumeChanged)(
        IAudioSessionEvents *This,
        float NewVolume,
        WINBOOL NewMute,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *OnChannelVolumeChanged)(
        IAudioSessionEvents *This,
        DWORD ChannelCount,
        float NewChannelVolumeArray[],
        DWORD ChangedChannel,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *OnGroupingParamChanged)(
        IAudioSessionEvents *This,
        LPCGUID NewGroupingParam,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *OnStateChanged)(
        IAudioSessionEvents *This,
        AudioSessionState NewState);

    HRESULT (STDMETHODCALLTYPE *OnSessionDisconnected)(
        IAudioSessionEvents *This,
        AudioSessionDisconnectReason DisconnectReason);

    END_INTERFACE
} IAudioSessionEventsVtbl;

interface IAudioSessionEvents {
    CONST_VTBL IAudioSessionEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionEvents methods ***/
#define IAudioSessionEvents_OnDisplayNameChanged(This,NewDisplayName,EventContext) (This)->lpVtbl->OnDisplayNameChanged(This,NewDisplayName,EventContext)
#define IAudioSessionEvents_OnIconPathChanged(This,NewIconPath,EventContext) (This)->lpVtbl->OnIconPathChanged(This,NewIconPath,EventContext)
#define IAudioSessionEvents_OnSimpleVolumeChanged(This,NewVolume,NewMute,EventContext) (This)->lpVtbl->OnSimpleVolumeChanged(This,NewVolume,NewMute,EventContext)
#define IAudioSessionEvents_OnChannelVolumeChanged(This,ChannelCount,NewChannelVolumeArray,ChangedChannel,EventContext) (This)->lpVtbl->OnChannelVolumeChanged(This,ChannelCount,NewChannelVolumeArray,ChangedChannel,EventContext)
#define IAudioSessionEvents_OnGroupingParamChanged(This,NewGroupingParam,EventContext) (This)->lpVtbl->OnGroupingParamChanged(This,NewGroupingParam,EventContext)
#define IAudioSessionEvents_OnStateChanged(This,NewState) (This)->lpVtbl->OnStateChanged(This,NewState)
#define IAudioSessionEvents_OnSessionDisconnected(This,DisconnectReason) (This)->lpVtbl->OnSessionDisconnected(This,DisconnectReason)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionEvents_QueryInterface(IAudioSessionEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionEvents_AddRef(IAudioSessionEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionEvents_Release(IAudioSessionEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionEvents methods ***/
static FORCEINLINE HRESULT IAudioSessionEvents_OnDisplayNameChanged(IAudioSessionEvents* This,LPCWSTR NewDisplayName,LPCGUID EventContext) {
    return This->lpVtbl->OnDisplayNameChanged(This,NewDisplayName,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionEvents_OnIconPathChanged(IAudioSessionEvents* This,LPCWSTR NewIconPath,LPCGUID EventContext) {
    return This->lpVtbl->OnIconPathChanged(This,NewIconPath,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionEvents_OnSimpleVolumeChanged(IAudioSessionEvents* This,float NewVolume,WINBOOL NewMute,LPCGUID EventContext) {
    return This->lpVtbl->OnSimpleVolumeChanged(This,NewVolume,NewMute,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionEvents_OnChannelVolumeChanged(IAudioSessionEvents* This,DWORD ChannelCount,float NewChannelVolumeArray[],DWORD ChangedChannel,LPCGUID EventContext) {
    return This->lpVtbl->OnChannelVolumeChanged(This,ChannelCount,NewChannelVolumeArray,ChangedChannel,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionEvents_OnGroupingParamChanged(IAudioSessionEvents* This,LPCGUID NewGroupingParam,LPCGUID EventContext) {
    return This->lpVtbl->OnGroupingParamChanged(This,NewGroupingParam,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionEvents_OnStateChanged(IAudioSessionEvents* This,AudioSessionState NewState) {
    return This->lpVtbl->OnStateChanged(This,NewState);
}
static FORCEINLINE HRESULT IAudioSessionEvents_OnSessionDisconnected(IAudioSessionEvents* This,AudioSessionDisconnectReason DisconnectReason) {
    return This->lpVtbl->OnSessionDisconnected(This,DisconnectReason);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionEvents_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAudioSessionControl interface
 */
#ifndef __IAudioSessionControl_INTERFACE_DEFINED__
#define __IAudioSessionControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionControl, 0xf4b1a599, 0x7266, 0x4319, 0xa8,0xca, 0xe7,0x0a,0xcb,0x11,0xe8,0xcd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f4b1a599-7266-4319-a8ca-e70acb11e8cd")
IAudioSessionControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetState(
        AudioSessionState *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
        LPWSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDisplayName(
        LPCWSTR Value,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIconPath(
        LPWSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIconPath(
        LPCWSTR Value,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupingParam(
        GUID *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGroupingParam(
        LPCGUID Override,
        LPCGUID EventContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterAudioSessionNotification(
        IAudioSessionEvents *NewNotifications) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterAudioSessionNotification(
        IAudioSessionEvents *NewNotifications) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionControl, 0xf4b1a599, 0x7266, 0x4319, 0xa8,0xca, 0xe7,0x0a,0xcb,0x11,0xe8,0xcd)
#endif
#else
typedef struct IAudioSessionControlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetState)(
        IAudioSessionControl *This,
        AudioSessionState *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        IAudioSessionControl *This,
        LPWSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetDisplayName)(
        IAudioSessionControl *This,
        LPCWSTR Value,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *GetIconPath)(
        IAudioSessionControl *This,
        LPWSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetIconPath)(
        IAudioSessionControl *This,
        LPCWSTR Value,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *GetGroupingParam)(
        IAudioSessionControl *This,
        GUID *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetGroupingParam)(
        IAudioSessionControl *This,
        LPCGUID Override,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *RegisterAudioSessionNotification)(
        IAudioSessionControl *This,
        IAudioSessionEvents *NewNotifications);

    HRESULT (STDMETHODCALLTYPE *UnregisterAudioSessionNotification)(
        IAudioSessionControl *This,
        IAudioSessionEvents *NewNotifications);

    END_INTERFACE
} IAudioSessionControlVtbl;

interface IAudioSessionControl {
    CONST_VTBL IAudioSessionControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionControl_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionControl methods ***/
#define IAudioSessionControl_GetState(This,pRetVal) (This)->lpVtbl->GetState(This,pRetVal)
#define IAudioSessionControl_GetDisplayName(This,pRetVal) (This)->lpVtbl->GetDisplayName(This,pRetVal)
#define IAudioSessionControl_SetDisplayName(This,Value,EventContext) (This)->lpVtbl->SetDisplayName(This,Value,EventContext)
#define IAudioSessionControl_GetIconPath(This,pRetVal) (This)->lpVtbl->GetIconPath(This,pRetVal)
#define IAudioSessionControl_SetIconPath(This,Value,EventContext) (This)->lpVtbl->SetIconPath(This,Value,EventContext)
#define IAudioSessionControl_GetGroupingParam(This,pRetVal) (This)->lpVtbl->GetGroupingParam(This,pRetVal)
#define IAudioSessionControl_SetGroupingParam(This,Override,EventContext) (This)->lpVtbl->SetGroupingParam(This,Override,EventContext)
#define IAudioSessionControl_RegisterAudioSessionNotification(This,NewNotifications) (This)->lpVtbl->RegisterAudioSessionNotification(This,NewNotifications)
#define IAudioSessionControl_UnregisterAudioSessionNotification(This,NewNotifications) (This)->lpVtbl->UnregisterAudioSessionNotification(This,NewNotifications)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionControl_QueryInterface(IAudioSessionControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionControl_AddRef(IAudioSessionControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionControl_Release(IAudioSessionControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionControl methods ***/
static FORCEINLINE HRESULT IAudioSessionControl_GetState(IAudioSessionControl* This,AudioSessionState *pRetVal) {
    return This->lpVtbl->GetState(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl_GetDisplayName(IAudioSessionControl* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetDisplayName(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl_SetDisplayName(IAudioSessionControl* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetDisplayName(This,Value,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionControl_GetIconPath(IAudioSessionControl* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetIconPath(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl_SetIconPath(IAudioSessionControl* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetIconPath(This,Value,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionControl_GetGroupingParam(IAudioSessionControl* This,GUID *pRetVal) {
    return This->lpVtbl->GetGroupingParam(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl_SetGroupingParam(IAudioSessionControl* This,LPCGUID Override,LPCGUID EventContext) {
    return This->lpVtbl->SetGroupingParam(This,Override,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionControl_RegisterAudioSessionNotification(IAudioSessionControl* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->RegisterAudioSessionNotification(This,NewNotifications);
}
static FORCEINLINE HRESULT IAudioSessionControl_UnregisterAudioSessionNotification(IAudioSessionControl* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->UnregisterAudioSessionNotification(This,NewNotifications);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionControl_INTERFACE_DEFINED__ */

#endif

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * IAudioSessionControl2 interface
 */
#ifndef __IAudioSessionControl2_INTERFACE_DEFINED__
#define __IAudioSessionControl2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionControl2, 0xbfb7ff88, 0x7239, 0x4fc9, 0x8f,0xa2, 0x07,0xc9,0x50,0xbe,0x9c,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d")
IAudioSessionControl2 : public IAudioSessionControl
{
    virtual HRESULT STDMETHODCALLTYPE GetSessionIdentifier(
        LPWSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSessionInstanceIdentifier(
        LPWSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProcessId(
        DWORD *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSystemSoundsSession(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDuckingPreference(
        WINBOOL optOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionControl2, 0xbfb7ff88, 0x7239, 0x4fc9, 0x8f,0xa2, 0x07,0xc9,0x50,0xbe,0x9c,0x6d)
#endif
#else
typedef struct IAudioSessionControl2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetState)(
        IAudioSessionControl2 *This,
        AudioSessionState *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        IAudioSessionControl2 *This,
        LPWSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetDisplayName)(
        IAudioSessionControl2 *This,
        LPCWSTR Value,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *GetIconPath)(
        IAudioSessionControl2 *This,
        LPWSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetIconPath)(
        IAudioSessionControl2 *This,
        LPCWSTR Value,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *GetGroupingParam)(
        IAudioSessionControl2 *This,
        GUID *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetGroupingParam)(
        IAudioSessionControl2 *This,
        LPCGUID Override,
        LPCGUID EventContext);

    HRESULT (STDMETHODCALLTYPE *RegisterAudioSessionNotification)(
        IAudioSessionControl2 *This,
        IAudioSessionEvents *NewNotifications);

    HRESULT (STDMETHODCALLTYPE *UnregisterAudioSessionNotification)(
        IAudioSessionControl2 *This,
        IAudioSessionEvents *NewNotifications);

    /*** IAudioSessionControl2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSessionIdentifier)(
        IAudioSessionControl2 *This,
        LPWSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetSessionInstanceIdentifier)(
        IAudioSessionControl2 *This,
        LPWSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetProcessId)(
        IAudioSessionControl2 *This,
        DWORD *pRetVal);

    HRESULT (STDMETHODCALLTYPE *IsSystemSoundsSession)(
        IAudioSessionControl2 *This);

    HRESULT (STDMETHODCALLTYPE *SetDuckingPreference)(
        IAudioSessionControl2 *This,
        WINBOOL optOut);

    END_INTERFACE
} IAudioSessionControl2Vtbl;

interface IAudioSessionControl2 {
    CONST_VTBL IAudioSessionControl2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionControl2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionControl2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionControl2_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionControl methods ***/
#define IAudioSessionControl2_GetState(This,pRetVal) (This)->lpVtbl->GetState(This,pRetVal)
#define IAudioSessionControl2_GetDisplayName(This,pRetVal) (This)->lpVtbl->GetDisplayName(This,pRetVal)
#define IAudioSessionControl2_SetDisplayName(This,Value,EventContext) (This)->lpVtbl->SetDisplayName(This,Value,EventContext)
#define IAudioSessionControl2_GetIconPath(This,pRetVal) (This)->lpVtbl->GetIconPath(This,pRetVal)
#define IAudioSessionControl2_SetIconPath(This,Value,EventContext) (This)->lpVtbl->SetIconPath(This,Value,EventContext)
#define IAudioSessionControl2_GetGroupingParam(This,pRetVal) (This)->lpVtbl->GetGroupingParam(This,pRetVal)
#define IAudioSessionControl2_SetGroupingParam(This,Override,EventContext) (This)->lpVtbl->SetGroupingParam(This,Override,EventContext)
#define IAudioSessionControl2_RegisterAudioSessionNotification(This,NewNotifications) (This)->lpVtbl->RegisterAudioSessionNotification(This,NewNotifications)
#define IAudioSessionControl2_UnregisterAudioSessionNotification(This,NewNotifications) (This)->lpVtbl->UnregisterAudioSessionNotification(This,NewNotifications)
/*** IAudioSessionControl2 methods ***/
#define IAudioSessionControl2_GetSessionIdentifier(This,pRetVal) (This)->lpVtbl->GetSessionIdentifier(This,pRetVal)
#define IAudioSessionControl2_GetSessionInstanceIdentifier(This,pRetVal) (This)->lpVtbl->GetSessionInstanceIdentifier(This,pRetVal)
#define IAudioSessionControl2_GetProcessId(This,pRetVal) (This)->lpVtbl->GetProcessId(This,pRetVal)
#define IAudioSessionControl2_IsSystemSoundsSession(This) (This)->lpVtbl->IsSystemSoundsSession(This)
#define IAudioSessionControl2_SetDuckingPreference(This,optOut) (This)->lpVtbl->SetDuckingPreference(This,optOut)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionControl2_QueryInterface(IAudioSessionControl2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionControl2_AddRef(IAudioSessionControl2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionControl2_Release(IAudioSessionControl2* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionControl methods ***/
static FORCEINLINE HRESULT IAudioSessionControl2_GetState(IAudioSessionControl2* This,AudioSessionState *pRetVal) {
    return This->lpVtbl->GetState(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_GetDisplayName(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetDisplayName(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_SetDisplayName(IAudioSessionControl2* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetDisplayName(This,Value,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionControl2_GetIconPath(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetIconPath(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_SetIconPath(IAudioSessionControl2* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetIconPath(This,Value,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionControl2_GetGroupingParam(IAudioSessionControl2* This,GUID *pRetVal) {
    return This->lpVtbl->GetGroupingParam(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_SetGroupingParam(IAudioSessionControl2* This,LPCGUID Override,LPCGUID EventContext) {
    return This->lpVtbl->SetGroupingParam(This,Override,EventContext);
}
static FORCEINLINE HRESULT IAudioSessionControl2_RegisterAudioSessionNotification(IAudioSessionControl2* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->RegisterAudioSessionNotification(This,NewNotifications);
}
static FORCEINLINE HRESULT IAudioSessionControl2_UnregisterAudioSessionNotification(IAudioSessionControl2* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->UnregisterAudioSessionNotification(This,NewNotifications);
}
/*** IAudioSessionControl2 methods ***/
static FORCEINLINE HRESULT IAudioSessionControl2_GetSessionIdentifier(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetSessionIdentifier(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_GetSessionInstanceIdentifier(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetSessionInstanceIdentifier(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_GetProcessId(IAudioSessionControl2* This,DWORD *pRetVal) {
    return This->lpVtbl->GetProcessId(This,pRetVal);
}
static FORCEINLINE HRESULT IAudioSessionControl2_IsSystemSoundsSession(IAudioSessionControl2* This) {
    return This->lpVtbl->IsSystemSoundsSession(This);
}
static FORCEINLINE HRESULT IAudioSessionControl2_SetDuckingPreference(IAudioSessionControl2* This,WINBOOL optOut) {
    return This->lpVtbl->SetDuckingPreference(This,optOut);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionControl2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAudioSessionManager interface
 */
#ifndef __IAudioSessionManager_INTERFACE_DEFINED__
#define __IAudioSessionManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionManager, 0xbfa971f1, 0x4d5e, 0x40bb, 0x93,0x5e, 0x96,0x70,0x39,0xbf,0xbe,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bfa971f1-4d5e-40bb-935e-967039bfbee4")
IAudioSessionManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAudioSessionControl(
        LPCGUID AudioSessionGuid,
        DWORD StreamFlags,
        IAudioSessionControl **SessionControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSimpleAudioVolume(
        LPCGUID AudioSessionGuid,
        DWORD StreamFlags,
        ISimpleAudioVolume **AudioVolume) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionManager, 0xbfa971f1, 0x4d5e, 0x40bb, 0x93,0x5e, 0x96,0x70,0x39,0xbf,0xbe,0xe4)
#endif
#else
typedef struct IAudioSessionManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionManager methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAudioSessionControl)(
        IAudioSessionManager *This,
        LPCGUID AudioSessionGuid,
        DWORD StreamFlags,
        IAudioSessionControl **SessionControl);

    HRESULT (STDMETHODCALLTYPE *GetSimpleAudioVolume)(
        IAudioSessionManager *This,
        LPCGUID AudioSessionGuid,
        DWORD StreamFlags,
        ISimpleAudioVolume **AudioVolume);

    END_INTERFACE
} IAudioSessionManagerVtbl;

interface IAudioSessionManager {
    CONST_VTBL IAudioSessionManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionManager_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionManager methods ***/
#define IAudioSessionManager_GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl) (This)->lpVtbl->GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl)
#define IAudioSessionManager_GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume) (This)->lpVtbl->GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionManager_QueryInterface(IAudioSessionManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionManager_AddRef(IAudioSessionManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionManager_Release(IAudioSessionManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionManager methods ***/
static FORCEINLINE HRESULT IAudioSessionManager_GetAudioSessionControl(IAudioSessionManager* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,IAudioSessionControl **SessionControl) {
    return This->lpVtbl->GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl);
}
static FORCEINLINE HRESULT IAudioSessionManager_GetSimpleAudioVolume(IAudioSessionManager* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,ISimpleAudioVolume **AudioVolume) {
    return This->lpVtbl->GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionManager_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAudioVolumeDuckNotification interface
 */
#ifndef __IAudioVolumeDuckNotification_INTERFACE_DEFINED__
#define __IAudioVolumeDuckNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioVolumeDuckNotification, 0xc3b284d4, 0x6d39, 0x4359, 0xb3,0xcf, 0xb5,0x6d,0xdb,0x3b,0xb3,0x9c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c3b284d4-6d39-4359-b3cf-b56ddb3bb39c")
IAudioVolumeDuckNotification : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnVolumeDuckNotification(
        LPCWSTR sessionID,
        UINT32 countCommunicationSessions) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnVolumeUnduckNotification(
        LPCWSTR sessionID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioVolumeDuckNotification, 0xc3b284d4, 0x6d39, 0x4359, 0xb3,0xcf, 0xb5,0x6d,0xdb,0x3b,0xb3,0x9c)
#endif
#else
typedef struct IAudioVolumeDuckNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioVolumeDuckNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *OnVolumeDuckNotification)(
        IAudioVolumeDuckNotification *This,
        LPCWSTR sessionID,
        UINT32 countCommunicationSessions);

    HRESULT (STDMETHODCALLTYPE *OnVolumeUnduckNotification)(
        IAudioVolumeDuckNotification *This,
        LPCWSTR sessionID);

    END_INTERFACE
} IAudioVolumeDuckNotificationVtbl;

interface IAudioVolumeDuckNotification {
    CONST_VTBL IAudioVolumeDuckNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioVolumeDuckNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioVolumeDuckNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioVolumeDuckNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioVolumeDuckNotification methods ***/
#define IAudioVolumeDuckNotification_OnVolumeDuckNotification(This,sessionID,countCommunicationSessions) (This)->lpVtbl->OnVolumeDuckNotification(This,sessionID,countCommunicationSessions)
#define IAudioVolumeDuckNotification_OnVolumeUnduckNotification(This,sessionID) (This)->lpVtbl->OnVolumeUnduckNotification(This,sessionID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioVolumeDuckNotification_QueryInterface(IAudioVolumeDuckNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioVolumeDuckNotification_AddRef(IAudioVolumeDuckNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioVolumeDuckNotification_Release(IAudioVolumeDuckNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioVolumeDuckNotification methods ***/
static FORCEINLINE HRESULT IAudioVolumeDuckNotification_OnVolumeDuckNotification(IAudioVolumeDuckNotification* This,LPCWSTR sessionID,UINT32 countCommunicationSessions) {
    return This->lpVtbl->OnVolumeDuckNotification(This,sessionID,countCommunicationSessions);
}
static FORCEINLINE HRESULT IAudioVolumeDuckNotification_OnVolumeUnduckNotification(IAudioVolumeDuckNotification* This,LPCWSTR sessionID) {
    return This->lpVtbl->OnVolumeUnduckNotification(This,sessionID);
}
#endif
#endif

#endif


#endif  /* __IAudioVolumeDuckNotification_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAudioSessionNotification interface
 */
#ifndef __IAudioSessionNotification_INTERFACE_DEFINED__
#define __IAudioSessionNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionNotification, 0x641dd20b, 0x4d41, 0x49cc, 0xab,0xa3, 0x17,0x4b,0x94,0x77,0xbb,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("641dd20b-4d41-49cc-aba3-174b9477bb08")
IAudioSessionNotification : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnSessionCreated(
        IAudioSessionControl *NewSession) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionNotification, 0x641dd20b, 0x4d41, 0x49cc, 0xab,0xa3, 0x17,0x4b,0x94,0x77,0xbb,0x08)
#endif
#else
typedef struct IAudioSessionNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSessionCreated)(
        IAudioSessionNotification *This,
        IAudioSessionControl *NewSession);

    END_INTERFACE
} IAudioSessionNotificationVtbl;

interface IAudioSessionNotification {
    CONST_VTBL IAudioSessionNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionNotification methods ***/
#define IAudioSessionNotification_OnSessionCreated(This,NewSession) (This)->lpVtbl->OnSessionCreated(This,NewSession)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionNotification_QueryInterface(IAudioSessionNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionNotification_AddRef(IAudioSessionNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionNotification_Release(IAudioSessionNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionNotification methods ***/
static FORCEINLINE HRESULT IAudioSessionNotification_OnSessionCreated(IAudioSessionNotification* This,IAudioSessionControl *NewSession) {
    return This->lpVtbl->OnSessionCreated(This,NewSession);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionNotification_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAudioSessionEnumerator interface
 */
#ifndef __IAudioSessionEnumerator_INTERFACE_DEFINED__
#define __IAudioSessionEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionEnumerator, 0xe2f5bb11, 0x0570, 0x40ca, 0xac,0xdd, 0x3a,0xa0,0x12,0x77,0xde,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e2f5bb11-0570-40ca-acdd-3aa01277dee8")
IAudioSessionEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        int *SessionCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSession(
        int SessionCount,
        IAudioSessionControl **Session) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionEnumerator, 0xe2f5bb11, 0x0570, 0x40ca, 0xac,0xdd, 0x3a,0xa0,0x12,0x77,0xde,0xe8)
#endif
#else
typedef struct IAudioSessionEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IAudioSessionEnumerator *This,
        int *SessionCount);

    HRESULT (STDMETHODCALLTYPE *GetSession)(
        IAudioSessionEnumerator *This,
        int SessionCount,
        IAudioSessionControl **Session);

    END_INTERFACE
} IAudioSessionEnumeratorVtbl;

interface IAudioSessionEnumerator {
    CONST_VTBL IAudioSessionEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionEnumerator methods ***/
#define IAudioSessionEnumerator_GetCount(This,SessionCount) (This)->lpVtbl->GetCount(This,SessionCount)
#define IAudioSessionEnumerator_GetSession(This,SessionCount,Session) (This)->lpVtbl->GetSession(This,SessionCount,Session)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionEnumerator_QueryInterface(IAudioSessionEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionEnumerator_AddRef(IAudioSessionEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionEnumerator_Release(IAudioSessionEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionEnumerator methods ***/
static FORCEINLINE HRESULT IAudioSessionEnumerator_GetCount(IAudioSessionEnumerator* This,int *SessionCount) {
    return This->lpVtbl->GetCount(This,SessionCount);
}
static FORCEINLINE HRESULT IAudioSessionEnumerator_GetSession(IAudioSessionEnumerator* This,int SessionCount,IAudioSessionControl **Session) {
    return This->lpVtbl->GetSession(This,SessionCount,Session);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionEnumerator_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IAudioSessionManager2 interface
 */
#ifndef __IAudioSessionManager2_INTERFACE_DEFINED__
#define __IAudioSessionManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAudioSessionManager2, 0x77aa99a0, 0x1bd6, 0x484f, 0x8b,0xc7, 0x2c,0x65,0x4c,0x9a,0x9b,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("77aa99a0-1bd6-484f-8bc7-2c654c9a9b6f")
IAudioSessionManager2 : public IAudioSessionManager
{
    virtual HRESULT STDMETHODCALLTYPE GetSessionEnumerator(
        IAudioSessionEnumerator **SessionEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterSessionNotification(
        IAudioSessionNotification *SessionNotification) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterSessionNotification(
        IAudioSessionNotification *SessionNotification) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterDuckNotification(
        LPCWSTR sessionID,
        IAudioVolumeDuckNotification *duckNotification) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterDuckNotification(
        IAudioVolumeDuckNotification *duckNotification) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAudioSessionManager2, 0x77aa99a0, 0x1bd6, 0x484f, 0x8b,0xc7, 0x2c,0x65,0x4c,0x9a,0x9b,0x6f)
#endif
#else
typedef struct IAudioSessionManager2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAudioSessionManager methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAudioSessionControl)(
        IAudioSessionManager2 *This,
        LPCGUID AudioSessionGuid,
        DWORD StreamFlags,
        IAudioSessionControl **SessionControl);

    HRESULT (STDMETHODCALLTYPE *GetSimpleAudioVolume)(
        IAudioSessionManager2 *This,
        LPCGUID AudioSessionGuid,
        DWORD StreamFlags,
        ISimpleAudioVolume **AudioVolume);

    /*** IAudioSessionManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSessionEnumerator)(
        IAudioSessionManager2 *This,
        IAudioSessionEnumerator **SessionEnum);

    HRESULT (STDMETHODCALLTYPE *RegisterSessionNotification)(
        IAudioSessionManager2 *This,
        IAudioSessionNotification *SessionNotification);

    HRESULT (STDMETHODCALLTYPE *UnregisterSessionNotification)(
        IAudioSessionManager2 *This,
        IAudioSessionNotification *SessionNotification);

    HRESULT (STDMETHODCALLTYPE *RegisterDuckNotification)(
        IAudioSessionManager2 *This,
        LPCWSTR sessionID,
        IAudioVolumeDuckNotification *duckNotification);

    HRESULT (STDMETHODCALLTYPE *UnregisterDuckNotification)(
        IAudioSessionManager2 *This,
        IAudioVolumeDuckNotification *duckNotification);

    END_INTERFACE
} IAudioSessionManager2Vtbl;

interface IAudioSessionManager2 {
    CONST_VTBL IAudioSessionManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAudioSessionManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAudioSessionManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAudioSessionManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IAudioSessionManager methods ***/
#define IAudioSessionManager2_GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl) (This)->lpVtbl->GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl)
#define IAudioSessionManager2_GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume) (This)->lpVtbl->GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume)
/*** IAudioSessionManager2 methods ***/
#define IAudioSessionManager2_GetSessionEnumerator(This,SessionEnum) (This)->lpVtbl->GetSessionEnumerator(This,SessionEnum)
#define IAudioSessionManager2_RegisterSessionNotification(This,SessionNotification) (This)->lpVtbl->RegisterSessionNotification(This,SessionNotification)
#define IAudioSessionManager2_UnregisterSessionNotification(This,SessionNotification) (This)->lpVtbl->UnregisterSessionNotification(This,SessionNotification)
#define IAudioSessionManager2_RegisterDuckNotification(This,sessionID,duckNotification) (This)->lpVtbl->RegisterDuckNotification(This,sessionID,duckNotification)
#define IAudioSessionManager2_UnregisterDuckNotification(This,duckNotification) (This)->lpVtbl->UnregisterDuckNotification(This,duckNotification)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAudioSessionManager2_QueryInterface(IAudioSessionManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAudioSessionManager2_AddRef(IAudioSessionManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAudioSessionManager2_Release(IAudioSessionManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionManager methods ***/
static FORCEINLINE HRESULT IAudioSessionManager2_GetAudioSessionControl(IAudioSessionManager2* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,IAudioSessionControl **SessionControl) {
    return This->lpVtbl->GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl);
}
static FORCEINLINE HRESULT IAudioSessionManager2_GetSimpleAudioVolume(IAudioSessionManager2* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,ISimpleAudioVolume **AudioVolume) {
    return This->lpVtbl->GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume);
}
/*** IAudioSessionManager2 methods ***/
static FORCEINLINE HRESULT IAudioSessionManager2_GetSessionEnumerator(IAudioSessionManager2* This,IAudioSessionEnumerator **SessionEnum) {
    return This->lpVtbl->GetSessionEnumerator(This,SessionEnum);
}
static FORCEINLINE HRESULT IAudioSessionManager2_RegisterSessionNotification(IAudioSessionManager2* This,IAudioSessionNotification *SessionNotification) {
    return This->lpVtbl->RegisterSessionNotification(This,SessionNotification);
}
static FORCEINLINE HRESULT IAudioSessionManager2_UnregisterSessionNotification(IAudioSessionManager2* This,IAudioSessionNotification *SessionNotification) {
    return This->lpVtbl->UnregisterSessionNotification(This,SessionNotification);
}
static FORCEINLINE HRESULT IAudioSessionManager2_RegisterDuckNotification(IAudioSessionManager2* This,LPCWSTR sessionID,IAudioVolumeDuckNotification *duckNotification) {
    return This->lpVtbl->RegisterDuckNotification(This,sessionID,duckNotification);
}
static FORCEINLINE HRESULT IAudioSessionManager2_UnregisterDuckNotification(IAudioSessionManager2* This,IAudioVolumeDuckNotification *duckNotification) {
    return This->lpVtbl->UnregisterDuckNotification(This,duckNotification);
}
#endif
#endif

#endif


#endif  /* __IAudioSessionManager2_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __audiopolicy_h__ */
