/*** Autogenerated by WIDL 8.19 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__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

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