/*** Autogenerated by WIDL 1.6 from include/wmsdkidl.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

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

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wmsdkidl_h__
#define __wmsdkidl_h__

/* Forward declarations */

#ifndef __IWMStatusCallback_FWD_DEFINED__
#define __IWMStatusCallback_FWD_DEFINED__
typedef interface IWMStatusCallback IWMStatusCallback;
#endif

#ifndef __IWMReaderCallback_FWD_DEFINED__
#define __IWMReaderCallback_FWD_DEFINED__
typedef interface IWMReaderCallback IWMReaderCallback;
#endif

#ifndef __IWMStreamList_FWD_DEFINED__
#define __IWMStreamList_FWD_DEFINED__
typedef interface IWMStreamList IWMStreamList;
#endif

#ifndef __IWMMutualExclusion_FWD_DEFINED__
#define __IWMMutualExclusion_FWD_DEFINED__
typedef interface IWMMutualExclusion IWMMutualExclusion;
#endif

#ifndef __IWMStreamConfig_FWD_DEFINED__
#define __IWMStreamConfig_FWD_DEFINED__
typedef interface IWMStreamConfig IWMStreamConfig;
#endif

#ifndef __IWMProfile_FWD_DEFINED__
#define __IWMProfile_FWD_DEFINED__
typedef interface IWMProfile IWMProfile;
#endif

#ifndef __IWMProfileManager_FWD_DEFINED__
#define __IWMProfileManager_FWD_DEFINED__
typedef interface IWMProfileManager IWMProfileManager;
#endif

#ifndef __IWMMediaProps_FWD_DEFINED__
#define __IWMMediaProps_FWD_DEFINED__
typedef interface IWMMediaProps IWMMediaProps;
#endif

#ifndef __IWMOutputMediaProps_FWD_DEFINED__
#define __IWMOutputMediaProps_FWD_DEFINED__
typedef interface IWMOutputMediaProps IWMOutputMediaProps;
#endif

#ifndef __IWMMetadataEditor_FWD_DEFINED__
#define __IWMMetadataEditor_FWD_DEFINED__
typedef interface IWMMetadataEditor IWMMetadataEditor;
#endif

#ifndef __IWMReader_FWD_DEFINED__
#define __IWMReader_FWD_DEFINED__
typedef interface IWMReader IWMReader;
#endif

#ifndef __IWMPlayerHook_FWD_DEFINED__
#define __IWMPlayerHook_FWD_DEFINED__
typedef interface IWMPlayerHook IWMPlayerHook;
#endif

#ifndef __IWMReaderAdvanced_FWD_DEFINED__
#define __IWMReaderAdvanced_FWD_DEFINED__
typedef interface IWMReaderAdvanced IWMReaderAdvanced;
#endif

#ifndef __IWMReaderAdvanced2_FWD_DEFINED__
#define __IWMReaderAdvanced2_FWD_DEFINED__
typedef interface IWMReaderAdvanced2 IWMReaderAdvanced2;
#endif

#ifndef __IWMReaderAdvanced3_FWD_DEFINED__
#define __IWMReaderAdvanced3_FWD_DEFINED__
typedef interface IWMReaderAdvanced3 IWMReaderAdvanced3;
#endif

#ifndef __IWMReaderAdvanced4_FWD_DEFINED__
#define __IWMReaderAdvanced4_FWD_DEFINED__
typedef interface IWMReaderAdvanced4 IWMReaderAdvanced4;
#endif

#ifndef __IWMReaderAdvanced5_FWD_DEFINED__
#define __IWMReaderAdvanced5_FWD_DEFINED__
typedef interface IWMReaderAdvanced5 IWMReaderAdvanced5;
#endif

#ifndef __IWMReaderAdvanced6_FWD_DEFINED__
#define __IWMReaderAdvanced6_FWD_DEFINED__
typedef interface IWMReaderAdvanced6 IWMReaderAdvanced6;
#endif

#ifndef __IWMSyncReader_FWD_DEFINED__
#define __IWMSyncReader_FWD_DEFINED__
typedef interface IWMSyncReader IWMSyncReader;
#endif

#ifndef __IWMInputMediaProps_FWD_DEFINED__
#define __IWMInputMediaProps_FWD_DEFINED__
typedef interface IWMInputMediaProps IWMInputMediaProps;
#endif

#ifndef __IWMWriterSink_FWD_DEFINED__
#define __IWMWriterSink_FWD_DEFINED__
typedef interface IWMWriterSink IWMWriterSink;
#endif

#ifndef __IWMWriter_FWD_DEFINED__
#define __IWMWriter_FWD_DEFINED__
typedef interface IWMWriter IWMWriter;
#endif

#ifndef __IWMWriterAdvanced_FWD_DEFINED__
#define __IWMWriterAdvanced_FWD_DEFINED__
typedef interface IWMWriterAdvanced IWMWriterAdvanced;
#endif

#ifndef __IWMWriterAdvanced2_FWD_DEFINED__
#define __IWMWriterAdvanced2_FWD_DEFINED__
typedef interface IWMWriterAdvanced2 IWMWriterAdvanced2;
#endif

#ifndef __IWMWriterAdvanced3_FWD_DEFINED__
#define __IWMWriterAdvanced3_FWD_DEFINED__
typedef interface IWMWriterAdvanced3 IWMWriterAdvanced3;
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <wmsbuffer.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef UINT64 QWORD;
typedef struct _WMMediaType {
    GUID majortype;
    GUID subtype;
    WINBOOL bFixedSizeSamples;
    WINBOOL bTemporalCompression;
    ULONG lSampleSize;
    GUID formattype;
    IUnknown *pUnk;
    ULONG cbFormat;
    BYTE *pbFormat;
} WM_MEDIA_TYPE;
typedef struct _WMWriterStatistics {
    QWORD qwSampleCount;
    QWORD qwByteCount;
    QWORD qwDroppedSampleCount;
    QWORD qwDroppedByteCount;
    DWORD dwCurrentBitrate;
    DWORD dwAverageBitrate;
    DWORD dwExpectedBitrate;
    DWORD dwCurrentSampleRate;
    DWORD dwAverageSampleRate;
    DWORD dwExpectedSampleRate;
} WM_WRITER_STATISTICS;
typedef struct _WMWriterStatisticsEx {
    DWORD dwBitratePlusOverhead;
    DWORD dwCurrentSampleDropRateInQueue;
    DWORD dwCurrentSampleDropRateInCodec;
    DWORD dwCurrentSampleDropRateInMultiplexer;
    DWORD dwTotalSampleDropsInQueue;
    DWORD dwTotalSampleDropsInCodec;
    DWORD dwTotalSampleDropsInMultiplexer;
} WM_WRITER_STATISTICS_EX;
typedef struct _WMReaderStatistics {
    DWORD cbSize;
    DWORD dwBandwidth;
    DWORD cPacketsReceived;
    DWORD cPacketsRecovered;
    DWORD cPacketsLost;
    WORD wQuality;
} WM_READER_STATISTICS;
typedef struct _WMReaderClientInfo {
    DWORD cbSize;
    WCHAR *wszLang;
    WCHAR *wszBrowserUserAgent;
    WCHAR *wszBrowserWebPage;
    QWORD qwReserved;
    LPARAM *pReserved;
    WCHAR *wszHostExe;
    QWORD qwHostVersion;
    WCHAR *wszPlayerUserAgent;
} WM_READER_CLIENTINFO;
typedef enum WMT_ATTR_DATATYPE {
    WMT_TYPE_DWORD = 0,
    WMT_TYPE_STRING = 1,
    WMT_TYPE_BINARY = 2,
    WMT_TYPE_BOOL = 3,
    WMT_TYPE_QWORD = 4,
    WMT_TYPE_WORD = 5,
    WMT_TYPE_GUID = 6
} WMT_ATTR_DATATYPE;
typedef enum WMT_STATUS {
    WMT_ERROR = 0,
    WMT_OPENED = 1,
    WMT_BUFFERING_START = 2,
    WMT_BUFFERING_STOP = 3,
    WMT_EOF = 4,
    WMT_END_OF_FILE = 4,
    WMT_END_OF_SEGMENT = 5,
    WMT_END_OF_STREAMING = 6,
    WMT_LOCATING = 7,
    WMT_CONNECTING = 8,
    WMT_NO_RIGHTS = 9,
    WMT_MISSING_CODEC = 10,
    WMT_STARTED = 11,
    WMT_STOPPED = 12,
    WMT_CLOSED = 13,
    WMT_STRIDING = 14,
    WMT_TIMER = 15,
    WMT_INDEX_PROGRESS = 16,
    WMT_SAVEAS_START = 17,
    WMT_SAVEAS_STOP = 18,
    WMT_NEW_SOURCEFLAGS = 19,
    WMT_NEW_METADATA = 20,
    WMT_BACKUPRESTORE_BEGIN = 21,
    WMT_SOURCE_SWITCH = 22,
    WMT_ACQUIRE_LICENSE = 23,
    WMT_INDIVIDUALIZE = 24,
    WMT_NEEDS_INDIVIDUALIZATION = 25,
    WMT_NO_RIGHTS_EX = 26,
    WMT_BACKUPRESTORE_END = 27,
    WMT_BACKUPRESTORE_CONNECTING = 28,
    WMT_BACKUPRESTORE_DISCONNECTING = 29,
    WMT_ERROR_WITHURL = 30,
    WMT_RESTRICTED_LICENSE = 31,
    WMT_CLIENT_CONNECT = 32,
    WMT_CLIENT_DISCONNECT = 33,
    WMT_NATIVE_OUTPUT_PROPS_CHANGED = 34,
    WMT_RECONNECT_START = 35,
    WMT_RECONNECT_END = 36,
    WMT_CLIENT_CONNECT_EX = 37,
    WMT_CLIENT_DISCONNECT_EX = 38,
    WMT_SET_FEC_SPAN = 39,
    WMT_PREROLL_READY = 40,
    WMT_PREROLL_COMPLETE = 41,
    WMT_CLIENT_PROPERTIES = 42,
    WMT_LICENSEURL_SIGNATURE_STATE = 43,
    WMT_INIT_PLAYLIST_BURN = 44,
    WMT_TRANSCRYPTOR_INIT = 45,
    WMT_TRANSCRYPTOR_SEEKED = 46,
    WMT_TRANSCRYPTOR_READ = 47,
    WMT_TRANSCRYPTOR_CLOSED = 48,
    WMT_PROXIMITY_RESULT = 49,
    WMT_PROXIMITY_COMPLETED = 50,
    WMT_CONTENT_ENABLER = 51
} WMT_STATUS;
typedef enum WMT_STREAM_SELECTION {
    WMT_OFF = 0,
    WMT_CLEANPOINT_ONLY = 1,
    WMT_ON = 2
} WMT_STREAM_SELECTION;
typedef enum WMT_VERSION {
    WMT_VER_4_0 = 0x40000,
    WMT_VER_7_0 = 0x70000,
    WMT_VER_8_0 = 0x80000,
    WMT_VER_9_0 = 0x90000
} WMT_VERSION;
typedef enum WMT_PLAY_MODE {
    WMT_PLAY_MODE_AUTOSELECT = 0,
    WMT_PLAY_MODE_LOCAL = 1,
    WMT_PLAY_MODE_DOWNLOAD = 2,
    WMT_PLAY_MODE_STREAMING = 3
} WMT_PLAY_MODE;
typedef enum tagWMT_OFFSET_FORMAT {
    WMT_OFFSET_FORMAT_100NS = 0,
    WMT_OFFSET_FORMAT_FRAME_NUMBERS = 1,
    WMT_OFFSET_FORMAT_PLAYLIST_OFFSET = 2,
    WMT_OFFSET_FORMAT_TIMECODE = 3,
    WMT_OFFSET_FORMAT_100NS_APPROXIMATE = 4
} WMT_OFFSET_FORMAT;
typedef LPCWSTR LPCWSTR_WMSDK_TYPE_SAFE;
/*****************************************************************************
 * IWMStatusCallback interface
 */
#ifndef __IWMStatusCallback_INTERFACE_DEFINED__
#define __IWMStatusCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStatusCallback, 0x6d7cdc70, 0x9888, 0x11d3, 0x8e,0xdc, 0x00,0xc0,0x4f,0x61,0x09,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6d7cdc70-9888-11d3-8edc-00c04f6109cf")
IWMStatusCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnStatus(
        WMT_STATUS Status,
        HRESULT hr,
        WMT_ATTR_DATATYPE dwType,
        BYTE *pValue,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStatusCallback, 0x6d7cdc70, 0x9888, 0x11d3, 0x8e,0xdc, 0x00,0xc0,0x4f,0x61,0x09,0xcf)
