/////////////////////////////////////////////////////////////////////////////
-// Name: common/mediactrl.cpp
+// Name: src/common/mediactrl.cpp
// Purpose: wxMediaCtrl common code
// Author: Ryan Norton <wxprojects@comcast.net>
// Modified by:
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+// TODO: Platform specific backend defaults?
+
//===========================================================================
// Definitions
//===========================================================================
// 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
//===========================================================================
//
// 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)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
}
}
- SetBestFittingSize(size);
+ SetInitialSize(size);
return true;
}
else
{
if (Load(fileName))
{
- SetBestFittingSize(size);
+ SetInitialSize(size);
return true;
}
else
}
else
{
- SetBestFittingSize(size);
+ SetInitialSize(size);
return true;
}
}
return false;
}
- SetBestFittingSize(size);
+ SetInitialSize(size);
return true;
}
else
if (Load(location))
{
- SetBestFittingSize(size);
+ SetInitialSize(size);
return true;
}
else
}
//---------------------------------------------------------------------------
-// wxMediaCtrl::NextBackend
+// wxMediaCtrl::NextBackend (static)
//
//
// Search through the RTTI hashmap one at a
// 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()
{
//---------------------------------------------------------------------------
// 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
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::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
return wxSize(0,0);
}
-double wxMediaCtrl::GetVolume()
+double wxMediaCtrl::GetVolume()
{
if(m_imp && m_bLoaded)
return m_imp->GetVolume();
return 0.0;
}
-bool wxMediaCtrl::SetVolume(double dVolume)
+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
//
m_imp->Move(x, y, w, h);
}
-#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