/*** Autogenerated by WIDL from audiopolicy.idl - Do not edit ***/

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

#if !defined(COM_NO_WINDOWS_H) && !defined(__WINESRC__)
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __WIDL_AUDIOPOLICY_H
#define __WIDL_AUDIOPOLICY_H

/* Forward declarations */

#ifndef __IAudioSessionEvents_FWD_DEFINED__
#define __IAudioSessionEvents_FWD_DEFINED__
typedef interface IAudioSessionEvents IAudioSessionEvents;
#endif

#ifndef __IAudioSessionControl_FWD_DEFINED__
#define __IAudioSessionControl_FWD_DEFINED__
typedef interface IAudioSessionControl IAudioSessionControl;
#endif

#ifndef __IAudioSessionControl2_FWD_DEFINED__
#define __IAudioSessionControl2_FWD_DEFINED__
typedef interface IAudioSessionControl2 IAudioSessionControl2;
#endif

#ifndef __IAudioSessionManager_FWD_DEFINED__
#define __IAudioSessionManager_FWD_DEFINED__
typedef interface IAudioSessionManager IAudioSessionManager;
#endif

#ifndef __IAudioVolumeDuckNotification_FWD_DEFINED__
#define __IAudioVolumeDuckNotification_FWD_DEFINED__
typedef interface IAudioVolumeDuckNotification IAudioVolumeDuckNotification;
#endif

#ifndef __IAudioSessionNotification_FWD_DEFINED__
#define __IAudioSessionNotification_FWD_DEFINED__
typedef interface IAudioSessionNotification IAudioSessionNotification;
#endif

#ifndef __IAudioSessionEnumerator_FWD_DEFINED__
#define __IAudioSessionEnumerator_FWD_DEFINED__
typedef interface IAudioSessionEnumerator IAudioSessionEnumerator;
#endif

#ifndef __IAudioSessionManager2_FWD_DEFINED__
#define __IAudioSessionManager2_FWD_DEFINED__
typedef interface IAudioSessionManager2 IAudioSessionManager2;
#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

#ifndef __audiopolicy_h__
#define __audiopolicy_h__
#ifndef __IAudioSessionEvents_FWD_DEFINED__
#define __IAudioSessionEvents_FWD_DEFINED__
typedef interface IAudioSessionEvents IAudioSessionEvents;
#endif

#ifndef __IAudioSessionControl_FWD_DEFINED__
#define __IAudioSessionControl_FWD_DEFINED__
typedef interface IAudioSessionControl IAudioSessionControl;
#endif

#ifndef __IAudioSessionControl2_FWD_DEFINED__
#define __IAudioSessionControl2_FWD_DEFINED__
typedef interface IAudioSessionControl2 IAudioSessionControl2;
#endif

#ifndef __IAudioSessionManager_FWD_DEFINED__
#define __IAudioSessionManager_FWD_DEFINED__
typedef interface IAudioSessionManager IAudioSessionManager;
#endif

#ifndef __IAudioVolumeDuckNotification_FWD_DEFINED__
#define __IAudioVolumeDuckNotification_FWD_DEFINED__
typedef interface IAudioVolumeDuckNotification IAudioVolumeDuckNotification;
#endif

#ifndef __IAudioSessionNotification_FWD_DEFINED__
#define __IAudioSessionNotification_FWD_DEFINED__
typedef interface IAudioSessionNotification IAudioSessionNotification;
#endif

#ifndef __IAudioSessionEnumerator_FWD_DEFINED__
#define __IAudioSessionEnumerator_FWD_DEFINED__
typedef interface IAudioSessionEnumerator IAudioSessionEnumerator;
#endif