#endif
#else
typedef struct IWMStatusCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStatusCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStatus)(
        IWMStatusCallback* This,
        WMT_STATUS Status,
        HRESULT hr,
        WMT_ATTR_DATATYPE dwType,
        BYTE *pValue,
        void *pvContext);

    END_INTERFACE
} IWMStatusCallbackVtbl;
interface IWMStatusCallback {
    CONST_VTBL IWMStatusCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStatusCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStatusCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStatusCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStatusCallback methods ***/
#define IWMStatusCallback_OnStatus(This,Status,hr,dwType,pValue,pvContext) (This)->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStatusCallback_QueryInterface(IWMStatusCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStatusCallback_AddRef(IWMStatusCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStatusCallback_Release(IWMStatusCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStatusCallback methods ***/
static FORCEINLINE HRESULT IWMStatusCallback_OnStatus(IWMStatusCallback* This,WMT_STATUS Status,HRESULT hr,WMT_ATTR_DATATYPE dwType,BYTE *pValue,void *pvContext) {
    return This->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMStatusCallback_OnStatus_Proxy(
    IWMStatusCallback* This,
    WMT_STATUS Status,
    HRESULT hr,
    WMT_ATTR_DATATYPE dwType,
    BYTE *pValue,
    void *pvContext);
void __RPC_STUB IWMStatusCallback_OnStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMStatusCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderCallback interface
 */
#ifndef __IWMReaderCallback_INTERFACE_DEFINED__
#define __IWMReaderCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderCallback, 0x96406bd8, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd8-2b2b-11d3-b36b-00c04f6108ff")
IWMReaderCallback : public IWMStatusCallback
{
    virtual HRESULT STDMETHODCALLTYPE OnSample(
        DWORD dwOutputNum,
        QWORD cnsSampleTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderCallback, 0x96406bd8, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStatusCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStatus)(
        IWMReaderCallback* This,
        WMT_STATUS Status,
        HRESULT hr,
        WMT_ATTR_DATATYPE dwType,
        BYTE *pValue,
        void *pvContext);

    /*** IWMReaderCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSample)(
        IWMReaderCallback* This,
        DWORD dwOutputNum,
        QWORD cnsSampleTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample,
        void *pvContext);

    END_INTERFACE
} IWMReaderCallbackVtbl;
interface IWMReaderCallback {
    CONST_VTBL IWMReaderCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStatusCallback methods ***/
#define IWMReaderCallback_OnStatus(This,Status,hr,dwType,pValue,pvContext) (This)->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext)
/*** IWMReaderCallback methods ***/
#define IWMReaderCallback_OnSample(This,dwOutputNum,cnsSampleTime,cnsSampleDuration,dwFlags,pSample,pvContext) (This)->lpVtbl->OnSample(This,dwOutputNum,cnsSampleTime,cnsSampleDuration,dwFlags,pSample,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderCallback_QueryInterface(IWMReaderCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderCallback_AddRef(IWMReaderCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderCallback_Release(IWMReaderCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStatusCallback methods ***/
static FORCEINLINE HRESULT IWMReaderCallback_OnStatus(IWMReaderCallback* This,WMT_STATUS Status,HRESULT hr,WMT_ATTR_DATATYPE dwType,BYTE *pValue,void *pvContext) {
    return This->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext);
}
/*** IWMReaderCallback methods ***/
static FORCEINLINE HRESULT IWMReaderCallback_OnSample(IWMReaderCallback* This,DWORD dwOutputNum,QWORD cnsSampleTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample,void *pvContext) {
    return This->lpVtbl->OnSample(This,dwOutputNum,cnsSampleTime,cnsSampleDuration,dwFlags,pSample,pvContext);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderCallback_OnSample_Proxy(
    IWMReaderCallback* This,
    DWORD dwOutputNum,
    QWORD cnsSampleTime,
    QWORD cnsSampleDuration,
    DWORD dwFlags,
    INSSBuffer *pSample,
    void *pvContext);
void __RPC_STUB IWMReaderCallback_OnSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMStreamList interface
 */
#ifndef __IWMStreamList_INTERFACE_DEFINED__
#define __IWMStreamList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStreamList, 0x96406bdd, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bdd-2b2b-11d3-b36b-00c04f6108ff")
IWMStreamList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStreams(
        WORD *pwStreamNumArray,
        WORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStream(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStream(
        WORD wStreamNum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStreamList, 0x96406bdd, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMStreamListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamList methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreams)(
        IWMStreamList* This,
        WORD *pwStreamNumArray,
        WORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMStreamList* This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMStreamList* This,
        WORD wStreamNum);

    END_INTERFACE
} IWMStreamListVtbl;
interface IWMStreamList {
    CONST_VTBL IWMStreamListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStreamList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStreamList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStreamList_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamList methods ***/
#define IWMStreamList_GetStreams(This,pwStreamNumArray,pcStreams) (This)->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams)
#define IWMStreamList_AddStream(This,wStreamNum) (This)->lpVtbl->AddStream(This,wStreamNum)
#define IWMStreamList_RemoveStream(This,wStreamNum) (This)->lpVtbl->RemoveStream(This,wStreamNum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStreamList_QueryInterface(IWMStreamList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStreamList_AddRef(IWMStreamList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStreamList_Release(IWMStreamList* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamList methods ***/
static FORCEINLINE HRESULT IWMStreamList_GetStreams(IWMStreamList* This,WORD *pwStreamNumArray,WORD *pcStreams) {
    return This->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams);
}
static FORCEINLINE HRESULT IWMStreamList_AddStream(IWMStreamList* This,WORD wStreamNum) {
    return This->lpVtbl->AddStream(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMStreamList_RemoveStream(IWMStreamList* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStream(This,wStreamNum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMStreamList_GetStreams_Proxy(
    IWMStreamList* This,
    WORD *pwStreamNumArray,
    WORD *pcStreams);
void __RPC_STUB IWMStreamList_GetStreams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamList_AddStream_Proxy(
    IWMStreamList* This,
    WORD wStreamNum);
void __RPC_STUB IWMStreamList_AddStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamList_RemoveStream_Proxy(
    IWMStreamList* This,
    WORD wStreamNum);
void __RPC_STUB IWMStreamList_RemoveStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMStreamList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMMutualExclusion interface
 */
#ifndef __IWMMutualExclusion_INTERFACE_DEFINED__
#define __IWMMutualExclusion_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMMutualExclusion, 0x96406bde, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bde-2b2b-11d3-b36b-00c04f6108ff")
IWMMutualExclusion : public IWMStreamList
{
    virtual HRESULT STDMETHODCALLTYPE GetType(
        GUID *pguidType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetType(
        REFGUID guidType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMMutualExclusion, 0x96406bde, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMMutualExclusionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamList methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreams)(
        IWMMutualExclusion* This,
        WORD *pwStreamNumArray,
        WORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMMutualExclusion* This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMMutualExclusion* This,
        WORD wStreamNum);

    /*** IWMMutualExclusion methods ***/
    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWMMutualExclusion* This,
        GUID *pguidType);

    HRESULT (STDMETHODCALLTYPE *SetType)(
        IWMMutualExclusion* This,
        REFGUID guidType);

    END_INTERFACE
} IWMMutualExclusionVtbl;
interface IWMMutualExclusion {
    CONST_VTBL IWMMutualExclusionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMMutualExclusion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMMutualExclusion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMMutualExclusion_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamList methods ***/
#define IWMMutualExclusion_GetStreams(This,pwStreamNumArray,pcStreams) (This)->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams)
#define IWMMutualExclusion_AddStream(This,wStreamNum) (This)->lpVtbl->AddStream(This,wStreamNum)
#define IWMMutualExclusion_RemoveStream(This,wStreamNum) (This)->lpVtbl->RemoveStream(This,wStreamNum)
/*** IWMMutualExclusion methods ***/
#define IWMMutualExclusion_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMMutualExclusion_SetType(This,guidType) (This)->lpVtbl->SetType(This,guidType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMMutualExclusion_QueryInterface(IWMMutualExclusion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMMutualExclusion_AddRef(IWMMutualExclusion* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMMutualExclusion_Release(IWMMutualExclusion* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamList methods ***/
static FORCEINLINE HRESULT IWMMutualExclusion_GetStreams(IWMMutualExclusion* This,WORD *pwStreamNumArray,WORD *pcStreams) {
    return This->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams);
}
static FORCEINLINE HRESULT IWMMutualExclusion_AddStream(IWMMutualExclusion* This,WORD wStreamNum) {
    return This->lpVtbl->AddStream(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMMutualExclusion_RemoveStream(IWMMutualExclusion* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStream(This,wStreamNum);
}
/*** IWMMutualExclusion methods ***/
static FORCEINLINE HRESULT IWMMutualExclusion_GetType(IWMMutualExclusion* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMMutualExclusion_SetType(IWMMutualExclusion* This,REFGUID guidType) {
    return This->lpVtbl->SetType(This,guidType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMMutualExclusion_GetType_Proxy(
    IWMMutualExclusion* This,
    GUID *pguidType);
void __RPC_STUB IWMMutualExclusion_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMMutualExclusion_SetType_Proxy(
    IWMMutualExclusion* This,
    REFGUID guidType);
void __RPC_STUB IWMMutualExclusion_SetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMMutualExclusion_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMStreamConfig interface
 */
#ifndef __IWMStreamConfig_INTERFACE_DEFINED__
#define __IWMStreamConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStreamConfig, 0x96406bdc, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bdc-2b2b-11d3-b36b-00c04f6108ff")
IWMStreamConfig : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamType(
        GUID *pguidStreamType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamNumber(
        WORD *pwStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamNumber(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamName(
        WCHAR *pwszStreamName,
        WORD *pcchStreamName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamName(
        LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
        WCHAR *pwszInputName,
        WORD *pcchInputName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConnectionName(
        LPCWSTR_WMSDK_TYPE_SAFE pwszInputName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBitrate(
        DWORD *pdwBitrate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBitrate(
        DWORD pdwBitrate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBufferWindow(
        DWORD *pmsBufferWindow) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBufferWindow(
        DWORD msBufferWindow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStreamConfig, 0x96406bdc, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMStreamConfigVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamType)(
        IWMStreamConfig* This,
        GUID *pguidStreamType);

    HRESULT (STDMETHODCALLTYPE *GetStreamNumber)(
        IWMStreamConfig* This,
        WORD *pwStreamNum);

    HRESULT (STDMETHODCALLTYPE *SetStreamNumber)(
        IWMStreamConfig* This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *GetStreamName)(
        IWMStreamConfig* This,
        WCHAR *pwszStreamName,
        WORD *pcchStreamName);

    HRESULT (STDMETHODCALLTYPE *SetStreamName)(
        IWMStreamConfig* This,
        LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName);

    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
        IWMStreamConfig* This,
        WCHAR *pwszInputName,
        WORD *pcchInputName);

    HRESULT (STDMETHODCALLTYPE *SetConnectionName)(
        IWMStreamConfig* This,
        LPCWSTR_WMSDK_TYPE_SAFE pwszInputName);

    HRESULT (STDMETHODCALLTYPE *GetBitrate)(
        IWMStreamConfig* This,
        DWORD *pdwBitrate);

    HRESULT (STDMETHODCALLTYPE *SetBitrate)(
        IWMStreamConfig* This,
        DWORD pdwBitrate);

    HRESULT (STDMETHODCALLTYPE *GetBufferWindow)(
        IWMStreamConfig* This,
        DWORD *pmsBufferWindow);

    HRESULT (STDMETHODCALLTYPE *SetBufferWindow)(
        IWMStreamConfig* This,
        DWORD msBufferWindow);

    END_INTERFACE
} IWMStreamConfigVtbl;
interface IWMStreamConfig {
    CONST_VTBL IWMStreamConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStreamConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStreamConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStreamConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamConfig methods ***/
#define IWMStreamConfig_GetStreamType(This,pguidStreamType) (This)->lpVtbl->GetStreamType(This,pguidStreamType)
#define IWMStreamConfig_GetStreamNumber(This,pwStreamNum) (This)->lpVtbl->GetStreamNumber(This,pwStreamNum)
#define IWMStreamConfig_SetStreamNumber(This,wStreamNum) (This)->lpVtbl->SetStreamNumber(This,wStreamNum)
#define IWMStreamConfig_GetStreamName(This,pwszStreamName,pcchStreamName) (This)->lpVtbl->GetStreamName(This,pwszStreamName,pcchStreamName)
#define IWMStreamConfig_SetStreamName(This,pwszStreamName) (This)->lpVtbl->SetStreamName(This,pwszStreamName)
#define IWMStreamConfig_GetConnectionName(This,pwszInputName,pcchInputName) (This)->lpVtbl->GetConnectionName(This,pwszInputName,pcchInputName)
#define IWMStreamConfig_SetConnectionName(This,pwszInputName) (This)->lpVtbl->SetConnectionName(This,pwszInputName)
#define IWMStreamConfig_GetBitrate(This,pdwBitrate) (This)->lpVtbl->GetBitrate(This,pdwBitrate)
#define IWMStreamConfig_SetBitrate(This,pdwBitrate) (This)->lpVtbl->SetBitrate(This,pdwBitrate)
#define IWMStreamConfig_GetBufferWindow(This,pmsBufferWindow) (This)->lpVtbl->GetBufferWindow(This,pmsBufferWindow)
#define IWMStreamConfig_SetBufferWindow(This,msBufferWindow) (This)->lpVtbl->SetBufferWindow(This,msBufferWindow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStreamConfig_QueryInterface(IWMStreamConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStreamConfig_AddRef(IWMStreamConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStreamConfig_Release(IWMStreamConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamConfig methods ***/
static FORCEINLINE HRESULT IWMStreamConfig_GetStreamType(IWMStreamConfig* This,GUID *pguidStreamType) {
    return This->lpVtbl->GetStreamType(This,pguidStreamType);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetStreamNumber(IWMStreamConfig* This,WORD *pwStreamNum) {
    return This->lpVtbl->GetStreamNumber(This,pwStreamNum);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetStreamNumber(IWMStreamConfig* This,WORD wStreamNum) {
    return This->lpVtbl->SetStreamNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetStreamName(IWMStreamConfig* This,WCHAR *pwszStreamName,WORD *pcchStreamName) {
    return This->lpVtbl->GetStreamName(This,pwszStreamName,pcchStreamName);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetStreamName(IWMStreamConfig* This,LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName) {
    return This->lpVtbl->SetStreamName(This,pwszStreamName);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetConnectionName(IWMStreamConfig* This,WCHAR *pwszInputName,WORD *pcchInputName) {
    return This->lpVtbl->GetConnectionName(This,pwszInputName,pcchInputName);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetConnectionName(IWMStreamConfig* This,LPCWSTR_WMSDK_TYPE_SAFE pwszInputName) {
    return This->lpVtbl->SetConnectionName(This,pwszInputName);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetBitrate(IWMStreamConfig* This,DWORD *pdwBitrate) {
    return This->lpVtbl->GetBitrate(This,pdwBitrate);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetBitrate(IWMStreamConfig* This,DWORD pdwBitrate) {
    return This->lpVtbl->SetBitrate(This,pdwBitrate);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetBufferWindow(IWMStreamConfig* This,DWORD *pmsBufferWindow) {
    return This->lpVtbl->GetBufferWindow(This,pmsBufferWindow);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetBufferWindow(IWMStreamConfig* This,DWORD msBufferWindow) {
    return This->lpVtbl->SetBufferWindow(This,msBufferWindow);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMStreamConfig_GetStreamType_Proxy(
    IWMStreamConfig* This,
    GUID *pguidStreamType);
void __RPC_STUB IWMStreamConfig_GetStreamType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_GetStreamNumber_Proxy(
    IWMStreamConfig* This,
    WORD *pwStreamNum);
void __RPC_STUB IWMStreamConfig_GetStreamNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_SetStreamNumber_Proxy(
    IWMStreamConfig* This,
    WORD wStreamNum);
void __RPC_STUB IWMStreamConfig_SetStreamNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_GetStreamName_Proxy(
    IWMStreamConfig* This,
    WCHAR *pwszStreamName,
    WORD *pcchStreamName);
void __RPC_STUB IWMStreamConfig_GetStreamName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_SetStreamName_Proxy(
    IWMStreamConfig* This,
    LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName);
void __RPC_STUB IWMStreamConfig_SetStreamName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_GetConnectionName_Proxy(
    IWMStreamConfig* This,
    WCHAR *pwszInputName,
    WORD *pcchInputName);
void __RPC_STUB IWMStreamConfig_GetConnectionName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_SetConnectionName_Proxy(
    IWMStreamConfig* This,
    LPCWSTR_WMSDK_TYPE_SAFE pwszInputName);
void __RPC_STUB IWMStreamConfig_SetConnectionName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_GetBitrate_Proxy(
    IWMStreamConfig* This,
    DWORD *pdwBitrate);
void __RPC_STUB IWMStreamConfig_GetBitrate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_SetBitrate_Proxy(
    IWMStreamConfig* This,
    DWORD pdwBitrate);
void __RPC_STUB IWMStreamConfig_SetBitrate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_GetBufferWindow_Proxy(
    IWMStreamConfig* This,
    DWORD *pmsBufferWindow);
void __RPC_STUB IWMStreamConfig_GetBufferWindow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMStreamConfig_SetBufferWindow_Proxy(
    IWMStreamConfig* This,
    DWORD msBufferWindow);
void __RPC_STUB IWMStreamConfig_SetBufferWindow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMStreamConfig_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfile interface
 */
#ifndef __IWMProfile_INTERFACE_DEFINED__
#define __IWMProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfile, 0x96406bdb, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bdb-2b2b-11d3-b36b-00c04f6108ff")
IWMProfile : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetVersion(
        WMT_VERSION *pdwVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        WCHAR *pwszName,
        DWORD *pcchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        const WCHAR *pwszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        WCHAR *pwszDescription,
        DWORD *pcchDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        const WCHAR *pwszDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamCount(
        DWORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        DWORD dwStreamIndex,
        IWMStreamConfig **ppConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamByNumber(
        WORD wStreamNum,
        IWMStreamConfig **ppConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStream(
        IWMStreamConfig *pConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStreamByNumber(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStream(
        IWMStreamConfig *pConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReconfigStream(
        IWMStreamConfig *pConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewStream(
        REFGUID guidStreamType,
        IWMStreamConfig **ppConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMutualExclusionCount(
        DWORD *pcME) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMutualExclusion(
        DWORD dwMEIndex,
        IWMMutualExclusion **ppME) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMutualExclusion(
        IWMMutualExclusion *pME) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddMutualExclusion(
        IWMMutualExclusion *pME) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewMutualExclusion(
        IWMMutualExclusion **ppME) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfile, 0x96406bdb, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMProfileVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWMProfile* This,
        WMT_VERSION *pdwVersion);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IWMProfile* This,
        WCHAR *pwszName,
        DWORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IWMProfile* This,
        const WCHAR *pwszName);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IWMProfile* This,
        WCHAR *pwszDescription,
        DWORD *pcchDescription);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IWMProfile* This,
        const WCHAR *pwszDescription);

    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IWMProfile* This,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IWMProfile* This,
        DWORD dwStreamIndex,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetStreamByNumber)(
        IWMProfile* This,
        WORD wStreamNum,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMProfile* This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStreamByNumber)(
        IWMProfile* This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMProfile* This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *ReconfigStream)(
        IWMProfile* This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *CreateNewStream)(
        IWMProfile* This,
        REFGUID guidStreamType,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusionCount)(
        IWMProfile* This,
        DWORD *pcME);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusion)(
        IWMProfile* This,
        DWORD dwMEIndex,
        IWMMutualExclusion **ppME);

    HRESULT (STDMETHODCALLTYPE *RemoveMutualExclusion)(
        IWMProfile* This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *AddMutualExclusion)(
        IWMProfile* This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *CreateNewMutualExclusion)(
        IWMProfile* This,
        IWMMutualExclusion **ppME);

    END_INTERFACE
} IWMProfileVtbl;
interface IWMProfile {
    CONST_VTBL IWMProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfile methods ***/
#define IWMProfile_GetVersion(This,pdwVersion) (This)->lpVtbl->GetVersion(This,pdwVersion)
#define IWMProfile_GetName(This,pwszName,pcchName) (This)->lpVtbl->GetName(This,pwszName,pcchName)
#define IWMProfile_SetName(This,pwszName) (This)->lpVtbl->SetName(This,pwszName)
#define IWMProfile_GetDescription(This,pwszDescription,pcchDescription) (This)->lpVtbl->GetDescription(This,pwszDescription,pcchDescription)
#define IWMProfile_SetDescription(This,pwszDescription) (This)->lpVtbl->SetDescription(This,pwszDescription)
#define IWMProfile_GetStreamCount(This,pcStreams) (This)->lpVtbl->GetStreamCount(This,pcStreams)
#define IWMProfile_GetStream(This,dwStreamIndex,ppConfig) (This)->lpVtbl->GetStream(This,dwStreamIndex,ppConfig)
#define IWMProfile_GetStreamByNumber(This,wStreamNum,ppConfig) (This)->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig)
#define IWMProfile_RemoveStream(This,pConfig) (This)->lpVtbl->RemoveStream(This,pConfig)
#define IWMProfile_RemoveStreamByNumber(This,wStreamNum) (This)->lpVtbl->RemoveStreamByNumber(This,wStreamNum)
#define IWMProfile_AddStream(This,pConfig) (This)->lpVtbl->AddStream(This,pConfig)
#define IWMProfile_ReconfigStream(This,pConfig) (This)->lpVtbl->ReconfigStream(This,pConfig)
#define IWMProfile_CreateNewStream(This,guidStreamType,ppConfig) (This)->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig)
#define IWMProfile_GetMutualExclusionCount(This,pcME) (This)->lpVtbl->GetMutualExclusionCount(This,pcME)
#define IWMProfile_GetMutualExclusion(This,dwMEIndex,ppME) (This)->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME)
#define IWMProfile_RemoveMutualExclusion(This,pME) (This)->lpVtbl->RemoveMutualExclusion(This,pME)
#define IWMProfile_AddMutualExclusion(This,pME) (This)->lpVtbl->AddMutualExclusion(This,pME)
#define IWMProfile_CreateNewMutualExclusion(This,ppME) (This)->lpVtbl->CreateNewMutualExclusion(This,ppME)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfile_QueryInterface(IWMProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfile_AddRef(IWMProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfile_Release(IWMProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfile methods ***/
static FORCEINLINE HRESULT IWMProfile_GetVersion(IWMProfile* This,WMT_VERSION *pdwVersion) {
    return This->lpVtbl->GetVersion(This,pdwVersion);
}
static FORCEINLINE HRESULT IWMProfile_GetName(IWMProfile* This,WCHAR *pwszName,DWORD *pcchName) {
    return This->lpVtbl->GetName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMProfile_SetName(IWMProfile* This,const WCHAR *pwszName) {
    return This->lpVtbl->SetName(This,pwszName);
}
static FORCEINLINE HRESULT IWMProfile_GetDescription(IWMProfile* This,WCHAR *pwszDescription,DWORD *pcchDescription) {
    return This->lpVtbl->GetDescription(This,pwszDescription,pcchDescription);
}
static FORCEINLINE HRESULT IWMProfile_SetDescription(IWMProfile* This,const WCHAR *pwszDescription) {
    return This->lpVtbl->SetDescription(This,pwszDescription);
}
static FORCEINLINE HRESULT IWMProfile_GetStreamCount(IWMProfile* This,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamCount(This,pcStreams);
}
static FORCEINLINE HRESULT IWMProfile_GetStream(IWMProfile* This,DWORD dwStreamIndex,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStream(This,dwStreamIndex,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile_GetStreamByNumber(IWMProfile* This,WORD wStreamNum,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile_RemoveStream(IWMProfile* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->RemoveStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile_RemoveStreamByNumber(IWMProfile* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStreamByNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMProfile_AddStream(IWMProfile* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->AddStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile_ReconfigStream(IWMProfile* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->ReconfigStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile_CreateNewStream(IWMProfile* This,REFGUID guidStreamType,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile_GetMutualExclusionCount(IWMProfile* This,DWORD *pcME) {
    return This->lpVtbl->GetMutualExclusionCount(This,pcME);
}
static FORCEINLINE HRESULT IWMProfile_GetMutualExclusion(IWMProfile* This,DWORD dwMEIndex,IWMMutualExclusion **ppME) {
    return This->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME);
}
static FORCEINLINE HRESULT IWMProfile_RemoveMutualExclusion(IWMProfile* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->RemoveMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile_AddMutualExclusion(IWMProfile* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->AddMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile_CreateNewMutualExclusion(IWMProfile* This,IWMMutualExclusion **ppME) {
    return This->lpVtbl->CreateNewMutualExclusion(This,ppME);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMProfile_GetVersion_Proxy(
    IWMProfile* This,
    WMT_VERSION *pdwVersion);
void __RPC_STUB IWMProfile_GetVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetName_Proxy(
    IWMProfile* This,
    WCHAR *pwszName,
    DWORD *pcchName);
void __RPC_STUB IWMProfile_GetName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_SetName_Proxy(
    IWMProfile* This,
    const WCHAR *pwszName);
void __RPC_STUB IWMProfile_SetName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetDescription_Proxy(
    IWMProfile* This,
    WCHAR *pwszDescription,
    DWORD *pcchDescription);
void __RPC_STUB IWMProfile_GetDescription_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_SetDescription_Proxy(
    IWMProfile* This,
    const WCHAR *pwszDescription);
void __RPC_STUB IWMProfile_SetDescription_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetStreamCount_Proxy(
    IWMProfile* This,
    DWORD *pcStreams);
void __RPC_STUB IWMProfile_GetStreamCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetStream_Proxy(
    IWMProfile* This,
    DWORD dwStreamIndex,
    IWMStreamConfig **ppConfig);
void __RPC_STUB IWMProfile_GetStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetStreamByNumber_Proxy(
    IWMProfile* This,
    WORD wStreamNum,
    IWMStreamConfig **ppConfig);
void __RPC_STUB IWMProfile_GetStreamByNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_RemoveStream_Proxy(
    IWMProfile* This,
    IWMStreamConfig *pConfig);
void __RPC_STUB IWMProfile_RemoveStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_RemoveStreamByNumber_Proxy(
    IWMProfile* This,
    WORD wStreamNum);
void __RPC_STUB IWMProfile_RemoveStreamByNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_AddStream_Proxy(
    IWMProfile* This,
    IWMStreamConfig *pConfig);
void __RPC_STUB IWMProfile_AddStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_ReconfigStream_Proxy(
    IWMProfile* This,
    IWMStreamConfig *pConfig);
void __RPC_STUB IWMProfile_ReconfigStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_CreateNewStream_Proxy(
    IWMProfile* This,
    REFGUID guidStreamType,
    IWMStreamConfig **ppConfig);
void __RPC_STUB IWMProfile_CreateNewStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetMutualExclusionCount_Proxy(
    IWMProfile* This,
    DWORD *pcME);
void __RPC_STUB IWMProfile_GetMutualExclusionCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_GetMutualExclusion_Proxy(
    IWMProfile* This,
    DWORD dwMEIndex,
    IWMMutualExclusion **ppME);
void __RPC_STUB IWMProfile_GetMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_RemoveMutualExclusion_Proxy(
    IWMProfile* This,
    IWMMutualExclusion *pME);
void __RPC_STUB IWMProfile_RemoveMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_AddMutualExclusion_Proxy(
    IWMProfile* This,
    IWMMutualExclusion *pME);
void __RPC_STUB IWMProfile_AddMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfile_CreateNewMutualExclusion_Proxy(
    IWMProfile* This,
    IWMMutualExclusion **ppME);
void __RPC_STUB IWMProfile_CreateNewMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfileManager interface
 */
#ifndef __IWMProfileManager_INTERFACE_DEFINED__
#define __IWMProfileManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfileManager, 0xd16679f2, 0x6ca0, 0x472d, 0x8d,0x31, 0x2f,0x5d,0x55,0xae,0xe1,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d16679f2-6ca0-472d-8d31-2f5d55aee155")
IWMProfileManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateEmptyProfile(
        WMT_VERSION dwVersion,
        IWMProfile **ppProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadProfileByID(
        REFGUID guidProfile,
        IWMProfile **ppProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadProfileByData(
        const WCHAR *pwszProfile,
        IWMProfile **ppProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveProfile(
        IWMProfile *pIWMProfile,
        WCHAR *pwszProfile,
        DWORD *pdwLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSystemProfileCount(
        DWORD *pcProfiles) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadSystemProfile(
        DWORD dwProfileIndex,
        IWMProfile **ppProfile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfileManager, 0xd16679f2, 0x6ca0, 0x472d, 0x8d,0x31, 0x2f,0x5d,0x55,0xae,0xe1,0x55)
#endif
#else
typedef struct IWMProfileManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfileManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateEmptyProfile)(
        IWMProfileManager* This,
        WMT_VERSION dwVersion,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *LoadProfileByID)(
        IWMProfileManager* This,
        REFGUID guidProfile,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *LoadProfileByData)(
        IWMProfileManager* This,
        const WCHAR *pwszProfile,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *SaveProfile)(
        IWMProfileManager* This,
        IWMProfile *pIWMProfile,
        WCHAR *pwszProfile,
        DWORD *pdwLength);

    HRESULT (STDMETHODCALLTYPE *GetSystemProfileCount)(
        IWMProfileManager* This,
        DWORD *pcProfiles);

    HRESULT (STDMETHODCALLTYPE *LoadSystemProfile)(
        IWMProfileManager* This,
        DWORD dwProfileIndex,
        IWMProfile **ppProfile);

    END_INTERFACE
} IWMProfileManagerVtbl;
interface IWMProfileManager {
    CONST_VTBL IWMProfileManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfileManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfileManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfileManager_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfileManager methods ***/
#define IWMProfileManager_CreateEmptyProfile(This,dwVersion,ppProfile) (This)->lpVtbl->CreateEmptyProfile(This,dwVersion,ppProfile)
#define IWMProfileManager_LoadProfileByID(This,guidProfile,ppProfile) (This)->lpVtbl->LoadProfileByID(This,guidProfile,ppProfile)
#define IWMProfileManager_LoadProfileByData(This,pwszProfile,ppProfile) (This)->lpVtbl->LoadProfileByData(This,pwszProfile,ppProfile)
#define IWMProfileManager_SaveProfile(This,pIWMProfile,pwszProfile,pdwLength) (This)->lpVtbl->SaveProfile(This,pIWMProfile,pwszProfile,pdwLength)
#define IWMProfileManager_GetSystemProfileCount(This,pcProfiles) (This)->lpVtbl->GetSystemProfileCount(This,pcProfiles)
#define IWMProfileManager_LoadSystemProfile(This,dwProfileIndex,ppProfile) (This)->lpVtbl->LoadSystemProfile(This,dwProfileIndex,ppProfile)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfileManager_QueryInterface(IWMProfileManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfileManager_AddRef(IWMProfileManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfileManager_Release(IWMProfileManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfileManager methods ***/
static FORCEINLINE HRESULT IWMProfileManager_CreateEmptyProfile(IWMProfileManager* This,WMT_VERSION dwVersion,IWMProfile **ppProfile) {
    return This->lpVtbl->CreateEmptyProfile(This,dwVersion,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager_LoadProfileByID(IWMProfileManager* This,REFGUID guidProfile,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadProfileByID(This,guidProfile,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager_LoadProfileByData(IWMProfileManager* This,const WCHAR *pwszProfile,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadProfileByData(This,pwszProfile,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager_SaveProfile(IWMProfileManager* This,IWMProfile *pIWMProfile,WCHAR *pwszProfile,DWORD *pdwLength) {
    return This->lpVtbl->SaveProfile(This,pIWMProfile,pwszProfile,pdwLength);
}
static FORCEINLINE HRESULT IWMProfileManager_GetSystemProfileCount(IWMProfileManager* This,DWORD *pcProfiles) {
    return This->lpVtbl->GetSystemProfileCount(This,pcProfiles);
}
static FORCEINLINE HRESULT IWMProfileManager_LoadSystemProfile(IWMProfileManager* This,DWORD dwProfileIndex,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadSystemProfile(This,dwProfileIndex,ppProfile);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMProfileManager_CreateEmptyProfile_Proxy(
    IWMProfileManager* This,
    WMT_VERSION dwVersion,
    IWMProfile **ppProfile);
void __RPC_STUB IWMProfileManager_CreateEmptyProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfileManager_LoadProfileByID_Proxy(
    IWMProfileManager* This,
    REFGUID guidProfile,
    IWMProfile **ppProfile);
void __RPC_STUB IWMProfileManager_LoadProfileByID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfileManager_LoadProfileByData_Proxy(
    IWMProfileManager* This,
    const WCHAR *pwszProfile,
    IWMProfile **ppProfile);
void __RPC_STUB IWMProfileManager_LoadProfileByData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfileManager_SaveProfile_Proxy(
    IWMProfileManager* This,
    IWMProfile *pIWMProfile,
    WCHAR *pwszProfile,
    DWORD *pdwLength);
void __RPC_STUB IWMProfileManager_SaveProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfileManager_GetSystemProfileCount_Proxy(
    IWMProfileManager* This,
    DWORD *pcProfiles);
void __RPC_STUB IWMProfileManager_GetSystemProfileCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMProfileManager_LoadSystemProfile_Proxy(
    IWMProfileManager* This,
    DWORD dwProfileIndex,
    IWMProfile **ppProfile);
void __RPC_STUB IWMProfileManager_LoadSystemProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMProfileManager_INTERFACE_DEFINED__ */

HRESULT WINAPI WMCreateProfileManager(IWMProfileManager**);
/*****************************************************************************
 * IWMMediaProps interface
 */
#ifndef __IWMMediaProps_INTERFACE_DEFINED__
#define __IWMMediaProps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMMediaProps, 0x96406bce, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bce-2b2b-11d3-b36b-00c04f6108ff")
IWMMediaProps : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetType(
        GUID *pguidType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaType(
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaType(
        WM_MEDIA_TYPE *pType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMMediaProps, 0x96406bce, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMMediaPropsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWMMediaProps* This,
        GUID *pguidType);

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IWMMediaProps* This,
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IWMMediaProps* This,
        WM_MEDIA_TYPE *pType);

    END_INTERFACE
} IWMMediaPropsVtbl;
interface IWMMediaProps {
    CONST_VTBL IWMMediaPropsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMMediaProps_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMediaProps methods ***/
#define IWMMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
#define IWMMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMMediaProps_QueryInterface(IWMMediaProps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMMediaProps_AddRef(IWMMediaProps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMMediaProps_Release(IWMMediaProps* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMediaProps methods ***/
static FORCEINLINE HRESULT IWMMediaProps_GetType(IWMMediaProps* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMMediaProps_GetMediaType(IWMMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
    return This->lpVtbl->GetMediaType(This,pType,pcbType);
}
static FORCEINLINE HRESULT IWMMediaProps_SetMediaType(IWMMediaProps* This,WM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMMediaProps_GetType_Proxy(
    IWMMediaProps* This,
    GUID *pguidType);
void __RPC_STUB IWMMediaProps_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMMediaProps_GetMediaType_Proxy(
    IWMMediaProps* This,
    WM_MEDIA_TYPE *pType,
    DWORD *pcbType);
void __RPC_STUB IWMMediaProps_GetMediaType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMMediaProps_SetMediaType_Proxy(
    IWMMediaProps* This,
    WM_MEDIA_TYPE *pType);
void __RPC_STUB IWMMediaProps_SetMediaType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMMediaProps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMOutputMediaProps interface
 */
#ifndef __IWMOutputMediaProps_INTERFACE_DEFINED__
#define __IWMOutputMediaProps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMOutputMediaProps, 0x96406bd7, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd7-2b2b-11d3-b36b-00c04f6108ff")
IWMOutputMediaProps : public IWMMediaProps
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamGroupName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMOutputMediaProps, 0x96406bd7, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMOutputMediaPropsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWMOutputMediaProps* This,
        GUID *pguidType);

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IWMOutputMediaProps* This,
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IWMOutputMediaProps* This,
        WM_MEDIA_TYPE *pType);

    /*** IWMOutputMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamGroupName)(
        IWMOutputMediaProps* This,
        WCHAR *pwszName,
        WORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
        IWMOutputMediaProps* This,
        WCHAR *pwszName,
        WORD *pcchName);

    END_INTERFACE
} IWMOutputMediaPropsVtbl;
interface IWMOutputMediaProps {
    CONST_VTBL IWMOutputMediaPropsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMOutputMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMOutputMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMOutputMediaProps_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMediaProps methods ***/
#define IWMOutputMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMOutputMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
#define IWMOutputMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
/*** IWMOutputMediaProps methods ***/
#define IWMOutputMediaProps_GetStreamGroupName(This,pwszName,pcchName) (This)->lpVtbl->GetStreamGroupName(This,pwszName,pcchName)
#define IWMOutputMediaProps_GetConnectionName(This,pwszName,pcchName) (This)->lpVtbl->GetConnectionName(This,pwszName,pcchName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMOutputMediaProps_QueryInterface(IWMOutputMediaProps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMOutputMediaProps_AddRef(IWMOutputMediaProps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMOutputMediaProps_Release(IWMOutputMediaProps* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMediaProps methods ***/
static FORCEINLINE HRESULT IWMOutputMediaProps_GetType(IWMOutputMediaProps* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMOutputMediaProps_GetMediaType(IWMOutputMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
    return This->lpVtbl->GetMediaType(This,pType,pcbType);
}
static FORCEINLINE HRESULT IWMOutputMediaProps_SetMediaType(IWMOutputMediaProps* This,WM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
/*** IWMOutputMediaProps methods ***/
static FORCEINLINE HRESULT IWMOutputMediaProps_GetStreamGroupName(IWMOutputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetStreamGroupName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMOutputMediaProps_GetConnectionName(IWMOutputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetConnectionName(This,pwszName,pcchName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMOutputMediaProps_GetStreamGroupName_Proxy(
    IWMOutputMediaProps* This,
    WCHAR *pwszName,
    WORD *pcchName);
void __RPC_STUB IWMOutputMediaProps_GetStreamGroupName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMOutputMediaProps_GetConnectionName_Proxy(
    IWMOutputMediaProps* This,
    WCHAR *pwszName,
    WORD *pcchName);
void __RPC_STUB IWMOutputMediaProps_GetConnectionName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMOutputMediaProps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMMetadataEditor interface
 */
#ifndef __IWMMetadataEditor_INTERFACE_DEFINED__
#define __IWMMetadataEditor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMMetadataEditor, 0x96406bd9, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd9-2b2b-11d3-b36b-00c04f6108ff")
IWMMetadataEditor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMMetadataEditor, 0x96406bd9, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMMetadataEditorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMMetadataEditor methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IWMMetadataEditor* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWMMetadataEditor* This);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IWMMetadataEditor* This);

    END_INTERFACE
} IWMMetadataEditorVtbl;
interface IWMMetadataEditor {
    CONST_VTBL IWMMetadataEditorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMMetadataEditor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMMetadataEditor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMMetadataEditor_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMetadataEditor methods ***/
#define IWMMetadataEditor_Open(This,pwszFilename) (This)->lpVtbl->Open(This,pwszFilename)
#define IWMMetadataEditor_Close(This) (This)->lpVtbl->Close(This)
#define IWMMetadataEditor_Flush(This) (This)->lpVtbl->Flush(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMMetadataEditor_QueryInterface(IWMMetadataEditor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMMetadataEditor_AddRef(IWMMetadataEditor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMMetadataEditor_Release(IWMMetadataEditor* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMetadataEditor methods ***/
static FORCEINLINE HRESULT IWMMetadataEditor_Open(IWMMetadataEditor* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->Open(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMMetadataEditor_Close(IWMMetadataEditor* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IWMMetadataEditor_Flush(IWMMetadataEditor* This) {
    return This->lpVtbl->Flush(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMMetadataEditor_Open_Proxy(
    IWMMetadataEditor* This,
    const WCHAR *pwszFilename);
void __RPC_STUB IWMMetadataEditor_Open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMMetadataEditor_Close_Proxy(
    IWMMetadataEditor* This);
void __RPC_STUB IWMMetadataEditor_Close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMMetadataEditor_Flush_Proxy(
    IWMMetadataEditor* This);
void __RPC_STUB IWMMetadataEditor_Flush_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMMetadataEditor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReader interface
 */
#ifndef __IWMReader_INTERFACE_DEFINED__
#define __IWMReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReader, 0x96406bd6, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd6-2b2b-11d3-b36b-00c04f6108ff")
IWMReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *pwszURL,
        IWMReaderCallback *pCallback,
        void *pvContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputCount(
        DWORD *pcOutputs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormatCount(
        DWORD dwOutputNumber,
        DWORD *pcFormats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormat(
        DWORD dwOutputNumber,
        DWORD dwFormatNumber,
        IWMOutputMediaProps **ppProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE Start(
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate,
        void *pvContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReader, 0x96406bd6, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReader methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IWMReader* This,
        const WCHAR *pwszURL,
        IWMReaderCallback *pCallback,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWMReader* This);

    HRESULT (STDMETHODCALLTYPE *GetOutputCount)(
        IWMReader* This,
        DWORD *pcOutputs);

    HRESULT (STDMETHODCALLTYPE *GetOutputProps)(
        IWMReader* This,
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput);

    HRESULT (STDMETHODCALLTYPE *SetOutputProps)(
        IWMReader* This,
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormatCount)(
        IWMReader* This,
        DWORD dwOutputNumber,
        DWORD *pcFormats);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormat)(
        IWMReader* This,
        DWORD dwOutputNumber,
        DWORD dwFormatNumber,
        IWMOutputMediaProps **ppProps);

    HRESULT (STDMETHODCALLTYPE *Start)(
        IWMReader* This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IWMReader* This);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IWMReader* This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IWMReader* This);

    END_INTERFACE
} IWMReaderVtbl;
interface IWMReader {
    CONST_VTBL IWMReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReader_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReader methods ***/
#define IWMReader_Open(This,pwszURL,pCallback,pvContext) (This)->lpVtbl->Open(This,pwszURL,pCallback,pvContext)
#define IWMReader_Close(This) (This)->lpVtbl->Close(This)
#define IWMReader_GetOutputCount(This,pcOutputs) (This)->lpVtbl->GetOutputCount(This,pcOutputs)
#define IWMReader_GetOutputProps(This,dwOutputNum,ppOutput) (This)->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput)
#define IWMReader_SetOutputProps(This,dwOutputNum,pOutput) (This)->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput)
#define IWMReader_GetOutputFormatCount(This,dwOutputNumber,pcFormats) (This)->lpVtbl->GetOutputFormatCount(This,dwOutputNumber,pcFormats)
#define IWMReader_GetOutputFormat(This,dwOutputNumber,dwFormatNumber,ppProps) (This)->lpVtbl->GetOutputFormat(This,dwOutputNumber,dwFormatNumber,ppProps)
#define IWMReader_Start(This,cnsStart,cnsDuration,fRate,pvContext) (This)->lpVtbl->Start(This,cnsStart,cnsDuration,fRate,pvContext)
#define IWMReader_Stop(This) (This)->lpVtbl->Stop(This)
#define IWMReader_Pause(This) (This)->lpVtbl->Pause(This)
#define IWMReader_Resume(This) (This)->lpVtbl->Resume(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReader_QueryInterface(IWMReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReader_AddRef(IWMReader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReader_Release(IWMReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReader methods ***/
static FORCEINLINE HRESULT IWMReader_Open(IWMReader* This,const WCHAR *pwszURL,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->Open(This,pwszURL,pCallback,pvContext);
}
static FORCEINLINE HRESULT IWMReader_Close(IWMReader* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IWMReader_GetOutputCount(IWMReader* This,DWORD *pcOutputs) {
    return This->lpVtbl->GetOutputCount(This,pcOutputs);
}
static FORCEINLINE HRESULT IWMReader_GetOutputProps(IWMReader* This,DWORD dwOutputNum,IWMOutputMediaProps **ppOutput) {
    return This->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput);
}
static FORCEINLINE HRESULT IWMReader_SetOutputProps(IWMReader* This,DWORD dwOutputNum,IWMOutputMediaProps *pOutput) {
    return This->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput);
}
static FORCEINLINE HRESULT IWMReader_GetOutputFormatCount(IWMReader* This,DWORD dwOutputNumber,DWORD *pcFormats) {
    return This->lpVtbl->GetOutputFormatCount(This,dwOutputNumber,pcFormats);
}
static FORCEINLINE HRESULT IWMReader_GetOutputFormat(IWMReader* This,DWORD dwOutputNumber,DWORD dwFormatNumber,IWMOutputMediaProps **ppProps) {
    return This->lpVtbl->GetOutputFormat(This,dwOutputNumber,dwFormatNumber,ppProps);
}
static FORCEINLINE HRESULT IWMReader_Start(IWMReader* This,QWORD cnsStart,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->Start(This,cnsStart,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReader_Stop(IWMReader* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT IWMReader_Pause(IWMReader* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IWMReader_Resume(IWMReader* This) {
    return This->lpVtbl->Resume(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReader_Open_Proxy(
    IWMReader* This,
    const WCHAR *pwszURL,
    IWMReaderCallback *pCallback,
    void *pvContext);
void __RPC_STUB IWMReader_Open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_Close_Proxy(
    IWMReader* This);
void __RPC_STUB IWMReader_Close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_GetOutputCount_Proxy(
    IWMReader* This,
    DWORD *pcOutputs);
void __RPC_STUB IWMReader_GetOutputCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_GetOutputProps_Proxy(
    IWMReader* This,
    DWORD dwOutputNum,
    IWMOutputMediaProps **ppOutput);
void __RPC_STUB IWMReader_GetOutputProps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_SetOutputProps_Proxy(
    IWMReader* This,
    DWORD dwOutputNum,
    IWMOutputMediaProps *pOutput);
void __RPC_STUB IWMReader_SetOutputProps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_GetOutputFormatCount_Proxy(
    IWMReader* This,
    DWORD dwOutputNumber,
    DWORD *pcFormats);
void __RPC_STUB IWMReader_GetOutputFormatCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_GetOutputFormat_Proxy(
    IWMReader* This,
    DWORD dwOutputNumber,
    DWORD dwFormatNumber,
    IWMOutputMediaProps **ppProps);
void __RPC_STUB IWMReader_GetOutputFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_Start_Proxy(
    IWMReader* This,
    QWORD cnsStart,
    QWORD cnsDuration,
    float fRate,
    void *pvContext);
void __RPC_STUB IWMReader_Start_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_Stop_Proxy(
    IWMReader* This);
void __RPC_STUB IWMReader_Stop_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_Pause_Proxy(
    IWMReader* This);
void __RPC_STUB IWMReader_Pause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReader_Resume_Proxy(
    IWMReader* This);
void __RPC_STUB IWMReader_Resume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPlayerHook interface
 */
#ifndef __IWMPlayerHook_INTERFACE_DEFINED__
#define __IWMPlayerHook_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPlayerHook, 0xe5b7ca9a, 0x0f1c, 0x4f66, 0x90,0x02, 0x74,0xec,0x50,0xd8,0xb3,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e5b7ca9a-0f1c-4f66-9002-74ec50d8b304")
IWMPlayerHook : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PreDecode(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPlayerHook, 0xe5b7ca9a, 0x0f1c, 0x4f66, 0x90,0x02, 0x74,0xec,0x50,0xd8,0xb3,0x04)
#endif
#else
typedef struct IWMPlayerHookVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPlayerHook methods ***/
    HRESULT (STDMETHODCALLTYPE *PreDecode)(
        IWMPlayerHook* This);

    END_INTERFACE
} IWMPlayerHookVtbl;
interface IWMPlayerHook {
    CONST_VTBL IWMPlayerHookVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPlayerHook_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPlayerHook_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPlayerHook_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPlayerHook methods ***/
#define IWMPlayerHook_PreDecode(This) (This)->lpVtbl->PreDecode(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMPlayerHook_QueryInterface(IWMPlayerHook* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPlayerHook_AddRef(IWMPlayerHook* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPlayerHook_Release(IWMPlayerHook* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPlayerHook methods ***/
static FORCEINLINE HRESULT IWMPlayerHook_PreDecode(IWMPlayerHook* This) {
    return This->lpVtbl->PreDecode(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMPlayerHook_PreDecode_Proxy(
    IWMPlayerHook* This);
void __RPC_STUB IWMPlayerHook_PreDecode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMPlayerHook_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced interface
 */
#ifndef __IWMReaderAdvanced_INTERFACE_DEFINED__
#define __IWMReaderAdvanced_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced, 0x96406bea, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bea-2b2b-11d3-b36b-00c04f6108ff")
IWMReaderAdvanced : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetUserProvidedClock(
        WINBOOL fUserClock) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserProvidedClock(
        WINBOOL *pfUserClock) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeliverTime(
        QWORD cnsTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetManualStreamSelection(
        WINBOOL fSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetManualStreamSelection(
        WINBOOL *pfSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamsSelected(
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamSelected(
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReceiveSelectionCallbacks(
        WINBOOL fGetCallbacks) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReceiveSelectionCallbacks(
        WINBOOL *pfGetCallbacks) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReceiveStreamSamples(
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReceiveStreamSamples(
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAllocateForOutput(
        DWORD dwOutputNum,
        WINBOOL fAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllocateForOutput(
        DWORD dwOutputNum,
        WINBOOL *pfAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAllocateForStream(
        WORD wStreamNum,
        WINBOOL fAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllocateForStream(
        WORD dwSreamNum,
        WINBOOL *pfAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
        WM_READER_STATISTICS *pStatistics) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClientInfo(
        WM_READER_CLIENTINFO *pClientInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxOutputSampleSize(
        DWORD dwOutput,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxStreamSampleSize(
        WORD wStream,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE NotifyLateDelivery(
        QWORD cnsLateness) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced, 0x96406bea, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderAdvancedVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced* This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced* This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced* This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced* This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced* This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced* This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced* This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced* This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced* This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced* This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced* This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced* This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced* This,
        WORD dwSreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced* This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced* This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced* This,
        QWORD cnsLateness);

    END_INTERFACE
} IWMReaderAdvancedVtbl;
interface IWMReaderAdvanced {
    CONST_VTBL IWMReaderAdvancedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced_GetAllocateForStream(This,dwSreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate)
#define IWMReaderAdvanced_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced_QueryInterface(IWMReaderAdvanced* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced_AddRef(IWMReaderAdvanced* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced_Release(IWMReaderAdvanced* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced_SetUserProvidedClock(IWMReaderAdvanced* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetUserProvidedClock(IWMReaderAdvanced* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_DeliverTime(IWMReaderAdvanced* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetManualStreamSelection(IWMReaderAdvanced* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetManualStreamSelection(IWMReaderAdvanced* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetStreamsSelected(IWMReaderAdvanced* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetStreamSelected(IWMReaderAdvanced* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetReceiveSelectionCallbacks(IWMReaderAdvanced* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetReceiveSelectionCallbacks(IWMReaderAdvanced* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetReceiveStreamSamples(IWMReaderAdvanced* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetReceiveStreamSamples(IWMReaderAdvanced* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetAllocateForOutput(IWMReaderAdvanced* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetAllocateForOutput(IWMReaderAdvanced* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetAllocateForStream(IWMReaderAdvanced* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetAllocateForStream(IWMReaderAdvanced* This,WORD dwSreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetStatistics(IWMReaderAdvanced* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetClientInfo(IWMReaderAdvanced* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetMaxOutputSampleSize(IWMReaderAdvanced* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetMaxStreamSampleSize(IWMReaderAdvanced* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_NotifyLateDelivery(IWMReaderAdvanced* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetUserProvidedClock_Proxy(
    IWMReaderAdvanced* This,
    WINBOOL fUserClock);
void __RPC_STUB IWMReaderAdvanced_SetUserProvidedClock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetUserProvidedClock_Proxy(
    IWMReaderAdvanced* This,
    WINBOOL *pfUserClock);
void __RPC_STUB IWMReaderAdvanced_GetUserProvidedClock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_DeliverTime_Proxy(
    IWMReaderAdvanced* This,
    QWORD cnsTime);
void __RPC_STUB IWMReaderAdvanced_DeliverTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetManualStreamSelection_Proxy(
    IWMReaderAdvanced* This,
    WINBOOL fSelection);
void __RPC_STUB IWMReaderAdvanced_SetManualStreamSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetManualStreamSelection_Proxy(
    IWMReaderAdvanced* This,
    WINBOOL *pfSelection);
void __RPC_STUB IWMReaderAdvanced_GetManualStreamSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetStreamsSelected_Proxy(
    IWMReaderAdvanced* This,
    WORD cStreamCount,
    WORD *pwStreamNumbers,
    WMT_STREAM_SELECTION *pSelections);
void __RPC_STUB IWMReaderAdvanced_SetStreamsSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetStreamSelected_Proxy(
    IWMReaderAdvanced* This,
    WORD wStreamNum,
    WMT_STREAM_SELECTION *pSelection);
void __RPC_STUB IWMReaderAdvanced_GetStreamSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetReceiveSelectionCallbacks_Proxy(
    IWMReaderAdvanced* This,
    WINBOOL fGetCallbacks);
void __RPC_STUB IWMReaderAdvanced_SetReceiveSelectionCallbacks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetReceiveSelectionCallbacks_Proxy(
    IWMReaderAdvanced* This,
    WINBOOL *pfGetCallbacks);
void __RPC_STUB IWMReaderAdvanced_GetReceiveSelectionCallbacks_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetReceiveStreamSamples_Proxy(
    IWMReaderAdvanced* This,
    WORD wStreamNum,
    WINBOOL fReceiveStreamSamples);
void __RPC_STUB IWMReaderAdvanced_SetReceiveStreamSamples_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetReceiveStreamSamples_Proxy(
    IWMReaderAdvanced* This,
    WORD wStreamNum,
    WINBOOL *pfReceiveStreamSamples);
void __RPC_STUB IWMReaderAdvanced_GetReceiveStreamSamples_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetAllocateForOutput_Proxy(
    IWMReaderAdvanced* This,
    DWORD dwOutputNum,
    WINBOOL fAllocate);
void __RPC_STUB IWMReaderAdvanced_SetAllocateForOutput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetAllocateForOutput_Proxy(
    IWMReaderAdvanced* This,
    DWORD dwOutputNum,
    WINBOOL *pfAllocate);
void __RPC_STUB IWMReaderAdvanced_GetAllocateForOutput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetAllocateForStream_Proxy(
    IWMReaderAdvanced* This,
    WORD wStreamNum,
    WINBOOL fAllocate);
void __RPC_STUB IWMReaderAdvanced_SetAllocateForStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetAllocateForStream_Proxy(
    IWMReaderAdvanced* This,
    WORD dwSreamNum,
    WINBOOL *pfAllocate);
void __RPC_STUB IWMReaderAdvanced_GetAllocateForStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetStatistics_Proxy(
    IWMReaderAdvanced* This,
    WM_READER_STATISTICS *pStatistics);
void __RPC_STUB IWMReaderAdvanced_GetStatistics_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_SetClientInfo_Proxy(
    IWMReaderAdvanced* This,
    WM_READER_CLIENTINFO *pClientInfo);
void __RPC_STUB IWMReaderAdvanced_SetClientInfo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetMaxOutputSampleSize_Proxy(
    IWMReaderAdvanced* This,
    DWORD dwOutput,
    DWORD *pcbMax);
void __RPC_STUB IWMReaderAdvanced_GetMaxOutputSampleSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_GetMaxStreamSampleSize_Proxy(
    IWMReaderAdvanced* This,
    WORD wStream,
    DWORD *pcbMax);
void __RPC_STUB IWMReaderAdvanced_GetMaxStreamSampleSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced_NotifyLateDelivery_Proxy(
    IWMReaderAdvanced* This,
    QWORD cnsLateness);
void __RPC_STUB IWMReaderAdvanced_NotifyLateDelivery_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderAdvanced_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced2 interface
 */
#ifndef __IWMReaderAdvanced2_INTERFACE_DEFINED__
#define __IWMReaderAdvanced2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced2, 0xae14a945, 0xb90c, 0x4d0d, 0x91,0x27, 0x80,0xd6,0x65,0xf7,0xd7,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae14a945-b90c-4d0d-9127-80d665f7d73e")
IWMReaderAdvanced2 : public IWMReaderAdvanced
{
    virtual HRESULT STDMETHODCALLTYPE SetPlayMode(
        WMT_PLAY_MODE Mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPlayMode(
        WMT_PLAY_MODE *pMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBufferProgress(
        DWORD *pdwPercent,
        QWORD *pcnsBuffering) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDownloadProgress(
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSaveAsProgress(
        DWORD *pdwPercent) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveFileAs(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProtocolName(
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartAtMarker(
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE Preroll(
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLogClientID(
        WINBOOL fLogClientID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLogClientID(
        WINBOOL *pfLogClientID) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopBuffering(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenStream(
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced2, 0xae14a945, 0xb90c, 0x4d0d, 0x91,0x27, 0x80,0xd6,0x65,0xf7,0xd7,0x3e)
#endif
#else
typedef struct IWMReaderAdvanced2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced2* This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced2* This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced2* This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced2* This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced2* This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced2* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced2* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced2* This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced2* This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced2* This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced2* This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced2* This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced2* This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced2* This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced2* This,
        WORD dwSreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced2* This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced2* This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced2* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced2* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced2* This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced2* This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced2* This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced2* This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced2* This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced2* This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced2* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced2* This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced2* This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced2* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced2* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced2* This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced2* This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced2* This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced2* This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced2* This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    END_INTERFACE
} IWMReaderAdvanced2Vtbl;
interface IWMReaderAdvanced2 {
    CONST_VTBL IWMReaderAdvanced2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced2_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced2_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced2_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced2_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced2_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced2_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced2_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced2_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced2_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced2_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced2_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced2_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced2_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced2_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced2_GetAllocateForStream(This,dwSreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate)
#define IWMReaderAdvanced2_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced2_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced2_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced2_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced2_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced2_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced2_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced2_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced2_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced2_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced2_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced2_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced2_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced2_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced2_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced2_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced2_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced2_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced2_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced2_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced2_QueryInterface(IWMReaderAdvanced2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced2_AddRef(IWMReaderAdvanced2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced2_Release(IWMReaderAdvanced2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetUserProvidedClock(IWMReaderAdvanced2* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetUserProvidedClock(IWMReaderAdvanced2* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_DeliverTime(IWMReaderAdvanced2* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetManualStreamSelection(IWMReaderAdvanced2* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetManualStreamSelection(IWMReaderAdvanced2* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetStreamsSelected(IWMReaderAdvanced2* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetStreamSelected(IWMReaderAdvanced2* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetReceiveSelectionCallbacks(IWMReaderAdvanced2* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetReceiveSelectionCallbacks(IWMReaderAdvanced2* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetReceiveStreamSamples(IWMReaderAdvanced2* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetReceiveStreamSamples(IWMReaderAdvanced2* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetAllocateForOutput(IWMReaderAdvanced2* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetAllocateForOutput(IWMReaderAdvanced2* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetAllocateForStream(IWMReaderAdvanced2* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetAllocateForStream(IWMReaderAdvanced2* This,WORD dwSreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetStatistics(IWMReaderAdvanced2* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetClientInfo(IWMReaderAdvanced2* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetMaxOutputSampleSize(IWMReaderAdvanced2* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetMaxStreamSampleSize(IWMReaderAdvanced2* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_NotifyLateDelivery(IWMReaderAdvanced2* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetPlayMode(IWMReaderAdvanced2* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetPlayMode(IWMReaderAdvanced2* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetBufferProgress(IWMReaderAdvanced2* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetDownloadProgress(IWMReaderAdvanced2* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetSaveAsProgress(IWMReaderAdvanced2* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SaveFileAs(IWMReaderAdvanced2* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetProtocolName(IWMReaderAdvanced2* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_StartAtMarker(IWMReaderAdvanced2* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetOutputSetting(IWMReaderAdvanced2* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetOutputSetting(IWMReaderAdvanced2* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_Preroll(IWMReaderAdvanced2* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetLogClientID(IWMReaderAdvanced2* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetLogClientID(IWMReaderAdvanced2* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_StopBuffering(IWMReaderAdvanced2* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_OpenStream(IWMReaderAdvanced2* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_SetPlayMode_Proxy(
    IWMReaderAdvanced2* This,
    WMT_PLAY_MODE Mode);
void __RPC_STUB IWMReaderAdvanced2_SetPlayMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetPlayMode_Proxy(
    IWMReaderAdvanced2* This,
    WMT_PLAY_MODE *pMode);
void __RPC_STUB IWMReaderAdvanced2_GetPlayMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetBufferProgress_Proxy(
    IWMReaderAdvanced2* This,
    DWORD *pdwPercent,
    QWORD *pcnsBuffering);
void __RPC_STUB IWMReaderAdvanced2_GetBufferProgress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetDownloadProgress_Proxy(
    IWMReaderAdvanced2* This,
    DWORD *pdwPercent,
    QWORD *pqwBytesDownloaded,
    QWORD *pcnsDownload);
void __RPC_STUB IWMReaderAdvanced2_GetDownloadProgress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetSaveAsProgress_Proxy(
    IWMReaderAdvanced2* This,
    DWORD *pdwPercent);
void __RPC_STUB IWMReaderAdvanced2_GetSaveAsProgress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_SaveFileAs_Proxy(
    IWMReaderAdvanced2* This,
    const WCHAR *pwszFilename);
void __RPC_STUB IWMReaderAdvanced2_SaveFileAs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetProtocolName_Proxy(
    IWMReaderAdvanced2* This,
    WCHAR *pwszProtocol,
    DWORD *pcchProtocol);
void __RPC_STUB IWMReaderAdvanced2_GetProtocolName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_StartAtMarker_Proxy(
    IWMReaderAdvanced2* This,
    WORD wMarkerIndex,
    QWORD cnsDuration,
    float fRate,
    void *pvContext);
void __RPC_STUB IWMReaderAdvanced2_StartAtMarker_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetOutputSetting_Proxy(
    IWMReaderAdvanced2* This,
    DWORD dwOutputNum,
    LPCWSTR pszName,
    WMT_ATTR_DATATYPE *pType,
    BYTE *pValue,
    WORD *pcbLength);
void __RPC_STUB IWMReaderAdvanced2_GetOutputSetting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_SetOutputSetting_Proxy(
    IWMReaderAdvanced2* This,
    DWORD dwOutputNum,
    LPCWSTR pszName,
    WMT_ATTR_DATATYPE Type,
    const BYTE *pValue,
    WORD cbLength);
void __RPC_STUB IWMReaderAdvanced2_SetOutputSetting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_Preroll_Proxy(
    IWMReaderAdvanced2* This,
    QWORD cnsStart,
    QWORD cnsDuration,
    float fRate);
void __RPC_STUB IWMReaderAdvanced2_Preroll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_SetLogClientID_Proxy(
    IWMReaderAdvanced2* This,
    WINBOOL fLogClientID);
void __RPC_STUB IWMReaderAdvanced2_SetLogClientID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_GetLogClientID_Proxy(
    IWMReaderAdvanced2* This,
    WINBOOL *pfLogClientID);
void __RPC_STUB IWMReaderAdvanced2_GetLogClientID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_StopBuffering_Proxy(
    IWMReaderAdvanced2* This);
void __RPC_STUB IWMReaderAdvanced2_StopBuffering_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced2_OpenStream_Proxy(
    IWMReaderAdvanced2* This,
    IStream *pStream,
    IWMReaderCallback *pCallback,
    void *pvContext);
void __RPC_STUB IWMReaderAdvanced2_OpenStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderAdvanced2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced3 interface
 */
#ifndef __IWMReaderAdvanced3_INTERFACE_DEFINED__
#define __IWMReaderAdvanced3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced3, 0x5dc0674b, 0xf04b, 0x4a4e, 0x9f,0x2a, 0xb1,0xaf,0xde,0x2c,0x81,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5dc0674b-f04b-4a4e-9f2a-b1afde2c8100")
IWMReaderAdvanced3 : public IWMReaderAdvanced2
{
    virtual HRESULT STDMETHODCALLTYPE StopNetStreaming(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartAtPosition(
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced3, 0x5dc0674b, 0xf04b, 0x4a4e, 0x9f,0x2a, 0xb1,0xaf,0xde,0x2c,0x81,0x00)
#endif
#else
typedef struct IWMReaderAdvanced3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced3* This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced3* This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced3* This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced3* This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced3* This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced3* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced3* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced3* This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced3* This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced3* This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced3* This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced3* This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced3* This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced3* This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced3* This,
        WORD dwSreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced3* This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced3* This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced3* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced3* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced3* This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced3* This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced3* This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced3* This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced3* This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced3* This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced3* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced3* This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced3* This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced3* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced3* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced3* This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced3* This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced3* This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced3* This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced3* This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced3* This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced3* This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    END_INTERFACE
} IWMReaderAdvanced3Vtbl;
interface IWMReaderAdvanced3 {
    CONST_VTBL IWMReaderAdvanced3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced3_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced3_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced3_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced3_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced3_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced3_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced3_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced3_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced3_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced3_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced3_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced3_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced3_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced3_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced3_GetAllocateForStream(This,dwSreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate)
#define IWMReaderAdvanced3_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced3_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced3_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced3_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced3_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced3_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced3_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced3_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced3_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced3_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced3_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced3_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced3_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced3_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced3_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced3_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced3_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced3_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced3_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced3_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced3_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced3_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_QueryInterface(IWMReaderAdvanced3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced3_AddRef(IWMReaderAdvanced3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced3_Release(IWMReaderAdvanced3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetUserProvidedClock(IWMReaderAdvanced3* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetUserProvidedClock(IWMReaderAdvanced3* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_DeliverTime(IWMReaderAdvanced3* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetManualStreamSelection(IWMReaderAdvanced3* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetManualStreamSelection(IWMReaderAdvanced3* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetStreamsSelected(IWMReaderAdvanced3* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetStreamSelected(IWMReaderAdvanced3* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetReceiveSelectionCallbacks(IWMReaderAdvanced3* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetReceiveSelectionCallbacks(IWMReaderAdvanced3* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetReceiveStreamSamples(IWMReaderAdvanced3* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetReceiveStreamSamples(IWMReaderAdvanced3* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetAllocateForOutput(IWMReaderAdvanced3* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetAllocateForOutput(IWMReaderAdvanced3* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetAllocateForStream(IWMReaderAdvanced3* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetAllocateForStream(IWMReaderAdvanced3* This,WORD dwSreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetStatistics(IWMReaderAdvanced3* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetClientInfo(IWMReaderAdvanced3* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetMaxOutputSampleSize(IWMReaderAdvanced3* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetMaxStreamSampleSize(IWMReaderAdvanced3* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_NotifyLateDelivery(IWMReaderAdvanced3* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetPlayMode(IWMReaderAdvanced3* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetPlayMode(IWMReaderAdvanced3* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetBufferProgress(IWMReaderAdvanced3* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetDownloadProgress(IWMReaderAdvanced3* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetSaveAsProgress(IWMReaderAdvanced3* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SaveFileAs(IWMReaderAdvanced3* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetProtocolName(IWMReaderAdvanced3* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_StartAtMarker(IWMReaderAdvanced3* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetOutputSetting(IWMReaderAdvanced3* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetOutputSetting(IWMReaderAdvanced3* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_Preroll(IWMReaderAdvanced3* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetLogClientID(IWMReaderAdvanced3* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetLogClientID(IWMReaderAdvanced3* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_StopBuffering(IWMReaderAdvanced3* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_OpenStream(IWMReaderAdvanced3* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_StopNetStreaming(IWMReaderAdvanced3* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_StartAtPosition(IWMReaderAdvanced3* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderAdvanced3_StopNetStreaming_Proxy(
    IWMReaderAdvanced3* This);
void __RPC_STUB IWMReaderAdvanced3_StopNetStreaming_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced3_StartAtPosition_Proxy(
    IWMReaderAdvanced3* This,
    WORD wStreamNum,
    void *pvOffsetStart,
    void *pvDuration,
    WMT_OFFSET_FORMAT dwOffsetFormat,
    float fRate,
    void *pvContext);
void __RPC_STUB IWMReaderAdvanced3_StartAtPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderAdvanced3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced4 interface
 */
#ifndef __IWMReaderAdvanced4_INTERFACE_DEFINED__
#define __IWMReaderAdvanced4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced4, 0x945a76a2, 0x12ae, 0x4d48, 0xbd,0x3c, 0xcd,0x1d,0x90,0x39,0x9b,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("945a76a2-12ae-4d48-bd3c-cd1d90399b85")
IWMReaderAdvanced4 : public IWMReaderAdvanced3
{
    virtual HRESULT STDMETHODCALLTYPE GetLanguageCount(
        DWORD dwOutputNum,
        WORD *pwLanguageCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguage(
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxSpeedFactor(
        double *pdblFactor) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsUsingFastCache(
        WINBOOL *pfUsingFastCache) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddLogParam(
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendLogParams(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CanSaveFileAs(
        WINBOOL *pfCanSave) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelSaveFileAs(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetURL(
        WCHAR *pwszURL,
        DWORD *pcchURL) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced4, 0x945a76a2, 0x12ae, 0x4d48, 0xbd,0x3c, 0xcd,0x1d,0x90,0x39,0x9b,0x85)
#endif
#else
typedef struct IWMReaderAdvanced4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced4* This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced4* This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced4* This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced4* This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced4* This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced4* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced4* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced4* This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced4* This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced4* This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced4* This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced4* This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced4* This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced4* This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced4* This,
        WORD dwSreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced4* This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced4* This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced4* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced4* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced4* This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced4* This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced4* This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced4* This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced4* This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced4* This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced4* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced4* This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced4* This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced4* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced4* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced4* This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced4* This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced4* This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced4* This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced4* This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced4* This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced4* This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    /*** IWMReaderAdvanced4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMReaderAdvanced4* This,
        DWORD dwOutputNum,
        WORD *pwLanguageCount);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IWMReaderAdvanced4* This,
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength);

    HRESULT (STDMETHODCALLTYPE *GetMaxSpeedFactor)(
        IWMReaderAdvanced4* This,
        double *pdblFactor);

    HRESULT (STDMETHODCALLTYPE *IsUsingFastCache)(
        IWMReaderAdvanced4* This,
        WINBOOL *pfUsingFastCache);

    HRESULT (STDMETHODCALLTYPE *AddLogParam)(
        IWMReaderAdvanced4* This,
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SendLogParams)(
        IWMReaderAdvanced4* This);

    HRESULT (STDMETHODCALLTYPE *CanSaveFileAs)(
        IWMReaderAdvanced4* This,
        WINBOOL *pfCanSave);

    HRESULT (STDMETHODCALLTYPE *CancelSaveFileAs)(
        IWMReaderAdvanced4* This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IWMReaderAdvanced4* This,
        WCHAR *pwszURL,
        DWORD *pcchURL);

    END_INTERFACE
} IWMReaderAdvanced4Vtbl;
interface IWMReaderAdvanced4 {
    CONST_VTBL IWMReaderAdvanced4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced4_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced4_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced4_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced4_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced4_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced4_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced4_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced4_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced4_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced4_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced4_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced4_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced4_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced4_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced4_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced4_GetAllocateForStream(This,dwSreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate)
#define IWMReaderAdvanced4_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced4_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced4_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced4_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced4_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced4_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced4_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced4_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced4_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced4_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced4_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced4_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced4_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced4_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced4_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced4_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced4_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced4_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced4_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced4_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced4_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced4_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
/*** IWMReaderAdvanced4 methods ***/
#define IWMReaderAdvanced4_GetLanguageCount(This,dwOutputNum,pwLanguageCount) (This)->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount)
#define IWMReaderAdvanced4_GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength) (This)->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength)
#define IWMReaderAdvanced4_GetMaxSpeedFactor(This,pdblFactor) (This)->lpVtbl->GetMaxSpeedFactor(This,pdblFactor)
#define IWMReaderAdvanced4_IsUsingFastCache(This,pfUsingFastCache) (This)->lpVtbl->IsUsingFastCache(This,pfUsingFastCache)
#define IWMReaderAdvanced4_AddLogParam(This,wszNameSpace,wszName,wszValue) (This)->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue)
#define IWMReaderAdvanced4_SendLogParams(This) (This)->lpVtbl->SendLogParams(This)
#define IWMReaderAdvanced4_CanSaveFileAs(This,pfCanSave) (This)->lpVtbl->CanSaveFileAs(This,pfCanSave)
#define IWMReaderAdvanced4_CancelSaveFileAs(This) (This)->lpVtbl->CancelSaveFileAs(This)
#define IWMReaderAdvanced4_GetURL(This,pwszURL,pcchURL) (This)->lpVtbl->GetURL(This,pwszURL,pcchURL)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_QueryInterface(IWMReaderAdvanced4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced4_AddRef(IWMReaderAdvanced4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced4_Release(IWMReaderAdvanced4* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetUserProvidedClock(IWMReaderAdvanced4* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetUserProvidedClock(IWMReaderAdvanced4* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_DeliverTime(IWMReaderAdvanced4* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetManualStreamSelection(IWMReaderAdvanced4* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetManualStreamSelection(IWMReaderAdvanced4* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetStreamsSelected(IWMReaderAdvanced4* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetStreamSelected(IWMReaderAdvanced4* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetReceiveSelectionCallbacks(IWMReaderAdvanced4* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetReceiveSelectionCallbacks(IWMReaderAdvanced4* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetReceiveStreamSamples(IWMReaderAdvanced4* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetReceiveStreamSamples(IWMReaderAdvanced4* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetAllocateForOutput(IWMReaderAdvanced4* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetAllocateForOutput(IWMReaderAdvanced4* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetAllocateForStream(IWMReaderAdvanced4* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetAllocateForStream(IWMReaderAdvanced4* This,WORD dwSreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetStatistics(IWMReaderAdvanced4* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetClientInfo(IWMReaderAdvanced4* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetMaxOutputSampleSize(IWMReaderAdvanced4* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetMaxStreamSampleSize(IWMReaderAdvanced4* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_NotifyLateDelivery(IWMReaderAdvanced4* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetPlayMode(IWMReaderAdvanced4* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetPlayMode(IWMReaderAdvanced4* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetBufferProgress(IWMReaderAdvanced4* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetDownloadProgress(IWMReaderAdvanced4* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetSaveAsProgress(IWMReaderAdvanced4* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SaveFileAs(IWMReaderAdvanced4* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetProtocolName(IWMReaderAdvanced4* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_StartAtMarker(IWMReaderAdvanced4* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetOutputSetting(IWMReaderAdvanced4* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetOutputSetting(IWMReaderAdvanced4* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_Preroll(IWMReaderAdvanced4* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetLogClientID(IWMReaderAdvanced4* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetLogClientID(IWMReaderAdvanced4* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_StopBuffering(IWMReaderAdvanced4* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_OpenStream(IWMReaderAdvanced4* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_StopNetStreaming(IWMReaderAdvanced4* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_StartAtPosition(IWMReaderAdvanced4* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
/*** IWMReaderAdvanced4 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetLanguageCount(IWMReaderAdvanced4* This,DWORD dwOutputNum,WORD *pwLanguageCount) {
    return This->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetLanguage(IWMReaderAdvanced4* This,DWORD dwOutputNum,WORD wLanguage,WCHAR *pwszLanguageString,WORD *pcchLanguageStringLength) {
    return This->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetMaxSpeedFactor(IWMReaderAdvanced4* This,double *pdblFactor) {
    return This->lpVtbl->GetMaxSpeedFactor(This,pdblFactor);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_IsUsingFastCache(IWMReaderAdvanced4* This,WINBOOL *pfUsingFastCache) {
    return This->lpVtbl->IsUsingFastCache(This,pfUsingFastCache);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_AddLogParam(IWMReaderAdvanced4* This,LPCWSTR wszNameSpace,LPCWSTR wszName,LPCWSTR wszValue) {
    return This->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SendLogParams(IWMReaderAdvanced4* This) {
    return This->lpVtbl->SendLogParams(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_CanSaveFileAs(IWMReaderAdvanced4* This,WINBOOL *pfCanSave) {
    return This->lpVtbl->CanSaveFileAs(This,pfCanSave);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_CancelSaveFileAs(IWMReaderAdvanced4* This) {
    return This->lpVtbl->CancelSaveFileAs(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetURL(IWMReaderAdvanced4* This,WCHAR *pwszURL,DWORD *pcchURL) {
    return This->lpVtbl->GetURL(This,pwszURL,pcchURL);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_GetLanguageCount_Proxy(
    IWMReaderAdvanced4* This,
    DWORD dwOutputNum,
    WORD *pwLanguageCount);
void __RPC_STUB IWMReaderAdvanced4_GetLanguageCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_GetLanguage_Proxy(
    IWMReaderAdvanced4* This,
    DWORD dwOutputNum,
    WORD wLanguage,
    WCHAR *pwszLanguageString,
    WORD *pcchLanguageStringLength);
void __RPC_STUB IWMReaderAdvanced4_GetLanguage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_GetMaxSpeedFactor_Proxy(
    IWMReaderAdvanced4* This,
    double *pdblFactor);
void __RPC_STUB IWMReaderAdvanced4_GetMaxSpeedFactor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_IsUsingFastCache_Proxy(
    IWMReaderAdvanced4* This,
    WINBOOL *pfUsingFastCache);
void __RPC_STUB IWMReaderAdvanced4_IsUsingFastCache_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_AddLogParam_Proxy(
    IWMReaderAdvanced4* This,
    LPCWSTR wszNameSpace,
    LPCWSTR wszName,
    LPCWSTR wszValue);
void __RPC_STUB IWMReaderAdvanced4_AddLogParam_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_SendLogParams_Proxy(
    IWMReaderAdvanced4* This);
void __RPC_STUB IWMReaderAdvanced4_SendLogParams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_CanSaveFileAs_Proxy(
    IWMReaderAdvanced4* This,
    WINBOOL *pfCanSave);
void __RPC_STUB IWMReaderAdvanced4_CanSaveFileAs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_CancelSaveFileAs_Proxy(
    IWMReaderAdvanced4* This);
void __RPC_STUB IWMReaderAdvanced4_CancelSaveFileAs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMReaderAdvanced4_GetURL_Proxy(
    IWMReaderAdvanced4* This,
    WCHAR *pwszURL,
    DWORD *pcchURL);
void __RPC_STUB IWMReaderAdvanced4_GetURL_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderAdvanced4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced5 interface
 */
#ifndef __IWMReaderAdvanced5_INTERFACE_DEFINED__
#define __IWMReaderAdvanced5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced5, 0x24c44db0, 0x55d1, 0x49ae, 0xa5,0xcc, 0xf1,0x38,0x15,0xe3,0x63,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24c44db0-55d1-49ae-a5cc-f13815e36363")
IWMReaderAdvanced5 : public IWMReaderAdvanced4
{
    virtual HRESULT STDMETHODCALLTYPE SetPlayerHook(
        DWORD dwOutputNum,
        IWMPlayerHook *pHook) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced5, 0x24c44db0, 0x55d1, 0x49ae, 0xa5,0xcc, 0xf1,0x38,0x15,0xe3,0x63,0x63)
#endif
#else
typedef struct IWMReaderAdvanced5Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced5* This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced5* This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced5* This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced5* This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced5* This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced5* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced5* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced5* This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced5* This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced5* This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced5* This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced5* This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced5* This,
        WORD dwSreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced5* This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced5* This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced5* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced5* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced5* This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced5* This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced5* This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced5* This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced5* This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced5* This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced5* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced5* This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced5* This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced5* This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced5* This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced5* This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced5* This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced5* This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced5* This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced5* This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    /*** IWMReaderAdvanced4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        WORD *pwLanguageCount);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength);

    HRESULT (STDMETHODCALLTYPE *GetMaxSpeedFactor)(
        IWMReaderAdvanced5* This,
        double *pdblFactor);

    HRESULT (STDMETHODCALLTYPE *IsUsingFastCache)(
        IWMReaderAdvanced5* This,
        WINBOOL *pfUsingFastCache);

    HRESULT (STDMETHODCALLTYPE *AddLogParam)(
        IWMReaderAdvanced5* This,
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SendLogParams)(
        IWMReaderAdvanced5* This);

    HRESULT (STDMETHODCALLTYPE *CanSaveFileAs)(
        IWMReaderAdvanced5* This,
        WINBOOL *pfCanSave);

    HRESULT (STDMETHODCALLTYPE *CancelSaveFileAs)(
        IWMReaderAdvanced5* This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IWMReaderAdvanced5* This,
        WCHAR *pwszURL,
        DWORD *pcchURL);

    /*** IWMReaderAdvanced5 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayerHook)(
        IWMReaderAdvanced5* This,
        DWORD dwOutputNum,
        IWMPlayerHook *pHook);

    END_INTERFACE
} IWMReaderAdvanced5Vtbl;
interface IWMReaderAdvanced5 {
    CONST_VTBL IWMReaderAdvanced5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced5_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced5_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced5_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced5_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced5_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced5_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced5_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced5_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced5_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced5_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced5_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced5_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced5_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced5_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced5_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced5_GetAllocateForStream(This,dwSreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate)
#define IWMReaderAdvanced5_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced5_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced5_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced5_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced5_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced5_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced5_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced5_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced5_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced5_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced5_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced5_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced5_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced5_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced5_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced5_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced5_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced5_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced5_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced5_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced5_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced5_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
/*** IWMReaderAdvanced4 methods ***/
#define IWMReaderAdvanced5_GetLanguageCount(This,dwOutputNum,pwLanguageCount) (This)->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount)
#define IWMReaderAdvanced5_GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength) (This)->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength)
#define IWMReaderAdvanced5_GetMaxSpeedFactor(This,pdblFactor) (This)->lpVtbl->GetMaxSpeedFactor(This,pdblFactor)
#define IWMReaderAdvanced5_IsUsingFastCache(This,pfUsingFastCache) (This)->lpVtbl->IsUsingFastCache(This,pfUsingFastCache)
#define IWMReaderAdvanced5_AddLogParam(This,wszNameSpace,wszName,wszValue) (This)->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue)
#define IWMReaderAdvanced5_SendLogParams(This) (This)->lpVtbl->SendLogParams(This)
#define IWMReaderAdvanced5_CanSaveFileAs(This,pfCanSave) (This)->lpVtbl->CanSaveFileAs(This,pfCanSave)
#define IWMReaderAdvanced5_CancelSaveFileAs(This) (This)->lpVtbl->CancelSaveFileAs(This)
#define IWMReaderAdvanced5_GetURL(This,pwszURL,pcchURL) (This)->lpVtbl->GetURL(This,pwszURL,pcchURL)
/*** IWMReaderAdvanced5 methods ***/
#define IWMReaderAdvanced5_SetPlayerHook(This,dwOutputNum,pHook) (This)->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_QueryInterface(IWMReaderAdvanced5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced5_AddRef(IWMReaderAdvanced5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced5_Release(IWMReaderAdvanced5* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetUserProvidedClock(IWMReaderAdvanced5* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetUserProvidedClock(IWMReaderAdvanced5* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_DeliverTime(IWMReaderAdvanced5* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetManualStreamSelection(IWMReaderAdvanced5* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetManualStreamSelection(IWMReaderAdvanced5* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetStreamsSelected(IWMReaderAdvanced5* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetStreamSelected(IWMReaderAdvanced5* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetReceiveSelectionCallbacks(IWMReaderAdvanced5* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetReceiveSelectionCallbacks(IWMReaderAdvanced5* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetReceiveStreamSamples(IWMReaderAdvanced5* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetReceiveStreamSamples(IWMReaderAdvanced5* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetAllocateForOutput(IWMReaderAdvanced5* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetAllocateForOutput(IWMReaderAdvanced5* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetAllocateForStream(IWMReaderAdvanced5* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetAllocateForStream(IWMReaderAdvanced5* This,WORD dwSreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetStatistics(IWMReaderAdvanced5* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetClientInfo(IWMReaderAdvanced5* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetMaxOutputSampleSize(IWMReaderAdvanced5* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetMaxStreamSampleSize(IWMReaderAdvanced5* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_NotifyLateDelivery(IWMReaderAdvanced5* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetPlayMode(IWMReaderAdvanced5* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetPlayMode(IWMReaderAdvanced5* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetBufferProgress(IWMReaderAdvanced5* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetDownloadProgress(IWMReaderAdvanced5* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetSaveAsProgress(IWMReaderAdvanced5* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SaveFileAs(IWMReaderAdvanced5* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetProtocolName(IWMReaderAdvanced5* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_StartAtMarker(IWMReaderAdvanced5* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetOutputSetting(IWMReaderAdvanced5* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetOutputSetting(IWMReaderAdvanced5* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_Preroll(IWMReaderAdvanced5* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetLogClientID(IWMReaderAdvanced5* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetLogClientID(IWMReaderAdvanced5* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_StopBuffering(IWMReaderAdvanced5* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_OpenStream(IWMReaderAdvanced5* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_StopNetStreaming(IWMReaderAdvanced5* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_StartAtPosition(IWMReaderAdvanced5* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
/*** IWMReaderAdvanced4 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetLanguageCount(IWMReaderAdvanced5* This,DWORD dwOutputNum,WORD *pwLanguageCount) {
    return This->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetLanguage(IWMReaderAdvanced5* This,DWORD dwOutputNum,WORD wLanguage,WCHAR *pwszLanguageString,WORD *pcchLanguageStringLength) {
    return This->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetMaxSpeedFactor(IWMReaderAdvanced5* This,double *pdblFactor) {
    return This->lpVtbl->GetMaxSpeedFactor(This,pdblFactor);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_IsUsingFastCache(IWMReaderAdvanced5* This,WINBOOL *pfUsingFastCache) {
    return This->lpVtbl->IsUsingFastCache(This,pfUsingFastCache);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_AddLogParam(IWMReaderAdvanced5* This,LPCWSTR wszNameSpace,LPCWSTR wszName,LPCWSTR wszValue) {
    return This->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SendLogParams(IWMReaderAdvanced5* This) {
    return This->lpVtbl->SendLogParams(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_CanSaveFileAs(IWMReaderAdvanced5* This,WINBOOL *pfCanSave) {
    return This->lpVtbl->CanSaveFileAs(This,pfCanSave);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_CancelSaveFileAs(IWMReaderAdvanced5* This) {
    return This->lpVtbl->CancelSaveFileAs(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetURL(IWMReaderAdvanced5* This,WCHAR *pwszURL,DWORD *pcchURL) {
    return This->lpVtbl->GetURL(This,pwszURL,pcchURL);
}
/*** IWMReaderAdvanced5 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetPlayerHook(IWMReaderAdvanced5* This,DWORD dwOutputNum,IWMPlayerHook *pHook) {
    return This->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderAdvanced5_SetPlayerHook_Proxy(
    IWMReaderAdvanced5* This,
    DWORD dwOutputNum,
    IWMPlayerHook *pHook);
void __RPC_STUB IWMReaderAdvanced5_SetPlayerHook_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderAdvanced5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced6 interface
 */
#ifndef __IWMReaderAdvanced6_INTERFACE_DEFINED__
#define __IWMReaderAdvanced6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced6, 0x18a2e7f8, 0x428f, 0x4acd, 0x8a,0x00, 0xe6,0x46,0x39,0xbc,0x93,0xde);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("18a2e7f8-428f-4acd-8a00-e64639bc93de")
IWMReaderAdvanced6 : public IWMReaderAdvanced5
{
    virtual HRESULT STDMETHODCALLTYPE SetProtectStreamSamples(
        BYTE *pbCertificate,
        DWORD cbCertificate,
        DWORD dwCertificateType,
        DWORD dwFlags,
        BYTE *pbInitializationVector,
        DWORD *pcbInitializationVector) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced6, 0x18a2e7f8, 0x428f, 0x4acd, 0x8a,0x00, 0xe6,0x46,0x39,0xbc,0x93,0xde)
#endif
#else
typedef struct IWMReaderAdvanced6Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced6* This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced6* This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced6* This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced6* This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced6* This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced6* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced6* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced6* This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced6* This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced6* This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced6* This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced6* This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced6* This,
        WORD dwSreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced6* This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced6* This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced6* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced6* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced6* This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced6* This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced6* This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced6* This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced6* This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced6* This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced6* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced6* This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced6* This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced6* This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced6* This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced6* This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced6* This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced6* This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced6* This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced6* This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    /*** IWMReaderAdvanced4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        WORD *pwLanguageCount);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength);

    HRESULT (STDMETHODCALLTYPE *GetMaxSpeedFactor)(
        IWMReaderAdvanced6* This,
        double *pdblFactor);

    HRESULT (STDMETHODCALLTYPE *IsUsingFastCache)(
        IWMReaderAdvanced6* This,
        WINBOOL *pfUsingFastCache);

    HRESULT (STDMETHODCALLTYPE *AddLogParam)(
        IWMReaderAdvanced6* This,
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SendLogParams)(
        IWMReaderAdvanced6* This);

    HRESULT (STDMETHODCALLTYPE *CanSaveFileAs)(
        IWMReaderAdvanced6* This,
        WINBOOL *pfCanSave);

    HRESULT (STDMETHODCALLTYPE *CancelSaveFileAs)(
        IWMReaderAdvanced6* This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IWMReaderAdvanced6* This,
        WCHAR *pwszURL,
        DWORD *pcchURL);

    /*** IWMReaderAdvanced5 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayerHook)(
        IWMReaderAdvanced6* This,
        DWORD dwOutputNum,
        IWMPlayerHook *pHook);

    /*** IWMReaderAdvanced6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProtectStreamSamples)(
        IWMReaderAdvanced6* This,
        BYTE *pbCertificate,
        DWORD cbCertificate,
        DWORD dwCertificateType,
        DWORD dwFlags,
        BYTE *pbInitializationVector,
        DWORD *pcbInitializationVector);

    END_INTERFACE
} IWMReaderAdvanced6Vtbl;
interface IWMReaderAdvanced6 {
    CONST_VTBL IWMReaderAdvanced6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced6_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced6_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced6_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced6_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced6_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced6_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced6_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced6_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced6_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced6_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced6_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced6_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced6_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced6_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced6_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced6_GetAllocateForStream(This,dwSreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate)
#define IWMReaderAdvanced6_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced6_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced6_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced6_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced6_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced6_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced6_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced6_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced6_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced6_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced6_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced6_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced6_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced6_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced6_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced6_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced6_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced6_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced6_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced6_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced6_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced6_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
/*** IWMReaderAdvanced4 methods ***/
#define IWMReaderAdvanced6_GetLanguageCount(This,dwOutputNum,pwLanguageCount) (This)->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount)
#define IWMReaderAdvanced6_GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength) (This)->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength)
#define IWMReaderAdvanced6_GetMaxSpeedFactor(This,pdblFactor) (This)->lpVtbl->GetMaxSpeedFactor(This,pdblFactor)
#define IWMReaderAdvanced6_IsUsingFastCache(This,pfUsingFastCache) (This)->lpVtbl->IsUsingFastCache(This,pfUsingFastCache)
#define IWMReaderAdvanced6_AddLogParam(This,wszNameSpace,wszName,wszValue) (This)->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue)
#define IWMReaderAdvanced6_SendLogParams(This) (This)->lpVtbl->SendLogParams(This)
#define IWMReaderAdvanced6_CanSaveFileAs(This,pfCanSave) (This)->lpVtbl->CanSaveFileAs(This,pfCanSave)
#define IWMReaderAdvanced6_CancelSaveFileAs(This) (This)->lpVtbl->CancelSaveFileAs(This)
#define IWMReaderAdvanced6_GetURL(This,pwszURL,pcchURL) (This)->lpVtbl->GetURL(This,pwszURL,pcchURL)
/*** IWMReaderAdvanced5 methods ***/
#define IWMReaderAdvanced6_SetPlayerHook(This,dwOutputNum,pHook) (This)->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook)
/*** IWMReaderAdvanced6 methods ***/
#define IWMReaderAdvanced6_SetProtectStreamSamples(This,pbCertificate,cbCertificate,dwCertificateType,dwFlags,pbInitializationVector,pcbInitializationVector) (This)->lpVtbl->SetProtectStreamSamples(This,pbCertificate,cbCertificate,dwCertificateType,dwFlags,pbInitializationVector,pcbInitializationVector)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_QueryInterface(IWMReaderAdvanced6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced6_AddRef(IWMReaderAdvanced6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced6_Release(IWMReaderAdvanced6* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetUserProvidedClock(IWMReaderAdvanced6* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetUserProvidedClock(IWMReaderAdvanced6* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_DeliverTime(IWMReaderAdvanced6* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetManualStreamSelection(IWMReaderAdvanced6* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetManualStreamSelection(IWMReaderAdvanced6* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetStreamsSelected(IWMReaderAdvanced6* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetStreamSelected(IWMReaderAdvanced6* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetReceiveSelectionCallbacks(IWMReaderAdvanced6* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetReceiveSelectionCallbacks(IWMReaderAdvanced6* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetReceiveStreamSamples(IWMReaderAdvanced6* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetReceiveStreamSamples(IWMReaderAdvanced6* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetAllocateForOutput(IWMReaderAdvanced6* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetAllocateForOutput(IWMReaderAdvanced6* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetAllocateForStream(IWMReaderAdvanced6* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetAllocateForStream(IWMReaderAdvanced6* This,WORD dwSreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwSreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetStatistics(IWMReaderAdvanced6* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetClientInfo(IWMReaderAdvanced6* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetMaxOutputSampleSize(IWMReaderAdvanced6* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetMaxStreamSampleSize(IWMReaderAdvanced6* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_NotifyLateDelivery(IWMReaderAdvanced6* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetPlayMode(IWMReaderAdvanced6* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetPlayMode(IWMReaderAdvanced6* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetBufferProgress(IWMReaderAdvanced6* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetDownloadProgress(IWMReaderAdvanced6* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetSaveAsProgress(IWMReaderAdvanced6* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SaveFileAs(IWMReaderAdvanced6* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetProtocolName(IWMReaderAdvanced6* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_StartAtMarker(IWMReaderAdvanced6* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetOutputSetting(IWMReaderAdvanced6* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetOutputSetting(IWMReaderAdvanced6* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_Preroll(IWMReaderAdvanced6* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetLogClientID(IWMReaderAdvanced6* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetLogClientID(IWMReaderAdvanced6* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_StopBuffering(IWMReaderAdvanced6* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_OpenStream(IWMReaderAdvanced6* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_StopNetStreaming(IWMReaderAdvanced6* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_StartAtPosition(IWMReaderAdvanced6* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
/*** IWMReaderAdvanced4 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetLanguageCount(IWMReaderAdvanced6* This,DWORD dwOutputNum,WORD *pwLanguageCount) {
    return This->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetLanguage(IWMReaderAdvanced6* This,DWORD dwOutputNum,WORD wLanguage,WCHAR *pwszLanguageString,WORD *pcchLanguageStringLength) {
    return This->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetMaxSpeedFactor(IWMReaderAdvanced6* This,double *pdblFactor) {
    return This->lpVtbl->GetMaxSpeedFactor(This,pdblFactor);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_IsUsingFastCache(IWMReaderAdvanced6* This,WINBOOL *pfUsingFastCache) {
    return This->lpVtbl->IsUsingFastCache(This,pfUsingFastCache);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_AddLogParam(IWMReaderAdvanced6* This,LPCWSTR wszNameSpace,LPCWSTR wszName,LPCWSTR wszValue) {
    return This->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SendLogParams(IWMReaderAdvanced6* This) {
    return This->lpVtbl->SendLogParams(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_CanSaveFileAs(IWMReaderAdvanced6* This,WINBOOL *pfCanSave) {
    return This->lpVtbl->CanSaveFileAs(This,pfCanSave);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_CancelSaveFileAs(IWMReaderAdvanced6* This) {
    return This->lpVtbl->CancelSaveFileAs(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetURL(IWMReaderAdvanced6* This,WCHAR *pwszURL,DWORD *pcchURL) {
    return This->lpVtbl->GetURL(This,pwszURL,pcchURL);
}
/*** IWMReaderAdvanced5 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetPlayerHook(IWMReaderAdvanced6* This,DWORD dwOutputNum,IWMPlayerHook *pHook) {
    return This->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook);
}
/*** IWMReaderAdvanced6 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetProtectStreamSamples(IWMReaderAdvanced6* This,BYTE *pbCertificate,DWORD cbCertificate,DWORD dwCertificateType,DWORD dwFlags,BYTE *pbInitializationVector,DWORD *pcbInitializationVector) {
    return This->lpVtbl->SetProtectStreamSamples(This,pbCertificate,cbCertificate,dwCertificateType,dwFlags,pbInitializationVector,pcbInitializationVector);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMReaderAdvanced6_SetProtectStreamSamples_Proxy(
    IWMReaderAdvanced6* This,
    BYTE *pbCertificate,
    DWORD cbCertificate,
    DWORD dwCertificateType,
    DWORD dwFlags,
    BYTE *pbInitializationVector,
    DWORD *pcbInitializationVector);
void __RPC_STUB IWMReaderAdvanced6_SetProtectStreamSamples_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMReaderAdvanced6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMSyncReader interface
 */
#ifndef __IWMSyncReader_INTERFACE_DEFINED__
#define __IWMSyncReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMSyncReader, 0x9397f121, 0x7705, 0x4dc9, 0xb0,0x49, 0x98,0xb6,0x98,0x18,0x84,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9397f121-7705-4dc9-b049-98b698188414")
IWMSyncReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRange(
        QWORD cnsStartTime,
        LONGLONG cnsDuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRangeByFrame(
        WORD wStreamNum,
        QWORD qwFrameNumber,
        LONGLONG cFramesToRead) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextSample(
        WORD wStreamNum,
        INSSBuffer **ppSample,
        QWORD *pcnsSampleTime,
        QWORD *pcnsDuration,
        DWORD *pdwFlags,
        DWORD *pdwOutputNum,
        WORD *pwStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamsSelected(
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamSelected(
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReadStreamSamples(
        WORD wStreamNum,
        WINBOOL fCompressed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReadStreamSamples(
        WORD wStreamNum,
        WINBOOL *pfCompressed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputCount(
        DWORD *pcOutputs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormatCount(
        DWORD dwOutputNum,
        DWORD *pcFormats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormat(
        DWORD dwOutputNum,
        DWORD dwFormatNum,
        IWMOutputMediaProps **ppProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputNumberForStream(
        WORD wStreamNum,
        DWORD *pdwOutputNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamNumberForOutput(
        DWORD dwOutputNum,
        WORD *pwStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxOutputSampleSize(
        DWORD dwOutput,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxStreamSampleSize(
        WORD wStream,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenStream(
        IStream *pStream) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMSyncReader, 0x9397f121, 0x7705, 0x4dc9, 0xb0,0x49, 0x98,0xb6,0x98,0x18,0x84,0x14)
#endif
#else
typedef struct IWMSyncReaderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMSyncReader methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IWMSyncReader* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWMSyncReader* This);

    HRESULT (STDMETHODCALLTYPE *SetRange)(
        IWMSyncReader* This,
        QWORD cnsStartTime,
        LONGLONG cnsDuration);

    HRESULT (STDMETHODCALLTYPE *SetRangeByFrame)(
        IWMSyncReader* This,
        WORD wStreamNum,
        QWORD qwFrameNumber,
        LONGLONG cFramesToRead);

    HRESULT (STDMETHODCALLTYPE *GetNextSample)(
        IWMSyncReader* This,
        WORD wStreamNum,
        INSSBuffer **ppSample,
        QWORD *pcnsSampleTime,
        QWORD *pcnsDuration,
        DWORD *pdwFlags,
        DWORD *pdwOutputNum,
        WORD *pwStreamNum);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMSyncReader* This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMSyncReader* This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReadStreamSamples)(
        IWMSyncReader* This,
        WORD wStreamNum,
        WINBOOL fCompressed);

    HRESULT (STDMETHODCALLTYPE *GetReadStreamSamples)(
        IWMSyncReader* This,
        WORD wStreamNum,
        WINBOOL *pfCompressed);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *GetOutputCount)(
        IWMSyncReader* This,
        DWORD *pcOutputs);

    HRESULT (STDMETHODCALLTYPE *GetOutputProps)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput);

    HRESULT (STDMETHODCALLTYPE *SetOutputProps)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormatCount)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        DWORD *pcFormats);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormat)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        DWORD dwFormatNum,
        IWMOutputMediaProps **ppProps);

    HRESULT (STDMETHODCALLTYPE *GetOutputNumberForStream)(
        IWMSyncReader* This,
        WORD wStreamNum,
        DWORD *pdwOutputNum);

    HRESULT (STDMETHODCALLTYPE *GetStreamNumberForOutput)(
        IWMSyncReader* This,
        DWORD dwOutputNum,
        WORD *pwStreamNum);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMSyncReader* This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMSyncReader* This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMSyncReader* This,
        IStream *pStream);

    END_INTERFACE
} IWMSyncReaderVtbl;
interface IWMSyncReader {
    CONST_VTBL IWMSyncReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMSyncReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMSyncReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMSyncReader_Release(This) (This)->lpVtbl->Release(This)
/*** IWMSyncReader methods ***/
#define IWMSyncReader_Open(This,pwszFilename) (This)->lpVtbl->Open(This,pwszFilename)
#define IWMSyncReader_Close(This) (This)->lpVtbl->Close(This)
#define IWMSyncReader_SetRange(This,cnsStartTime,cnsDuration) (This)->lpVtbl->SetRange(This,cnsStartTime,cnsDuration)
#define IWMSyncReader_SetRangeByFrame(This,wStreamNum,qwFrameNumber,cFramesToRead) (This)->lpVtbl->SetRangeByFrame(This,wStreamNum,qwFrameNumber,cFramesToRead)
#define IWMSyncReader_GetNextSample(This,wStreamNum,ppSample,pcnsSampleTime,pcnsDuration,pdwFlags,pdwOutputNum,pwStreamNum) (This)->lpVtbl->GetNextSample(This,wStreamNum,ppSample,pcnsSampleTime,pcnsDuration,pdwFlags,pdwOutputNum,pwStreamNum)
#define IWMSyncReader_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMSyncReader_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMSyncReader_SetReadStreamSamples(This,wStreamNum,fCompressed) (This)->lpVtbl->SetReadStreamSamples(This,wStreamNum,fCompressed)
#define IWMSyncReader_GetReadStreamSamples(This,wStreamNum,pfCompressed) (This)->lpVtbl->GetReadStreamSamples(This,wStreamNum,pfCompressed)
#define IWMSyncReader_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMSyncReader_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMSyncReader_GetOutputCount(This,pcOutputs) (This)->lpVtbl->GetOutputCount(This,pcOutputs)
#define IWMSyncReader_GetOutputProps(This,dwOutputNum,ppOutput) (This)->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput)
#define IWMSyncReader_SetOutputProps(This,dwOutputNum,pOutput) (This)->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput)
#define IWMSyncReader_GetOutputFormatCount(This,dwOutputNum,pcFormats) (This)->lpVtbl->GetOutputFormatCount(This,dwOutputNum,pcFormats)
#define IWMSyncReader_GetOutputFormat(This,dwOutputNum,dwFormatNum,ppProps) (This)->lpVtbl->GetOutputFormat(This,dwOutputNum,dwFormatNum,ppProps)
#define IWMSyncReader_GetOutputNumberForStream(This,wStreamNum,pdwOutputNum) (This)->lpVtbl->GetOutputNumberForStream(This,wStreamNum,pdwOutputNum)
#define IWMSyncReader_GetStreamNumberForOutput(This,dwOutputNum,pwStreamNum) (This)->lpVtbl->GetStreamNumberForOutput(This,dwOutputNum,pwStreamNum)
#define IWMSyncReader_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMSyncReader_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMSyncReader_OpenStream(This,pStream) (This)->lpVtbl->OpenStream(This,pStream)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMSyncReader_QueryInterface(IWMSyncReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMSyncReader_AddRef(IWMSyncReader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMSyncReader_Release(IWMSyncReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMSyncReader methods ***/
static FORCEINLINE HRESULT IWMSyncReader_Open(IWMSyncReader* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->Open(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMSyncReader_Close(IWMSyncReader* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IWMSyncReader_SetRange(IWMSyncReader* This,QWORD cnsStartTime,LONGLONG cnsDuration) {
    return This->lpVtbl->SetRange(This,cnsStartTime,cnsDuration);
}
static FORCEINLINE HRESULT IWMSyncReader_SetRangeByFrame(IWMSyncReader* This,WORD wStreamNum,QWORD qwFrameNumber,LONGLONG cFramesToRead) {
    return This->lpVtbl->SetRangeByFrame(This,wStreamNum,qwFrameNumber,cFramesToRead);
}
static FORCEINLINE HRESULT IWMSyncReader_GetNextSample(IWMSyncReader* This,WORD wStreamNum,INSSBuffer **ppSample,QWORD *pcnsSampleTime,QWORD *pcnsDuration,DWORD *pdwFlags,DWORD *pdwOutputNum,WORD *pwStreamNum) {
    return This->lpVtbl->GetNextSample(This,wStreamNum,ppSample,pcnsSampleTime,pcnsDuration,pdwFlags,pdwOutputNum,pwStreamNum);
}
static FORCEINLINE HRESULT IWMSyncReader_SetStreamsSelected(IWMSyncReader* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMSyncReader_GetStreamSelected(IWMSyncReader* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMSyncReader_SetReadStreamSamples(IWMSyncReader* This,WORD wStreamNum,WINBOOL fCompressed) {
    return This->lpVtbl->SetReadStreamSamples(This,wStreamNum,fCompressed);
}
static FORCEINLINE HRESULT IWMSyncReader_GetReadStreamSamples(IWMSyncReader* This,WORD wStreamNum,WINBOOL *pfCompressed) {
    return This->lpVtbl->GetReadStreamSamples(This,wStreamNum,pfCompressed);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputSetting(IWMSyncReader* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMSyncReader_SetOutputSetting(IWMSyncReader* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputCount(IWMSyncReader* This,DWORD *pcOutputs) {
    return This->lpVtbl->GetOutputCount(This,pcOutputs);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputProps(IWMSyncReader* This,DWORD dwOutputNum,IWMOutputMediaProps **ppOutput) {
    return This->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput);
}
static FORCEINLINE HRESULT IWMSyncReader_SetOutputProps(IWMSyncReader* This,DWORD dwOutputNum,IWMOutputMediaProps *pOutput) {
    return This->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputFormatCount(IWMSyncReader* This,DWORD dwOutputNum,DWORD *pcFormats) {
    return This->lpVtbl->GetOutputFormatCount(This,dwOutputNum,pcFormats);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputFormat(IWMSyncReader* This,DWORD dwOutputNum,DWORD dwFormatNum,IWMOutputMediaProps **ppProps) {
    return This->lpVtbl->GetOutputFormat(This,dwOutputNum,dwFormatNum,ppProps);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputNumberForStream(IWMSyncReader* This,WORD wStreamNum,DWORD *pdwOutputNum) {
    return This->lpVtbl->GetOutputNumberForStream(This,wStreamNum,pdwOutputNum);
}
static FORCEINLINE HRESULT IWMSyncReader_GetStreamNumberForOutput(IWMSyncReader* This,DWORD dwOutputNum,WORD *pwStreamNum) {
    return This->lpVtbl->GetStreamNumberForOutput(This,dwOutputNum,pwStreamNum);
}
static FORCEINLINE HRESULT IWMSyncReader_GetMaxOutputSampleSize(IWMSyncReader* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMSyncReader_GetMaxStreamSampleSize(IWMSyncReader* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMSyncReader_OpenStream(IWMSyncReader* This,IStream *pStream) {
    return This->lpVtbl->OpenStream(This,pStream);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMSyncReader_Open_Proxy(
    IWMSyncReader* This,
    const WCHAR *pwszFilename);
void __RPC_STUB IWMSyncReader_Open_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_Close_Proxy(
    IWMSyncReader* This);
void __RPC_STUB IWMSyncReader_Close_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_SetRange_Proxy(
    IWMSyncReader* This,
    QWORD cnsStartTime,
    LONGLONG cnsDuration);
void __RPC_STUB IWMSyncReader_SetRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_SetRangeByFrame_Proxy(
    IWMSyncReader* This,
    WORD wStreamNum,
    QWORD qwFrameNumber,
    LONGLONG cFramesToRead);
void __RPC_STUB IWMSyncReader_SetRangeByFrame_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetNextSample_Proxy(
    IWMSyncReader* This,
    WORD wStreamNum,
    INSSBuffer **ppSample,
    QWORD *pcnsSampleTime,
    QWORD *pcnsDuration,
    DWORD *pdwFlags,
    DWORD *pdwOutputNum,
    WORD *pwStreamNum);
void __RPC_STUB IWMSyncReader_GetNextSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_SetStreamsSelected_Proxy(
    IWMSyncReader* This,
    WORD cStreamCount,
    WORD *pwStreamNumbers,
    WMT_STREAM_SELECTION *pSelections);
void __RPC_STUB IWMSyncReader_SetStreamsSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetStreamSelected_Proxy(
    IWMSyncReader* This,
    WORD wStreamNum,
    WMT_STREAM_SELECTION *pSelection);
void __RPC_STUB IWMSyncReader_GetStreamSelected_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_SetReadStreamSamples_Proxy(
    IWMSyncReader* This,
    WORD wStreamNum,
    WINBOOL fCompressed);
void __RPC_STUB IWMSyncReader_SetReadStreamSamples_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetReadStreamSamples_Proxy(
    IWMSyncReader* This,
    WORD wStreamNum,
    WINBOOL *pfCompressed);
void __RPC_STUB IWMSyncReader_GetReadStreamSamples_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetOutputSetting_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    LPCWSTR pszName,
    WMT_ATTR_DATATYPE *pType,
    BYTE *pValue,
    WORD *pcbLength);
void __RPC_STUB IWMSyncReader_GetOutputSetting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_SetOutputSetting_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    LPCWSTR pszName,
    WMT_ATTR_DATATYPE Type,
    const BYTE *pValue,
    WORD cbLength);
void __RPC_STUB IWMSyncReader_SetOutputSetting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetOutputCount_Proxy(
    IWMSyncReader* This,
    DWORD *pcOutputs);
void __RPC_STUB IWMSyncReader_GetOutputCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetOutputProps_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    IWMOutputMediaProps **ppOutput);
void __RPC_STUB IWMSyncReader_GetOutputProps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_SetOutputProps_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    IWMOutputMediaProps *pOutput);
void __RPC_STUB IWMSyncReader_SetOutputProps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetOutputFormatCount_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    DWORD *pcFormats);
void __RPC_STUB IWMSyncReader_GetOutputFormatCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetOutputFormat_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    DWORD dwFormatNum,
    IWMOutputMediaProps **ppProps);
void __RPC_STUB IWMSyncReader_GetOutputFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetOutputNumberForStream_Proxy(
    IWMSyncReader* This,
    WORD wStreamNum,
    DWORD *pdwOutputNum);
void __RPC_STUB IWMSyncReader_GetOutputNumberForStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetStreamNumberForOutput_Proxy(
    IWMSyncReader* This,
    DWORD dwOutputNum,
    WORD *pwStreamNum);
void __RPC_STUB IWMSyncReader_GetStreamNumberForOutput_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetMaxOutputSampleSize_Proxy(
    IWMSyncReader* This,
    DWORD dwOutput,
    DWORD *pcbMax);
void __RPC_STUB IWMSyncReader_GetMaxOutputSampleSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_GetMaxStreamSampleSize_Proxy(
    IWMSyncReader* This,
    WORD wStream,
    DWORD *pcbMax);
void __RPC_STUB IWMSyncReader_GetMaxStreamSampleSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMSyncReader_OpenStream_Proxy(
    IWMSyncReader* This,
    IStream *pStream);
void __RPC_STUB IWMSyncReader_OpenStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMSyncReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMInputMediaProps interface
 */
#ifndef __IWMInputMediaProps_INTERFACE_DEFINED__
#define __IWMInputMediaProps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMInputMediaProps, 0x96406bd5, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd5-2b2b-11d3-b36b-00c04f6108ff")
IWMInputMediaProps : public IWMMediaProps
{
    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMInputMediaProps, 0x96406bd5, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMInputMediaPropsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWMInputMediaProps* This,
        GUID *pguidType);

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IWMInputMediaProps* This,
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IWMInputMediaProps* This,
        WM_MEDIA_TYPE *pType);

    /*** IWMInputMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
        IWMInputMediaProps* This,
        WCHAR *pwszName,
        WORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *GetGroupName)(
        IWMInputMediaProps* This,
        WCHAR *pwszName,
        WORD *pcchName);

    END_INTERFACE
} IWMInputMediaPropsVtbl;
interface IWMInputMediaProps {
    CONST_VTBL IWMInputMediaPropsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMInputMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMInputMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMInputMediaProps_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMediaProps methods ***/
#define IWMInputMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMInputMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
#define IWMInputMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
/*** IWMInputMediaProps methods ***/
#define IWMInputMediaProps_GetConnectionName(This,pwszName,pcchName) (This)->lpVtbl->GetConnectionName(This,pwszName,pcchName)
#define IWMInputMediaProps_GetGroupName(This,pwszName,pcchName) (This)->lpVtbl->GetGroupName(This,pwszName,pcchName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMInputMediaProps_QueryInterface(IWMInputMediaProps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMInputMediaProps_AddRef(IWMInputMediaProps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMInputMediaProps_Release(IWMInputMediaProps* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMediaProps methods ***/
static FORCEINLINE HRESULT IWMInputMediaProps_GetType(IWMInputMediaProps* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMInputMediaProps_GetMediaType(IWMInputMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
    return This->lpVtbl->GetMediaType(This,pType,pcbType);
}
static FORCEINLINE HRESULT IWMInputMediaProps_SetMediaType(IWMInputMediaProps* This,WM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
/*** IWMInputMediaProps methods ***/
static FORCEINLINE HRESULT IWMInputMediaProps_GetConnectionName(IWMInputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetConnectionName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMInputMediaProps_GetGroupName(IWMInputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetGroupName(This,pwszName,pcchName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMInputMediaProps_GetConnectionName_Proxy(
    IWMInputMediaProps* This,
    WCHAR *pwszName,
    WORD *pcchName);
void __RPC_STUB IWMInputMediaProps_GetConnectionName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMInputMediaProps_GetGroupName_Proxy(
    IWMInputMediaProps* This,
    WCHAR *pwszName,
    WORD *pcchName);
void __RPC_STUB IWMInputMediaProps_GetGroupName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMInputMediaProps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterSink interface
 */
#ifndef __IWMWriterSink_INTERFACE_DEFINED__
#define __IWMWriterSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterSink, 0x96406be4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406be4-2b2b-11d3-b36b-00c04f6108ff")
IWMWriterSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnHeader(
        INSSBuffer *pHeader) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRealTime(
        WINBOOL *pfRealTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE AllocateDataUnit(
        DWORD cbDataUnit,
        INSSBuffer **ppDataUnit) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDataUnit(
        INSSBuffer *pDataUnit) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEndWriting(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterSink, 0x96406be4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMWriterSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterSink methods ***/
    HRESULT (STDMETHODCALLTYPE *OnHeader)(
        IWMWriterSink* This,
        INSSBuffer *pHeader);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterSink* This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *AllocateDataUnit)(
        IWMWriterSink* This,
        DWORD cbDataUnit,
        INSSBuffer **ppDataUnit);

    HRESULT (STDMETHODCALLTYPE *OnDataUnit)(
        IWMWriterSink* This,
        INSSBuffer *pDataUnit);

    HRESULT (STDMETHODCALLTYPE *OnEndWriting)(
        IWMWriterSink* This);

    END_INTERFACE
} IWMWriterSinkVtbl;
interface IWMWriterSink {
    CONST_VTBL IWMWriterSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterSink_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterSink methods ***/
#define IWMWriterSink_OnHeader(This,pHeader) (This)->lpVtbl->OnHeader(This,pHeader)
#define IWMWriterSink_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterSink_AllocateDataUnit(This,cbDataUnit,ppDataUnit) (This)->lpVtbl->AllocateDataUnit(This,cbDataUnit,ppDataUnit)
#define IWMWriterSink_OnDataUnit(This,pDataUnit) (This)->lpVtbl->OnDataUnit(This,pDataUnit)
#define IWMWriterSink_OnEndWriting(This) (This)->lpVtbl->OnEndWriting(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterSink_QueryInterface(IWMWriterSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterSink_AddRef(IWMWriterSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterSink_Release(IWMWriterSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterSink methods ***/
static FORCEINLINE HRESULT IWMWriterSink_OnHeader(IWMWriterSink* This,INSSBuffer *pHeader) {
    return This->lpVtbl->OnHeader(This,pHeader);
}
static FORCEINLINE HRESULT IWMWriterSink_IsRealTime(IWMWriterSink* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterSink_AllocateDataUnit(IWMWriterSink* This,DWORD cbDataUnit,INSSBuffer **ppDataUnit) {
    return This->lpVtbl->AllocateDataUnit(This,cbDataUnit,ppDataUnit);
}
static FORCEINLINE HRESULT IWMWriterSink_OnDataUnit(IWMWriterSink* This,INSSBuffer *pDataUnit) {
    return This->lpVtbl->OnDataUnit(This,pDataUnit);
}
static FORCEINLINE HRESULT IWMWriterSink_OnEndWriting(IWMWriterSink* This) {
    return This->lpVtbl->OnEndWriting(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMWriterSink_OnHeader_Proxy(
    IWMWriterSink* This,
    INSSBuffer *pHeader);
void __RPC_STUB IWMWriterSink_OnHeader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterSink_IsRealTime_Proxy(
    IWMWriterSink* This,
    WINBOOL *pfRealTime);
void __RPC_STUB IWMWriterSink_IsRealTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterSink_AllocateDataUnit_Proxy(
    IWMWriterSink* This,
    DWORD cbDataUnit,
    INSSBuffer **ppDataUnit);
void __RPC_STUB IWMWriterSink_AllocateDataUnit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterSink_OnDataUnit_Proxy(
    IWMWriterSink* This,
    INSSBuffer *pDataUnit);
void __RPC_STUB IWMWriterSink_OnDataUnit_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterSink_OnEndWriting_Proxy(
    IWMWriterSink* This);
void __RPC_STUB IWMWriterSink_OnEndWriting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMWriterSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriter interface
 */
#ifndef __IWMWriter_INTERFACE_DEFINED__
#define __IWMWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriter, 0x96406bd4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd4-2b2b-11d3-b36b-00c04f6108ff")
IWMWriter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetProfileByID(
        REFGUID guidProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProfile(
        IWMProfile *pProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFilename(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputCount(
        DWORD *pcInputs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputProps(
        DWORD dwInputNum,
        IWMInputMediaProps **ppInput) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInputProps(
        DWORD dwInputNum,
        IWMInputMediaProps *pInput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputFormatCount(
        DWORD dwInputNumber,
        DWORD *pcFormats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputFormat(
        DWORD dwInputNumber,
        DWORD dwFormatNumber,
        IWMInputMediaProps **pProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginWriting(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndWriting(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AllocateSample(
        DWORD dwSampleSize,
        INSSBuffer **ppSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteSample(
        DWORD dwInputNum,
        QWORD cnsSampleTime,
        DWORD dwFlags,
        INSSBuffer *pSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriter, 0x96406bd4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMWriterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProfileByID)(
        IWMWriter* This,
        REFGUID guidProfile);

    HRESULT (STDMETHODCALLTYPE *SetProfile)(
        IWMWriter* This,
        IWMProfile *pProfile);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilename)(
        IWMWriter* This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetInputCount)(
        IWMWriter* This,
        DWORD *pcInputs);

    HRESULT (STDMETHODCALLTYPE *GetInputProps)(
        IWMWriter* This,
        DWORD dwInputNum,
        IWMInputMediaProps **ppInput);

    HRESULT (STDMETHODCALLTYPE *SetInputProps)(
        IWMWriter* This,
        DWORD dwInputNum,
        IWMInputMediaProps *pInput);

    HRESULT (STDMETHODCALLTYPE *GetInputFormatCount)(
        IWMWriter* This,
        DWORD dwInputNumber,
        DWORD *pcFormats);

    HRESULT (STDMETHODCALLTYPE *GetInputFormat)(
        IWMWriter* This,
        DWORD dwInputNumber,
        DWORD dwFormatNumber,
        IWMInputMediaProps **pProps);

    HRESULT (STDMETHODCALLTYPE *BeginWriting)(
        IWMWriter* This);

    HRESULT (STDMETHODCALLTYPE *EndWriting)(
        IWMWriter* This);

    HRESULT (STDMETHODCALLTYPE *AllocateSample)(
        IWMWriter* This,
        DWORD dwSampleSize,
        INSSBuffer **ppSample);

    HRESULT (STDMETHODCALLTYPE *WriteSample)(
        IWMWriter* This,
        DWORD dwInputNum,
        QWORD cnsSampleTime,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IWMWriter* This);

    END_INTERFACE
} IWMWriterVtbl;
interface IWMWriter {
    CONST_VTBL IWMWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriter methods ***/
#define IWMWriter_SetProfileByID(This,guidProfile) (This)->lpVtbl->SetProfileByID(This,guidProfile)
#define IWMWriter_SetProfile(This,pProfile) (This)->lpVtbl->SetProfile(This,pProfile)
#define IWMWriter_SetOutputFilename(This,pwszFilename) (This)->lpVtbl->SetOutputFilename(This,pwszFilename)
#define IWMWriter_GetInputCount(This,pcInputs) (This)->lpVtbl->GetInputCount(This,pcInputs)
#define IWMWriter_GetInputProps(This,dwInputNum,ppInput) (This)->lpVtbl->GetInputProps(This,dwInputNum,ppInput)
#define IWMWriter_SetInputProps(This,dwInputNum,pInput) (This)->lpVtbl->SetInputProps(This,dwInputNum,pInput)
#define IWMWriter_GetInputFormatCount(This,dwInputNumber,pcFormats) (This)->lpVtbl->GetInputFormatCount(This,dwInputNumber,pcFormats)
#define IWMWriter_GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps) (This)->lpVtbl->GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps)
#define IWMWriter_BeginWriting(This) (This)->lpVtbl->BeginWriting(This)
#define IWMWriter_EndWriting(This) (This)->lpVtbl->EndWriting(This)
#define IWMWriter_AllocateSample(This,dwSampleSize,ppSample) (This)->lpVtbl->AllocateSample(This,dwSampleSize,ppSample)
#define IWMWriter_WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample) (This)->lpVtbl->WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample)
#define IWMWriter_Flush(This) (This)->lpVtbl->Flush(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriter_QueryInterface(IWMWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriter_AddRef(IWMWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriter_Release(IWMWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriter methods ***/
static FORCEINLINE HRESULT IWMWriter_SetProfileByID(IWMWriter* This,REFGUID guidProfile) {
    return This->lpVtbl->SetProfileByID(This,guidProfile);
}
static FORCEINLINE HRESULT IWMWriter_SetProfile(IWMWriter* This,IWMProfile *pProfile) {
    return This->lpVtbl->SetProfile(This,pProfile);
}
static FORCEINLINE HRESULT IWMWriter_SetOutputFilename(IWMWriter* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SetOutputFilename(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMWriter_GetInputCount(IWMWriter* This,DWORD *pcInputs) {
    return This->lpVtbl->GetInputCount(This,pcInputs);
}
static FORCEINLINE HRESULT IWMWriter_GetInputProps(IWMWriter* This,DWORD dwInputNum,IWMInputMediaProps **ppInput) {
    return This->lpVtbl->GetInputProps(This,dwInputNum,ppInput);
}
static FORCEINLINE HRESULT IWMWriter_SetInputProps(IWMWriter* This,DWORD dwInputNum,IWMInputMediaProps *pInput) {
    return This->lpVtbl->SetInputProps(This,dwInputNum,pInput);
}
static FORCEINLINE HRESULT IWMWriter_GetInputFormatCount(IWMWriter* This,DWORD dwInputNumber,DWORD *pcFormats) {
    return This->lpVtbl->GetInputFormatCount(This,dwInputNumber,pcFormats);
}
static FORCEINLINE HRESULT IWMWriter_GetInputFormat(IWMWriter* This,DWORD dwInputNumber,DWORD dwFormatNumber,IWMInputMediaProps **pProps) {
    return This->lpVtbl->GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps);
}
static FORCEINLINE HRESULT IWMWriter_BeginWriting(IWMWriter* This) {
    return This->lpVtbl->BeginWriting(This);
}
static FORCEINLINE HRESULT IWMWriter_EndWriting(IWMWriter* This) {
    return This->lpVtbl->EndWriting(This);
}
static FORCEINLINE HRESULT IWMWriter_AllocateSample(IWMWriter* This,DWORD dwSampleSize,INSSBuffer **ppSample) {
    return This->lpVtbl->AllocateSample(This,dwSampleSize,ppSample);
}
static FORCEINLINE HRESULT IWMWriter_WriteSample(IWMWriter* This,DWORD dwInputNum,QWORD cnsSampleTime,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriter_Flush(IWMWriter* This) {
    return This->lpVtbl->Flush(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMWriter_SetProfileByID_Proxy(
    IWMWriter* This,
    REFGUID guidProfile);
void __RPC_STUB IWMWriter_SetProfileByID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_SetProfile_Proxy(
    IWMWriter* This,
    IWMProfile *pProfile);
void __RPC_STUB IWMWriter_SetProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_SetOutputFilename_Proxy(
    IWMWriter* This,
    const WCHAR *pwszFilename);
void __RPC_STUB IWMWriter_SetOutputFilename_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_GetInputCount_Proxy(
    IWMWriter* This,
    DWORD *pcInputs);
void __RPC_STUB IWMWriter_GetInputCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_GetInputProps_Proxy(
    IWMWriter* This,
    DWORD dwInputNum,
    IWMInputMediaProps **ppInput);
void __RPC_STUB IWMWriter_GetInputProps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_SetInputProps_Proxy(
    IWMWriter* This,
    DWORD dwInputNum,
    IWMInputMediaProps *pInput);
void __RPC_STUB IWMWriter_SetInputProps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_GetInputFormatCount_Proxy(
    IWMWriter* This,
    DWORD dwInputNumber,
    DWORD *pcFormats);
void __RPC_STUB IWMWriter_GetInputFormatCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_GetInputFormat_Proxy(
    IWMWriter* This,
    DWORD dwInputNumber,
    DWORD dwFormatNumber,
    IWMInputMediaProps **pProps);
void __RPC_STUB IWMWriter_GetInputFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_BeginWriting_Proxy(
    IWMWriter* This);
void __RPC_STUB IWMWriter_BeginWriting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_EndWriting_Proxy(
    IWMWriter* This);
void __RPC_STUB IWMWriter_EndWriting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_AllocateSample_Proxy(
    IWMWriter* This,
    DWORD dwSampleSize,
    INSSBuffer **ppSample);
void __RPC_STUB IWMWriter_AllocateSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_WriteSample_Proxy(
    IWMWriter* This,
    DWORD dwInputNum,
    QWORD cnsSampleTime,
    DWORD dwFlags,
    INSSBuffer *pSample);
void __RPC_STUB IWMWriter_WriteSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriter_Flush_Proxy(
    IWMWriter* This);
void __RPC_STUB IWMWriter_Flush_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMWriter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterAdvanced interface
 */
#ifndef __IWMWriterAdvanced_INTERFACE_DEFINED__
#define __IWMWriterAdvanced_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterAdvanced, 0x96406be3, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406be3-2b2b-11d3-b36b-00c04f6108ff")
IWMWriterAdvanced : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSinkCount(
        DWORD *pcSinks) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSink(
        DWORD dwSinkNum,
        IWMWriterSink **ppSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSink(
        IWMWriterSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveSink(
        IWMWriterSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteStreamSample(
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLiveSource(
        WINBOOL fIsLiveSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRealTime(
        WINBOOL *pfRealTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterTime(
        QWORD *pCurrentTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSyncTolerance(
        DWORD msWindow) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSyncTolerance(
        DWORD *pmsWindow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterAdvanced, 0x96406be3, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMWriterAdvancedVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
        IWMWriterAdvanced* This,
        DWORD *pcSinks);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWMWriterAdvanced* This,
        DWORD dwSinkNum,
        IWMWriterSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *AddSink)(
        IWMWriterAdvanced* This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
        IWMWriterAdvanced* This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
        IWMWriterAdvanced* This,
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
        IWMWriterAdvanced* This,
        WINBOOL fIsLiveSource);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterAdvanced* This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
        IWMWriterAdvanced* This,
        QWORD *pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMWriterAdvanced* This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IWMWriterAdvanced* This,
        DWORD msWindow);

    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
        IWMWriterAdvanced* This,
        DWORD *pmsWindow);

    END_INTERFACE
} IWMWriterAdvancedVtbl;
interface IWMWriterAdvanced {
    CONST_VTBL IWMWriterAdvancedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterAdvanced_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterAdvanced_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterAdvanced_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterAdvanced methods ***/
#define IWMWriterAdvanced_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
#define IWMWriterAdvanced_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
#define IWMWriterAdvanced_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
#define IWMWriterAdvanced_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
#define IWMWriterAdvanced_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
#define IWMWriterAdvanced_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
#define IWMWriterAdvanced_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterAdvanced_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
#define IWMWriterAdvanced_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
#define IWMWriterAdvanced_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
#define IWMWriterAdvanced_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced_QueryInterface(IWMWriterAdvanced* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterAdvanced_AddRef(IWMWriterAdvanced* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterAdvanced_Release(IWMWriterAdvanced* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterAdvanced methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced_GetSinkCount(IWMWriterAdvanced* This,DWORD *pcSinks) {
    return This->lpVtbl->GetSinkCount(This,pcSinks);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetSink(IWMWriterAdvanced* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_AddSink(IWMWriterAdvanced* This,IWMWriterSink *pSink) {
    return This->lpVtbl->AddSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_RemoveSink(IWMWriterAdvanced* This,IWMWriterSink *pSink) {
    return This->lpVtbl->RemoveSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_WriteStreamSample(IWMWriterAdvanced* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_SetLiveSource(IWMWriterAdvanced* This,WINBOOL fIsLiveSource) {
    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_IsRealTime(IWMWriterAdvanced* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetWriterTime(IWMWriterAdvanced* This,QWORD *pCurrentTime) {
    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetStatistics(IWMWriterAdvanced* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_SetSyncTolerance(IWMWriterAdvanced* This,DWORD msWindow) {
    return This->lpVtbl->SetSyncTolerance(This,msWindow);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetSyncTolerance(IWMWriterAdvanced* This,DWORD *pmsWindow) {
    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetSinkCount_Proxy(
    IWMWriterAdvanced* This,
    DWORD *pcSinks);
void __RPC_STUB IWMWriterAdvanced_GetSinkCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetSink_Proxy(
    IWMWriterAdvanced* This,
    DWORD dwSinkNum,
    IWMWriterSink **ppSink);
void __RPC_STUB IWMWriterAdvanced_GetSink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_AddSink_Proxy(
    IWMWriterAdvanced* This,
    IWMWriterSink *pSink);
void __RPC_STUB IWMWriterAdvanced_AddSink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_RemoveSink_Proxy(
    IWMWriterAdvanced* This,
    IWMWriterSink *pSink);
void __RPC_STUB IWMWriterAdvanced_RemoveSink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_WriteStreamSample_Proxy(
    IWMWriterAdvanced* This,
    WORD wStreamNum,
    QWORD cnsSampleTime,
    DWORD msSampleSendTime,
    QWORD cnsSampleDuration,
    DWORD dwFlags,
    INSSBuffer *pSample);
void __RPC_STUB IWMWriterAdvanced_WriteStreamSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_SetLiveSource_Proxy(
    IWMWriterAdvanced* This,
    WINBOOL fIsLiveSource);
void __RPC_STUB IWMWriterAdvanced_SetLiveSource_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_IsRealTime_Proxy(
    IWMWriterAdvanced* This,
    WINBOOL *pfRealTime);
void __RPC_STUB IWMWriterAdvanced_IsRealTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetWriterTime_Proxy(
    IWMWriterAdvanced* This,
    QWORD *pCurrentTime);
void __RPC_STUB IWMWriterAdvanced_GetWriterTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetStatistics_Proxy(
    IWMWriterAdvanced* This,
    WORD wStreamNum,
    WM_WRITER_STATISTICS *pStats);
void __RPC_STUB IWMWriterAdvanced_GetStatistics_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_SetSyncTolerance_Proxy(
    IWMWriterAdvanced* This,
    DWORD msWindow);
void __RPC_STUB IWMWriterAdvanced_SetSyncTolerance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced_GetSyncTolerance_Proxy(
    IWMWriterAdvanced* This,
    DWORD *pmsWindow);
void __RPC_STUB IWMWriterAdvanced_GetSyncTolerance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMWriterAdvanced_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterAdvanced2 interface
 */
#ifndef __IWMWriterAdvanced2_INTERFACE_DEFINED__
#define __IWMWriterAdvanced2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterAdvanced2, 0x962dc1ec, 0xc046, 0x4db8, 0x9c,0xc7, 0x26,0xce,0xae,0x50,0x08,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("962dc1ec-c046-4db8-9cc7-26ceae500817")
IWMWriterAdvanced2 : public IWMWriterAdvanced
{
    virtual HRESULT STDMETHODCALLTYPE GetInputSetting(
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInputSetting(
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterAdvanced2, 0x962dc1ec, 0xc046, 0x4db8, 0x9c,0xc7, 0x26,0xce,0xae,0x50,0x08,0x17)
#endif
#else
typedef struct IWMWriterAdvanced2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
        IWMWriterAdvanced2* This,
        DWORD *pcSinks);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWMWriterAdvanced2* This,
        DWORD dwSinkNum,
        IWMWriterSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *AddSink)(
        IWMWriterAdvanced2* This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
        IWMWriterAdvanced2* This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
        IWMWriterAdvanced2* This,
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
        IWMWriterAdvanced2* This,
        WINBOOL fIsLiveSource);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterAdvanced2* This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
        IWMWriterAdvanced2* This,
        QWORD *pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMWriterAdvanced2* This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IWMWriterAdvanced2* This,
        DWORD msWindow);

    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
        IWMWriterAdvanced2* This,
        DWORD *pmsWindow);

    /*** IWMWriterAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInputSetting)(
        IWMWriterAdvanced2* This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetInputSetting)(
        IWMWriterAdvanced2* This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    END_INTERFACE
} IWMWriterAdvanced2Vtbl;
interface IWMWriterAdvanced2 {
    CONST_VTBL IWMWriterAdvanced2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterAdvanced2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterAdvanced2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterAdvanced2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterAdvanced methods ***/
#define IWMWriterAdvanced2_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
#define IWMWriterAdvanced2_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
#define IWMWriterAdvanced2_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
#define IWMWriterAdvanced2_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
#define IWMWriterAdvanced2_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
#define IWMWriterAdvanced2_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
#define IWMWriterAdvanced2_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterAdvanced2_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
#define IWMWriterAdvanced2_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
#define IWMWriterAdvanced2_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
#define IWMWriterAdvanced2_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
/*** IWMWriterAdvanced2 methods ***/
#define IWMWriterAdvanced2_GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength)
#define IWMWriterAdvanced2_SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced2_QueryInterface(IWMWriterAdvanced2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterAdvanced2_AddRef(IWMWriterAdvanced2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterAdvanced2_Release(IWMWriterAdvanced2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterAdvanced methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSinkCount(IWMWriterAdvanced2* This,DWORD *pcSinks) {
    return This->lpVtbl->GetSinkCount(This,pcSinks);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSink(IWMWriterAdvanced2* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_AddSink(IWMWriterAdvanced2* This,IWMWriterSink *pSink) {
    return This->lpVtbl->AddSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_RemoveSink(IWMWriterAdvanced2* This,IWMWriterSink *pSink) {
    return This->lpVtbl->RemoveSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_WriteStreamSample(IWMWriterAdvanced2* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_SetLiveSource(IWMWriterAdvanced2* This,WINBOOL fIsLiveSource) {
    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_IsRealTime(IWMWriterAdvanced2* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetWriterTime(IWMWriterAdvanced2* This,QWORD *pCurrentTime) {
    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetStatistics(IWMWriterAdvanced2* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_SetSyncTolerance(IWMWriterAdvanced2* This,DWORD msWindow) {
    return This->lpVtbl->SetSyncTolerance(This,msWindow);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSyncTolerance(IWMWriterAdvanced2* This,DWORD *pmsWindow) {
    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
}
/*** IWMWriterAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetInputSetting(IWMWriterAdvanced2* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_SetInputSetting(IWMWriterAdvanced2* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMWriterAdvanced2_GetInputSetting_Proxy(
    IWMWriterAdvanced2* This,
    DWORD dwInputNum,
    LPCWSTR pszName,
    WMT_ATTR_DATATYPE *pType,
    BYTE *pValue,
    WORD *pcbLength);
void __RPC_STUB IWMWriterAdvanced2_GetInputSetting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced2_SetInputSetting_Proxy(
    IWMWriterAdvanced2* This,
    DWORD dwInputNum,
    LPCWSTR pszName,
    WMT_ATTR_DATATYPE Type,
    const BYTE *pValue,
    WORD cbLength);
void __RPC_STUB IWMWriterAdvanced2_SetInputSetting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMWriterAdvanced2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterAdvanced3 interface
 */
#ifndef __IWMWriterAdvanced3_INTERFACE_DEFINED__
#define __IWMWriterAdvanced3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterAdvanced3, 0x2cd6492d, 0x7c37, 0x4e76, 0x9d,0x3b, 0x59,0x26,0x11,0x83,0xa2,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2cd6492d-7c37-4e76-9d3b-59261183a22e")
IWMWriterAdvanced3 : public IWMWriterAdvanced2
{
    virtual HRESULT STDMETHODCALLTYPE GetStatisticsEx(
        WORD wStreamNum,
        WM_WRITER_STATISTICS_EX *pStats) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNonBlocking(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterAdvanced3, 0x2cd6492d, 0x7c37, 0x4e76, 0x9d,0x3b, 0x59,0x26,0x11,0x83,0xa2,0x2e)
#endif
#else
typedef struct IWMWriterAdvanced3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
        IWMWriterAdvanced3* This,
        DWORD *pcSinks);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWMWriterAdvanced3* This,
        DWORD dwSinkNum,
        IWMWriterSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *AddSink)(
        IWMWriterAdvanced3* This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
        IWMWriterAdvanced3* This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
        IWMWriterAdvanced3* This,
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
        IWMWriterAdvanced3* This,
        WINBOOL fIsLiveSource);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterAdvanced3* This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
        IWMWriterAdvanced3* This,
        QWORD *pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMWriterAdvanced3* This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IWMWriterAdvanced3* This,
        DWORD msWindow);

    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
        IWMWriterAdvanced3* This,
        DWORD *pmsWindow);

    /*** IWMWriterAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInputSetting)(
        IWMWriterAdvanced3* This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetInputSetting)(
        IWMWriterAdvanced3* This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    /*** IWMWriterAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatisticsEx)(
        IWMWriterAdvanced3* This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS_EX *pStats);

    HRESULT (STDMETHODCALLTYPE *SetNonBlocking)(
        IWMWriterAdvanced3* This);

    END_INTERFACE
} IWMWriterAdvanced3Vtbl;
interface IWMWriterAdvanced3 {
    CONST_VTBL IWMWriterAdvanced3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterAdvanced3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterAdvanced3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterAdvanced3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterAdvanced methods ***/
#define IWMWriterAdvanced3_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
#define IWMWriterAdvanced3_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
#define IWMWriterAdvanced3_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
#define IWMWriterAdvanced3_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
#define IWMWriterAdvanced3_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
#define IWMWriterAdvanced3_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
#define IWMWriterAdvanced3_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterAdvanced3_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
#define IWMWriterAdvanced3_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
#define IWMWriterAdvanced3_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
#define IWMWriterAdvanced3_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
/*** IWMWriterAdvanced2 methods ***/
#define IWMWriterAdvanced3_GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength)
#define IWMWriterAdvanced3_SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength)
/*** IWMWriterAdvanced3 methods ***/
#define IWMWriterAdvanced3_GetStatisticsEx(This,wStreamNum,pStats) (This)->lpVtbl->GetStatisticsEx(This,wStreamNum,pStats)
#define IWMWriterAdvanced3_SetNonBlocking(This) (This)->lpVtbl->SetNonBlocking(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_QueryInterface(IWMWriterAdvanced3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterAdvanced3_AddRef(IWMWriterAdvanced3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterAdvanced3_Release(IWMWriterAdvanced3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterAdvanced methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSinkCount(IWMWriterAdvanced3* This,DWORD *pcSinks) {
    return This->lpVtbl->GetSinkCount(This,pcSinks);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSink(IWMWriterAdvanced3* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_AddSink(IWMWriterAdvanced3* This,IWMWriterSink *pSink) {
    return This->lpVtbl->AddSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_RemoveSink(IWMWriterAdvanced3* This,IWMWriterSink *pSink) {
    return This->lpVtbl->RemoveSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_WriteStreamSample(IWMWriterAdvanced3* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetLiveSource(IWMWriterAdvanced3* This,WINBOOL fIsLiveSource) {
    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_IsRealTime(IWMWriterAdvanced3* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetWriterTime(IWMWriterAdvanced3* This,QWORD *pCurrentTime) {
    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetStatistics(IWMWriterAdvanced3* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetSyncTolerance(IWMWriterAdvanced3* This,DWORD msWindow) {
    return This->lpVtbl->SetSyncTolerance(This,msWindow);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSyncTolerance(IWMWriterAdvanced3* This,DWORD *pmsWindow) {
    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
}
/*** IWMWriterAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetInputSetting(IWMWriterAdvanced3* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetInputSetting(IWMWriterAdvanced3* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength);
}
/*** IWMWriterAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetStatisticsEx(IWMWriterAdvanced3* This,WORD wStreamNum,WM_WRITER_STATISTICS_EX *pStats) {
    return This->lpVtbl->GetStatisticsEx(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetNonBlocking(IWMWriterAdvanced3* This) {
    return This->lpVtbl->SetNonBlocking(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWMWriterAdvanced3_GetStatisticsEx_Proxy(
    IWMWriterAdvanced3* This,
    WORD wStreamNum,
    WM_WRITER_STATISTICS_EX *pStats);
void __RPC_STUB IWMWriterAdvanced3_GetStatisticsEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWMWriterAdvanced3_SetNonBlocking_Proxy(
    IWMWriterAdvanced3* This);
void __RPC_STUB IWMWriterAdvanced3_SetNonBlocking_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWMWriterAdvanced3_INTERFACE_DEFINED__ */

HRESULT WINAPI WMCreateWriter(IUnknown*,IWMWriter**);
HRESULT WINAPI WMCreateReader(IUnknown*,DWORD,IWMReader**);
EXTERN_GUID(WMMEDIASUBTYPE_Base,   0x00000000,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIATYPE_Video,     0x73646976,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_RGB1,   0xe436eb78,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB4,   0xe436eb79,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB8,   0xe436eb7a,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB565, 0xe436eb7b,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB555, 0xe436eb7c,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB24,  0xe436eb7d,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB32,  0xe436eb7e,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_I420,   0x30323449,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_IYUV,   0x56555949,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YV12,   0x32315659,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YUY2,   0x32595559,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_P422,   0x32323450,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_UYVY,   0x59565955,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YVYU,   0x55595659,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YVU9,   0x39555659,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_VIDEOIMAGE, 0x1d4a45f2,0xe5f6,0x4b44,0x83,0x88,0xf0,0xae,0x5c,0x0e,0x0c,0x37);
EXTERN_GUID(WMMEDIASUBTYPE_MP43,   0x3334504d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MP4S,   0x5334504d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_M4S2,   0x3253344d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMV1,   0x31564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMV2,   0x32564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MSS1,   0x3153534d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MPEG2_VIDEO, 0xe06d8026,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea);
EXTERN_GUID(WMMEDIATYPE_Audio,     0x73647561,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_PCM,    0x00000001,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_DRM,    0x00000009,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMAudioV9,        0x00000162,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMAudio_Lossless, 0x00000163,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MSS2,   0x3253534d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMSP1,  0x0000000a,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMSP2,  0x0000000b,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMV3,   0x33564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMVP,   0x50564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WVP2,   0x32505657,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMVA,   0x41564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WVC1,   0x31435657,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wmsdkidl_h__ */
