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")
76 // ----------------------------------------------------------------------------
80 // ----------------------------------------------------------------------------
82 class WXDLLIMPEXP_MEDIA wxMediaEvent
: public wxNotifyEvent
85 // ------------------------------------------------------------------------
86 // wxMediaEvent Constructor
88 // Normal constructor, much the same as wxNotifyEvent
89 // ------------------------------------------------------------------------
90 wxMediaEvent(wxEventType commandType
= wxEVT_NULL
, int winid
= 0)
91 : wxNotifyEvent(commandType
, winid
)
94 // ------------------------------------------------------------------------
95 // wxMediaEvent Copy Constructor
97 // Normal copy constructor, much the same as wxNotifyEvent
98 // ------------------------------------------------------------------------
99 wxMediaEvent(const wxMediaEvent
&clone
)
100 : wxNotifyEvent(clone
)
103 // ------------------------------------------------------------------------
104 // wxMediaEvent::Clone
106 // Allocates a copy of this object.
107 // Required for wxEvtHandler::AddPendingEvent
108 // ------------------------------------------------------------------------
109 virtual wxEvent
*Clone() const
110 { return new wxMediaEvent(*this); }
113 // Put this class on wxWidget's RTTI table
114 DECLARE_DYNAMIC_CLASS(wxMediaEvent
)
117 // ----------------------------------------------------------------------------
121 // ----------------------------------------------------------------------------
123 class WXDLLIMPEXP_MEDIA wxMediaCtrl
: public wxControl
126 wxMediaCtrl() : m_imp(NULL
), m_bLoaded(false)
129 wxMediaCtrl(wxWindow
* parent
, wxWindowID winid
,
130 const wxString
& fileName
= wxEmptyString
,
131 const wxPoint
& pos
= wxDefaultPosition
,
132 const wxSize
& size
= wxDefaultSize
,
134 const wxString
& szBackend
= wxEmptyString
,
135 const wxValidator
& validator
= wxDefaultValidator
,
136 const wxString
& name
= wxT("mediaCtrl"))
137 : m_imp(NULL
), m_bLoaded(false)
138 { Create(parent
, winid
, fileName
, pos
, size
, style
,
139 szBackend
, validator
, name
); }
141 wxMediaCtrl(wxWindow
* parent
, wxWindowID winid
,
142 const wxURI
& location
,
143 const wxPoint
& pos
= wxDefaultPosition
,
144 const wxSize
& size
= wxDefaultSize
,
146 const wxString
& szBackend
= wxEmptyString
,
147 const wxValidator
& validator
= wxDefaultValidator
,
148 const wxString
& name
= wxT("mediaCtrl"))
149 : m_imp(NULL
), m_bLoaded(false)
150 { Create(parent
, winid
, location
, pos
, size
, style
,
151 szBackend
, validator
, name
); }
155 bool Create(wxWindow
* parent
, wxWindowID winid
,
156 const wxString
& fileName
= wxEmptyString
,
157 const wxPoint
& pos
= wxDefaultPosition
,
158 const wxSize
& size
= wxDefaultSize
,
160 const wxString
& szBackend
= wxEmptyString
,
161 const wxValidator
& validator
= wxDefaultValidator
,
162 const wxString
& name
= wxT("mediaCtrl"));
164 bool Create(wxWindow
* parent
, wxWindowID winid
,
165 const wxURI
& location
,
166 const wxPoint
& pos
= wxDefaultPosition
,
167 const wxSize
& size
= wxDefaultSize
,
169 const wxString
& szBackend
= wxEmptyString
,
170 const wxValidator
& validator
= wxDefaultValidator
,
171 const wxString
& name
= wxT("mediaCtrl"));
173 bool DoCreate(wxClassInfo
* instance
,
174 wxWindow
* parent
, wxWindowID winid
,
175 const wxPoint
& pos
= wxDefaultPosition
,
176 const wxSize
& size
= wxDefaultSize
,
178 const wxValidator
& validator
= wxDefaultValidator
,
179 const wxString
& name
= wxT("mediaCtrl"));
185 bool Load(const wxString
& fileName
);
187 wxMediaState
GetState();
189 wxFileOffset
Seek(wxFileOffset where
, wxSeekMode mode
= wxFromStart
);
190 wxFileOffset
Tell(); //FIXME: This should be const
191 wxFileOffset
Length(); //FIXME: This should be const
193 #if wxABI_VERSION >= 20601 /* 2.6.1+ only */
194 double GetPlaybackRate(); //All but MCI & GStreamer
195 bool SetPlaybackRate(double dRate
); //All but MCI & GStreamer
198 #if wxABI_VERSION >= 20602 /* 2.6.2+ only */
199 bool Load(const wxURI
& location
);
200 bool Load(const wxURI
& location
, const wxURI
& proxy
);
202 wxFileOffset
GetDownloadProgress();
203 wxFileOffset
GetDownloadTotal();
206 bool SetVolume(double dVolume
);
208 bool ShowPlayerControls(
209 wxMediaCtrlPlayerControls flags
= wxMEDIACTRLPLAYERCONTROLS_DEFAULT
);
211 //helpers for the wxPython people
212 bool LoadURI(const wxString
& fileName
)
213 { return Load(wxURI(fileName
)); }
214 bool LoadURIWithProxy(const wxString
& fileName
, const wxString
& proxy
)
215 { return Load(wxURI(fileName
), wxURI(proxy
)); }
218 static wxClassInfo
* NextBackend();
220 void OnMediaFinished(wxMediaEvent
& evt
);
221 virtual void DoMoveWindow(int x
, int y
, int w
, int h
);
222 wxSize
DoGetBestSize() const;
224 //FIXME: This is nasty... find a better way to work around
226 #if defined(__WXMAC__) || defined(__WXCOCOA__)
227 friend class wxQTMediaBackend
;
229 class wxMediaBackend
* m_imp
;
232 DECLARE_DYNAMIC_CLASS(wxMediaCtrl
)
235 // ----------------------------------------------------------------------------
239 // Derive from this and use standard wxWidgets RTTI
240 // (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend
241 // for wxMediaCtrl. Backends are searched alphabetically -
242 // the one with the earliest letter is tried first.
244 // Note that this is currently not API or ABI compatable -
245 // so statically link or make the client compile on-site.
247 // ----------------------------------------------------------------------------
249 class WXDLLIMPEXP_MEDIA wxMediaBackend
: public wxObject
255 virtual ~wxMediaBackend();
257 virtual bool CreateControl(wxControl
* WXUNUSED(ctrl
),
258 wxWindow
* WXUNUSED(parent
),
259 wxWindowID
WXUNUSED(winid
),
260 const wxPoint
& WXUNUSED(pos
),
261 const wxSize
& WXUNUSED(size
),
262 long WXUNUSED(style
),
263 const wxValidator
& WXUNUSED(validator
),
264 const wxString
& WXUNUSED(name
))
274 virtual bool Load(const wxString
& WXUNUSED(fileName
))
276 virtual bool Load(const wxURI
& WXUNUSED(location
))
279 virtual bool SetPosition(wxLongLong
WXUNUSED(where
))
281 virtual wxLongLong
GetPosition()
283 virtual wxLongLong
GetDuration()
286 virtual void Move(int WXUNUSED(x
), int WXUNUSED(y
),
287 int WXUNUSED(w
), int WXUNUSED(h
))
289 virtual wxSize
GetVideoSize() const
290 { return wxSize(0,0); }
292 virtual double GetPlaybackRate()
294 virtual bool SetPlaybackRate(double WXUNUSED(dRate
))
297 virtual wxMediaState
GetState()
298 { return wxMEDIASTATE_STOPPED
; }
300 virtual double GetVolume()
302 virtual bool SetVolume(double WXUNUSED(dVolume
))
305 virtual bool Load(const wxURI
& WXUNUSED(location
),
306 const wxURI
& WXUNUSED(proxy
))
309 virtual bool ShowPlayerControls(
310 wxMediaCtrlPlayerControls
WXUNUSED(flags
))
312 virtual bool IsInterfaceShown()
315 virtual wxLongLong
GetDownloadProgress()
317 virtual wxLongLong
GetDownloadTotal()
320 virtual void RESERVED8() {}
321 virtual void RESERVED9() {}
323 DECLARE_DYNAMIC_CLASS(wxMediaBackend
)
327 //Event ID to give to our events
328 #define wxMEDIA_FINISHED_ID 13000
329 #define wxMEDIA_STOP_ID 13001
331 //Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
332 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_FINISHED
, wxMEDIA_FINISHED_ID
)
333 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_STOP
, wxMEDIA_STOP_ID
)
335 //Function type(s) our events need
336 typedef void (wxEvtHandler::*wxMediaEventFunction
)(wxMediaEvent
&);
338 #define wxMediaEventHandler(func) \
339 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func)
341 //Macro for usage with message maps
342 #define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
343 #define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
345 #if wxABI_VERSION >= 20602 /* 2.6.2+ only */
346 # define wxMEDIA_LOADED_ID 13002
347 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA
, wxEVT_MEDIA_LOADED
, wxMEDIA_LOADED_ID
)
348 # define EVT_MEDIA_LOADED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ),
351 // ----------------------------------------------------------------------------
352 // common backend base class used by many other backends
353 // ----------------------------------------------------------------------------
355 class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase
: public wxMediaBackend
358 // add a pending wxMediaEvent of the given type
359 void QueueEvent(wxEventType evtType
);
361 // notify that the movie playback is finished
362 void QueueFinishEvent() { QueueEvent(wxEVT_MEDIA_FINISHED
); }
364 // send the stop event and return true if it hasn't been vetoed
365 bool SendStopEvent();
368 // call this when the movie size has changed but not because it has just
369 // been loaded (in this case, call NotifyMovieLoaded() below)
370 void NotifyMovieSizeChanged();
372 // call this when the movie is fully loaded
373 void NotifyMovieLoaded();
376 wxMediaCtrl
*m_ctrl
; // parent control
379 // ----------------------------------------------------------------------------
380 // End compilation gaurd
381 // ----------------------------------------------------------------------------
382 #endif // wxUSE_MEDIACTRL
384 // ----------------------------------------------------------------------------
385 // End header guard and header itself
386 // ----------------------------------------------------------------------------
387 #endif // _WX_MEDIACTRL_H_