]> git.saurik.com Git - wxWidgets.git/blame - include/wx/mediactrl.h
wxLaunchDefaultBrowser() now supports wxBROWSER_NEW_WINDOW flag (and it actually...
[wxWidgets.git] / include / wx / mediactrl.h
CommitLineData
ff4aedc5 1///////////////////////////////////////////////////////////////////////////////
1a680109
RN
2// Name: wx/mediactrl.h
3// Purpose: wxMediaCtrl class
4// Author: Ryan Norton <wxprojects@comcast.net>
226ec5a7 5// Modified by:
1a680109
RN
6// Created: 11/07/04
7// RCS-ID: $Id$
8// Copyright: (c) Ryan Norton
9// Licence: wxWindows licence
ff4aedc5 10///////////////////////////////////////////////////////////////////////////////
1a680109 11
ff4aedc5
RN
12// ============================================================================
13// Definitions
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// Header guard
18// ----------------------------------------------------------------------------
19#ifndef _WX_MEDIACTRL_H_
20#define _WX_MEDIACTRL_H_
21
22// ----------------------------------------------------------------------------
23// Pre-compiled header stuff
24// ----------------------------------------------------------------------------
72259e00 25
2ecf902b
WS
26#include "wx/defs.h"
27
ff4aedc5
RN
28// ----------------------------------------------------------------------------
29// Compilation guard
30// ----------------------------------------------------------------------------
2ecf902b 31
ff4aedc5
RN
32#if wxUSE_MEDIACTRL
33
34// ----------------------------------------------------------------------------
35// Includes
36// ----------------------------------------------------------------------------
37
38#include "wx/control.h"
39#include "wx/uri.h"
40
41// ============================================================================
42// Declarations
43// ============================================================================
44
45// ----------------------------------------------------------------------------
46//
47// Enumerations
48//
49// ----------------------------------------------------------------------------
50
51enum wxMediaState
52{
53 wxMEDIASTATE_STOPPED,
54 wxMEDIASTATE_PAUSED,
55 wxMEDIASTATE_PLAYING
56};
57
c5191fbd
VZ
58enum wxMediaCtrlPlayerControls
59{
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
68};
69
ff4aedc5
RN
70#define wxMEDIABACKEND_DIRECTSHOW wxT("wxAMMediaBackend")
71#define wxMEDIABACKEND_MCI wxT("wxMCIMediaBackend")
72#define wxMEDIABACKEND_QUICKTIME wxT("wxQTMediaBackend")
ce756cb0 73#define wxMEDIABACKEND_GSTREAMER wxT("wxGStreamerMediaBackend")
ff4aedc5 74
c5191fbd 75
226ec5a7
WS
76// ----------------------------------------------------------------------------
77//
78// wxMediaEvent
79//
80// ----------------------------------------------------------------------------
81
ff2b312f 82class WXDLLIMPEXP_MEDIA wxMediaEvent : public wxNotifyEvent
226ec5a7
WS
83{
84public:
85 // ------------------------------------------------------------------------
86 // wxMediaEvent Constructor
87 //
88 // Normal constructor, much the same as wxNotifyEvent
89 // ------------------------------------------------------------------------
4fc81cbc
RN
90 wxMediaEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
91 : wxNotifyEvent(commandType, winid)
226ec5a7
WS
92 { }
93
94 // ------------------------------------------------------------------------
95 // wxMediaEvent Copy Constructor
96 //
97 // Normal copy constructor, much the same as wxNotifyEvent
98 // ------------------------------------------------------------------------
99 wxMediaEvent(const wxMediaEvent &clone)
100 : wxNotifyEvent(clone)
101 { }
102
103 // ------------------------------------------------------------------------
104 // wxMediaEvent::Clone
105 //
106 // Allocates a copy of this object.
107 // Required for wxEvtHandler::AddPendingEvent
108 // ------------------------------------------------------------------------
109 virtual wxEvent *Clone() const
110 { return new wxMediaEvent(*this); }
111
112
113 // Put this class on wxWidget's RTTI table
114 DECLARE_DYNAMIC_CLASS(wxMediaEvent)
115};
116
ff4aedc5
RN
117// ----------------------------------------------------------------------------
118//
119// wxMediaCtrl
120//
121// ----------------------------------------------------------------------------
122
ff2b312f 123class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl
ff4aedc5
RN
124{
125public:
bc036010 126 wxMediaCtrl() : m_imp(NULL), m_bLoaded(false)
ff4aedc5
RN
127 { }
128
4fc81cbc 129 wxMediaCtrl(wxWindow* parent, wxWindowID winid,
8b5d5223 130 const wxString& fileName = wxEmptyString,
226ec5a7 131 const wxPoint& pos = wxDefaultPosition,
ff4aedc5 132 const wxSize& size = wxDefaultSize,
226ec5a7 133 long style = 0,
8b5d5223 134 const wxString& szBackend = wxEmptyString,
ff4aedc5
RN
135 const wxValidator& validator = wxDefaultValidator,
136 const wxString& name = wxT("mediaCtrl"))
bc036010 137 : m_imp(NULL), m_bLoaded(false)
4fc81cbc 138 { Create(parent, winid, fileName, pos, size, style,
ff4aedc5
RN
139 szBackend, validator, name); }
140
4fc81cbc 141 wxMediaCtrl(wxWindow* parent, wxWindowID winid,
ff4aedc5 142 const wxURI& location,
226ec5a7 143 const wxPoint& pos = wxDefaultPosition,
ff4aedc5 144 const wxSize& size = wxDefaultSize,
226ec5a7 145 long style = 0,
8b5d5223 146 const wxString& szBackend = wxEmptyString,
ff4aedc5
RN
147 const wxValidator& validator = wxDefaultValidator,
148 const wxString& name = wxT("mediaCtrl"))
bc036010 149 : m_imp(NULL), m_bLoaded(false)
4fc81cbc 150 { Create(parent, winid, location, pos, size, style,
ff4aedc5
RN
151 szBackend, validator, name); }
152
153 ~wxMediaCtrl();
154
4fc81cbc 155 bool Create(wxWindow* parent, wxWindowID winid,
8b5d5223 156 const wxString& fileName = wxEmptyString,
226ec5a7 157 const wxPoint& pos = wxDefaultPosition,
ff4aedc5 158 const wxSize& size = wxDefaultSize,
226ec5a7 159 long style = 0,
8b5d5223 160 const wxString& szBackend = wxEmptyString,
ff4aedc5
RN
161 const wxValidator& validator = wxDefaultValidator,
162 const wxString& name = wxT("mediaCtrl"));
163
4fc81cbc 164 bool Create(wxWindow* parent, wxWindowID winid,
ff4aedc5 165 const wxURI& location,
226ec5a7 166 const wxPoint& pos = wxDefaultPosition,
ff4aedc5 167 const wxSize& size = wxDefaultSize,
226ec5a7 168 long style = 0,
8b5d5223 169 const wxString& szBackend = wxEmptyString,
ff4aedc5 170 const wxValidator& validator = wxDefaultValidator,
c5191fbd 171 const wxString& name = wxT("mediaCtrl"));
ff4aedc5
RN
172
173 bool DoCreate(wxClassInfo* instance,
4fc81cbc 174 wxWindow* parent, wxWindowID winid,
226ec5a7 175 const wxPoint& pos = wxDefaultPosition,
ff4aedc5 176 const wxSize& size = wxDefaultSize,
226ec5a7 177 long style = 0,
ff4aedc5
RN
178 const wxValidator& validator = wxDefaultValidator,
179 const wxString& name = wxT("mediaCtrl"));
180
ff4aedc5
RN
181 bool Play();
182 bool Pause();
183 bool Stop();
184
185 bool Load(const wxString& fileName);
ff4aedc5 186
ff4aedc5
RN
187 wxMediaState GetState();
188
9180b535
RN
189 wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart);
190 wxFileOffset Tell(); //FIXME: This should be const
191 wxFileOffset Length(); //FIXME: This should be const
973dc0a8 192
c5191fbd 193#if wxABI_VERSION >= 20601 /* 2.6.1+ only */
bc036010
RN
194 double GetPlaybackRate(); //All but MCI & GStreamer
195 bool SetPlaybackRate(double dRate); //All but MCI & GStreamer
c5191fbd
VZ
196#endif
197
198#if wxABI_VERSION >= 20602 /* 2.6.2+ only */
199 bool Load(const wxURI& location);
200 bool Load(const wxURI& location, const wxURI& proxy);
201
202 wxFileOffset GetDownloadProgress();
203 wxFileOffset GetDownloadTotal();
bc036010 204
c5191fbd
VZ
205 double GetVolume();
206 bool SetVolume(double dVolume);
6f8c67e7 207
c5191fbd
VZ
208 bool ShowPlayerControls(
209 wxMediaCtrlPlayerControls flags = wxMEDIACTRLPLAYERCONTROLS_DEFAULT);
210
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)); }
216#endif
ff4aedc5 217protected:
973dc0a8
RN
218 static wxClassInfo* NextBackend();
219
226ec5a7 220 void OnMediaFinished(wxMediaEvent& evt);
ff4aedc5
RN
221 virtual void DoMoveWindow(int x, int y, int w, int h);
222 wxSize DoGetBestSize() const;
223
bc036010
RN
224 //FIXME: This is nasty... find a better way to work around
225 //inheritance issues
c5191fbd 226#if defined(__WXMAC__) || defined(__WXCOCOA__)
4fc81cbc 227 friend class wxQTMediaBackend;
3b5023b9 228#endif
ff4aedc5
RN
229 class wxMediaBackend* m_imp;
230 bool m_bLoaded;
ff4aedc5 231
3839f37e 232 DECLARE_DYNAMIC_CLASS(wxMediaCtrl)
ff4aedc5
RN
233};
234
235// ----------------------------------------------------------------------------
236//
237// wxMediaBackend
238//
c5191fbd
VZ
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.
243//
244// Note that this is currently not API or ABI compatable -
245// so statically link or make the client compile on-site.
ff4aedc5
RN
246//
247// ----------------------------------------------------------------------------
248
ff2b312f 249class WXDLLIMPEXP_MEDIA wxMediaBackend : public wxObject
ff4aedc5
RN
250{
251public:
252 wxMediaBackend()
253 { }
254
255 virtual ~wxMediaBackend();
256
226ec5a7
WS
257 virtual bool CreateControl(wxControl* WXUNUSED(ctrl),
258 wxWindow* WXUNUSED(parent),
4fc81cbc 259 wxWindowID WXUNUSED(winid),
226ec5a7 260 const wxPoint& WXUNUSED(pos),
78450975 261 const wxSize& WXUNUSED(size),
226ec5a7 262 long WXUNUSED(style),
78450975
RN
263 const wxValidator& WXUNUSED(validator),
264 const wxString& WXUNUSED(name))
ff4aedc5
RN
265 { return false; }
266
226ec5a7 267 virtual bool Play()
ff4aedc5 268 { return false; }
226ec5a7 269 virtual bool Pause()
ff4aedc5 270 { return false; }
226ec5a7 271 virtual bool Stop()
ff4aedc5
RN
272 { return false; }
273
226ec5a7 274 virtual bool Load(const wxString& WXUNUSED(fileName))
ff4aedc5 275 { return false; }
226ec5a7 276 virtual bool Load(const wxURI& WXUNUSED(location))
ff4aedc5
RN
277 { return false; }
278
226ec5a7 279 virtual bool SetPosition(wxLongLong WXUNUSED(where))
ff4aedc5 280 { return 0; }
226ec5a7 281 virtual wxLongLong GetPosition()
ff4aedc5 282 { return 0; }
226ec5a7 283 virtual wxLongLong GetDuration()
ff4aedc5
RN
284 { return 0; }
285
226ec5a7
WS
286 virtual void Move(int WXUNUSED(x), int WXUNUSED(y),
287 int WXUNUSED(w), int WXUNUSED(h))
ff4aedc5 288 { }
226ec5a7 289 virtual wxSize GetVideoSize() const
c47addef 290 { return wxSize(0,0); }
ff4aedc5 291
226ec5a7 292 virtual double GetPlaybackRate()
ff4aedc5 293 { return 0.0; }
226ec5a7 294 virtual bool SetPlaybackRate(double WXUNUSED(dRate))
ff4aedc5
RN
295 { return false; }
296
297 virtual wxMediaState GetState()
298 { return wxMEDIASTATE_STOPPED; }
299
6f8c67e7
JS
300 virtual double GetVolume()
301 { return 0.0; }
302 virtual bool SetVolume(double WXUNUSED(dVolume))
303 { return false; }
304
c5191fbd
VZ
305 virtual bool Load(const wxURI& WXUNUSED(location),
306 const wxURI& WXUNUSED(proxy))
307 { return false; }
308
309 virtual bool ShowPlayerControls(
310 wxMediaCtrlPlayerControls WXUNUSED(flags))
311 { return false; }
312 virtual bool IsInterfaceShown()
313 { return false; }
314
315 virtual wxLongLong GetDownloadProgress()
316 { return 0; }
317 virtual wxLongLong GetDownloadTotal()
318 { return 0; }
319
07323ed6
RN
320 virtual void RESERVED8() {}
321 virtual void RESERVED9() {}
322
3839f37e 323 DECLARE_DYNAMIC_CLASS(wxMediaBackend)
ff4aedc5
RN
324};
325
bf354396 326
ff4aedc5
RN
327//Event ID to give to our events
328#define wxMEDIA_FINISHED_ID 13000
329#define wxMEDIA_STOP_ID 13001
330
331//Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
c220a8ec
RD
332DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID)
333DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STOP, wxMEDIA_STOP_ID)
ff4aedc5
RN
334
335//Function type(s) our events need
336typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&);
337
4153a503
RN
338#define wxMediaEventHandler(func) \
339 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func)
340
ff4aedc5 341//Macro for usage with message maps
4153a503
RN
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 ),
ff4aedc5 344
c5191fbd
VZ
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 ),
349#endif
350
bf354396
VZ
351// ----------------------------------------------------------------------------
352// common backend base class used by many other backends
353// ----------------------------------------------------------------------------
354
355class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase : public wxMediaBackend
356{
357public:
358 // add a pending wxMediaEvent of the given type
359 void QueueEvent(wxEventType evtType);
360
361 // notify that the movie playback is finished
362 void QueueFinishEvent() { QueueEvent(wxEVT_MEDIA_FINISHED); }
363
364 // send the stop event and return true if it hasn't been vetoed
365 bool SendStopEvent();
366
367protected:
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();
371
372 // call this when the movie is fully loaded
373 void NotifyMovieLoaded();
374
375
376 wxMediaCtrl *m_ctrl; // parent control
377};
378
ff4aedc5
RN
379// ----------------------------------------------------------------------------
380// End compilation gaurd
381// ----------------------------------------------------------------------------
382#endif // wxUSE_MEDIACTRL
383
384// ----------------------------------------------------------------------------
385// End header guard and header itself
386// ----------------------------------------------------------------------------
387#endif // _WX_MEDIACTRL_H_
388
389