| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: mediactrl.h
- // Purpose: interface of wxMediaEvent, wxMediaCtrl
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- Describes the current state of the media.
- @see wxMediaCtrl::GetState()
- */
- enum wxMediaState
- {
- /** No media is being currently played. */
- wxMEDIASTATE_STOPPED,
- /** Current media is paused. */
- wxMEDIASTATE_PAUSED,
- /** There is media currently playing. */
- wxMEDIASTATE_PLAYING
- };
- enum wxMediaCtrlPlayerControls
- {
- /** No controls. return wxMediaCtrl to its default state. */
- wxMEDIACTRLPLAYERCONTROLS_NONE = 0,
- /** Step controls like fastforward, step one frame etc. */
- wxMEDIACTRLPLAYERCONTROLS_STEP = 1 << 0,
- /** Volume controls like the speaker icon, volume slider, etc. */
- wxMEDIACTRLPLAYERCONTROLS_VOLUME = 1 << 1,
- /** Default controls for the toolkit. Currently a combination for
- @c wxMEDIACTRLPLAYERCONTROLS_STEP and @c wxMEDIACTRLPLAYERCONTROLS_VOLUME. */
- wxMEDIACTRLPLAYERCONTROLS_DEFAULT =
- wxMEDIACTRLPLAYERCONTROLS_STEP |
- wxMEDIACTRLPLAYERCONTROLS_VOLUME
- };
- /**
- @class wxMediaEvent
- Event wxMediaCtrl uses.
- @beginEventTable{wxMediaEvent}
- @event{EVT_MEDIA_LOADED(id\, func)}
- Sent when a media has loaded enough data that it can start playing.
- @event{EVT_MEDIA_STOP(id\, func)}
- Sent when a media has switched to the @c wxMEDIASTATE_STOPPED state.
- You may be able to Veto this event to prevent it from stopping,
- causing it to continue playing - even if it has reached that end of
- the media (note that this may not have the desired effect - if you
- want to loop the media, for example, catch the @c EVT_MEDIA_FINISHED
- and play there instead).
- @event{EVT_MEDIA_FINISHED(id\, func)}
- Sent when a media has finished playing in a wxMediaCtrl.
- @event{EVT_MEDIA_STATECHANGED(id\, func)}
- Sent when a media has switched its state (from any media state).
- @event{EVT_MEDIA_PLAY(id\, func)}
- Sent when a media has switched to the @c wxMEDIASTATE_PLAYING state.
- @event{EVT_MEDIA_PAUSE(id\, func)}
- Sent when a media has switched to the @c wxMEDIASTATE_PAUSED state.
- @endEventTable
- @library{wxmedia}
- @category{events}
- */
- class wxMediaEvent : public wxNotifyEvent
- {
- public:
- /** Default ctor. */
- wxMediaEvent(wxEventType commandType = wxEVT_NULL, int winid = 0);
- };
- /**
- @class wxMediaCtrl
- wxMediaCtrl is a class for displaying types of media, such as videos, audio
- files, natively through native codecs.
- wxMediaCtrl uses native backends to render media, for example on Windows
- there is a ActiveMovie/DirectShow backend, and on Macintosh there is a
- QuickTime backend.
- @section mediactrl_rendering_media Rendering media
- Depending upon the backend, wxMediaCtrl can render and display pretty much any
- kind of media that the native system can - such as an image, mpeg video, or mp3
- (without license restrictions - since it relies on native system calls that may
- not technically have mp3 decoding available, for example, it falls outside
- the realm of licensing restrictions).
- For general operation, all you need to do is call Load() to load the file you
- want to render, catch the @c EVT_MEDIA_LOADED event, and then call Play()
- to show the video/audio of the media in that event.
- More complex operations are generally more heavily dependent on the capabilities
- of the backend. For example, QuickTime cannot set the playback rate of certain
- streaming media - while DirectShow is slightly more flexible in that regard.
- @section mediactrl_operation Operation
- When wxMediaCtrl plays a file, it plays until the stop position is reached
- (currently the end of the file/stream). Right before it hits the end of the stream,
- it fires off a @c EVT_MEDIA_STOP event to its parent window, at which point the event
- handler can choose to veto the event, preventing the stream from actually stopping.
- Example:
- @code
- //connect to the media event
- this->Connect(wxMY_ID, wxEVT_MEDIA_STOP, (wxObjectEventFunction)
- (wxEventFunction)(wxMediaEventFunction) &MyFrame::OnMediaStop);
- //...
- void MyFrame::OnMediaStop(const wxMediaEvent& evt)
- {
- if(bUserWantsToSeek)
- {
- m_mediactrl->SetPosition(
- m_mediactrl->GetDuration() << 1
- );
- evt.Veto();
- }
- }
- @endcode
- When wxMediaCtrl stops, either by the @c EVT_MEDIA_STOP not being vetoed, or
- by manually calling Stop(), where it actually stops is not at the beginning,
- rather, but at the beginning of the stream. That is, when it stops and play
- is called, playback is guaranteed to start at the beginning of the media.
- This is because some streams are not seekable, and when stop is called on
- them they return to the beginning, thus wxMediaCtrl tries to keep consistent
- for all types of media.
- Note that when changing the state of the media through Play() and other methods,
- the media may not actually be in the @c wxMEDIASTATE_PLAYING, for example.
- If you are relying on the media being in certain state catch the event relevant
- to the state. See wxMediaEvent for the kinds of events that you can catch.
- @section mediactrl_video_size Video size
- By default, wxMediaCtrl will scale the size of the video to the requested
- amount passed to either its constructor or Create().
- After calling wxMediaCtrl::Load or performing an equivalent operation,
- you can subsequently obtain the "real" size of the video (if there is any)
- by calling wxMediaCtrl::GetBestSize(). Note that the actual result on the
- display will be slightly different when wxMediaCtrl::ShowPlayerControls is
- activated and the actual video size will be less than specified due to the
- extra controls provided by the native toolkit.
- In addition, the backend may modify wxMediaCtrl::GetBestSize() to include
- the size of the extra controls - so if you want the real size of the video
- just disable wxMediaCtrl::ShowPlayerControls().
- The idea with setting wxMediaCtrl::GetBestSize() to the size of the video is
- that GetBestSize() is a wxWindow-derived function that is called when sizers
- on a window recalculate.
- What this means is that if you use sizers by default the video will show in
- its original size without any extra assistance needed from the user.
- @section mediactrl_player_controls Player controls
- Normally, when you use wxMediaCtrl it is just a window for the video to play in.
- However, some toolkits have their own media player interface.
- For example, QuickTime generally has a bar below the video with a slider.
- A special feature available to wxMediaCtrl, you can use the toolkits interface
- instead of making your own by using the ShowPlayerControls() function.
- There are several options for the flags parameter, with the two general flags
- being @c wxMEDIACTRLPLAYERCONTROLS_NONE which turns off the native interface,
- and @c wxMEDIACTRLPLAYERCONTROLS_DEFAULT which lets wxMediaCtrl decide what
- native controls on the interface.
- Be sure to review the caveats outlined in @ref mediactrl_video_size before doing so.
- @section mediactrl_choosing_backend Choosing a backend
- Generally, you should almost certainly leave this part up to wxMediaCtrl -
- but if you need a certain backend for a particular reason, such as QuickTime
- for playing .mov files, all you need to do to choose a specific backend is
- to pass the name of the backend class to wxMediaCtrl::Create().
- The following are valid backend identifiers:
- - @b wxMEDIABACKEND_DIRECTSHOW: Use ActiveMovie/DirectShow.
- Uses the native ActiveMovie (I.E. DirectShow) control.
- Default backend on Windows and supported by nearly all Windows versions,
- even some Windows CE versions.
- May display a windows media player logo while inactive.
- - @b wxMEDIABACKEND_QUICKTIME: Use QuickTime. Mac Only.
- WARNING: May not working correctly embedded in a wxNotebook.
- - @b wxMEDIABACKEND_GSTREAMER, Use GStreamer. Unix Only.
- Requires GStreamer 0.8 along with at the very least the xvimagesink, xoverlay,
- and gst-play modules of gstreamer to function.
- You need the correct modules to play the relevant files, for example the
- mad module to play mp3s, etc.
- - @b wxMEDIABACKEND_WMP10, Uses Windows Media Player 10 (Windows only) -
- works on mobile machines with Windows Media Player 10 and desktop machines
- with either Windows Media Player 9 or 10.
- Note that other backends such as wxMEDIABACKEND_MCI can now be found at
- wxCode (http://wxcode.sourceforge.net/).
- @section mediactrl_creating_backend Creating a backend
- Creating a backend for wxMediaCtrl is a rather simple process.
- Simply derive from wxMediaBackendCommonBase and implement the methods you want.
- The methods in wxMediaBackend correspond to those in wxMediaCtrl except for
- wxMediaCtrl::CreateControl which does the actual creation of the control,
- in cases where a custom control is not needed you may simply call wxControl::Create().
- You need to make sure to use the @c DECLARE_CLASS and @c IMPLEMENT_CLASS macros.
- The only real tricky part is that you need to make sure the file in compiled in,
- which if there are just backends in there will not happen and you may need to
- use a force link hack (see http://www.wxwidgets.org/wiki/index.php/RTTI).
- This is a rather simple example of how to create a backend in the
- wxActiveXContainer documentation.
- @library{wxmedia}
- @category{media}
- @see wxMediaEvent
- */
- class wxMediaCtrl : public wxControl
- {
- public:
- /**
- Default constructor - you MUST call Create() before calling any
- other methods of wxMediaCtrl.
- */
- wxMediaCtrl();
- /**
- Constructor that calls Create().
- You may prefer to call Create() directly to check to see if
- wxMediaCtrl is available on the system.
- @param parent
- parent of this control. Must not be @NULL.
- @param id
- id to use for events
- @param fileName
- If not empty, the path of a file to open.
- @param pos
- Position to put control at.
- @param size
- Size to put the control at and to stretch movie to.
- @param style
- Optional styles.
- @param szBackend
- Name of backend you want to use, leave blank to make wxMediaCtrl figure it out.
- @param validator
- validator to use.
- @param name
- Window name.
- */
- wxMediaCtrl(wxWindow* parent, wxWindowID id, const wxString& fileName = wxEmptyString,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, const wxString& szBackend = wxEmptyString,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = "mediaCtrl");
- /**
- Creates this control.
- Returns @false if it can't load the movie located at @a fileName
- or it cannot load one of its native backends.
- If you specify a file to open via @a fileName and you don't specify a
- backend to use, wxMediaCtrl tries each of its backends until one that
- can render the path referred to by @a fileName can be found.
- @param parent
- parent of this control. Must not be @NULL.
- @param id
- id to use for events
- @param fileName
- If not empty, the path of a file to open.
- @param pos
- Position to put control at.
- @param size
- Size to put the control at and to stretch movie to.
- @param style
- Optional styles.
- @param szBackend
- Name of backend you want to use, leave blank to make wxMediaCtrl figure it out.
- @param validator
- validator to use.
- @param name
- Window name.
- */
- bool Create(wxWindow* parent, wxWindowID id, const wxString& fileName = wxEmptyString,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, const wxString& szBackend = wxEmptyString,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = "mediaCtrl");
- /**
- Obtains the best size relative to the original/natural size of the
- video, if there is any.
- See @ref mediactrl_video_size for more information.
- */
- wxSize GetBestSize() const;
- /**
- Obtains the playback rate, or speed of the media. @c 1.0 represents normal
- speed, while @c 2.0 represents twice the normal speed of the media, for
- example. Not supported on the GStreamer (Unix) backend.
- @return zero on failure.
- */
- double GetPlaybackRate();
- /**
- Obtains the state the playback of the media is in.
- @beginTable
- @row2col{wxMEDIASTATE_STOPPED, The movie has stopped.}
- @row2col{wxMEDIASTATE_PAUSED, The movie is paused.}
- @row2col{wxMEDIASTATE_PLAYING, The movie is currently playing.}
- @endTable
- */
- wxMediaState GetState();
- /**
- Gets the volume of the media from a 0.0 to 1.0 range.
- @note Due to rounding and other errors the value returned may not be the
- exact value sent to SetVolume().
- */
- double GetVolume();
- /**
- Obtains the length - the total amount of time the movie has in milliseconds.
- */
- wxFileOffset Length();
- /**
- Loads the file that fileName refers to. Returns @false if loading fails.
- */
- bool Load(const wxString& fileName);
- /**
- Loads the location that uri refers to. Note that this is very
- implementation-dependent, although HTTP URI/URLs are generally
- supported, for example. Returns @false if loading fails.
- */
- bool Load(const wxURI& uri);
- /**
- Loads the location that @c uri refers to with the proxy @c proxy.
- Not implemented on most backends so it should be called with caution.
- Returns @false if loading fails.
- */
- bool Load(const wxURI& uri, const wxURI& proxy);
- /**
- Same as Load(const wxURI& uri). Kept for wxPython compatibility.
- */
- bool LoadURI(const wxString& fileName);
- /**
- Same as Load(const wxURI& uri, const wxURI& proxy).
- Kept for wxPython compatibility.
- */
- bool LoadURIWithProxy(const wxString& fileName, const wxString& proxy);
- /**
- Pauses playback of the movie.
- */
- bool Pause();
- /**
- Resumes playback of the movie.
- */
- bool Play();
- /**
- Seeks to a position within the movie.
- @todo Document the wxSeekMode parameter @a mode, and perhaps also the
- wxFileOffset and wxSeekMode themselves.
- */
- wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart);
- /**
- Sets the playback rate, or speed of the media, to that referred by @a dRate.
- @c 1.0 represents normal speed, while @c 2.0 represents twice the normal
- speed of the media, for example. Not supported on the GStreamer (Unix) backend.
- Returns @true if successful.
- */
- bool SetPlaybackRate(double dRate);
- /**
- Sets the volume of the media from a 0.0 to 1.0 range to that referred
- by @c dVolume. @c 1.0 represents full volume, while @c 0.5
- represents half (50 percent) volume, for example.
- @note The volume may not be exact due to conversion and rounding errors,
- although setting the volume to full or none is always exact.
- Returns @true if successful.
- */
- bool SetVolume(double dVolume);
- /**
- A special feature to wxMediaCtrl. Applications using native toolkits such as
- QuickTime usually have a scrollbar, play button, and more provided to
- them by the toolkit. By default wxMediaCtrl does not do this. However, on
- the directshow and quicktime backends you can show or hide the native controls
- provided by the underlying toolkit at will using ShowPlayerControls(). Simply
- calling the function with default parameters tells wxMediaCtrl to use the
- default controls provided by the toolkit. The function takes a
- wxMediaCtrlPlayerControls enumeration, please see available show modes there.
- For more info see @ref mediactrl_player_controls.
- Currently only implemented on the QuickTime and DirectShow backends.
- The function returns @true on success.
- */
- bool ShowPlayerControls(wxMediaCtrlPlayerControls flags = wxMEDIACTRLPLAYERCONTROLS_DEFAULT);
- /**
- Stops the media.
- See @ref mediactrl_operation for an overview of how stopping works.
- */
- bool Stop();
- /**
- Obtains the current position in time within the movie in milliseconds.
- */
- wxFileOffset Tell();
- };
|