1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/mediactrl.h
3 // Purpose: wxMediaCtrl class
4 // Author: Ryan Norton <wxprojects@comcast.net>
8 // Copyright: (c) Ryan Norton
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
19 #ifndef _WX_MEDIACTRL_H_
20 #define _WX_MEDIACTRL_H_
22 // ----------------------------------------------------------------------------
23 // Pre-compiled header stuff
24 // ----------------------------------------------------------------------------
28 // ----------------------------------------------------------------------------
30 // ----------------------------------------------------------------------------
34 // ----------------------------------------------------------------------------
36 // ----------------------------------------------------------------------------
38 #include "wx/control.h"
41 // ============================================================================
43 // ============================================================================
45 // ----------------------------------------------------------------------------
49 // ----------------------------------------------------------------------------
58 enum wxMediaCtrlPlayerControls
60 wxMEDIACTRLPLAYERCONTROLS_NONE
= 0,
61 //Step controls like fastfoward, step one frame etc.
62 wxMEDIACTRLPLAYERCONTROLS_STEP
= 1 << 0,
63 //Volume controls like the speaker icon, volume slider, etc.
64 wxMEDIACTRLPLAYERCONTROLS_VOLUME
= 1 << 1,
65 wxMEDIACTRLPLAYERCONTROLS_DEFAULT
=
66 wxMEDIACTRLPLAYERCONTROLS_STEP
|
67 wxMEDIACTRLPLAYERCONTROLS_VOLUME
70 #define wxMEDIABACKEND_DIRECTSHOW wxT("wxAMMediaBackend")
71 #define wxMEDIABACKEND_MCI wxT("wxMCIMediaBackend")
72 #define wxMEDIABACKEND_QUICKTIME wxT("wxQTMediaBackend")
73 #define wxMEDIABACKEND_GSTREAMER wxT("wxGStreamerMediaBackend")
74 #define wxMEDIABACKEND_REALPLAYER wxT("wxRealPlayerMediaBackend")
75 #define wxMEDIABACKEND_WMP10 wxT("wxWMP10MediaBackend")
77 // ----------------------------------------------------------------------------
81 // ----------------------------------------------------------------------------
83 class WXDLLIMPEXP_MEDIA wxMediaEvent
: public wxNotifyEvent
86 // ------------------------------------------------------------------------
87 // wxMediaEvent Constructor
89 // Normal constructor, much the same as wxNotifyEvent
90 // ------------------------------------------------------------------------
91 wxMediaEvent(wxEventType commandType
= wxEVT_NULL
, int winid
= 0)
92 : wxNotifyEvent(commandType
, winid
)
95 // ------------------------------------------------------------------------
96 // wxMediaEvent Copy Constructor
98 // Normal copy constructor, much the same as wxNotifyEvent
99 // ------------------------------------------------------------------------
100 wxMediaEvent(const wxMediaEvent
&clone
)
101 : wxNotifyEvent(clone
)
104 // ------------------------------------------------------------------------
105 // wxMediaEvent::Clone
107 // Allocates a copy of this object.
108 // Required for wxEvtHandler::AddPendingEvent
109 // ------------------------------------------------------------------------
110 virtual wxEvent
*Clone() const
111 { return new wxMediaEvent(*this); }
114 // Put this class on wxWidget's RTTI table
115 DECLARE_DYNAMIC_CLASS(wxMediaEvent
)
118 // ----------------------------------------------------------------------------
122 // ----------------------------------------------------------------------------
124 class WXDLLIMPEXP_MEDIA wxMediaCtrl
: public wxControl
127 wxMediaCtrl() : m_imp(NULL
), m_bLoaded(false)
130 wxMediaCtrl(wxWindow
* parent
, wxWindowID winid
,
131 const wxString
& fileName
= wxEmptyString
,
132 const wxPoint
& pos
= wxDefaultPosition
,
133 const wxSize
& size
= wxDefaultSize
,
135 const wxString
& szBackend
= wxEmptyString
,
136 const wxValidator
& validator
= wxDefaultValidator
,
137 const wxString
& name
= wxT("mediaCtrl"))
138 : m_imp(NULL
), m_bLoaded(false)
139 { Create(parent
, winid
, fileName
, pos
, size
, style
,
140 szBackend
, validator
, name
); }
142 wxMediaCtrl(wxWindow
* parent
, wxWindowID winid
,
143 const wxURI
& location
,
144 const wxPoint
& pos
= wxDefaultPosition
,
145 const wxSize
& size
= wxDefaultSize
,
147 const wxString
& szBackend
= wxEmptyString
,
148 const wxValidator
& validator
= wxDefaultValidator
,
149 const wxString
& name
= wxT("mediaCtrl"))
150 : m_imp(NULL
), m_bLoaded(false)
151 { Create(parent
, winid
, location
, pos
, size
, style
,
152 szBackend
, validator
, name
); }
156 bool Create(wxWindow
* parent
, wxWindowID winid
,
157 const wxString
& fileName
= wxEmptyString
,
158 const wxPoint
& pos
= wxDefaultPosition
,
159 const wxSize
& size
= wxDefaultSize
,
161 const wxString
& szBackend
= wxEmptyString
,
162 const wxValidator
& validator
= wxDefaultValidator
,
163 const wxString
& name
= wxT("mediaCtrl"));
165 bool Create(wxWindow
* parent
, wxWindowID winid
,
166 const wxURI
& location
,
167 const wxPoint
& pos
= wxDefaultPosition
,
168 const wxSize
& size
= wxDefaultSize
,
170 const wxString
& szBackend
= wxEmptyString
,
171 const wxValidator
& validator
= wxDefaultValidator
,
172 const wxString
& name
= wxT("mediaCtrl"));
174 bool DoCreate(wxClassInfo
* instance
,
175 wxWindow
* parent
, wxWindowID winid
,
176 const wxPoint
& pos
= wxDefaultPosition
,
177 const wxSize
& size
= wxDefaultSize
,
179 const wxValidator
& validator
= wxDefaultValidator
,
180 const wxString
& name
= wxT("mediaCtrl"));
186 bool Load(const wxString
& fileName
);
188 wxMediaState
GetState();
190 wxFileOffset
Seek(wxFileOffset where
, wxSeekMode mode
= wxFromStart
);
191 wxFileOffset
Tell(); //FIXME: This should be const
192 wxFileOffset
Length(); //FIXME: This should be const
194 #if wxABI_VERSION >= 20601 /* 2.6.1+ only */
195 double GetPlaybackRate(); //All but MCI & GStreamer
196 bool SetPlaybackRate(double dRate
); //All but MCI & GStreamer
199 #if wxABI_VERSION >= 20602 /* 2.6.2+ only */
200 bool Load(const wxURI
& location
);
201 bool Load(const wxURI
& location
, const wxURI
& proxy
);
203 wxFileOffset
GetDownloadProgress(); // DirectShow only
204 wxFileOffset
GetDownloadTotal(); // DirectShow only
207 bool SetVolume(double dVolume
);
209 bool ShowPlayerControls(
210 wxMediaCtrlPlayerControls flags
= wxMEDIACTRLPLAYERCONTROLS_DEFAULT
);
212 //helpers for the wxPython people
213 bool LoadURI(const wxString
& fileName
)
214 { return Load(wxURI(fileName
)); }
215 bool LoadURIWithProxy(const wxString
& fileName
, const wxString
& proxy
)
216 { return Load(wxURI(fileName
), wxURI(proxy
)); }
219 static wxClassInfo
* NextBackend();
221 void OnMediaFinished(wxMediaEvent
& evt
);
222 virtual void DoMoveWindow(int x
, int y
, int w
, int h
);
223 wxSize
DoGetBestSize() const;
225 //FIXME: This is nasty... find a better way to work around
227 #if defined(__WXMAC__) || defined(__WXCOCOA__)
228 friend class wxQTMediaBackend
;
230 class wxMediaBackend
* m_imp
;
233 DECLARE_DYNAMIC_CLASS(wxMediaCtrl
)
236 // ----------------------------------------------------------------------------
240 // Derive from this and use standard wxWidgets RTTI
241 // (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend
242 // for wxMediaCtrl. Backends are searched alphabetically -
243 // the one with the earliest letter is tried first.
245 // Note that this is currently not API or ABI compatable -
246 // so statically link or make the client compile on-site.
248 // ----------------------------------------------------------------------------
250 class WXDLLIMPEXP_MEDIA wxMediaBackend
: public wxObject
256 virtual ~wxMediaBackend();
258 virtual bool CreateControl(wxControl
* WXUNUSED(ctrl
),
259 wxWindow
* WXUNUSED(parent
),
260 wxWindowID
WXUNUSED(winid
),
261 const wxPoint
& WXUNUSED(pos
),
262 const wxSize
& WXUNUSED(size
),
263 long WXUNUSED(style
),
264 const wxValidator
& WXUNUSED(validator
),
265 const wxString
& WXUNUSED(name
))
275 virtual bool Load(const wxString
& WXUNUSED(fileName
))
277 virtual bool Load(const wxURI
& WXUNUSED(location
))
280 virtual bool SetPosition(wxLongLong
WXUNUSED(where
))
282 virtual wxLongLong
GetPosition()
284 virtual wxLongLong
GetDuration()
287 virtual void Move(int WXUNUSED(x
), int WXUNUSED(y
),
288 int WXUNUSED(w
), int WXUNUSED(h
))
290 virtual wxSize
GetVideoSize() const
291 { return wxSize(0,0); }
293 virtual double GetPlaybackRate()
295 virtual bool SetPlaybackRate(double WXUNUSED(dRate
))
298 virtual wxMediaState
GetState()
299 { return wxMEDIASTATE_STOPPED
; }
301 virtual double GetVolume()
303 virtual bool SetVolume(double WXUNUSED(dVolume
))
306 virtual bool Load(const wxURI
& WXUNUSED(location
),
307 const wxURI
& WXUNUSED(proxy
))
310 virtual bool ShowPlayerControls(
311 wxMediaCtrlPlayerControls
WXUNUSED(flags
))
313 virtual bool IsInterfaceShown()
316 virtual wxLongLong
GetDownloadProgress()
318 virtual wxLongLong
GetDownloadTotal()
321 virtual void RESERVED8() {}
322 virtual void RESERVED9() {}
324 DECLARE_DYNAMIC_CLASS(wxMediaBackend
)
328 //Event ID to give to our events
329 #define wxMEDIA_FINISHED_ID 13000
330 #define wxMEDIA_STOP_ID 13001
332 //Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
333 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_FINISHED
, wxMEDIA_FINISHED_ID
)
334 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STOP
, wxMEDIA_STOP_ID
)
336 //Function type(s) our events need
337 typedef void (wxEvtHandler::*wxMediaEventFunction
)(wxMediaEvent
&);
339 #define wxMediaEventHandler(func) \
340 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func)
342 //Macro for usage with message maps
343 #define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
344 #define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
346 #if wxABI_VERSION >= 20602 /* 2.6.2+ only */
347 # define wxMEDIA_LOADED_ID 13002
348 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_LOADED
, wxMEDIA_LOADED_ID
)
349 # define EVT_MEDIA_LOADED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
352 #if wxABI_VERSION >= 20603 /* 2.6.3+ only */
353 # define wxMEDIA_STATECHANGED_ID 13003
354 # define wxMEDIA_PLAY_ID 13004
355 # define wxMEDIA_PAUSE_ID 13005
356 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STATECHANGED
, wxMEDIA_STATECHANGED_ID
)
357 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_PLAY
, wxMEDIA_PLAY_ID
)
358 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_PAUSE
, wxMEDIA_PAUSE_ID
)
359 # define EVT_MEDIA_STATECHANGED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
360 # define EVT_MEDIA_PLAY(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
361 # define EVT_MEDIA_PAUSE(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
364 // ----------------------------------------------------------------------------
365 // common backend base class used by many other backends
366 // ----------------------------------------------------------------------------
368 class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase
: public wxMediaBackend
371 // add a pending wxMediaEvent of the given type
372 void QueueEvent(wxEventType evtType
);
374 // notify that the movie playback is finished
375 void QueueFinishEvent()
377 #if wxABI_VERSION >= 20603 /* 2.6.3+ only */
378 QueueEvent(wxEVT_MEDIA_STATECHANGED
);
380 QueueEvent(wxEVT_MEDIA_FINISHED
);
383 // send the stop event and return true if it hasn't been vetoed
384 bool SendStopEvent();
387 void QueuePlayEvent();
390 void QueuePauseEvent();
392 // Queue stop event (no veto)
393 void QueueStopEvent();
396 // call this when the movie size has changed but not because it has just
397 // been loaded (in this case, call NotifyMovieLoaded() below)
398 void NotifyMovieSizeChanged();
400 // call this when the movie is fully loaded
401 void NotifyMovieLoaded();
404 wxMediaCtrl
*m_ctrl
; // parent control
407 // ----------------------------------------------------------------------------
408 // End compilation gaurd
409 // ----------------------------------------------------------------------------
410 #endif // wxUSE_MEDIACTRL
412 // ----------------------------------------------------------------------------
413 // End header guard and header itself
414 // ----------------------------------------------------------------------------
415 #endif // _WX_MEDIACTRL_H_