/*** Autogenerated by WIDL 10.4 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 inline HRESULT IAudioSessionEvents_QueryInterface(IAudioSessionEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionEvents_AddRef(IAudioSessionEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionEvents_Release(IAudioSessionEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionEvents methods ***/
static inline HRESULT IAudioSessionEvents_OnDisplayNameChanged(IAudioSessionEvents* This,LPCWSTR NewDisplayName,LPCGUID EventContext) {
    return This->lpVtbl->OnDisplayNameChanged(This,NewDisplayName,EventContext);
}
static inline HRESULT IAudioSessionEvents_OnIconPathChanged(IAudioSessionEvents* This,LPCWSTR NewIconPath,LPCGUID EventContext) {
    return This->lpVtbl->OnIconPathChanged(This,NewIconPath,EventContext);
}
static inline HRESULT IAudioSessionEvents_OnSimpleVolumeChanged(IAudioSessionEvents* This,float NewVolume,WINBOOL NewMute,LPCGUID EventContext) {
    return This->lpVtbl->OnSimpleVolumeChanged(This,NewVolume,NewMute,EventContext);
}
static inline HRESULT IAudioSessionEvents_OnChannelVolumeChanged(IAudioSessionEvents* This,DWORD ChannelCount,float NewChannelVolumeArray[],DWORD ChangedChannel,LPCGUID EventContext) {
    return This->lpVtbl->OnChannelVolumeChanged(This,ChannelCount,NewChannelVolumeArray,ChangedChannel,EventContext);
}
static inline HRESULT IAudioSessionEvents_OnGroupingParamChanged(IAudioSessionEvents* This,LPCGUID NewGroupingParam,LPCGUID EventContext) {
    return This->lpVtbl->OnGroupingParamChanged(This,NewGroupingParam,EventContext);
}
static inline HRESULT IAudioSessionEvents_OnStateChanged(IAudioSessionEvents* This,AudioSessionState NewState) {
    return This->lpVtbl->OnStateChanged(This,NewState);
}
static inline 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 inline HRESULT IAudioSessionControl_QueryInterface(IAudioSessionControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionControl_AddRef(IAudioSessionControl* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionControl_Release(IAudioSessionControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionControl methods ***/
static inline HRESULT IAudioSessionControl_GetState(IAudioSessionControl* This,AudioSessionState *pRetVal) {
    return This->lpVtbl->GetState(This,pRetVal);
}
static inline HRESULT IAudioSessionControl_GetDisplayName(IAudioSessionControl* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetDisplayName(This,pRetVal);
}
static inline HRESULT IAudioSessionControl_SetDisplayName(IAudioSessionControl* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetDisplayName(This,Value,EventContext);
}
static inline HRESULT IAudioSessionControl_GetIconPath(IAudioSessionControl* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetIconPath(This,pRetVal);
}
static inline HRESULT IAudioSessionControl_SetIconPath(IAudioSessionControl* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetIconPath(This,Value,EventContext);
}
static inline HRESULT IAudioSessionControl_GetGroupingParam(IAudioSessionControl* This,GUID *pRetVal) {
    return This->lpVtbl->GetGroupingParam(This,pRetVal);
}
static inline HRESULT IAudioSessionControl_SetGroupingParam(IAudioSessionControl* This,LPCGUID Override,LPCGUID EventContext) {
    return This->lpVtbl->SetGroupingParam(This,Override,EventContext);
}
static inline HRESULT IAudioSessionControl_RegisterAudioSessionNotification(IAudioSessionControl* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->RegisterAudioSessionNotification(This,NewNotifications);
}
static inline 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 inline HRESULT IAudioSessionControl2_QueryInterface(IAudioSessionControl2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionControl2_AddRef(IAudioSessionControl2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionControl2_Release(IAudioSessionControl2* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionControl methods ***/
static inline HRESULT IAudioSessionControl2_GetState(IAudioSessionControl2* This,AudioSessionState *pRetVal) {
    return This->lpVtbl->GetState(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_GetDisplayName(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetDisplayName(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_SetDisplayName(IAudioSessionControl2* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetDisplayName(This,Value,EventContext);
}
static inline HRESULT IAudioSessionControl2_GetIconPath(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetIconPath(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_SetIconPath(IAudioSessionControl2* This,LPCWSTR Value,LPCGUID EventContext) {
    return This->lpVtbl->SetIconPath(This,Value,EventContext);
}
static inline HRESULT IAudioSessionControl2_GetGroupingParam(IAudioSessionControl2* This,GUID *pRetVal) {
    return This->lpVtbl->GetGroupingParam(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_SetGroupingParam(IAudioSessionControl2* This,LPCGUID Override,LPCGUID EventContext) {
    return This->lpVtbl->SetGroupingParam(This,Override,EventContext);
}
static inline HRESULT IAudioSessionControl2_RegisterAudioSessionNotification(IAudioSessionControl2* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->RegisterAudioSessionNotification(This,NewNotifications);
}
static inline HRESULT IAudioSessionControl2_UnregisterAudioSessionNotification(IAudioSessionControl2* This,IAudioSessionEvents *NewNotifications) {
    return This->lpVtbl->UnregisterAudioSessionNotification(This,NewNotifications);
}
/*** IAudioSessionControl2 methods ***/
static inline HRESULT IAudioSessionControl2_GetSessionIdentifier(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetSessionIdentifier(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_GetSessionInstanceIdentifier(IAudioSessionControl2* This,LPWSTR *pRetVal) {
    return This->lpVtbl->GetSessionInstanceIdentifier(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_GetProcessId(IAudioSessionControl2* This,DWORD *pRetVal) {
    return This->lpVtbl->GetProcessId(This,pRetVal);
}
static inline HRESULT IAudioSessionControl2_IsSystemSoundsSession(IAudioSessionControl2* This) {
    return This->lpVtbl->IsSystemSoundsSession(This);
}
static inline 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 inline HRESULT IAudioSessionManager_QueryInterface(IAudioSessionManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionManager_AddRef(IAudioSessionManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionManager_Release(IAudioSessionManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionManager methods ***/
static inline HRESULT IAudioSessionManager_GetAudioSessionControl(IAudioSessionManager* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,IAudioSessionControl **SessionControl) {
    return This->lpVtbl->GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl);
}
static inline 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 inline HRESULT IAudioVolumeDuckNotification_QueryInterface(IAudioVolumeDuckNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioVolumeDuckNotification_AddRef(IAudioVolumeDuckNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioVolumeDuckNotification_Release(IAudioVolumeDuckNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioVolumeDuckNotification methods ***/
static inline HRESULT IAudioVolumeDuckNotification_OnVolumeDuckNotification(IAudioVolumeDuckNotification* This,LPCWSTR sessionID,UINT32 countCommunicationSessions) {
    return This->lpVtbl->OnVolumeDuckNotification(This,sessionID,countCommunicationSessions);
}
static inline 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 inline HRESULT IAudioSessionNotification_QueryInterface(IAudioSessionNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionNotification_AddRef(IAudioSessionNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionNotification_Release(IAudioSessionNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionNotification methods ***/
static inline 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 inline HRESULT IAudioSessionEnumerator_QueryInterface(IAudioSessionEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionEnumerator_AddRef(IAudioSessionEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionEnumerator_Release(IAudioSessionEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionEnumerator methods ***/
static inline HRESULT IAudioSessionEnumerator_GetCount(IAudioSessionEnumerator* This,int *SessionCount) {
    return This->lpVtbl->GetCount(This,SessionCount);
}
static inline 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 inline HRESULT IAudioSessionManager2_QueryInterface(IAudioSessionManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IAudioSessionManager2_AddRef(IAudioSessionManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IAudioSessionManager2_Release(IAudioSessionManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IAudioSessionManager methods ***/
static inline HRESULT IAudioSessionManager2_GetAudioSessionControl(IAudioSessionManager2* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,IAudioSessionControl **SessionControl) {
    return This->lpVtbl->GetAudioSessionControl(This,AudioSessionGuid,StreamFlags,SessionControl);
}
static inline HRESULT IAudioSessionManager2_GetSimpleAudioVolume(IAudioSessionManager2* This,LPCGUID AudioSessionGuid,DWORD StreamFlags,ISimpleAudioVolume **AudioVolume) {
    return This->lpVtbl->GetSimpleAudioVolume(This,AudioSessionGuid,StreamFlags,AudioVolume);
}
/*** IAudioSessionManager2 methods ***/
static inline HRESULT IAudioSessionManager2_GetSessionEnumerator(IAudioSessionManager2* This,IAudioSessionEnumerator **SessionEnum) {
    return This->lpVtbl->GetSessionEnumerator(This,SessionEnum);
}
static inline HRESULT IAudioSessionManager2_RegisterSessionNotification(IAudioSessionManager2* This,IAudioSessionNotification *SessionNotification) {
    return This->lpVtbl->RegisterSessionNotification(This,SessionNotification);
}
static inline HRESULT IAudioSessionManager2_UnregisterSessionNotification(IAudioSessionManager2* This,IAudioSessionNotification *SessionNotification) {
    return This->lpVtbl->UnregisterSessionNotification(This,SessionNotification);
}
static inline HRESULT IAudioSessionManager2_RegisterDuckNotification(IAudioSessionManager2* This,LPCWSTR sessionID,IAudioVolumeDuckNotification *duckNotification) {
    return This->lpVtbl->RegisterDuckNotification(This,sessionID,duckNotification);
}
static inline 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__ */
