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
)); }
220 static wxClassInfo
* NextBackend();
222 void OnMediaFinished(wxMediaEvent
& evt
);
223 virtual void DoMoveWindow(int x
, int y
, int w
, int h
);
224 wxSize
DoGetBestSize() const;
226 //FIXME: This is nasty... find a better way to work around
228 #if defined(__WXMAC__)
229 virtual void MacVisibilityChanged();
231 #if defined(__WXMAC__) || defined(__WXCOCOA__)
232 friend class wxQTMediaBackend
;
234 class wxMediaBackend
* m_imp
;
237 DECLARE_DYNAMIC_CLASS(wxMediaCtrl
)
240 // ----------------------------------------------------------------------------
244 // Derive from this and use standard wxWidgets RTTI
245 // (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend
246 // for wxMediaCtrl. Backends are searched alphabetically -
247 // the one with the earliest letter is tried first.
249 // Note that this is currently not API or ABI compatable -
250 // so statically link or make the client compile on-site.
252 // ----------------------------------------------------------------------------
254 class WXDLLIMPEXP_MEDIA wxMediaBackend
: public wxObject
260 virtual ~wxMediaBackend();
262 virtual bool CreateControl(wxControl
* WXUNUSED(ctrl
),
263 wxWindow
* WXUNUSED(parent
),
264 wxWindowID
WXUNUSED(winid
),
265 const wxPoint
& WXUNUSED(pos
),
266 const wxSize
& WXUNUSED(size
),
267 long WXUNUSED(style
),
268 const wxValidator
& WXUNUSED(validator
),
269 const wxString
& WXUNUSED(name
))
279 virtual bool Load(const wxString
& WXUNUSED(fileName
))
281 virtual bool Load(const wxURI
& WXUNUSED(location
))
284 virtual bool SetPosition(wxLongLong
WXUNUSED(where
))
286 virtual wxLongLong
GetPosition()
288 virtual wxLongLong
GetDuration()
291 virtual void Move(int WXUNUSED(x
), int WXUNUSED(y
),
292 int WXUNUSED(w
), int WXUNUSED(h
))
294 virtual wxSize
GetVideoSize() const
295 { return wxSize(0,0); }
297 virtual double GetPlaybackRate()
299 virtual bool SetPlaybackRate(double WXUNUSED(dRate
))
302 virtual wxMediaState
GetState()
303 { return wxMEDIASTATE_STOPPED
; }
305 virtual double GetVolume()
307 virtual bool SetVolume(double WXUNUSED(dVolume
))
310 virtual bool Load(const wxURI
& WXUNUSED(location
),
311 const wxURI
& WXUNUSED(proxy
))
314 virtual bool ShowPlayerControls(
315 wxMediaCtrlPlayerControls
WXUNUSED(flags
))
317 virtual bool IsInterfaceShown()
320 virtual wxLongLong
GetDownloadProgress()
322 virtual wxLongLong
GetDownloadTotal()
325 virtual void MacVisibilityChanged()
327 virtual void RESERVED9() {}
329 DECLARE_DYNAMIC_CLASS(wxMediaBackend
)
333 //Event ID to give to our events
334 #define wxMEDIA_FINISHED_ID 13000
335 #define wxMEDIA_STOP_ID 13001
337 //Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
338 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_FINISHED
, wxMEDIA_FINISHED_ID
)
339 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STOP
, wxMEDIA_STOP_ID
)
341 //Function type(s) our events need
342 typedef void (wxEvtHandler::*wxMediaEventFunction
)(wxMediaEvent
&);
344 #define wxMediaEventHandler(func) \
345 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func)
347 //Macro for usage with message maps
348 #define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
349 #define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
351 #if wxABI_VERSION >= 20602 /* 2.6.2+ only */
352 # define wxMEDIA_LOADED_ID 13002
353 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_LOADED
, wxMEDIA_LOADED_ID
)
354 # define EVT_MEDIA_LOADED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
357 #if wxABI_VERSION >= 20603 /* 2.6.3+ only */
358 # define wxMEDIA_STATECHANGED_ID 13003
359 # define wxMEDIA_PLAY_ID 13004
360 # define wxMEDIA_PAUSE_ID 13005
361 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STATECHANGED
, wxMEDIA_STATECHANGED_ID
)
362 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_PLAY
, wxMEDIA_PLAY_ID
)
363 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_PAUSE
, wxMEDIA_PAUSE_ID
)
364 # define EVT_MEDIA_STATECHANGED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
365 # define EVT_MEDIA_PLAY(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
366 # define EVT_MEDIA_PAUSE(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
369 // ----------------------------------------------------------------------------
370 // common backend base class used by many other backends
371 // ----------------------------------------------------------------------------
373 class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase
: public wxMediaBackend
376 // add a pending wxMediaEvent of the given type
377 void QueueEvent(wxEventType evtType
);
379 // notify that the movie playback is finished
380 void QueueFinishEvent()
382 #if wxABI_VERSION >= 20603 /* 2.6.3+ only */
383 QueueEvent(wxEVT_MEDIA_STATECHANGED
);
385 QueueEvent(wxEVT_MEDIA_FINISHED
);
388 // send the stop event and return true if it hasn't been vetoed
389 bool SendStopEvent();
392 void QueuePlayEvent();
395 void QueuePauseEvent();
397 // Queue stop event (no veto)
398 void QueueStopEvent();
401 // call this when the movie size has changed but not because it has just
402 // been loaded (in this case, call NotifyMovieLoaded() below)
403 void NotifyMovieSizeChanged();
405 // call this when the movie is fully loaded
406 void NotifyMovieLoaded();
409 wxMediaCtrl
*m_ctrl
; // parent control
412 // ----------------------------------------------------------------------------
413 // End compilation gaurd
414 // ----------------------------------------------------------------------------
415 #endif // wxUSE_MEDIACTRL
417 // ----------------------------------------------------------------------------
418 // End header guard and header itself
419 // ----------------------------------------------------------------------------
420 #endif // _WX_MEDIACTRL_H_