1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/msw/mediactrl_am.cpp
3// Purpose:     ActiveMovie/WMP6/PocketPC 2000 Media Backend for Windows
4// Author:      Ryan Norton <wxprojects@comcast.net>
5// Modified by:
6// Created:     01/29/05
7// RCS-ID:      $Id: mediactrl_am.cpp 49027 2007-10-03 22:36:29Z VZ $
8// Copyright:   (c) Ryan Norton
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// TODO: Actually test the CE IWMP....
13// TODO: Actually test HTTP proxies...
14
15//-----------------Introduction----------------------------------------------
16// This is the media backend for Windows Media Player 6 and ActiveMovie,
17// as well as PocketPC 2000, Windows Media Player Mobile 7 and 8.
18//
19// We use a combination of the WMP 6 IMediaPlayer interface as well as the
20// ActiveMovie interface IActiveMovie that even exists on Windows 3. For
21// mobile systems we switch to IWMP for WMP mobile 7 and 8 and possibly
22// earlier. We just use ifdefs for differentiating between IWMP and
23// IActiveMovie/IMediaPlayer as the IWMP and IMediaPlayer are virtually
24// identical with a few minor exceptions.
25//
26// For supporting HTTP proxies and such we query the media player
27// interface (IActiveMovie/IWMP) for the INSPlay (NetShow) interface.
28//
29// The IMediaPlayer/IActiveMovie/IWMP are rather clean and straightforward
30// interfaces that are fairly simplistic.
31//
32// Docs for IMediaPlayer are at
33// http://msdn.microsoft.com/library/en-us/wmp6sdk/htm/microsoftwindowsmediaplayercontrolversion64sdk.asp
34//
35// Docs for IWMP are at
36// http://msdn.microsoft.com/library/en-us/wcewmp/html/_wcesdk_asx_wmp_control_reference.asp
37
38//===========================================================================
39//  DECLARATIONS
40//===========================================================================
41
42//---------------------------------------------------------------------------
43// Pre-compiled header stuff
44//---------------------------------------------------------------------------
45
46// For compilers that support precompilation, includes "wx.h".
47#include "wx/wxprec.h"
48
49#ifdef __BORLANDC__
50    #pragma hdrstop
51#endif
52
53// disable "cast truncates constant value" for VARIANT_BOOL values
54// passed as parameters in VC6
55#ifdef _MSC_VER
56#pragma warning (disable:4310)
57#endif
58
59#if wxUSE_MEDIACTRL && wxUSE_ACTIVEX
60
61#include "wx/mediactrl.h"
62
63#ifndef WX_PRECOMP
64    #include "wx/log.h"
65    #include "wx/dcclient.h"
66    #include "wx/timer.h"
67    #include "wx/math.h"        // log10 & pow
68    #include "wx/stopwatch.h"
69#endif
70
71#include "wx/msw/private.h" // user info and wndproc setting/getting
72#include "wx/dynlib.h"
73
74//---------------------------------------------------------------------------
75//  wxActiveXContainer - includes all the COM-specific stuff we need
76//---------------------------------------------------------------------------
77#include "wx/msw/ole/activex.h"
78
79// It may sound odd, but you can actually compile this with
80// __WXWINCE__ enabled on non-CE windows
81//#define __WXWINCE__
82
83//---------------------------------------------------------------------------
84//  IIDS - used by CoCreateInstance and IUnknown::QueryInterface
85//
86//  [idl name]          [idl decription]
87//  amcompat.idl        Microsoft Active Movie Control (Ver 2.0)
88//  nscompat.idl        Microsoft NetShow Player (Ver 1.0)
89//  msdxm.idl           Windows Media Player (Ver 1.0)
90//  quartz.idl
91//
92//  First, when I say I "from XXX.idl", I mean I go into the COM Browser
93//  ($Microsoft Visual Studio$/Common/Tools/OLEVIEW.EXE), open
94//  "type libraries", open a specific type library (for quartz for example its
95//  "ActiveMovie control type library (V1.0)"), save it as an .idl, compile the
96//  idl using the midl compiler that comes with visual studio
97//  ($Microsoft Visual Studio$/VC98/bin/midl.exe on VC6) with the /h argument
98//  to make it generate stubs (a .h & .c file), then clean up the generated
99//  interfaces I want with the STDMETHOD wrappers and then put them into
100//  mediactrl.cpp.
101//
102//  According to the MSDN docs, IMediaPlayer requires Windows 98 SE
103//  or greater.  NetShow is available on Windows 3.1 and I'm guessing
104//  IActiveMovie is too.  IMediaPlayer is essentially the Windows Media
105//  Player 6.4 SDK.
106//
107//  IWMP is from PlayerOCX.idl on PocketPC 2000, which uses CLSID_MediaPlayer
108//  as well as the main windows line.
109//
110//  Some of these are not used but are kept here for future reference anyway
111//---------------------------------------------------------------------------
112const IID IID_IActiveMovie          = {0x05589FA2,0xC356,0x11CE,{0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A}};
113const IID IID_IActiveMovie2         = {0xB6CD6554,0xE9CB,0x11D0,{0x82,0x1F,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}};
114const IID IID_IActiveMovie3         = {0x265EC140,0xAE62,0x11D1,{0x85,0x00,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}};
115
116const IID IID_INSOPlay              = {0x2179C5D1,0xEBFF,0x11CF,{0xB6,0xFD,0x00,0xAA,0x00,0xB4,0xE2,0x20}};
117const IID IID_INSPlay               = {0xE7C4BE80,0x7960,0x11D0,{0xB7,0x27,0x00,0xAA,0x00,0xB4,0xE2,0x20}};
118const IID IID_INSPlay1              = {0x265EC141,0xAE62,0x11D1,{0x85,0x00,0x00,0xA0,0xC9,0x1F,0x9C,0xA0}};
119
120const IID IID_IMediaPlayer          = {0x22D6F311,0xB0F6,0x11D0,{0x94,0xAB,0x00,0x80,0xC7,0x4C,0x7E,0x95}};
121const IID IID_IMediaPlayer2         = {0x20D4F5E0,0x5475,0x11D2,{0x97,0x74,0x00,0x00,0xF8,0x08,0x55,0xE6}};
122
123
124#ifdef __WXWINCE__
125const IID IID_IWMP                  = {0x136B66EC,0xF30D,0x46A8,{0x88,0xDD,0xF2,0xD0,0x55,0x16,0x3E,0x49}};
126#endif
127
128const CLSID CLSID_ActiveMovie       = {0x05589FA1,0xC356,0x11CE,{0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A}};
129const CLSID CLSID_MediaPlayer       = {0x22D6F312,0xB0F6,0x11D0,{0x94,0xAB,0x00,0x80,0xC7,0x4C,0x7E,0x95}};
130const CLSID CLSID_NSPlay            = {0x2179C5D3,0xEBFF,0x11CF,{0xB6,0xFD,0x00,0xAA,0x00,0xB4,0xE2,0x20}};
131
132const IID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11CF,{0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}};
133
134// QUARTZ
135const CLSID CLSID_FilgraphManager = {0xE436EBB3,0x524F,0x11CE,{0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70}};
136const IID IID_IMediaEvent = {0x56A868B6,0x0AD4,0x11CE,{0xB0,0x3A,0x00,0x20,0xAF,0x0B,0xA7,0x70}};
137
138//??  QUARTZ Also?
139const CLSID CLSID_VideoMixingRenderer9 ={0x51B4ABF3, 0x748F, 0x4E3B,{0xA2, 0x76, 0xC8, 0x28, 0x33, 0x0E, 0x92, 0x6A}};
140const IID IID_IVMRWindowlessControl9 =  {0x8F537D09, 0xF85E, 0x4414,{0xB2, 0x3B, 0x50, 0x2E, 0x54, 0xC7, 0x99, 0x27}};
141const IID IID_IFilterGraph =            {0x56A8689F, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
142const IID IID_IGraphBuilder =           {0x56A868A9, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
143const IID IID_IVMRFilterConfig9 =       {0x5A804648, 0x4F66, 0x4867,{0x9C, 0x43, 0x4F, 0x5C, 0x82, 0x2C, 0xF1, 0xB8}};
144const IID IID_IBaseFilter =             {0x56A86895, 0x0AD4, 0x11CE,{0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
145
146//---------------------------------------------------------------------------
147//  QUARTZ COM INTERFACES (dumped from quartz.idl from MSVC COM Browser)
148//---------------------------------------------------------------------------
149
150struct IAMOpenProgress : public IUnknown
151{
152    STDMETHOD(QueryProgress)(LONGLONG *pllTotal, LONGLONG *pllCurrent) PURE;
153    STDMETHOD(AbortOperation)(void) PURE;
154};
155
156struct IMediaEvent : public IDispatch
157{
158    STDMETHOD(GetEventHandle)(LONG_PTR *) PURE;
159    STDMETHOD(GetEvent)(long *, LONG_PTR *, LONG_PTR *, long) PURE;
160    STDMETHOD(WaitForCompletion)(long, long *) PURE;
161    STDMETHOD(CancelDefaultHandling)(long) PURE;
162    STDMETHOD(RestoreDefaultHandling)(long) PURE;
163    STDMETHOD(FreeEventParams)(long, LONG_PTR, LONG_PTR) PURE;
164};
165
166//---------------------------------------------------------------------------
167//  ACTIVEMOVIE COM INTERFACES (dumped from amcompat.idl from MSVC COM Browser)
168//---------------------------------------------------------------------------
169
170enum ReadyStateConstants
171{
172    amvUninitialized  = 0,
173    amvLoading        = 1,
174    amvInteractive    = 3,
175    amvComplete       = 4
176};
177
178enum StateConstants
179{
180    amvNotLoaded    = -1,
181    amvStopped      = 0,
182    amvPaused       = 1,
183    amvRunning      = 2
184};
185
186enum DisplayModeConstants
187{
188    amvTime      = 0,
189    amvFrames    = 1
190};
191
192enum WindowSizeConstants
193{
194    amvOriginalSize    = 0,
195    amvDoubleOriginalSize    = 1,
196    amvOneSixteenthScreen    = 2,
197    amvOneFourthScreen    = 3,
198    amvOneHalfScreen    = 4
199};
200
201enum AppearanceConstants
202{
203    amvFlat    = 0,
204    amv3D    = 1
205};
206
207enum BorderStyleConstants
208{
209    amvNone    = 0,
210    amvFixedSingle    = 1
211};
212
213struct IActiveMovie : public IDispatch
214{
215    STDMETHOD(AboutBox)( void) PURE;
216    STDMETHOD(Run)( void) PURE;
217    STDMETHOD(Pause)( void) PURE;
218    STDMETHOD(Stop)( void) PURE;
219    STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE;
220    STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE;
221    STDMETHOD(get_Author)(BSTR __RPC_FAR *pbstrAuthor) PURE;
222    STDMETHOD(get_Title)(BSTR __RPC_FAR *pbstrTitle) PURE;
223    STDMETHOD(get_Copyright)(BSTR __RPC_FAR *pbstrCopyright) PURE;
224    STDMETHOD(get_Description)(BSTR __RPC_FAR *pbstrDescription) PURE;
225    STDMETHOD(get_Rating)(BSTR __RPC_FAR *pbstrRating) PURE;
226    STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE;
227    STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE;
228    STDMETHOD(get_Duration)(double __RPC_FAR *pValue) PURE;
229    STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pValue) PURE;
230    STDMETHOD(put_CurrentPosition)(double pValue) PURE;
231    STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE;
232    STDMETHOD(put_PlayCount)(long pPlayCount) PURE;
233    STDMETHOD(get_SelectionStart)(double __RPC_FAR *pValue) PURE;
234    STDMETHOD(put_SelectionStart)(double pValue) PURE;
235    STDMETHOD(get_SelectionEnd)(double __RPC_FAR *pValue) PURE;
236    STDMETHOD(put_SelectionEnd)(double pValue) PURE;
237    STDMETHOD(get_CurrentState)(StateConstants __RPC_FAR *pState) PURE;
238    STDMETHOD(get_Rate)(double __RPC_FAR *pValue) PURE;
239    STDMETHOD(put_Rate)(double pValue) PURE;
240    STDMETHOD(get_Volume)(long __RPC_FAR *pValue) PURE;
241    STDMETHOD(put_Volume)(long pValue) PURE;
242    STDMETHOD(get_Balance)(long __RPC_FAR *pValue) PURE;
243    STDMETHOD(put_Balance)(long pValue) PURE;
244    STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnable) PURE;
245    STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnable) PURE;
246    STDMETHOD(get_ShowDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE;
247    STDMETHOD(put_ShowDisplay)(VARIANT_BOOL Show) PURE;
248    STDMETHOD(get_ShowControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
249    STDMETHOD(put_ShowControls)(VARIANT_BOOL Show) PURE;
250    STDMETHOD(get_ShowPositionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
251    STDMETHOD(put_ShowPositionControls)(VARIANT_BOOL Show) PURE;
252    STDMETHOD(get_ShowSelectionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
253    STDMETHOD(put_ShowSelectionControls)(VARIANT_BOOL Show) PURE;
254    STDMETHOD(get_ShowTracker)(VARIANT_BOOL __RPC_FAR *Show) PURE;
255    STDMETHOD(put_ShowTracker)(VARIANT_BOOL Show) PURE;
256    STDMETHOD(get_EnablePositionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
257    STDMETHOD(put_EnablePositionControls)(VARIANT_BOOL Enable) PURE;
258    STDMETHOD(get_EnableSelectionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
259    STDMETHOD(put_EnableSelectionControls)(VARIANT_BOOL Enable) PURE;
260    STDMETHOD(get_EnableTracker)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
261    STDMETHOD(put_EnableTracker)(VARIANT_BOOL Enable) PURE;
262    STDMETHOD(get_AllowHideDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE;
263    STDMETHOD(put_AllowHideDisplay)(VARIANT_BOOL Show) PURE;
264    STDMETHOD(get_AllowHideControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
265    STDMETHOD(put_AllowHideControls)(VARIANT_BOOL Show) PURE;
266    STDMETHOD(get_DisplayMode)(DisplayModeConstants __RPC_FAR *pValue) PURE;
267    STDMETHOD(put_DisplayMode)(DisplayModeConstants pValue) PURE;
268    STDMETHOD(get_AllowChangeDisplayMode)(VARIANT_BOOL __RPC_FAR *fAllow) PURE;
269    STDMETHOD(put_AllowChangeDisplayMode)(VARIANT_BOOL fAllow) PURE;
270    STDMETHOD(get_FilterGraph)(IUnknown __RPC_FAR *__RPC_FAR *ppFilterGraph) PURE;
271    STDMETHOD(put_FilterGraph)(IUnknown __RPC_FAR *ppFilterGraph) PURE;
272    STDMETHOD(get_FilterGraphDispatch)(IDispatch __RPC_FAR *__RPC_FAR *pDispatch) PURE;
273    STDMETHOD(get_DisplayForeColor)(unsigned long __RPC_FAR *ForeColor) PURE;
274    STDMETHOD(put_DisplayForeColor)(unsigned long ForeColor) PURE;
275    STDMETHOD(get_DisplayBackColor)(unsigned long __RPC_FAR *BackColor) PURE;
276    STDMETHOD(put_DisplayBackColor)(unsigned long BackColor) PURE;
277    STDMETHOD(get_MovieWindowSize)(WindowSizeConstants __RPC_FAR *WindowSize) PURE;
278    STDMETHOD(put_MovieWindowSize)(WindowSizeConstants WindowSize) PURE;
279    STDMETHOD(get_FullScreenMode)(VARIANT_BOOL __RPC_FAR *pEnable) PURE;
280    STDMETHOD(put_FullScreenMode)(VARIANT_BOOL pEnable) PURE;
281    STDMETHOD(get_AutoStart)(VARIANT_BOOL __RPC_FAR *pEnable) PURE;
282    STDMETHOD(put_AutoStart)(VARIANT_BOOL pEnable) PURE;
283    STDMETHOD(get_AutoRewind)(VARIANT_BOOL __RPC_FAR *pEnable) PURE;
284    STDMETHOD(put_AutoRewind)(VARIANT_BOOL pEnable) PURE;
285    STDMETHOD(get_hWnd)(long __RPC_FAR *hWnd) PURE;
286    STDMETHOD(get_Appearance)(AppearanceConstants __RPC_FAR *pAppearance) PURE;
287    STDMETHOD(put_Appearance)(AppearanceConstants pAppearance) PURE;
288    STDMETHOD(get_BorderStyle)(BorderStyleConstants __RPC_FAR *pBorderStyle) PURE;
289    STDMETHOD(put_BorderStyle)(BorderStyleConstants pBorderStyle) PURE;
290    STDMETHOD(get_Enabled)(VARIANT_BOOL __RPC_FAR *pEnabled) PURE;
291    STDMETHOD(put_Enabled)(VARIANT_BOOL pEnabled) PURE;
292    STDMETHOD(get_Info)(long __RPC_FAR *ppInfo) PURE;
293};
294
295
296
297struct IActiveMovie2 : public IActiveMovie
298{
299    STDMETHOD(IsSoundCardEnabled)(VARIANT_BOOL __RPC_FAR *pbSoundCard) PURE;
300    STDMETHOD(get_ReadyState)(ReadyStateConstants __RPC_FAR *pValue) PURE;
301};
302
303struct IActiveMovie3 : public IActiveMovie2
304{
305    STDMETHOD(get_MediaPlayer)(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) PURE;
306};
307
308
309//---------------------------------------------------------------------------
310//  MEDIAPLAYER COM INTERFACES (dumped from msdxm.idl from MSVC COM Browser)
311//---------------------------------------------------------------------------
312
313enum MPPlayStateConstants
314{
315    mpStopped = 0,
316    mpPaused    = 1,
317    mpPlaying    = 2,
318    mpWaiting    = 3,
319    mpScanForward    = 4,
320    mpScanReverse    = 5,
321    mpClosed    = 6
322};
323
324enum MPDisplaySizeConstants
325{
326    mpDefaultSize = 0,
327    mpHalfSize    = 1,
328    mpDoubleSize    = 2,
329    mpFullScreen    = 3,
330    mpFitToSize    = 4,
331    mpOneSixteenthScreen    = 5,
332    mpOneFourthScreen    = 6,
333    mpOneHalfScreen    = 7
334};
335
336enum MPReadyStateConstants
337{
338    mpReadyStateUninitialized = 0,
339    mpReadyStateLoading    = 1,
340    mpReadyStateInteractive    = 3,
341    mpReadyStateComplete    = 4
342};
343
344typedef unsigned long VB_OLE_COLOR;
345
346enum MPDisplayModeConstants
347{
348    mpTime = 0,
349    mpFrames    = 1
350};
351
352enum MPMoreInfoType
353{
354    mpShowURL = 0,
355    mpClipURL    = 1,
356    mpBannerURL    = 2
357};
358
359enum MPMediaInfoType
360{
361    mpShowFilename = 0,
362    mpShowTitle    = 1,
363    mpShowAuthor    = 2,
364    mpShowCopyright    = 3,
365    mpShowRating    = 4,
366    mpShowDescription    = 5,
367    mpShowLogoIcon    = 6,
368    mpClipFilename    = 7,
369    mpClipTitle    = 8,
370    mpClipAuthor    = 9,
371    mpClipCopyright    = 10,
372    mpClipRating    = 11,
373    mpClipDescription    = 12,
374    mpClipLogoIcon    = 13,
375    mpBannerImage    = 14,
376    mpBannerMoreInfo    = 15,
377    mpWatermark    = 16
378};
379
380enum DVDMenuIDConstants
381{
382    dvdMenu_Title    = 2,
383    dvdMenu_Root    = 3,
384    dvdMenu_Subpicture    = 4,
385    dvdMenu_Audio    = 5,
386    dvdMenu_Angle    = 6,
387    dvdMenu_Chapter    = 7
388};
389
390enum MPShowDialogConstants
391{
392    mpShowDialogHelp = 0,
393    mpShowDialogStatistics    = 1,
394    mpShowDialogOptions    = 2,
395    mpShowDialogContextMenu    = 3
396};
397
398
399struct IMediaPlayer : public IDispatch
400{
401    STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pCurrentPosition) PURE;
402    STDMETHOD(put_CurrentPosition)(double pCurrentPosition) PURE;
403    STDMETHOD(get_Duration)(double __RPC_FAR *pDuration) PURE;
404    STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE;
405    STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE;
406    STDMETHOD(get_MarkerCount)(long __RPC_FAR *pMarkerCount) PURE;
407    STDMETHOD(get_CanScan)(VARIANT_BOOL __RPC_FAR *pCanScan) PURE;
408    STDMETHOD(get_CanSeek)(VARIANT_BOOL __RPC_FAR *pCanSeek) PURE;
409    STDMETHOD(get_CanSeekToMarkers)(VARIANT_BOOL __RPC_FAR *pCanSeekToMarkers) PURE;
410    STDMETHOD(get_CurrentMarker)(long __RPC_FAR *pCurrentMarker) PURE;
411    STDMETHOD(put_CurrentMarker)(long pCurrentMarker) PURE;
412    STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE;
413    STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE;
414    STDMETHOD(get_SourceLink)(BSTR __RPC_FAR *pbstrSourceLink) PURE;
415    STDMETHOD(get_CreationDate)(DATE __RPC_FAR *pCreationDate) PURE;
416    STDMETHOD(get_ErrorCorrection)(BSTR __RPC_FAR *pbstrErrorCorrection) PURE;
417    STDMETHOD(get_Bandwidth)(long __RPC_FAR *pBandwidth) PURE;
418    STDMETHOD(get_SourceProtocol)(long __RPC_FAR *pSourceProtocol) PURE;
419    STDMETHOD(get_ReceivedPackets)(long __RPC_FAR *pReceivedPackets) PURE;
420    STDMETHOD(get_RecoveredPackets)(long __RPC_FAR *pRecoveredPackets) PURE;
421    STDMETHOD(get_LostPackets)(long __RPC_FAR *pLostPackets) PURE;
422    STDMETHOD(get_ReceptionQuality)(long __RPC_FAR *pReceptionQuality) PURE;
423    STDMETHOD(get_BufferingCount)(long __RPC_FAR *pBufferingCount) PURE;
424    STDMETHOD(get_IsBroadcast)(VARIANT_BOOL __RPC_FAR *pIsBroadcast) PURE;
425    STDMETHOD(get_BufferingProgress)(long __RPC_FAR *pBufferingProgress) PURE;
426    STDMETHOD(get_ChannelName)(BSTR __RPC_FAR *pbstrChannelName) PURE;
427    STDMETHOD(get_ChannelDescription)(BSTR __RPC_FAR *pbstrChannelDescription) PURE;
428    STDMETHOD(get_ChannelURL)(BSTR __RPC_FAR *pbstrChannelURL) PURE;
429    STDMETHOD(get_ContactAddress)(BSTR __RPC_FAR *pbstrContactAddress) PURE;
430    STDMETHOD(get_ContactPhone)(BSTR __RPC_FAR *pbstrContactPhone) PURE;
431    STDMETHOD(get_ContactEmail)(BSTR __RPC_FAR *pbstrContactEmail) PURE;
432    STDMETHOD(get_BufferingTime)(double __RPC_FAR *pBufferingTime) PURE;
433    STDMETHOD(put_BufferingTime)(double pBufferingTime) PURE;
434    STDMETHOD(get_AutoStart)(VARIANT_BOOL __RPC_FAR *pAutoStart) PURE;
435    STDMETHOD(put_AutoStart)(VARIANT_BOOL pAutoStart) PURE;
436    STDMETHOD(get_AutoRewind)(VARIANT_BOOL __RPC_FAR *pAutoRewind) PURE;
437    STDMETHOD(put_AutoRewind)(VARIANT_BOOL pAutoRewind) PURE;
438    STDMETHOD(get_Rate)(double __RPC_FAR *pRate) PURE;
439    STDMETHOD(put_Rate)(double pRate) PURE;
440    STDMETHOD(get_SendKeyboardEvents)(VARIANT_BOOL __RPC_FAR *pSendKeyboardEvents) PURE;
441    STDMETHOD(put_SendKeyboardEvents)(VARIANT_BOOL pSendKeyboardEvents) PURE;
442    STDMETHOD(get_SendMouseClickEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseClickEvents) PURE;
443    STDMETHOD(put_SendMouseClickEvents)(VARIANT_BOOL pSendMouseClickEvents) PURE;
444    STDMETHOD(get_SendMouseMoveEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseMoveEvents) PURE;
445    STDMETHOD(put_SendMouseMoveEvents)(VARIANT_BOOL pSendMouseMoveEvents) PURE;
446    STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE;
447    STDMETHOD(put_PlayCount)(long pPlayCount) PURE;
448    STDMETHOD(get_ClickToPlay)(VARIANT_BOOL __RPC_FAR *pClickToPlay) PURE;
449    STDMETHOD(put_ClickToPlay)(VARIANT_BOOL pClickToPlay) PURE;
450    STDMETHOD(get_AllowScan)(VARIANT_BOOL __RPC_FAR *pAllowScan) PURE;
451    STDMETHOD(put_AllowScan)(VARIANT_BOOL pAllowScan) PURE;
452    STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnableContextMenu) PURE;
453    STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnableContextMenu) PURE;
454    STDMETHOD(get_CursorType)(long __RPC_FAR *pCursorType) PURE;
455    STDMETHOD(put_CursorType)(long pCursorType) PURE;
456    STDMETHOD(get_CodecCount)(long __RPC_FAR *pCodecCount) PURE;
457    STDMETHOD(get_AllowChangeDisplaySize)(VARIANT_BOOL __RPC_FAR *pAllowChangeDisplaySize) PURE;
458    STDMETHOD(put_AllowChangeDisplaySize)( VARIANT_BOOL pAllowChangeDisplaySize) PURE;
459    STDMETHOD(get_IsDurationValid)(VARIANT_BOOL __RPC_FAR *pIsDurationValid) PURE;
460    STDMETHOD(get_OpenState)(long __RPC_FAR *pOpenState) PURE;
461    STDMETHOD(get_SendOpenStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendOpenStateChangeEvents) PURE;
462    STDMETHOD(put_SendOpenStateChangeEvents)(VARIANT_BOOL pSendOpenStateChangeEvents) PURE;
463    STDMETHOD(get_SendWarningEvents)( VARIANT_BOOL __RPC_FAR *pSendWarningEvents) PURE;
464    STDMETHOD(put_SendWarningEvents)(VARIANT_BOOL pSendWarningEvents) PURE;
465    STDMETHOD(get_SendErrorEvents)(VARIANT_BOOL __RPC_FAR *pSendErrorEvents) PURE;
466    STDMETHOD(put_SendErrorEvents)(VARIANT_BOOL pSendErrorEvents) PURE;
467    STDMETHOD(get_PlayState)(MPPlayStateConstants __RPC_FAR *pPlayState) PURE;
468    STDMETHOD(get_SendPlayStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendPlayStateChangeEvents) PURE;
469    STDMETHOD(put_SendPlayStateChangeEvents)(VARIANT_BOOL pSendPlayStateChangeEvents) PURE;
470    STDMETHOD(get_DisplaySize)(MPDisplaySizeConstants __RPC_FAR *pDisplaySize) PURE;
471    STDMETHOD(put_DisplaySize)(MPDisplaySizeConstants pDisplaySize) PURE;
472    STDMETHOD(get_InvokeURLs)(VARIANT_BOOL __RPC_FAR *pInvokeURLs) PURE;
473    STDMETHOD(put_InvokeURLs)(VARIANT_BOOL pInvokeURLs) PURE;
474    STDMETHOD(get_BaseURL)(BSTR __RPC_FAR *pbstrBaseURL) PURE;
475    STDMETHOD(put_BaseURL)(BSTR pbstrBaseURL) PURE;
476    STDMETHOD(get_DefaultFrame)(BSTR __RPC_FAR *pbstrDefaultFrame) PURE;
477    STDMETHOD(put_DefaultFrame)(BSTR pbstrDefaultFrame) PURE;
478    STDMETHOD(get_HasError)(VARIANT_BOOL __RPC_FAR *pHasError) PURE;
479    STDMETHOD(get_ErrorDescription)(BSTR __RPC_FAR *pbstrErrorDescription) PURE;
480    STDMETHOD(get_ErrorCode)(long __RPC_FAR *pErrorCode) PURE;
481    STDMETHOD(get_AnimationAtStart)(VARIANT_BOOL __RPC_FAR *pAnimationAtStart) PURE;
482    STDMETHOD(put_AnimationAtStart)(VARIANT_BOOL pAnimationAtStart) PURE;
483    STDMETHOD(get_TransparentAtStart)( VARIANT_BOOL __RPC_FAR *pTransparentAtStart) PURE;
484    STDMETHOD(put_TransparentAtStart)(VARIANT_BOOL pTransparentAtStart) PURE;
485    STDMETHOD(get_Volume)(long __RPC_FAR *pVolume) PURE;
486    STDMETHOD(put_Volume)(long pVolume) PURE;
487    STDMETHOD(get_Balance)(long __RPC_FAR *pBalance) PURE;
488    STDMETHOD(put_Balance)(long pBalance) PURE;
489    STDMETHOD(get_ReadyState)(MPReadyStateConstants __RPC_FAR *pValue) PURE;
490    STDMETHOD(get_SelectionStart)(double __RPC_FAR *pValue) PURE;
491    STDMETHOD(put_SelectionStart)(double pValue) PURE;
492    STDMETHOD(get_SelectionEnd)(double __RPC_FAR *pValue) PURE;
493    STDMETHOD(put_SelectionEnd)(double pValue) PURE;
494    STDMETHOD(get_ShowDisplay)(VARIANT_BOOL __RPC_FAR *Show) PURE;
495    STDMETHOD(put_ShowDisplay)(VARIANT_BOOL Show) PURE;
496    STDMETHOD(get_ShowControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
497    STDMETHOD(put_ShowControls)(VARIANT_BOOL Show) PURE;
498    STDMETHOD(get_ShowPositionControls)(VARIANT_BOOL __RPC_FAR *Show) PURE;
499    STDMETHOD(put_ShowPositionControls)(VARIANT_BOOL Show) PURE;
500    STDMETHOD(get_ShowTracker)(VARIANT_BOOL __RPC_FAR *Show) PURE;
501    STDMETHOD(put_ShowTracker)(VARIANT_BOOL Show) PURE;
502    STDMETHOD(get_EnablePositionControls)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
503    STDMETHOD(put_EnablePositionControls)(VARIANT_BOOL Enable) PURE;
504    STDMETHOD(get_EnableTracker)(VARIANT_BOOL __RPC_FAR *Enable) PURE;
505    STDMETHOD(put_EnableTracker)(VARIANT_BOOL Enable) PURE;
506    STDMETHOD(get_Enabled)(VARIANT_BOOL __RPC_FAR *pEnabled) PURE;
507    STDMETHOD(put_Enabled)(VARIANT_BOOL pEnabled) PURE;
508    STDMETHOD(get_DisplayForeColor)(VB_OLE_COLOR __RPC_FAR *ForeColor) PURE;
509    STDMETHOD(put_DisplayForeColor)(VB_OLE_COLOR ForeColor) PURE;
510    STDMETHOD(get_DisplayBackColor)(VB_OLE_COLOR __RPC_FAR *BackColor) PURE;
511    STDMETHOD(put_DisplayBackColor)(VB_OLE_COLOR BackColor) PURE;
512    STDMETHOD(get_DisplayMode)(MPDisplayModeConstants __RPC_FAR *pValue) PURE;
513    STDMETHOD(put_DisplayMode)(MPDisplayModeConstants pValue) PURE;
514    STDMETHOD(get_VideoBorder3D)(VARIANT_BOOL __RPC_FAR *pVideoBorderWidth) PURE;
515    STDMETHOD(put_VideoBorder3D)(VARIANT_BOOL pVideoBorderWidth) PURE;
516    STDMETHOD(get_VideoBorderWidth)(long __RPC_FAR *pVideoBorderWidth) PURE;
517    STDMETHOD(put_VideoBorderWidth)(long pVideoBorderWidth) PURE;
518    STDMETHOD(get_VideoBorderColor)(VB_OLE_COLOR __RPC_FAR *pVideoBorderWidth) PURE;
519    STDMETHOD(put_VideoBorderColor)(VB_OLE_COLOR pVideoBorderWidth) PURE;
520    STDMETHOD(get_ShowGotoBar)(VARIANT_BOOL __RPC_FAR *pbool) PURE;
521    STDMETHOD(put_ShowGotoBar)(VARIANT_BOOL pbool) PURE;
522    STDMETHOD(get_ShowStatusBar)(VARIANT_BOOL __RPC_FAR *pbool) PURE;
523    STDMETHOD(put_ShowStatusBar)(VARIANT_BOOL pbool) PURE;
524    STDMETHOD(get_ShowCaptioning)(VARIANT_BOOL __RPC_FAR *pbool) PURE;
525    STDMETHOD(put_ShowCaptioning)(VARIANT_BOOL pbool) PURE;
526    STDMETHOD(get_ShowAudioControls)(VARIANT_BOOL __RPC_FAR *pbool) PURE;
527    STDMETHOD(put_ShowAudioControls)(VARIANT_BOOL pbool) PURE;
528    STDMETHOD(get_CaptioningID)( BSTR __RPC_FAR *pstrText) PURE;
529    STDMETHOD(put_CaptioningID)(BSTR pstrText) PURE;
530    STDMETHOD(get_Mute)(VARIANT_BOOL __RPC_FAR *vbool) PURE;
531    STDMETHOD(put_Mute)(VARIANT_BOOL vbool) PURE;
532    STDMETHOD(get_CanPreview)(VARIANT_BOOL __RPC_FAR *pCanPreview) PURE;
533    STDMETHOD(get_PreviewMode)(VARIANT_BOOL __RPC_FAR *pPreviewMode) PURE;
534    STDMETHOD(put_PreviewMode)(VARIANT_BOOL pPreviewMode) PURE;
535    STDMETHOD(get_HasMultipleItems)(VARIANT_BOOL __RPC_FAR *pHasMuliItems) PURE;
536    STDMETHOD(get_Language)(long __RPC_FAR *pLanguage) PURE;
537    STDMETHOD(put_Language)(long pLanguage) PURE;
538    STDMETHOD(get_AudioStream)(long __RPC_FAR *pStream) PURE;
539    STDMETHOD(put_AudioStream)(long pStream) PURE;
540    STDMETHOD(get_SAMIStyle)(BSTR __RPC_FAR *pbstrStyle) PURE;
541    STDMETHOD(put_SAMIStyle)(BSTR pbstrStyle) PURE;
542    STDMETHOD(get_SAMILang)(BSTR __RPC_FAR *pbstrLang) PURE;
543    STDMETHOD(put_SAMILang)(BSTR pbstrLang) PURE;
544    STDMETHOD(get_SAMIFileName)(BSTR __RPC_FAR *pbstrFileName) PURE;
545    STDMETHOD(put_SAMIFileName)(BSTR pbstrFileName) PURE;
546    STDMETHOD(get_StreamCount)( long __RPC_FAR *pStreamCount) PURE;
547    STDMETHOD(get_ClientId)(BSTR __RPC_FAR *pbstrClientId) PURE;
548    STDMETHOD(get_ConnectionSpeed)(long __RPC_FAR *plConnectionSpeed) PURE;
549    STDMETHOD(get_AutoSize)(VARIANT_BOOL __RPC_FAR *pbool) PURE;
550    STDMETHOD(put_AutoSize)(VARIANT_BOOL pbool) PURE;
551    STDMETHOD(get_EnableFullScreenControls)(VARIANT_BOOL __RPC_FAR *pbVal) PURE;
552    STDMETHOD(put_EnableFullScreenControls)(VARIANT_BOOL pbVal) PURE;
553    STDMETHOD(get_ActiveMovie)(IDispatch __RPC_FAR *__RPC_FAR *ppdispatch) PURE;
554    STDMETHOD(get_NSPlay)(IDispatch __RPC_FAR *__RPC_FAR *ppdispatch) PURE;
555    STDMETHOD(get_WindowlessVideo)(VARIANT_BOOL __RPC_FAR *pbool) PURE;
556    STDMETHOD(put_WindowlessVideo)(VARIANT_BOOL pbool) PURE;
557    STDMETHOD(Play)(void) PURE;
558    STDMETHOD(Stop)(void) PURE;
559    STDMETHOD(Pause)(void) PURE;
560    STDMETHOD(GetMarkerTime)(long MarkerNum,
561                             double __RPC_FAR *pMarkerTime) PURE;
562    STDMETHOD(GetMarkerName)(long MarkerNum,
563                             BSTR __RPC_FAR *pbstrMarkerName) PURE;
564    STDMETHOD(AboutBox)(void) PURE;
565    STDMETHOD(GetCodecInstalled)(long CodecNum,
566                              VARIANT_BOOL __RPC_FAR *pCodecInstalled) PURE;
567    STDMETHOD(GetCodecDescription)(long CodecNum,
568                                 BSTR __RPC_FAR *pbstrCodecDescription) PURE;
569    STDMETHOD(GetCodecURL)(long CodecNum,
570                           BSTR __RPC_FAR *pbstrCodecURL) PURE;
571    STDMETHOD(GetMoreInfoURL)(MPMoreInfoType MoreInfoType,
572                              BSTR __RPC_FAR *pbstrMoreInfoURL) PURE;
573    STDMETHOD(GetMediaInfoString)(MPMediaInfoType MediaInfoType,
574                                  BSTR __RPC_FAR *pbstrMediaInfo) PURE;
575    STDMETHOD(Cancel)(void) PURE;
576    STDMETHOD(Open)(BSTR bstrFileName) PURE;
577    STDMETHOD(IsSoundCardEnabled)(VARIANT_BOOL __RPC_FAR *pbSoundCard) PURE;
578    STDMETHOD(Next)(void) PURE;
579    STDMETHOD(Previous)(void) PURE;
580    STDMETHOD(StreamSelect)(long StreamNum) PURE;
581    STDMETHOD(FastForward)(void) PURE;
582    STDMETHOD(FastReverse)(void) PURE;
583    STDMETHOD(GetStreamName)(long StreamNum,
584                             BSTR __RPC_FAR *pbstrStreamName) PURE;
585    STDMETHOD(GetStreamGroup)(long StreamNum,
586                              long __RPC_FAR *pStreamGroup) PURE;
587    STDMETHOD(GetStreamSelected)(long StreamNum, VARIANT_BOOL __RPC_FAR *pStreamSelected) PURE;
588};
589
590struct IMediaPlayer2 : public IMediaPlayer
591{
592    STDMETHOD(get_DVD)(struct IMediaPlayerDvd __RPC_FAR *__RPC_FAR *ppdispatch) PURE;
593    STDMETHOD(GetMediaParameter)(long EntryNum, BSTR bstrParameterName, BSTR __RPC_FAR *pbstrParameterValue) PURE;
594    STDMETHOD(GetMediaParameterName(long EntryNum, long Index, BSTR __RPC_FAR *pbstrParameterName) PURE;
595    STDMETHOD(get_EntryCount)(long __RPC_FAR *pNumberEntries) PURE;
596    STDMETHOD(GetCurrentEntry)(long __RPC_FAR *pEntryNumber) PURE;
597    STDMETHOD(SetCurrentEntry)(long EntryNumber) PURE;
598    STDMETHOD(ShowDialog)(MPShowDialogConstants mpDialogIndex) PURE;
599};
600
601//---------------------------------------------------------------------------
602//  NETSHOW COM INTERFACES (dumped from nscompat.idl from MSVC COM Browser)
603//---------------------------------------------------------------------------
604
605struct INSOPlay : public IDispatch
606{
607    STDMETHOD(get_ImageSourceWidth)(long __RPC_FAR *pWidth) PURE;
608    STDMETHOD(get_ImageSourceHeight)(long __RPC_FAR *pHeight) PURE;
609    STDMETHOD(get_Duration)(double __RPC_FAR *pDuration) PURE;
610    STDMETHOD(get_Author)(BSTR __RPC_FAR *pbstrAuthor) PURE;
611    STDMETHOD(get_Copyright)(BSTR __RPC_FAR *pbstrCopyright) PURE;
612    STDMETHOD(get_Description)(BSTR __RPC_FAR *pbstrDescription) PURE;
613    STDMETHOD(get_Rating)(BSTR __RPC_FAR *pbstrRating) PURE;
614    STDMETHOD(get_Title)(BSTR __RPC_FAR *pbstrTitle) PURE;
615    STDMETHOD(get_SourceLink)(BSTR __RPC_FAR *pbstrSourceLink) PURE;
616    STDMETHOD(get_MarkerCount)(long __RPC_FAR *pMarkerCount) PURE;
617    STDMETHOD(get_CanScan)(VARIANT_BOOL __RPC_FAR *pCanScan) PURE;
618    STDMETHOD(get_CanSeek)(VARIANT_BOOL __RPC_FAR *pCanSeek) PURE;
619    STDMETHOD(get_CanSeekToMarkers)(VARIANT_BOOL __RPC_FAR *pCanSeekToMarkers) PURE;
620    STDMETHOD(get_CreationDate)(DATE __RPC_FAR *pCreationDate) PURE;
621    STDMETHOD(get_Bandwidth)(long __RPC_FAR *pBandwidth) PURE;
622    STDMETHOD(get_ErrorCorrection)(BSTR __RPC_FAR *pbstrErrorCorrection) PURE;
623    STDMETHOD(get_AutoStart)(VARIANT_BOOL __RPC_FAR *pAutoStart) PURE;
624    STDMETHOD(put_AutoStart)(VARIANT_BOOL pAutoStart) PURE;
625    STDMETHOD(get_AutoRewind)(VARIANT_BOOL __RPC_FAR *pAutoRewind) PURE;
626    STDMETHOD(put_AutoRewind)(VARIANT_BOOL pAutoRewind) PURE;
627    STDMETHOD(get_AllowChangeControlType)(VARIANT_BOOL __RPC_FAR *pAllowChangeControlType) PURE;
628    STDMETHOD(put_AllowChangeControlType)(VARIANT_BOOL pAllowChangeControlType) PURE;
629    STDMETHOD(get_InvokeURLs)(VARIANT_BOOL __RPC_FAR *pInvokeURLs) PURE;
630    STDMETHOD(put_InvokeURLs)(VARIANT_BOOL pInvokeURLs) PURE;
631    STDMETHOD(get_EnableContextMenu)(VARIANT_BOOL __RPC_FAR *pEnableContextMenu) PURE;
632    STDMETHOD(put_EnableContextMenu)(VARIANT_BOOL pEnableContextMenu) PURE;
633    STDMETHOD(get_TransparentAtStart)(VARIANT_BOOL __RPC_FAR *pTransparentAtStart) PURE;
634    STDMETHOD(put_TransparentAtStart)(VARIANT_BOOL pTransparentAtStart) PURE;
635    STDMETHOD(get_TransparentOnStop)(VARIANT_BOOL __RPC_FAR *pTransparentOnStop) PURE;
636    STDMETHOD(put_TransparentOnStop)(VARIANT_BOOL pTransparentOnStop) PURE;
637    STDMETHOD(get_ClickToPlay)(VARIANT_BOOL __RPC_FAR *pClickToPlay) PURE;
638    STDMETHOD(put_ClickToPlay)(VARIANT_BOOL pClickToPlay) PURE;
639    STDMETHOD(get_FileName)(BSTR __RPC_FAR *pbstrFileName) PURE;
640    STDMETHOD(put_FileName)(BSTR pbstrFileName) PURE;
641    STDMETHOD(get_CurrentPosition)(double __RPC_FAR *pCurrentPosition) PURE;
642    STDMETHOD(put_CurrentPosition)(double pCurrentPosition) PURE;
643    STDMETHOD(get_Rate)(double __RPC_FAR *pRate) PURE;
644    STDMETHOD(put_Rate)(double pRate) PURE;
645    STDMETHOD(get_CurrentMarker)(long __RPC_FAR *pCurrentMarker) PURE;
646    STDMETHOD(put_CurrentMarker)(long pCurrentMarker) PURE;
647    STDMETHOD(get_PlayCount)(long __RPC_FAR *pPlayCount) PURE;
648    STDMETHOD(put_PlayCount)(long pPlayCount) PURE;
649    STDMETHOD(get_CurrentState)(long __RPC_FAR *pCurrentState) PURE;
650    STDMETHOD(get_DisplaySize)(long __RPC_FAR *pDisplaySize) PURE;
651    STDMETHOD(put_DisplaySize)(long pDisplaySize) PURE;
652    STDMETHOD(get_MainWindow)(long __RPC_FAR *pMainWindow) PURE;
653    STDMETHOD(get_ControlType)(long __RPC_FAR *pControlType) PURE;
654    STDMETHOD(put_ControlType)(long pControlType) PURE;
655    STDMETHOD(get_AllowScan)(VARIANT_BOOL __RPC_FAR *pAllowScan) PURE;
656    STDMETHOD(put_AllowScan)(VARIANT_BOOL pAllowScan) PURE;
657    STDMETHOD(get_SendKeyboardEvents)(VARIANT_BOOL __RPC_FAR *pSendKeyboardEvents) PURE;
658    STDMETHOD(put_SendKeyboardEvents)(VARIANT_BOOL pSendKeyboardEvents) PURE;
659    STDMETHOD(get_SendMouseClickEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseClickEvents) PURE;
660    STDMETHOD(put_SendMouseClickEvents)(VARIANT_BOOL pSendMouseClickEvents) PURE;
661    STDMETHOD(get_SendMouseMoveEvents)(VARIANT_BOOL __RPC_FAR *pSendMouseMoveEvents) PURE;
662    STDMETHOD(put_SendMouseMoveEvents)(VARIANT_BOOL pSendMouseMoveEvents) PURE;
663    STDMETHOD(get_SendStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendStateChangeEvents) PURE;
664    STDMETHOD(put_SendStateChangeEvents)(VARIANT_BOOL pSendStateChangeEvents) PURE;
665    STDMETHOD(get_ReceivedPackets)(long __RPC_FAR *pReceivedPackets) PURE;
666    STDMETHOD(get_RecoveredPackets)(long __RPC_FAR *pRecoveredPackets) PURE;
667    STDMETHOD(get_LostPackets)(long __RPC_FAR *pLostPackets) PURE;
668    STDMETHOD(get_ReceptionQuality)(long __RPC_FAR *pReceptionQuality) PURE;
669    STDMETHOD(get_BufferingCount)(long __RPC_FAR *pBufferingCount) PURE;
670    STDMETHOD(get_CursorType)(long __RPC_FAR *pCursorType) PURE;
671    STDMETHOD(put_CursorType)(long pCursorType) PURE;
672    STDMETHOD(get_AnimationAtStart)(VARIANT_BOOL __RPC_FAR *pAnimationAtStart) PURE;
673    STDMETHOD(put_AnimationAtStart)(VARIANT_BOOL pAnimationAtStart) PURE;
674    STDMETHOD(get_AnimationOnStop)(VARIANT_BOOL __RPC_FAR *pAnimationOnStop) PURE;
675    STDMETHOD(put_AnimationOnStop)(VARIANT_BOOL pAnimationOnStop) PURE;
676    STDMETHOD(Play)(void) PURE;
677    STDMETHOD(Pause)(void) PURE;
678    STDMETHOD(Stop)(void) PURE;
679    STDMETHOD(GetMarkerTime)(long MarkerNum, double __RPC_FAR *pMarkerTime) PURE;
680    STDMETHOD(GetMarkerName)(long MarkerNum, BSTR __RPC_FAR *pbstrMarkerName) PURE;
681};
682
683struct INSPlay : public INSOPlay
684{
685    STDMETHOD(get_ChannelName)(BSTR __RPC_FAR *pbstrChannelName) PURE;
686    STDMETHOD(get_ChannelDescription)(BSTR __RPC_FAR *pbstrChannelDescription) PURE;
687    STDMETHOD(get_ChannelURL)(BSTR __RPC_FAR *pbstrChannelURL) PURE;
688    STDMETHOD(get_ContactAddress)(BSTR __RPC_FAR *pbstrContactAddress) PURE;
689    STDMETHOD(get_ContactPhone)(BSTR __RPC_FAR *pbstrContactPhone) PURE;
690    STDMETHOD(get_ContactEmail)(BSTR __RPC_FAR *pbstrContactEmail) PURE;
691    STDMETHOD(get_AllowChangeDisplaySize)(VARIANT_BOOL __RPC_FAR *pAllowChangeDisplaySize) PURE;
692    STDMETHOD(put_AllowChangeDisplaySize)(VARIANT_BOOL pAllowChangeDisplaySize) PURE;
693    STDMETHOD(get_CodecCount)(long __RPC_FAR *pCodecCount) PURE;
694    STDMETHOD(get_IsBroadcast)(VARIANT_BOOL __RPC_FAR *pIsBroadcast) PURE;
695    STDMETHOD(get_IsDurationValid)(VARIANT_BOOL __RPC_FAR *pIsDurationValid) PURE;
696    STDMETHOD(get_SourceProtocol)(long __RPC_FAR *pSourceProtocol) PURE;
697    STDMETHOD(get_OpenState)(long __RPC_FAR *pOpenState) PURE;
698    STDMETHOD(get_SendOpenStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendOpenStateChangeEvents) PURE;
699    STDMETHOD(put_SendOpenStateChangeEvents)(VARIANT_BOOL pSendOpenStateChangeEvents) PURE;
700    STDMETHOD(get_SendWarningEvents)(VARIANT_BOOL __RPC_FAR *pSendWarningEvents) PURE;
701    STDMETHOD(put_SendWarningEvents)(VARIANT_BOOL pSendWarningEvents) PURE;
702    STDMETHOD(get_SendErrorEvents)(VARIANT_BOOL __RPC_FAR *pSendErrorEvents) PURE;
703    STDMETHOD(put_SendErrorEvents)(VARIANT_BOOL pSendErrorEvents) PURE;
704    STDMETHOD(get_HasError)(VARIANT_BOOL __RPC_FAR *pHasError) PURE;
705    STDMETHOD(get_ErrorDescription)(BSTR __RPC_FAR *pbstrErrorDescription) PURE;
706    STDMETHOD(get_ErrorCode)(long __RPC_FAR *pErrorCode) PURE;
707    STDMETHOD(get_PlayState)(long __RPC_FAR *pPlayState) PURE;
708    STDMETHOD(get_SendPlayStateChangeEvents)(VARIANT_BOOL __RPC_FAR *pSendPlayStateChangeEvents) PURE;
709    STDMETHOD(put_SendPlayStateChangeEvents)(VARIANT_BOOL pSendPlayStateChangeEvents) PURE;
710    STDMETHOD(get_BufferingTime)(double __RPC_FAR *pBufferingTime) PURE;
711    STDMETHOD(put_BufferingTime)(double pBufferingTime) PURE;
712    STDMETHOD(get_UseFixedUDPPort)(VARIANT_BOOL __RPC_FAR *pUseFixedUDPPort) PURE;
713    STDMETHOD(put_UseFixedUDPPort)(VARIANT_BOOL pUseFixedUDPPort) PURE;
714    STDMETHOD(get_FixedUDPPort)(long __RPC_FAR *pFixedUDPPort) PURE;
715    STDMETHOD(put_FixedUDPPort)(long pFixedUDPPort) PURE;
716    STDMETHOD(get_UseHTTPProxy)(VARIANT_BOOL __RPC_FAR *pUseHTTPProxy) PURE;
717    STDMETHOD(put_UseHTTPProxy)(VARIANT_BOOL pUseHTTPProxy) PURE;
718    STDMETHOD(get_EnableAutoProxy)(VARIANT_BOOL __RPC_FAR *pEnableAutoProxy) PURE;
719    STDMETHOD(put_EnableAutoProxy)(VARIANT_BOOL pEnableAutoProxy) PURE;
720    STDMETHOD(get_HTTPProxyHost)(BSTR __RPC_FAR *pbstrHTTPProxyHost) PURE;
721    STDMETHOD(put_HTTPProxyHost)(BSTR pbstrHTTPProxyHost) PURE;
722    STDMETHOD(get_HTTPProxyPort)(long __RPC_FAR *pHTTPProxyPort) PURE;
723    STDMETHOD(put_HTTPProxyPort)(long pHTTPProxyPort) PURE;
724    STDMETHOD(get_EnableMulticast)(VARIANT_BOOL __RPC_FAR *pEnableMulticast) PURE;
725    STDMETHOD(put_EnableMulticast)(VARIANT_BOOL pEnableMulticast) PURE;
726    STDMETHOD(get_EnableUDP)(VARIANT_BOOL __RPC_FAR *pEnableUDP) PURE;
727    STDMETHOD(put_EnableUDP)(VARIANT_BOOL pEnableUDP) PURE;
728    STDMETHOD(get_EnableTCP)(VARIANT_BOOL __RPC_FAR *pEnableTCP) PURE;
729    STDMETHOD(put_EnableTCP)(VARIANT_BOOL pEnableTCP) PURE;
730    STDMETHOD(get_EnableHTTP)(VARIANT_BOOL __RPC_FAR *pEnableHTTP) PURE;
731    STDMETHOD(put_EnableHTTP)(VARIANT_BOOL pEnableHTTP) PURE;
732    STDMETHOD(get_BufferingProgress)(long __RPC_FAR *pBufferingProgress) PURE;
733    STDMETHOD(get_BaseURL)(BSTR __RPC_FAR *pbstrBaseURL) PURE;
734    STDMETHOD(put_BaseURL)(BSTR pbstrBaseURL) PURE;
735    STDMETHOD(get_DefaultFrame)(BSTR __RPC_FAR *pbstrDefaultFrame) PURE;
736    STDMETHOD(put_DefaultFrame)(BSTR pbstrDefaultFrame) PURE;
737    STDMETHOD(AboutBox))(void) PURE;
738    STDMETHOD(Cancel)(void) PURE;
739    STDMETHOD(GetCodecInstalled)(long CodecNum, VARIANT_BOOL __RPC_FAR *pCodecInstalled) PURE;
740    STDMETHOD(GetCodecDescription)(long CodecNum, BSTR __RPC_FAR *pbstrCodecDescription) PURE;
741    STDMETHOD(GetCodecURL)(long CodecNum, BSTR __RPC_FAR *pbstrCodecURL) PURE;
742    STDMETHOD(Open)(BSTR bstrFileName) PURE;
743};
744
745
746struct INSPlay1 : public INSPlay
747{
748    STDMETHOD(get_MediaPlayer)(IDispatch __RPC_FAR *__RPC_FAR *ppdispatch) PURE;
749};
750
751//---------------------------------------------------------------------------
752//  IWMP (PocketPC 2000) COM INTERFACES (dumped from PlayerOCX.idl)
753//---------------------------------------------------------------------------
754
755#ifdef __WXWINCE__
756
757struct IWMP : public IDispatch
758{
759public:
760    virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_AutoSize(
761        /* [in] */ VARIANT_BOOL vbool) = 0;
762
763    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_AutoSize(
764        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbool) = 0;
765
766    virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_BorderStyle(
767        /* [in] */ long style) = 0;
768
769    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_BorderStyle(
770        /* [retval][out] */ long __RPC_FAR *pstyle) = 0;
771
772    virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_Enabled(
773        /* [in] */ VARIANT_BOOL vbool) = 0;
774
775    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_Enabled(
776        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbool) = 0;
777
778    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_FileName(
779        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
780
781    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_FileName(
782        /* [in] */ BSTR newVal) = 0;
783
784    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Volume(
785        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
786
787    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Volume(
788        /* [in] */ long newVal) = 0;
789
790    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Mute(
791        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
792
793    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Mute(
794        /* [in] */ VARIANT_BOOL newVal) = 0;
795
796    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AutoStart(
797        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
798
799    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AutoStart(
800        /* [in] */ VARIANT_BOOL newVal) = 0;
801
802    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PlayCount(
803        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
804
805    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PlayCount(
806        /* [in] */ long newVal) = 0;
807
808    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowStatusBar(
809        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
810
811    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowStatusBar(
812        /* [in] */ VARIANT_BOOL newVal) = 0;
813
814    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowAudioControls(
815        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
816
817    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowAudioControls(
818        /* [in] */ VARIANT_BOOL newVal) = 0;
819
820    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowCaptioning(
821        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
822
823    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowCaptioning(
824        /* [in] */ VARIANT_BOOL newVal) = 0;
825
826    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowControls(
827        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
828
829    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowControls(
830        /* [in] */ VARIANT_BOOL newVal) = 0;
831
832    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowDisplay(
833        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
834
835    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowDisplay(
836        /* [in] */ VARIANT_BOOL newVal) = 0;
837
838    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowGotoBar(
839        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
840
841    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowGotoBar(
842        /* [in] */ VARIANT_BOOL newVal) = 0;
843
844    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowPositionControls(
845        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
846
847    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowPositionControls(
848        /* [in] */ VARIANT_BOOL newVal) = 0;
849
850    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ShowTracker(
851        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
852
853    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ShowTracker(
854        /* [in] */ VARIANT_BOOL newVal) = 0;
855
856    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Startup( void) = 0;
857
858    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Shutdown( void) = 0;
859
860    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Bandwidth(
861        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
862
863    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BaseURL(
864        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
865
866    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_BaseURL(
867        /* [in] */ BSTR pVal) = 0;
868
869    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BufferingCount(
870        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
871
872    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BufferingProgress(
873        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
874
875    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_BufferingTime(
876        /* [retval][out] */ double __RPC_FAR *pVal) = 0;
877
878    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanSeek(
879        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
880
881    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanSeekToMarkers(
882        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
883
884    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ChannelDescription(
885        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
886
887    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ChannelName(
888        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
889
890    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ChannelURL(
891        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
892
893    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ClientID(
894        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
895
896    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ConnectionSpeed(
897        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
898
899    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ContactAddress(
900        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
901
902    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ContactEmail(
903        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
904
905    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ContactPhone(
906        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
907
908    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentMarker(
909        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
910
911    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentMarker(
912        /* [in] */ long newVal) = 0;
913
914    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentPosition(
915        /* [retval][out] */ double __RPC_FAR *pVal) = 0;
916
917    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentPosition(
918        /* [in] */ double newVal) = 0;
919
920    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DefaultFrame(
921        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
922
923    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DefaultFrame(
924        /* [in] */ BSTR newVal) = 0;
925
926    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Duration(
927        /* [retval][out] */ double __RPC_FAR *pVal) = 0;
928
929    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EntryCount(
930        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
931
932    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorCode(
933        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
934
935    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorDescription(
936        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
937
938    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HasError(
939        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
940
941    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_HasMultipleItems(
942        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
943
944    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ImageSourceHeight(
945        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
946
947    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ImageSourceWidth(
948        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
949
950    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_InvokeURLs(
951        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
952
953    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_InvokeURLs(
954        /* [in] */ VARIANT_BOOL newVal) = 0;
955
956    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_IsBroadcast(
957        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
958
959    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_IsDurationValid(
960        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
961
962    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_LostPackets(
963        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
964
965    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_MarkerCount(
966        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
967
968    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_OpenState(
969        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
970
971    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PlayState(
972        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
973
974    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_PreviewMode(
975        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
976
977    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_PreviewMode(
978        /* [in] */ VARIANT_BOOL newVal) = 0;
979
980    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReadyState(
981        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
982
983    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReceivedPackets(
984        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
985
986    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ReceptionQuality(
987        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
988
989    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_RecoveredPackets(
990        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
991
992    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SAMIFileName(
993        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
994
995    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SAMIFileName(
996        /* [in] */ BSTR newVal) = 0;
997
998    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SAMILang(
999        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
1000
1001    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SAMILang(
1002        /* [in] */ BSTR newVal) = 0;
1003
1004    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SAMIStyle(
1005        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
1006
1007    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SAMIStyle(
1008        /* [in] */ BSTR newVal) = 0;
1009
1010    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SelectionEnd(
1011        /* [retval][out] */ double __RPC_FAR *pVal) = 0;
1012
1013    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SelectionEnd(
1014        /* [in] */ double newVal) = 0;
1015
1016    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SelectionStart(
1017        /* [retval][out] */ double __RPC_FAR *pVal) = 0;
1018
1019    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SelectionStart(
1020        /* [in] */ double newVal) = 0;
1021
1022    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendErrorEvents(
1023        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1024
1025    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendErrorEvents(
1026        /* [in] */ VARIANT_BOOL newVal) = 0;
1027
1028    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendKeyboardEvents(
1029        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1030
1031    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendKeyboardEvents(
1032        /* [in] */ VARIANT_BOOL newVal) = 0;
1033
1034    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendMouseClickEvents(
1035        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1036
1037    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendMouseClickEvents(
1038        /* [in] */ VARIANT_BOOL newVal) = 0;
1039
1040    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendMouseMoveEvents(
1041        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1042
1043    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendMouseMoveEvents(
1044        /* [in] */ VARIANT_BOOL newVal) = 0;
1045
1046    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendOpenStateChangeEvents(
1047        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1048
1049    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendOpenStateChangeEvents(
1050        /* [in] */ VARIANT_BOOL newVal) = 0;
1051
1052    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendPlayStateChangeEvents(
1053        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1054
1055    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendPlayStateChangeEvents(
1056        /* [in] */ VARIANT_BOOL newVal) = 0;
1057
1058    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SendWarningEvents(
1059        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1060
1061    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SendWarningEvents(
1062        /* [in] */ VARIANT_BOOL newVal) = 0;
1063
1064    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SourceLink(
1065        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
1066
1067    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE AboutBox( void) = 0;
1068
1069    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Cancel( void) = 0;
1070
1071    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCodecDescription(
1072        /* [in] */ long nCodec,
1073        /* [retval][out] */ BSTR __RPC_FAR *pDescription) = 0;
1074
1075    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCodecInstalled(
1076        /* [in] */ BSTR __RPC_FAR *pstrCodec,
1077        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pIsInstalled) = 0;
1078
1079    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCurrentEntry(
1080        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1081
1082    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMarkerName(
1083        /* [in] */ long nMarker,
1084        /* [retval][out] */ BSTR __RPC_FAR *pMarkerName) = 0;
1085
1086    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMarkerTime(
1087        /* [in] */ long nMarker,
1088        /* [retval][out] */ double __RPC_FAR *pMarkerTime) = 0;
1089
1090    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMediaInfoString(
1091        /* [in] */ long MPMediaInfoType,
1092        /* [retval][out] */ BSTR __RPC_FAR *pstrMediaInfo) = 0;
1093
1094    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Next( void) = 0;
1095
1096    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Open(
1097        BSTR pstrClip) = 0;
1098
1099    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Pause( void) = 0;
1100
1101    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Play( void) = 0;
1102
1103    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Previous( void) = 0;
1104
1105    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Stop( void) = 0;
1106
1107    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Rate(
1108        /* [retval][out] */ double __RPC_FAR *pVal) = 0;
1109
1110    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Rate(
1111        /* [in] */ double newVal) = 0;
1112
1113    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplaySize(
1114        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1115
1116    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplaySize(
1117        /* [in] */ long newVal) = 0;
1118
1119    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SourceProtocol(
1120        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1121
1122    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ErrorCorrection(
1123        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
1124
1125    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FinalConstruct( void) = 0;
1126
1127    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AllowChangeDisplaySize(
1128        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1129
1130    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AllowChangeDisplaySize(
1131        /* [in] */ VARIANT_BOOL newVal) = 0;
1132
1133    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AllowScan(
1134        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1135
1136    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AllowScan(
1137        /* [in] */ VARIANT_BOOL newVal) = 0;
1138
1139    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AnimationAtStart(
1140        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1141
1142    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AnimationAtStart(
1143        /* [in] */ VARIANT_BOOL newVal) = 0;
1144
1145    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AudioStream(
1146        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1147
1148    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AudioStream(
1149        /* [in] */ long newVal) = 0;
1150
1151    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_AutoRewind(
1152        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1153
1154    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_AutoRewind(
1155        /* [in] */ VARIANT_BOOL newVal) = 0;
1156
1157    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Balance(
1158        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1159
1160    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Balance(
1161        /* [in] */ long newVal) = 0;
1162
1163    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanPreview(
1164        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1165
1166    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CanScan(
1167        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1168
1169    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CaptioningID(
1170        /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0;
1171
1172    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_ClickToPlay(
1173        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1174
1175    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_ClickToPlay(
1176        /* [in] */ VARIANT_BOOL newVal) = 0;
1177
1178    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CodecCount(
1179        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1180
1181    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CreationDate(
1182        /* [retval][out] */ DATE __RPC_FAR *pVal) = 0;
1183
1184    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CursorType(
1185        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1186
1187    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CursorType(
1188        /* [in] */ long newVal) = 0;
1189
1190    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayBackColor(
1191        /* [retval][out] */ VB_OLE_COLOR __RPC_FAR *pVal) = 0;
1192
1193    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayBackColor(
1194        /* [in] */ VB_OLE_COLOR newVal) = 0;
1195
1196    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayForeColor(
1197        /* [retval][out] */ VB_OLE_COLOR __RPC_FAR *pVal) = 0;
1198
1199    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayForeColor(
1200        /* [in] */ VB_OLE_COLOR newVal) = 0;
1201
1202    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayMode(
1203        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1204
1205    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayMode(
1206        /* [in] */ long newVal) = 0;
1207
1208    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnableContextMenu(
1209        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1210
1211    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnableContextMenu(
1212        /* [in] */ VARIANT_BOOL newVal) = 0;
1213
1214    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnableFullScreenControls(
1215        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1216
1217    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnableFullScreenControls(
1218        /* [in] */ VARIANT_BOOL newVal) = 0;
1219
1220    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnablePositionControls(
1221        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1222
1223    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnablePositionControls(
1224        /* [in] */ VARIANT_BOOL newVal) = 0;
1225
1226    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_EnableTracker(
1227        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1228
1229    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_EnableTracker(
1230        /* [in] */ VARIANT_BOOL newVal) = 0;
1231
1232    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Language(
1233        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1234
1235    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_StreamCount(
1236        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1237
1238    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_TransparentAtStart(
1239        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1240
1241    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_TransparentAtStart(
1242        /* [in] */ VARIANT_BOOL newVal) = 0;
1243
1244    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_VideoBorder3D(
1245        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0;
1246
1247    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_VideoBorder3D(
1248        /* [in] */ VARIANT_BOOL newVal) = 0;
1249
1250    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_VideoBorderColor(
1251        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1252
1253    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_VideoBorderColor(
1254        /* [in] */ long newVal) = 0;
1255
1256    virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_VideoBorderWidth(
1257        /* [retval][out] */ long __RPC_FAR *pVal) = 0;
1258
1259    virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_VideoBorderWidth(
1260        /* [in] */ long newVal) = 0;
1261
1262    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FastForward( void) = 0;
1263
1264    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FastReverse( void) = 0;
1265
1266    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetCodecURL(
1267        /* [retval][out] */ BSTR __RPC_FAR *pstrCodecURL) = 0;
1268
1269    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMediaParameter(
1270        /* [in] */ long nParam,
1271        BSTR szParameterName,
1272        /* [retval][out] */ BSTR __RPC_FAR *pstrParameterValue) = 0;
1273
1274    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMediaParameterName(
1275        /* [in] */ long nParam,
1276        long nIndex,
1277        /* [retval][out] */ BSTR __RPC_FAR *pstrParameterName) = 0;
1278
1279    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetMoreInfoURL(
1280        /* [retval][out] */ BSTR __RPC_FAR *pstrMoreInfoURL) = 0;
1281
1282    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetStreamGroup(
1283        /* [retval][out] */ BSTR __RPC_FAR *pstrStreamGroup) = 0;
1284
1285    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetStreamName(
1286        /* [retval][out] */ BSTR __RPC_FAR *pstrStreamName) = 0;
1287
1288    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetStreamSelected(
1289        /* [in] */ long nStream,
1290        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *fIsSelected) = 0;
1291
1292    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IsSoundCardEnabled(
1293        /* [retval][out] */ VARIANT_BOOL __RPC_FAR *fIsEnabled) = 0;
1294
1295    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetCurrentEntry(
1296        long nValue) = 0;
1297
1298    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ShowDialog(
1299        long nValue) = 0;
1300
1301    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE StreamSelect(
1302        long nSelect) = 0;
1303
1304    virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE OnWindowMessage(
1305        UINT msg,
1306        WPARAM wParam,
1307        LPARAM lParam,
1308        LRESULT __RPC_FAR *plResult) = 0;
1309
1310};
1311
1312
1313#endif // CE
1314
1315//---------------------------------------------------------------------------
1316// MISC COM INTERFACES
1317//---------------------------------------------------------------------------
1318typedef enum _FilterState
1319{
1320    State_Stopped,
1321    State_Paused,
1322    State_Running
1323} FILTER_STATE;
1324typedef enum _PinDirection {
1325    PINDIR_INPUT,
1326    PINDIR_OUTPUT
1327} PIN_DIRECTION;
1328
1329typedef struct _FilterInfo {
1330    WCHAR        achName[128];
1331    struct IFilterGraph *pGraph;
1332} FILTER_INFO;
1333
1334typedef struct _PinInfo {
1335    struct IBaseFilter *pFilter;
1336    PIN_DIRECTION dir;
1337    WCHAR achName[128];
1338} PIN_INFO;
1339
1340struct IBaseFilter;
1341struct IPin;
1342struct IEnumFilters;
1343typedef struct  _MediaType {
1344    GUID      majortype;
1345    GUID      subtype;
1346    BOOL      bFixedSizeSamples;
1347    BOOL      bTemporalCompression;
1348    ULONG     lSampleSize;
1349    GUID      formattype;
1350    IUnknown  *pUnk;
1351    ULONG     cbFormat;
1352    BYTE *pbFormat;
1353} AM_MEDIA_TYPE;
1354
1355struct IFilterGraph : public IUnknown
1356{
1357    STDMETHOD(AddFilter)(IBaseFilter *, LPCWSTR) PURE;
1358    STDMETHOD(RemoveFilter)(IBaseFilter *) PURE;
1359    STDMETHOD(EnumFilters)(IEnumFilters **) PURE;
1360    STDMETHOD(FindFilterByName)(LPCWSTR, IBaseFilter **) PURE;
1361    STDMETHOD(ConnectDirect)(IPin *, IPin *, const AM_MEDIA_TYPE *) PURE;
1362    STDMETHOD(Reconnect)(IPin *) PURE;
1363    STDMETHOD(Disconnect)(IPin *) PURE;
1364    STDMETHOD(SetDefaultSyncSource)() PURE;
1365};
1366
1367struct IGraphBuilder : public IFilterGraph
1368{
1369    STDMETHOD(Connect)(IPin *, IPin *) PURE;
1370    STDMETHOD(Render)(IPin *) PURE;
1371    STDMETHOD(RenderFile)(LPCWSTR, LPCWSTR) PURE;
1372    STDMETHOD(AddSourceFilter)(LPCWSTR, LPCWSTR, IBaseFilter **) PURE;
1373    STDMETHOD(SetLogFile)(DWORD_PTR) PURE;
1374    STDMETHOD(Abort)() PURE;
1375    STDMETHOD(ShouldOperationContinue)() PURE;
1376};
1377
1378struct IReferenceClock;
1379struct IEnumPins;
1380#define REFERENCE_TIME LONGLONG
1381struct IMediaFilter : public IPersist
1382{
1383    STDMETHOD(Stop)( void) PURE;
1384    STDMETHOD(Pause)( void) PURE;
1385    STDMETHOD(Run)(REFERENCE_TIME tStart) PURE;
1386    STDMETHOD(GetState)(DWORD dwMilliSecsTimeout,
1387                       FILTER_STATE *State) PURE;
1388    STDMETHOD(SetSyncSource)(IReferenceClock *pClock) PURE;
1389    STDMETHOD(GetSyncSource)(IReferenceClock **pClock) PURE;
1390};
1391
1392struct IBaseFilter : public IMediaFilter
1393{
1394    STDMETHOD(EnumPins)(IEnumPins **ppEnum) PURE;
1395    STDMETHOD(FindPin)(LPCWSTR Id, IPin **ppPin) PURE;
1396    STDMETHOD(QueryFilterInfo)(FILTER_INFO *pInfo) PURE;
1397    STDMETHOD(JoinFilterGraph)(IFilterGraph *pGraph, LPCWSTR pName) PURE;
1398    STDMETHOD(QueryVendorInfo)(LPWSTR *pVendorInfo) PURE;
1399};
1400
1401
1402//---------------------------------------------------------------------------
1403//
1404//  wxAMMediaBackend
1405//
1406//---------------------------------------------------------------------------
1407
1408typedef BOOL (WINAPI* LPAMGETERRORTEXT)(HRESULT, wxChar *, DWORD);
1409
1410class WXDLLIMPEXP_MEDIA wxAMMediaBackend : public wxMediaBackendCommonBase
1411{
1412public:
1413    wxAMMediaBackend();
1414    virtual ~wxAMMediaBackend();
1415
1416    virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
1417                                     wxWindowID id,
1418                                     const wxPoint& pos,
1419                                     const wxSize& size,
1420                                     long style,
1421                                     const wxValidator& validator,
1422                                     const wxString& name);
1423
1424    virtual bool Play();
1425    virtual bool Pause();
1426    virtual bool Stop();
1427
1428    virtual bool Load(const wxString& fileName);
1429    virtual bool Load(const wxURI& location);
1430    virtual bool Load(const wxURI& location, const wxURI& proxy);
1431
1432    bool DoLoad(const wxString& location);
1433    void FinishLoad();
1434
1435    virtual wxMediaState GetState();
1436
1437    virtual bool SetPosition(wxLongLong where);
1438    virtual wxLongLong GetPosition();
1439    virtual wxLongLong GetDuration();
1440
1441    virtual void Move(int x, int y, int w, int h);
1442    wxSize GetVideoSize() const;
1443
1444    virtual double GetPlaybackRate();
1445    virtual bool SetPlaybackRate(double);
1446
1447    virtual double GetVolume();
1448    virtual bool SetVolume(double);
1449
1450    virtual bool ShowPlayerControls(wxMediaCtrlPlayerControls flags);
1451
1452    void DoGetDownloadProgress(wxLongLong*, wxLongLong*);
1453    virtual wxLongLong GetDownloadProgress()
1454    {
1455        wxLongLong progress, total;
1456        DoGetDownloadProgress(&progress, &total);
1457        return progress;
1458    }
1459    virtual wxLongLong GetDownloadTotal()
1460    {
1461        wxLongLong progress, total;
1462        DoGetDownloadProgress(&progress, &total);
1463        return total;
1464    }
1465
1466    wxActiveXContainer* m_pAX;   // ActiveX host
1467#ifdef __WXWINCE__
1468    IWMP* m_pWMP;
1469
1470    IWMP* GetMP() {return m_pWMP;}
1471    IWMP* GetAM() {return m_pWMP;}
1472#else
1473    IActiveMovie* m_pAM;
1474    IMediaPlayer* m_pMP;
1475
1476    IMediaPlayer* GetMP() {return m_pMP;}
1477    IActiveMovie* GetAM() {return m_pAM;}
1478#endif
1479    wxSize m_bestSize;  // Cached size
1480
1481#ifdef __WXDEBUG__  // Stuff for getting useful debugging strings
1482    wxDynamicLibrary m_dllQuartz;
1483    LPAMGETERRORTEXT m_lpAMGetErrorText;
1484    wxString GetErrorString(HRESULT hrdsv);
1485#endif // __WXDEBUG__
1486
1487    friend class wxAMMediaEvtHandler;
1488    DECLARE_DYNAMIC_CLASS(wxAMMediaBackend)
1489};
1490
1491class WXDLLIMPEXP_MEDIA wxAMMediaEvtHandler : public wxEvtHandler
1492{
1493public:
1494    wxAMMediaEvtHandler(wxAMMediaBackend *amb) :
1495       m_amb(amb), m_bLoadEventSent(false)
1496    {
1497        m_amb->m_pAX->Connect(m_amb->m_pAX->GetId(),
1498            wxEVT_ACTIVEX,
1499            wxActiveXEventHandler(wxAMMediaEvtHandler::OnActiveX),
1500            NULL, this
1501                              );
1502    }
1503
1504    void OnActiveX(wxActiveXEvent& event);
1505
1506private:
1507    wxAMMediaBackend *m_amb;
1508    bool m_bLoadEventSent; // Whether or not FinishLoaded was already called
1509                           // prevents it being called multiple times
1510
1511    DECLARE_NO_COPY_CLASS(wxAMMediaEvtHandler)
1512};
1513
1514//===========================================================================
1515//  IMPLEMENTATION
1516//===========================================================================
1517
1518//---------------------------------------------------------------------------
1519//
1520// wxAMMediaBackend
1521//
1522//---------------------------------------------------------------------------
1523
1524IMPLEMENT_DYNAMIC_CLASS(wxAMMediaBackend, wxMediaBackend)
1525
1526//---------------------------------------------------------------------------
1527// Usual debugging macros
1528//---------------------------------------------------------------------------
1529#ifdef __WXDEBUG__
1530#define MAX_ERROR_TEXT_LEN 160
1531
1532// Get the error string for Active Movie
1533wxString wxAMMediaBackend::GetErrorString(HRESULT hrdsv)
1534{
1535    wxChar szError[MAX_ERROR_TEXT_LEN];
1536    if( m_lpAMGetErrorText != NULL &&
1537       (*m_lpAMGetErrorText)(hrdsv, szError, MAX_ERROR_TEXT_LEN) == 0)
1538    {
1539        return wxString::Format(wxT("DirectShow error \"%s\" \n")
1540                                     wxT("(numeric %X)\n")
1541                                     wxT("occured"),
1542                                     szError, (int)hrdsv);
1543    }
1544    else
1545    {
1546        return wxString::Format(wxT("Unknown error \n")
1547                                     wxT("(numeric %X)\n")
1548                                     wxT("occured"),
1549                                     (int)hrdsv);
1550    }
1551}
1552
1553#define wxAMFAIL(x) wxFAIL_MSG(GetErrorString(x));
1554#define wxVERIFY(x) wxASSERT((x))
1555#define wxAMLOG(x) wxLogDebug(GetErrorString(x))
1556#else
1557#define wxAMVERIFY(x) (x)
1558#define wxVERIFY(x) (x)
1559#define wxAMLOG(x)
1560#define wxAMFAIL(x)
1561#endif
1562
1563//---------------------------------------------------------------------------
1564// wxAMMediaBackend Constructor
1565//---------------------------------------------------------------------------
1566wxAMMediaBackend::wxAMMediaBackend()
1567                 :m_pAX(NULL),
1568#ifdef __WXWINCE__
1569                  m_pWMP(NULL),
1570#else
1571                  m_pAM(NULL),
1572                  m_pMP(NULL),
1573#endif
1574                  m_bestSize(wxDefaultSize)
1575{
1576}
1577
1578//---------------------------------------------------------------------------
1579// wxAMMediaBackend Destructor
1580//---------------------------------------------------------------------------
1581wxAMMediaBackend::~wxAMMediaBackend()
1582{
1583    if(m_pAX)
1584    {
1585        m_pAX->DissociateHandle();
1586        delete m_pAX;
1587#ifndef __WXWINCE__
1588        m_pAM->Release();
1589#endif
1590
1591        if (GetMP())
1592            GetMP()->Release();
1593
1594        m_ctrl->PopEventHandler(true);
1595    }
1596}
1597
1598//---------------------------------------------------------------------------
1599// wxAMMediaBackend::CreateControl
1600//---------------------------------------------------------------------------
1601bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
1602                                     wxWindowID id,
1603                                     const wxPoint& pos,
1604                                     const wxSize& size,
1605                                     long style,
1606                                     const wxValidator& validator,
1607                                     const wxString& name)
1608{
1609    // First get the AMGetErrorText procedure in debug
1610    // mode for more meaningful messages
1611#ifdef __WXDEBUG__
1612    if ( m_dllQuartz.Load(_T("quartz.dll"), wxDL_VERBATIM) )
1613    {
1614        m_lpAMGetErrorText = (LPAMGETERRORTEXT)
1615                                m_dllQuartz.GetSymbolAorW(wxT("AMGetErrorText"));
1616    }
1617#endif // __WXDEBUG__
1618
1619
1620
1621#ifdef __WXWINCE__
1622   CLSID clsid;
1623
1624   // Try progids first - *.WMP is PocketPC and Mediaplayer.1 is CE.NET
1625   // later versions support straight creation from CLSID
1626   if (CLSIDFromProgID(L"WPCEOCX.WMP", &clsid) != S_OK &&
1627       CLSIDFromProgID(L"MediaPlayer.MediaPlayer.1", &clsid) != S_OK)
1628   {
1629       clsid = CLSID_MediaPlayer;
1630   }
1631
1632   // While the CLSID is the same as CLSID_MediaPlayer
1633   // CE only supports the IWMP interface
1634   if ( ::CoCreateInstance(clsid, NULL,
1635                                 CLSCTX_INPROC_SERVER,
1636                                 IID_IWMP, (void**)&m_pWMP) != 0 )
1637   {
1638           return false;
1639   }
1640
1641#else
1642    // Now determine which (if any) media player interface is
1643    // available - IMediaPlayer or IActiveMovie
1644    if( ::CoCreateInstance(CLSID_MediaPlayer, NULL,
1645                                  CLSCTX_INPROC_SERVER,
1646                                  IID_IMediaPlayer, (void**)&m_pMP) != 0 )
1647    {
1648        if( ::CoCreateInstance(CLSID_ActiveMovie, NULL,
1649                                  CLSCTX_INPROC_SERVER,
1650                                  IID_IActiveMovie, (void**)&m_pAM) != 0 )
1651            return false;
1652        m_pAM->QueryInterface(IID_IMediaPlayer, (void**)&m_pMP);
1653    }
1654    else
1655    {
1656        m_pMP->QueryInterface(IID_IActiveMovie, (void**)&m_pAM);
1657    }
1658#endif
1659
1660    //
1661    // Create window
1662    // By default wxWindow(s) is created with a border -
1663    // so we need to get rid of those
1664    //
1665    // Since we don't have a child window like most other
1666    // backends, we don't need wxCLIP_CHILDREN
1667    //
1668    if ( !ctrl->wxControl::Create(parent, id, pos, size,
1669                            (style & ~wxBORDER_MASK) | wxBORDER_NONE,
1670                            validator, name) )
1671        return false;
1672
1673    //
1674    // Now create the ActiveX container along with the media player
1675    // interface and query them
1676    //
1677    m_ctrl = wxStaticCast(ctrl, wxMediaCtrl);
1678    m_pAX = new wxActiveXContainer(ctrl,
1679#ifdef __WXWINCE__
1680                IID_IWMP, m_pWMP
1681#else
1682                m_pMP ? IID_IMediaPlayer : IID_IActiveMovie, m_pAM
1683#endif
1684                                  );
1685    // Connect for events
1686    m_ctrl->PushEventHandler(new wxAMMediaEvtHandler(this));
1687
1688    //
1689    //  Here we set up wx-specific stuff for the default
1690    //  settings wxMediaCtrl says it will stay to
1691    //
1692    if(GetMP())
1693    {
1694        GetMP()->put_DisplaySize(mpFitToSize);
1695#ifndef __WXWINCE__ // Not in CE's IWMP
1696        // TODO: Unsure what actual effect this has
1697        // In DirectShow Windowless video results in less delay when
1698        // dragging, for example - but this doesn't appear to really do anything
1699        // in practice (it may be something different...)...
1700        GetMP()->put_WindowlessVideo(VARIANT_TRUE);
1701#endif
1702
1703    }
1704#ifndef __WXWINCE__ // Not in CE's IWMP
1705    else
1706        GetAM()->put_MovieWindowSize(amvDoubleOriginalSize);
1707#endif
1708
1709    // by default true
1710    GetAM()->put_AutoStart(VARIANT_FALSE);
1711    // by default enabled
1712    wxAMMediaBackend::ShowPlayerControls(wxMEDIACTRLPLAYERCONTROLS_NONE);
1713    // by default with AM only 0.5
1714    wxAMMediaBackend::SetVolume(1.0);
1715
1716    // don't erase the background of our control window so that resizing is a
1717    // bit smoother
1718    m_ctrl->SetBackgroundStyle(wxBG_STYLE_CUSTOM);
1719
1720    // success
1721    return true;
1722}
1723
1724//---------------------------------------------------------------------------
1725// wxAMMediaBackend::Load (file version)
1726//---------------------------------------------------------------------------
1727bool wxAMMediaBackend::Load(const wxString& fileName)
1728{
1729    return DoLoad(fileName);
1730}
1731
1732//---------------------------------------------------------------------------
1733// wxAMMediaBackend::Load (URL Version)
1734//---------------------------------------------------------------------------
1735bool wxAMMediaBackend::Load(const wxURI& location)
1736{
1737    //  Turn off loading from a proxy as user
1738    //  may have set it previously
1739    INSPlay* pPlay = NULL;
1740    GetAM()->QueryInterface(IID_INSPlay, (void**) &pPlay);
1741    if(pPlay)
1742    {
1743        pPlay->put_UseHTTPProxy(VARIANT_FALSE);
1744        pPlay->Release();
1745    }
1746
1747    return DoLoad(location.BuildURI());
1748}
1749
1750//---------------------------------------------------------------------------
1751// wxAMMediaBackend::Load (URL Version with Proxy)
1752//---------------------------------------------------------------------------
1753bool wxAMMediaBackend::Load(const wxURI& location, const wxURI& proxy)
1754{
1755    // Set the proxy of the NETSHOW interface
1756    INSPlay* pPlay = NULL;
1757    GetAM()->QueryInterface(IID_INSPlay, (void**) &pPlay);
1758
1759    if(pPlay)
1760    {
1761        pPlay->put_UseHTTPProxy(VARIANT_TRUE);
1762        pPlay->put_HTTPProxyHost(wxBasicString(proxy.GetServer()).Get());
1763        pPlay->put_HTTPProxyPort(wxAtoi(proxy.GetPort()));
1764        pPlay->Release();
1765    }
1766
1767    return DoLoad(location.BuildURI());
1768}
1769
1770//---------------------------------------------------------------------------
1771// wxAMMediaBackend::DoLoad
1772//
1773// Called by all functions - this actually renders
1774// the file and sets up the filter graph
1775//---------------------------------------------------------------------------
1776bool wxAMMediaBackend::DoLoad(const wxString& location)
1777{
1778    HRESULT hr;
1779
1780    // Play the movie the normal way through the embedded
1781    // WMP.  Supposively Open is better in theory because
1782    // the docs say its async and put_FileName is not -
1783    // but in practice they both seem to be async anyway
1784    if(GetMP())
1785        hr = GetMP()->Open( wxBasicString(location).Get() );
1786    else
1787        hr = GetAM()->put_FileName( wxBasicString(location).Get() );
1788
1789    if(FAILED(hr))
1790    {
1791        wxAMLOG(hr);
1792        return false;
1793    }
1794
1795    m_bestSize = wxDefaultSize;
1796    return true;
1797}
1798
1799//---------------------------------------------------------------------------
1800// wxAMMediaBackend::FinishLoad
1801//
1802// Called when the media has finished loaded and is ready to play
1803//
1804// Here we get the original size of the video and
1805// send the loaded event to our watcher :).
1806//---------------------------------------------------------------------------
1807void wxAMMediaBackend::FinishLoad()
1808{
1809    NotifyMovieLoaded();
1810}
1811
1812//---------------------------------------------------------------------------
1813// wxAMMediaBackend::ShowPlayerControls
1814//---------------------------------------------------------------------------
1815bool wxAMMediaBackend::ShowPlayerControls(wxMediaCtrlPlayerControls flags)
1816{
1817    // Note that IMediaPlayer doesn't have a statusbar by
1818    // default but IActiveMovie does - so lets try to keep
1819    // the interface consistant
1820    if(!flags)
1821    {
1822        GetAM()->put_Enabled(VARIANT_FALSE);
1823        GetAM()->put_ShowControls(VARIANT_FALSE);
1824        if(GetMP())
1825            GetMP()->put_ShowStatusBar(VARIANT_FALSE);
1826    }
1827    else
1828    {
1829        GetAM()->put_Enabled(VARIANT_TRUE);
1830        GetAM()->put_ShowControls(VARIANT_TRUE);
1831
1832        GetAM()->put_ShowPositionControls(
1833                (flags & wxMEDIACTRLPLAYERCONTROLS_STEP) ?
1834                VARIANT_TRUE : VARIANT_FALSE);
1835
1836        if(GetMP())
1837        {
1838            GetMP()->put_ShowStatusBar(VARIANT_TRUE);
1839            GetMP()->put_ShowAudioControls(
1840                (flags & wxMEDIACTRLPLAYERCONTROLS_VOLUME) ?
1841                VARIANT_TRUE : VARIANT_FALSE);
1842        }
1843    }
1844
1845    return true;
1846}
1847
1848//---------------------------------------------------------------------------
1849// wxAMMediaBackend::Play
1850//
1851// Plays the stream.  If it is non-seekable, it will restart it (implicit).
1852//
1853// Note that we use SUCCEEDED here because run/pause/stop tend to be overly
1854// picky and return warnings on pretty much every call
1855//---------------------------------------------------------------------------
1856bool wxAMMediaBackend::Play()
1857{
1858    // Actually try to play the movie (will fail if not loaded completely)
1859#ifdef __WXWINCE__
1860    HRESULT hr = m_pWMP->Play();
1861#else
1862    HRESULT hr = GetAM()->Run();
1863#endif
1864    if(SUCCEEDED(hr))
1865    {
1866       return true;
1867    }
1868    wxAMLOG(hr);
1869    return false;
1870}
1871
1872//---------------------------------------------------------------------------
1873// wxAMMediaBackend::Pause
1874//
1875// Pauses the stream.
1876//---------------------------------------------------------------------------
1877bool wxAMMediaBackend::Pause()
1878{
1879    HRESULT hr = GetAM()->Pause();
1880    if(SUCCEEDED(hr))
1881        return true;
1882    wxAMLOG(hr);
1883    return false;
1884}
1885
1886//---------------------------------------------------------------------------
1887// wxAMMediaBackend::Stop
1888//
1889// Stops the stream.
1890//---------------------------------------------------------------------------
1891bool wxAMMediaBackend::Stop()
1892{
1893    HRESULT hr = GetAM()->Stop();
1894    if(SUCCEEDED(hr))
1895    {
1896        // Seek to beginning
1897        wxAMMediaBackend::SetPosition(0);
1898        return true;
1899    }
1900    wxAMLOG(hr);
1901    return false;
1902}
1903
1904//---------------------------------------------------------------------------
1905// wxAMMediaBackend::SetPosition
1906//
1907// 1) Translates the current position's time to directshow time,
1908//    which is in a scale of 1 second (in a double)
1909// 2) Sets the play position of the IActiveMovie interface -
1910//    passing NULL as the stop position means to keep the old
1911//    stop position
1912//---------------------------------------------------------------------------
1913bool wxAMMediaBackend::SetPosition(wxLongLong where)
1914{
1915    HRESULT hr = GetAM()->put_CurrentPosition(
1916                        ((LONGLONG)where.GetValue()) / 1000.0
1917                                     );
1918    if(FAILED(hr))
1919    {
1920        wxAMLOG(hr);
1921        return false;
1922    }
1923
1924    return true;
1925}
1926
1927//---------------------------------------------------------------------------
1928// wxAMMediaBackend::GetPosition
1929//
1930// 1) Obtains the current play and stop positions from IMediaSeeking
1931// 2) Returns the play position translated to our time base
1932//---------------------------------------------------------------------------
1933wxLongLong wxAMMediaBackend::GetPosition()
1934{
1935    double outCur;
1936    HRESULT hr = GetAM()->get_CurrentPosition(&outCur);
1937    if(FAILED(hr))
1938    {
1939        wxAMLOG(hr);
1940        return 0;
1941    }
1942
1943    // h,m,s,milli - outCur is in 1 second (double)
1944    outCur *= 1000;
1945    wxLongLong ll;
1946    ll.Assign(outCur);
1947
1948    return ll;
1949}
1950
1951//---------------------------------------------------------------------------
1952// wxAMMediaBackend::GetVolume
1953//
1954// Gets the volume through the IActiveMovie interface -
1955// value ranges from 0 (MAX volume) to -10000 (minimum volume).
1956// -100 per decibel (Logorithmic in 0.01db per step).
1957//---------------------------------------------------------------------------
1958double wxAMMediaBackend::GetVolume()
1959{
1960    long lVolume;
1961    HRESULT hr = GetAM()->get_Volume(&lVolume);
1962    if(FAILED(hr))
1963    {
1964        wxAMLOG(hr);
1965        return 0.0;
1966    }
1967
1968    // Volume conversion from Greg Hazel
1969    double dVolume = (double)lVolume / 100;
1970
1971    // convert to 0 to 1
1972    dVolume = pow(10.0, dVolume/20.0);
1973    // handle -INF
1974    dVolume *= 1 + pow(10.0, -5.0);
1975    dVolume -= pow(10.0, -5.0);
1976    return dVolume;
1977}
1978
1979//---------------------------------------------------------------------------
1980// wxAMMediaBackend::SetVolume
1981//
1982// Sets the volume through the IActiveMovie interface -
1983// value ranges from 0 (MAX volume) to -10000 (minimum volume).
1984// -100 per decibel (Logorithmic in 0.01db per step).
1985//---------------------------------------------------------------------------
1986bool wxAMMediaBackend::SetVolume(double dVolume)
1987{
1988    // Volume conversion from Greg Hazel
1989    long lVolume;
1990    // handle -INF
1991    dVolume *= 1 - pow(10.0, -5.0);
1992    dVolume += pow(10.0, -5.0);
1993    // convert to -100db to 0db
1994    dVolume = 20 * log10(dVolume);
1995    // scale to -10000 to 0
1996    lVolume = (long)(100 * dVolume);
1997
1998    HRESULT hr = GetAM()->put_Volume( lVolume );
1999    if(FAILED(hr))
2000    {
2001        wxAMLOG(hr);
2002        return false;
2003    }
2004    return true;
2005}
2006
2007//---------------------------------------------------------------------------
2008// wxAMMediaBackend::GetDuration
2009//
2010// 1) Obtains the duration of the media from IActiveMovie
2011// 2) Converts that value to our time base, and returns it
2012//
2013// NB: With VBR MP3 files the default DirectShow MP3 render does not
2014// read the Xing header correctly, resulting in skewed values for duration
2015// and seeking
2016//---------------------------------------------------------------------------
2017wxLongLong wxAMMediaBackend::GetDuration()
2018{
2019    double outDuration;
2020    HRESULT hr = GetAM()->get_Duration(&outDuration);
2021    if(FAILED(hr))
2022    {
2023        wxAMLOG(hr);
2024        return 0;
2025    }
2026
2027    // h,m,s,milli - outDuration is in 1 second (double)
2028    outDuration *= 1000;
2029    wxLongLong ll;
2030    ll.Assign(outDuration);
2031
2032    return ll;
2033}
2034
2035//---------------------------------------------------------------------------
2036// wxAMMediaBackend::GetState
2037//
2038// Returns the cached state
2039//---------------------------------------------------------------------------
2040wxMediaState wxAMMediaBackend::GetState()
2041{
2042    StateConstants nState;
2043#ifdef __WXWINCE__
2044    HRESULT hr = m_pWMP->get_PlayState((long*)&nState);
2045#else
2046    HRESULT hr = GetAM()->get_CurrentState(&nState);
2047#endif
2048    if(FAILED(hr))
2049    {
2050        wxAMLOG(hr);
2051        return wxMEDIASTATE_STOPPED;
2052    }
2053
2054    return (wxMediaState)nState;
2055}
2056
2057//---------------------------------------------------------------------------
2058// wxAMMediaBackend::GetPlaybackRate
2059//
2060// Pretty simple way of obtaining the playback rate from
2061// the IActiveMovie interface
2062//---------------------------------------------------------------------------
2063double wxAMMediaBackend::GetPlaybackRate()
2064{
2065    double dRate;
2066    HRESULT hr = GetAM()->get_Rate(&dRate);
2067    if(FAILED(hr))
2068    {
2069        wxAMLOG(hr);
2070        return 0.0;
2071    }
2072    return dRate;
2073}
2074
2075//---------------------------------------------------------------------------
2076// wxAMMediaBackend::SetPlaybackRate
2077//
2078// Sets the playback rate of the media - DirectShow is pretty good
2079// about this, actually
2080//---------------------------------------------------------------------------
2081bool wxAMMediaBackend::SetPlaybackRate(double dRate)
2082{
2083    HRESULT hr = GetAM()->put_Rate(dRate);
2084    if(FAILED(hr))
2085    {
2086        wxAMLOG(hr);
2087        return false;
2088    }
2089
2090    return true;
2091}
2092
2093//---------------------------------------------------------------------------
2094// wxAMMediaBackend::GetDownloadXXX
2095//
2096// Queries for and gets the total size of the file and the current
2097// progress in downloading that file from the IAMOpenProgress
2098// interface from the media player interface's filter graph
2099//---------------------------------------------------------------------------
2100void wxAMMediaBackend::DoGetDownloadProgress(wxLongLong* pLoadProgress,
2101                                             wxLongLong* pLoadTotal)
2102{
2103#ifndef __WXWINCE__
2104    LONGLONG loadTotal = 0, loadProgress = 0;
2105    IUnknown* pFG;
2106    IAMOpenProgress* pOP;
2107    HRESULT hr;
2108    hr = m_pAM->get_FilterGraph(&pFG);
2109    if(SUCCEEDED(hr))
2110    {
2111        hr = pFG->QueryInterface(IID_IAMOpenProgress, (void**)&pOP);
2112        if(SUCCEEDED(hr))
2113    {
2114            hr = pOP->QueryProgress(&loadTotal, &loadProgress);
2115            pOP->Release();
2116        }
2117        pFG->Release();
2118    }
2119
2120    if(SUCCEEDED(hr))
2121    {
2122        *pLoadProgress = loadProgress;
2123        *pLoadTotal = loadTotal;
2124    }
2125    else
2126#endif
2127    {
2128        // When not loading from a URL QueryProgress will return
2129        // E_NOINTERFACE or whatever
2130        // wxAMFAIL(hr);
2131        *pLoadProgress = 0;
2132        *pLoadTotal = 0;
2133    }
2134}
2135
2136//---------------------------------------------------------------------------
2137// wxAMMediaBackend::GetVideoSize
2138//
2139// Obtains the cached original video size
2140//---------------------------------------------------------------------------
2141wxSize wxAMMediaBackend::GetVideoSize() const
2142{
2143    if (m_bestSize == wxDefaultSize)
2144    {
2145        wxAMMediaBackend* self = wxConstCast(this, wxAMMediaBackend);
2146        long w = 0;
2147        long h = 0;
2148
2149        self->GetAM()->get_ImageSourceWidth(&w);
2150        self->GetAM()->get_ImageSourceHeight(&h);
2151
2152        if (w != 0 && h != 0)
2153            self->m_bestSize.Set(w, h);
2154        else
2155            return wxSize(0,0);
2156    }
2157
2158   return m_bestSize;
2159}
2160
2161//---------------------------------------------------------------------------
2162// wxAMMediaBackend::Move
2163//
2164// We take care of this in our redrawing
2165//---------------------------------------------------------------------------
2166void wxAMMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y),
2167                            int WXUNUSED(w), int WXUNUSED(h))
2168{
2169}
2170
2171//---------------------------------------------------------------------------
2172// wxAMMediaBackend::OnActiveX
2173//
2174// Handle events sent from our activex control (IActiveMovie/IMediaPlayer).
2175//
2176// The weird numbers in the switch statement here are "dispatch ids"
2177// (the numbers in the id field like ( id(xxx) ) ) from amcompat.idl
2178// and msdxm.idl.
2179//---------------------------------------------------------------------------
2180void wxAMMediaEvtHandler::OnActiveX(wxActiveXEvent& event)
2181{
2182    switch(event.GetDispatchId())
2183    {
2184#ifndef __WXWINCE__
2185    case 0x00000001: // statechange in IActiveMovie
2186    case 0x00000bc4: // playstatechange in IMediaPlayer
2187#else
2188    case 0x00000011: // 17 == playstatechange on IWMP
2189#endif
2190        if(event.ParamCount() >= 2)
2191        {
2192            switch (event[1].GetInteger())
2193            {
2194            case 0: // stopping
2195                if( m_amb->wxAMMediaBackend::GetPosition() ==
2196                    m_amb->wxAMMediaBackend::GetDuration() )
2197                {
2198                    if ( m_amb->SendStopEvent() )
2199                    {
2200                        // Seek to beginning of movie
2201                        m_amb->wxAMMediaBackend::SetPosition(0);
2202
2203                        // send the event to our child
2204                        m_amb->QueueFinishEvent();
2205                    }
2206                }
2207                else
2208                {
2209                    m_amb->QueueStopEvent();
2210                }
2211                break;
2212            case 1: // pause
2213                m_amb->QueuePauseEvent();
2214                break;
2215            case 2: // play
2216                m_amb->QueuePlayEvent();
2217                break;
2218            default:
2219                break;
2220            }
2221        }
2222        else
2223            event.Skip();
2224        break;
2225
2226#ifndef __WXWINCE__
2227    case 0x00000032: // opencomplete in IActiveMovie
2228        if(!m_bLoadEventSent)
2229        {
2230            m_amb->FinishLoad();
2231        }
2232        break;
2233
2234    case 0xfffffd9f: // readystatechange in IActiveMovie2 and IMediaPlayer
2235#else
2236    case 0x00000013: // 19 == readystatechange in IWMP
2237#endif
2238        if(event.ParamCount() >= 1)
2239        {
2240            if(event[0].GetInteger() == 0)
2241            {
2242                m_bLoadEventSent = false;
2243            }
2244            // Originally this was >= 3 here but on 3 we can't get the
2245            // size of the video (will error) - however on 4
2246            // it won't play on downloaded things until it is
2247            // completely downloaded so we use the lesser of two evils...
2248            else if(event[0].GetInteger() == 3 &&
2249                !m_bLoadEventSent)
2250            {
2251                m_bLoadEventSent = true;
2252                m_amb->FinishLoad();
2253            }
2254        }
2255        else
2256            event.Skip();
2257        break;
2258
2259    default:
2260        event.Skip();
2261        return;
2262    }
2263}
2264
2265//---------------------------------------------------------------------------
2266// End of wxAMMediaBackend
2267//---------------------------------------------------------------------------
2268
2269// in source file that contains stuff you don't directly use
2270#include "wx/html/forcelnk.h"
2271FORCE_LINK_ME(wxmediabackend_am)
2272
2273#endif // wxUSE_MEDIACTRL && wxUSE_ACTIVEX
2274