X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c220a8ec4fcb4e7b620e88c76b0a84be4554b28b..7fc65a0384df4007a96cd5bab98b0f7abef0af52:/src/common/mediactrlcmn.cpp?ds=inline diff --git a/src/common/mediactrlcmn.cpp b/src/common/mediactrlcmn.cpp index 3d91560123..1762093574 100644 --- a/src/common/mediactrlcmn.cpp +++ b/src/common/mediactrlcmn.cpp @@ -17,10 +17,6 @@ // Pre-compiled header stuff //--------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "mediactrl.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ @@ -52,6 +48,7 @@ IMPLEMENT_CLASS(wxMediaCtrl, wxControl); 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 +57,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) @@ -70,7 +77,7 @@ DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP); // // This searches by searching the global RTTI hashtable, class by class, // attempting to call CreateControl on each one found that is a derivative -// of wxMediaBackend - if it succeededs Create returns true, otherwise +// of wxMediaBackend - if it succeeded Create returns true, otherwise // it keeps iterating through the hashmap. //--------------------------------------------------------------------------- bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, @@ -84,8 +91,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; @@ -93,7 +102,7 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, if (!fileName.empty()) { - if (!m_imp->Load(fileName)) + if (!Load(fileName)) { delete m_imp; m_imp = NULL; @@ -101,15 +110,16 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, } } + SetBestFittingSize(size); return true; } else { 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)) @@ -117,15 +127,19 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, if (!fileName.empty()) { - if (m_imp->Load(fileName)) + if (Load(fileName)) + { + SetBestFittingSize(size); return true; + } else delete m_imp; } else + { + SetBestFittingSize(size); return true; - - classInfo = NextBackend(); + } } m_imp = NULL; @@ -134,50 +148,53 @@ 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; } - if (!m_imp->Load(location)) + if (!Load(location)) { delete m_imp; m_imp = NULL; return false; } + SetBestFittingSize(size); return true; } else { 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)) continue; - if (m_imp->Load(location)) + if (Load(location)) + { + SetBestFittingSize(size); return true; + } else delete m_imp; - - classInfo = NextBackend(); } m_imp = NULL; @@ -203,10 +220,6 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo, if( m_imp->CreateControl(this, parent, id, pos, size, style, validator, name) ) { - this->Connect(GetId(), wxEVT_MEDIA_FINISHED, - (wxObjectEventFunction) (wxEventFunction) - (wxMediaEventFunction) - &wxMediaCtrl::OnMediaFinished); return true; } @@ -223,7 +236,7 @@ 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 @@ -265,6 +278,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 @@ -284,17 +299,29 @@ 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 // wxMediaCtrl::Stop // wxMediaCtrl::GetPlaybackRate // wxMediaCtrl::SetPlaybackRate -// wxMediaCtrl::SetPosition -// wxMediaCtrl::GetPosition -// wxMediaCtrl::GetDuration +// wxMediaCtrl::Seek --> SetPosition +// wxMediaCtrl::Tell --> GetPosition +// 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 @@ -335,25 +362,41 @@ bool wxMediaCtrl::SetPlaybackRate(double dRate) return false; } -bool wxMediaCtrl::SetPosition(wxLongLong where) +wxFileOffset wxMediaCtrl::Seek(wxFileOffset where, wxSeekMode mode) { - if(m_imp && m_bLoaded) - return m_imp->SetPosition(where); - return false; + wxFileOffset offset; + + switch (mode) + { + case wxFromStart: + offset = where; + break; + case wxFromEnd: + offset = Length() - where; + break; +// case wxFromCurrent: + default: + offset = Tell() + where; + break; + } + + if(m_imp && m_bLoaded && m_imp->SetPosition(offset)) + return offset; + return wxInvalidOffset; } -wxLongLong wxMediaCtrl::GetPosition() +wxFileOffset wxMediaCtrl::Tell() { if(m_imp && m_bLoaded) - return m_imp->GetPosition(); - return 0; + return (wxFileOffset) m_imp->GetPosition().ToLong(); + return wxInvalidOffset; } -wxLongLong wxMediaCtrl::GetDuration() +wxFileOffset wxMediaCtrl::Length() { if(m_imp && m_bLoaded) - return m_imp->GetDuration(); - return 0; + return (wxFileOffset) m_imp->GetDuration().ToLong(); + return wxInvalidOffset; } wxMediaState wxMediaCtrl::GetState() @@ -370,6 +413,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 // @@ -386,32 +464,50 @@ void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h) m_imp->Move(x, y, w, h); } -void wxMediaCtrl::Loop(bool bLoop) +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// 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() { - m_bLoop = bLoop; + NotifyMovieSizeChanged(); + + // notify about movie being fully loaded + QueueEvent(wxEVT_MEDIA_LOADED); } -bool wxMediaCtrl::IsLooped() +bool wxMediaBackendCommonBase::SendStopEvent() { - return m_bLoop; + wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId()); + + return !m_ctrl->ProcessEvent(theEvent) || theEvent.IsAllowed(); } -void wxMediaCtrl::OnMediaFinished(wxMediaEvent& WXUNUSED(evt)) +void wxMediaBackendCommonBase::QueueEvent(wxEventType evtType) { - if(m_bLoop) - { -#ifdef __WXDEBUG__ - wxASSERT( Play() ); -#else - Play(); -#endif - } + wxMediaEvent theEvent(evtType, m_ctrl->GetId()); + m_ctrl->AddPendingEvent(theEvent); } -//DARWIN gcc compiler badly screwed up - needs destructor impl in source -wxMediaBackend::~wxMediaBackend() -{ } -#include +#include "wx/html/forcelnk.h" FORCE_LINK(basewxmediabackends); //---------------------------------------------------------------------------