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
); }
154 virtual ~wxMediaCtrl();
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 double GetPlaybackRate(); //All but MCI & GStreamer
195 bool SetPlaybackRate(double dRate
); //All but MCI & GStreamer
197 bool Load(const wxURI
& location
);
198 bool Load(const wxURI
& location
, const wxURI
& proxy
);
200 wxFileOffset
GetDownloadProgress(); // DirectShow only
201 wxFileOffset
GetDownloadTotal(); // DirectShow only
204 bool SetVolume(double dVolume
);
206 bool ShowPlayerControls(
207 wxMediaCtrlPlayerControls flags
= wxMEDIACTRLPLAYERCONTROLS_DEFAULT
);
209 //helpers for the wxPython people
210 bool LoadURI(const wxString
& fileName
)
211 { return Load(wxURI(fileName
)); }
212 bool LoadURIWithProxy(const wxString
& fileName
, const wxString
& proxy
)
213 { return Load(wxURI(fileName
), wxURI(proxy
)); }
216 static wxClassInfo
* NextBackend();
218 void OnMediaFinished(wxMediaEvent
& evt
);
219 virtual void DoMoveWindow(int x
, int y
, int w
, int h
);
220 wxSize
DoGetBestSize() const;
222 //FIXME: This is nasty... find a better way to work around
224 #if defined(__WXMAC__)
225 virtual void MacVisibilityChanged();
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 MacVisibilityChanged()
323 virtual void RESERVED9() {}
325 DECLARE_DYNAMIC_CLASS(wxMediaBackend
)
329 //Event ID to give to our events
330 #define wxMEDIA_FINISHED_ID 13000
331 #define wxMEDIA_STOP_ID 13001
333 //Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
334 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_FINISHED
, wxMEDIA_FINISHED_ID
)
335 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STOP
, wxMEDIA_STOP_ID
)
337 //Function type(s) our events need
338 typedef void (wxEvtHandler::*wxMediaEventFunction
)(wxMediaEvent
&);
340 #define wxMediaEventHandler(func) \
341 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func)
343 //Macro for usage with message maps
344 #define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
345 #define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
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 ),
351 #define wxMEDIA_STATECHANGED_ID 13003
352 #define wxMEDIA_PLAY_ID 13004
353 #define wxMEDIA_PAUSE_ID 13005
354 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STATECHANGED
, wxMEDIA_STATECHANGED_ID
)
355 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_PLAY
, wxMEDIA_PLAY_ID
)
356 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_PAUSE
, wxMEDIA_PAUSE_ID
)
357 #define EVT_MEDIA_STATECHANGED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
358 #define EVT_MEDIA_PLAY(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
359 #define EVT_MEDIA_PAUSE(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
361 // ----------------------------------------------------------------------------
362 // common backend base class used by many other backends
363 // ----------------------------------------------------------------------------
365 class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase
: public wxMediaBackend
368 // add a pending wxMediaEvent of the given type
369 void QueueEvent(wxEventType evtType
);
371 // notify that the movie playback is finished
372 void QueueFinishEvent()
374 QueueEvent(wxEVT_MEDIA_STATECHANGED
);
375 QueueEvent(wxEVT_MEDIA_FINISHED
);
378 // send the stop event and return true if it hasn't been vetoed
379 bool SendStopEvent();
382 void QueuePlayEvent();
385 void QueuePauseEvent();
387 // Queue stop event (no veto)
388 void QueueStopEvent();
391 // call this when the movie size has changed but not because it has just
392 // been loaded (in this case, call NotifyMovieLoaded() below)
393 void NotifyMovieSizeChanged();
395 // call this when the movie is fully loaded
396 void NotifyMovieLoaded();
399 wxMediaCtrl
*m_ctrl
; // parent control
402 // ----------------------------------------------------------------------------
403 // End compilation gaurd
404 // ----------------------------------------------------------------------------
405 #endif // wxUSE_MEDIACTRL
407 // ----------------------------------------------------------------------------
408 // End header guard and header itself
409 // ----------------------------------------------------------------------------
410 #endif // _WX_MEDIACTRL_H_