#ifndef __IAudioSessionManager2_FWD_DEFINED__
#define __IAudioSessionManager2_FWD_DEFINED__
typedef interface IAudioSessionManager2 IAudioSessionManager2;
#endif

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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnDisplayNameChanged_Proxy(
    IAudioSessionEvents* This,
    LPCWSTR NewDisplayName,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionEvents_OnDisplayNameChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnIconPathChanged_Proxy(
    IAudioSessionEvents* This,
    LPCWSTR NewIconPath,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionEvents_OnIconPathChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnSimpleVolumeChanged_Proxy(
    IAudioSessionEvents* This,
    float NewVolume,
    WINBOOL NewMute,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionEvents_OnSimpleVolumeChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnChannelVolumeChanged_Proxy(
    IAudioSessionEvents* This,
    DWORD ChannelCount,
    float *NewChannelVolumeArray,
    DWORD ChangedChannel,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionEvents_OnChannelVolumeChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnGroupingParamChanged_Proxy(
    IAudioSessionEvents* This,
    LPCGUID NewGroupingParam,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionEvents_OnGroupingParamChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnStateChanged_Proxy(
    IAudioSessionEvents* This,
    AudioSessionState NewState);
void __RPC_STUB IAudioSessionEvents_OnStateChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEvents_OnSessionDisconnected_Proxy(
    IAudioSessionEvents* This,
    AudioSessionDisconnectReason DisconnectReason);
void __RPC_STUB IAudioSessionEvents_OnSessionDisconnected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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 DisplayName,
        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 DisplayName,
        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
/*** 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,DisplayName,EventContext) (This)->lpVtbl->SetDisplayName(This,DisplayName,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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionControl_GetState_Proxy(
    IAudioSessionControl* This,
    AudioSessionState *pRetVal);
void __RPC_STUB IAudioSessionControl_GetState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_GetDisplayName_Proxy(
    IAudioSessionControl* This,
    LPWSTR *pRetVal);
void __RPC_STUB IAudioSessionControl_GetDisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_SetDisplayName_Proxy(
    IAudioSessionControl* This,
    LPCWSTR DisplayName,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionControl_SetDisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_GetIconPath_Proxy(
    IAudioSessionControl* This,
    LPWSTR *pRetVal);
void __RPC_STUB IAudioSessionControl_GetIconPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_SetIconPath_Proxy(
    IAudioSessionControl* This,
    LPCWSTR Value,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionControl_SetIconPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_GetGroupingParam_Proxy(
    IAudioSessionControl* This,
    GUID *pRetVal);
void __RPC_STUB IAudioSessionControl_GetGroupingParam_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_SetGroupingParam_Proxy(
    IAudioSessionControl* This,
    LPCGUID Override,
    LPCGUID EventContext);
void __RPC_STUB IAudioSessionControl_SetGroupingParam_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_RegisterAudioSessionNotification_Proxy(
    IAudioSessionControl* This,
    IAudioSessionEvents *NewNotifications);
void __RPC_STUB IAudioSessionControl_RegisterAudioSessionNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl_UnregisterAudioSessionNotification_Proxy(
    IAudioSessionControl* This,
    IAudioSessionEvents *NewNotifications);
void __RPC_STUB IAudioSessionControl_UnregisterAudioSessionNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAudioSessionControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * 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 SetDuckingPreferences(
        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 DisplayName,
        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 *SetDuckingPreferences)(
        IAudioSessionControl2* This,
        WINBOOL optOut);

    END_INTERFACE
} IAudioSessionControl2Vtbl;
interface IAudioSessionControl2 {
    CONST_VTBL IAudioSessionControl2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
/*** 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,DisplayName,EventContext) (This)->lpVtbl->SetDisplayName(This,DisplayName,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_SetDuckingPreferences(This,optOut) (This)->lpVtbl->SetDuckingPreferences(This,optOut)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionControl2_GetSessionIdentifier_Proxy(
    IAudioSessionControl2* This,
    LPWSTR *pRetVal);
void __RPC_STUB IAudioSessionControl2_GetSessionIdentifier_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl2_GetSessionInstanceIdentifier_Proxy(
    IAudioSessionControl2* This,
    LPWSTR *pRetVal);
void __RPC_STUB IAudioSessionControl2_GetSessionInstanceIdentifier_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl2_GetProcessId_Proxy(
    IAudioSessionControl2* This,
    DWORD *pRetVal);
void __RPC_STUB IAudioSessionControl2_GetProcessId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl2_IsSystemSoundsSession_Proxy(
    IAudioSessionControl2* This);
void __RPC_STUB IAudioSessionControl2_IsSystemSoundsSession_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionControl2_SetDuckingPreferences_Proxy(
    IAudioSessionControl2* This,
    WINBOOL optOut);
void __RPC_STUB IAudioSessionControl2_SetDuckingPreferences_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionManager_GetAudioSessionControl_Proxy(
    IAudioSessionManager* This,
    LPCGUID AudioSessionGuid,
    DWORD StreamFlags,
    IAudioSessionControl **SessionControl);
void __RPC_STUB IAudioSessionManager_GetAudioSessionControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionManager_GetSimpleAudioVolume_Proxy(
    IAudioSessionManager* This,
    LPCGUID AudioSessionGuid,
    DWORD StreamFlags,
    ISimpleAudioVolume **AudioVolume);
void __RPC_STUB IAudioSessionManager_GetSimpleAudioVolume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioVolumeDuckNotification_OnVolumeDuckNotification_Proxy(
    IAudioVolumeDuckNotification* This,
    LPCWSTR sessionID,
    UINT32 countCommunicationSessions);
void __RPC_STUB IAudioVolumeDuckNotification_OnVolumeDuckNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioVolumeDuckNotification_OnVolumeUnduckNotification_Proxy(
    IAudioVolumeDuckNotification* This,
    LPCWSTR sessionID);
void __RPC_STUB IAudioVolumeDuckNotification_OnVolumeUnduckNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionNotification_OnSessionCreated_Proxy(
    IAudioSessionNotification* This,
    IAudioSessionControl *NewSession);
void __RPC_STUB IAudioSessionNotification_OnSessionCreated_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionEnumerator_GetCount_Proxy(
    IAudioSessionEnumerator* This,
    INT *SessionCount);
void __RPC_STUB IAudioSessionEnumerator_GetCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionEnumerator_GetSession_Proxy(
    IAudioSessionEnumerator* This,
    INT SessionCount,
    IAudioSessionControl **Session);
void __RPC_STUB IAudioSessionEnumerator_GetSession_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IAudioSessionManager2_GetSessionEnumerator_Proxy(
    IAudioSessionManager2* This,
    IAudioSessionEnumerator **SessionEnum);
void __RPC_STUB IAudioSessionManager2_GetSessionEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionManager2_RegisterSessionNotification_Proxy(
    IAudioSessionManager2* This,
    IAudioSessionNotification *SessionNotification);
void __RPC_STUB IAudioSessionManager2_RegisterSessionNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionManager2_UnregisterSessionNotification_Proxy(
    IAudioSessionManager2* This,
    IAudioSessionNotification *SessionNotification);
void __RPC_STUB IAudioSessionManager2_UnregisterSessionNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionManager2_RegisterDuckNotification_Proxy(
    IAudioSessionManager2* This,
    LPCWSTR sessionID,
    IAudioVolumeDuckNotification *duckNotification);
void __RPC_STUB IAudioSessionManager2_RegisterDuckNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAudioSessionManager2_UnregisterDuckNotification_Proxy(
    IAudioSessionManager2* This,
    IAudioVolumeDuckNotification *duckNotification);
void __RPC_STUB IAudioSessionManager2_UnregisterDuckNotification_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAudioSessionManager2_INTERFACE_DEFINED__ */

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __WIDL_AUDIOPOLICY_H */
