X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c47addef107f756f1a342d2f3f8d432e784691a2..bb8204ef8236a9d1f39516832947ea4081f22146:/src/common/mediactrlcmn.cpp diff --git a/src/common/mediactrlcmn.cpp b/src/common/mediactrlcmn.cpp index 1955ac10ce..2563d85a8f 100644 --- a/src/common/mediactrlcmn.cpp +++ b/src/common/mediactrlcmn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/mediactrl.cpp +// Name: src/common/mediactrl.cpp // Purpose: wxMediaCtrl common code // Author: Ryan Norton // Modified by: @@ -9,6 +9,8 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// TODO: Platform specific backend defaults? + //=========================================================================== // Definitions //=========================================================================== @@ -17,26 +19,22 @@ // Pre-compiled header stuff //--------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "mediactrl.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop +#endif + +#if wxUSE_MEDIACTRL + +#ifndef WX_PRECOMP + #include "wx/hash.h" #endif //--------------------------------------------------------------------------- // Includes //--------------------------------------------------------------------------- #include "wx/mediactrl.h" -#include "wx/hash.h" - -//--------------------------------------------------------------------------- -// Compilation guard -//--------------------------------------------------------------------------- -#if wxUSE_MEDIACTRL //=========================================================================== // @@ -48,11 +46,15 @@ // RTTI and Event implementations //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -IMPLEMENT_CLASS(wxMediaCtrl, wxControl); -IMPLEMENT_CLASS(wxMediaBackend, wxObject); -IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent); -DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED); -DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP); +IMPLEMENT_CLASS(wxMediaCtrl, wxControl) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_STATECHANGED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_PLAY) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_PAUSE) +IMPLEMENT_CLASS(wxMediaBackend, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_LOADED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // @@ -60,6 +62,16 @@ DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP); // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +//--------------------------------------------------------------------------- +// wxMediaBackend Destructor +// +// This is here because the DARWIN gcc compiler badly screwed up and +// needs the destructor implementation in the source +//--------------------------------------------------------------------------- +wxMediaBackend::~wxMediaBackend() +{ +} + //--------------------------------------------------------------------------- // wxMediaCtrl::Create (file version) // wxMediaCtrl::Create (URL version) @@ -84,8 +96,10 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, { if(!szBackend.empty()) { - if(!DoCreate(wxClassInfo::FindClass(szBackend), parent, id, - pos, size, style, validator, name)) + wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend); + + if(!pClassInfo || !DoCreate(pClassInfo, parent, id, + pos, size, style, validator, name)) { m_imp = NULL; return false; @@ -108,9 +122,9 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, { wxClassInfo::sm_classTable->BeginFind(); - wxClassInfo* classInfo = NextBackend(); + wxClassInfo* classInfo; - while(classInfo) + while((classInfo = NextBackend()) != NULL) { if(!DoCreate(classInfo, parent, id, pos, size, style, validator, name)) @@ -131,8 +145,6 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, SetBestFittingSize(size); return true; } - - classInfo = NextBackend(); } m_imp = NULL; @@ -141,18 +153,19 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, } bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, - const wxURI& location, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& szBackend, - const wxValidator& validator, - const wxString& name) + const wxURI& location, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& szBackend, + const wxValidator& validator, + const wxString& name) { if(!szBackend.empty()) { - if(!DoCreate(wxClassInfo::FindClass(szBackend), parent, id, - pos, size, style, validator, name)) + wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend); + if(!pClassInfo || !DoCreate(pClassInfo, parent, id, + pos, size, style, validator, name)) { m_imp = NULL; return false; @@ -172,9 +185,9 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, { wxClassInfo::sm_classTable->BeginFind(); - wxClassInfo* classInfo = NextBackend(); + wxClassInfo* classInfo; - while(classInfo) + while((classInfo = NextBackend()) != NULL) { if(!DoCreate(classInfo, parent, id, pos, size, style, validator, name)) @@ -187,8 +200,6 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, } else delete m_imp; - - classInfo = NextBackend(); } m_imp = NULL; @@ -222,7 +233,7 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo, } //--------------------------------------------------------------------------- -// wxMediaCtrl::NextBackend +// wxMediaCtrl::NextBackend (static) // // // Search through the RTTI hashmap one at a @@ -230,11 +241,10 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo, // of wxMediaBackend // // -// STL isn't compatable with and will have a compilation error +// STL isn't compatible with and will have a compilation error // on a wxNode, however, wxHashTable::compatibility_iterator is // incompatible with the old 2.4 stable version - but since -// we're in 2.5 only we don't need to worry about this -// static +// we're in 2.5+ only we don't need to worry about the new version //--------------------------------------------------------------------------- wxClassInfo* wxMediaCtrl::NextBackend() { @@ -272,6 +282,8 @@ wxMediaCtrl::~wxMediaCtrl() //--------------------------------------------------------------------------- // wxMediaCtrl::Load (file version) // wxMediaCtrl::Load (URL version) +// wxMediaCtrl::Load (URL & Proxy version) +// wxMediaCtrl::Load (wxInputStream version) // // Here we call load of the backend - keeping // track of whether it was successful or not - which @@ -291,6 +303,13 @@ bool wxMediaCtrl::Load(const wxURI& location) return false; } +bool wxMediaCtrl::Load(const wxURI& location, const wxURI& proxy) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(location, proxy)); + return false; +} + //--------------------------------------------------------------------------- // wxMediaCtrl::Play // wxMediaCtrl::Pause @@ -302,6 +321,11 @@ bool wxMediaCtrl::Load(const wxURI& location) // wxMediaCtrl::Length --> GetDuration // wxMediaCtrl::GetState // wxMediaCtrl::DoGetBestSize +// wxMediaCtrl::SetVolume +// wxMediaCtrl::GetVolume +// wxMediaCtrl::ShowInterface +// wxMediaCtrl::GetDownloadProgress +// wxMediaCtrl::GetDownloadTotal // // 1) Check to see whether the backend exists and is loading // 2) Call the backend's version of the method, returning success @@ -367,7 +391,6 @@ wxFileOffset wxMediaCtrl::Seek(wxFileOffset where, wxSeekMode mode) wxFileOffset wxMediaCtrl::Tell() { - //FIXME if(m_imp && m_bLoaded) return (wxFileOffset) m_imp->GetPosition().ToLong(); return wxInvalidOffset; @@ -375,7 +398,6 @@ wxFileOffset wxMediaCtrl::Tell() wxFileOffset wxMediaCtrl::Length() { - //FIXME if(m_imp && m_bLoaded) return (wxFileOffset) m_imp->GetDuration().ToLong(); return wxInvalidOffset; @@ -395,6 +417,41 @@ wxSize wxMediaCtrl::DoGetBestSize() const return wxSize(0,0); } +double wxMediaCtrl::GetVolume() +{ + if(m_imp && m_bLoaded) + return m_imp->GetVolume(); + return 0.0; +} + +bool wxMediaCtrl::SetVolume(double dVolume) +{ + if(m_imp && m_bLoaded) + return m_imp->SetVolume(dVolume); + return false; +} + +bool wxMediaCtrl::ShowPlayerControls(wxMediaCtrlPlayerControls flags) +{ + if(m_imp) + return m_imp->ShowPlayerControls(flags); + return false; +} + +wxFileOffset wxMediaCtrl::GetDownloadProgress() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDownloadProgress().ToLong(); + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::GetDownloadTotal() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDownloadTotal().ToLong(); + return wxInvalidOffset; +} + //--------------------------------------------------------------------------- // wxMediaCtrl::DoMoveWindow // @@ -411,15 +468,92 @@ void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h) m_imp->Move(x, y, w, h); } -//DARWIN gcc compiler badly screwed up - needs destructor impl in source -wxMediaBackend::~wxMediaBackend() -{ } -#include "wx/html/forcelnk.h" -FORCE_LINK(basewxmediabackends); - //--------------------------------------------------------------------------- -// End of compilation guard and of file +// wxMediaCtrl::MacVisibilityChanged //--------------------------------------------------------------------------- -#endif //wxUSE_MEDIACTRL +#ifdef __WXMAC__ +void wxMediaCtrl::MacVisibilityChanged() +{ + wxControl::MacVisibilityChanged(); + + if(m_imp) + m_imp->MacVisibilityChanged(); +} +#endif +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// wxMediaBackendCommonBase +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +void wxMediaBackendCommonBase::NotifyMovieSizeChanged() +{ + // our best size changed after opening a new file + m_ctrl->InvalidateBestSize(); + m_ctrl->SetSize(m_ctrl->GetSize()); + + // if the parent of the control has a sizer ask it to refresh our size + wxWindow * const parent = m_ctrl->GetParent(); + if ( parent->GetSizer() ) + { + m_ctrl->GetParent()->Layout(); + m_ctrl->GetParent()->Refresh(); + m_ctrl->GetParent()->Update(); + } +} + +void wxMediaBackendCommonBase::NotifyMovieLoaded() +{ + NotifyMovieSizeChanged(); + + // notify about movie being fully loaded + QueueEvent(wxEVT_MEDIA_LOADED); +} + +bool wxMediaBackendCommonBase::SendStopEvent() +{ + wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId()); + + return !m_ctrl->ProcessEvent(theEvent) || theEvent.IsAllowed(); +} + +void wxMediaBackendCommonBase::QueueEvent(wxEventType evtType) +{ + wxMediaEvent theEvent(evtType, m_ctrl->GetId()); + m_ctrl->AddPendingEvent(theEvent); +} + +void wxMediaBackendCommonBase::QueuePlayEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_PLAY); +} + +void wxMediaBackendCommonBase::QueuePauseEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_PAUSE); +} + +void wxMediaBackendCommonBase::QueueStopEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_STOP); +} + + +// +// Force link default backends in - +// see http://wiki.wxwidgets.org/wiki.pl?RTTI +// +#include "wx/html/forcelnk.h" + +#ifdef __WXMSW__ // MSW has huge backends so we do it seperately +FORCE_LINK(wxmediabackend_am) +FORCE_LINK(wxmediabackend_wmp10) +#else +FORCE_LINK(basewxmediabackends) +#endif + +#endif //wxUSE_MEDIACTRL