]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/mediactrlcmn.cpp
use popen() instead of wxExecute(), it works inside wxYield() unlike the latter
[wxWidgets.git] / src / common / mediactrlcmn.cpp
index 53ba95509ab9ec1f116a3df50eac7e95afabb002..074777d48631384f0cb1be83221c214ebb1dbaa5 100644 (file)
@@ -41,7 +41,7 @@
 //===========================================================================
 //
 // Implementation
 //===========================================================================
 //
 // Implementation
-// 
+//
 //===========================================================================
 
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //===========================================================================
 
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -67,17 +67,17 @@ DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP);
 // Searches for a backend that is installed on the system (backends
 // starting with lower characters in the alphabet are given priority),
 // and creates the control from it
 // Searches for a backend that is installed on the system (backends
 // starting with lower characters in the alphabet are given priority),
 // and creates the control from it
-// 
+//
 // This searches by searching the global RTTI hashtable, class by class,
 // attempting to call CreateControl on each one found that is a derivative
 // 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,
                 const wxString& fileName,
 // it keeps iterating through the hashmap.
 //---------------------------------------------------------------------------
 bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
                 const wxString& fileName,
-                const wxPoint& pos, 
+                const wxPoint& pos,
                 const wxSize& size,
                 const wxSize& size,
-                long style, 
+                long style,
                 const wxString& szBackend,
                 const wxValidator& validator,
                 const wxString& name)
                 const wxString& szBackend,
                 const wxValidator& validator,
                 const wxString& name)
@@ -93,7 +93,7 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
 
         if (!fileName.empty())
         {
 
         if (!fileName.empty())
         {
-            if (!m_imp->Load(fileName))
+            if (!Load(fileName))
             {
                 delete m_imp;
                 m_imp = NULL;
             {
                 delete m_imp;
                 m_imp = NULL;
@@ -101,31 +101,36 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
             }
         }
 
             }
         }
 
+        SetBestFittingSize(size);
         return true;
     }
     else
     {
         wxClassInfo::sm_classTable->BeginFind();
 
         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))
         {
             if(!DoCreate(classInfo, parent, id,
                          pos, size, style, validator, name))
-                continue;        
+                continue;
 
             if (!fileName.empty())
             {
 
             if (!fileName.empty())
             {
-                if (m_imp->Load(fileName))
+                if (Load(fileName))
+                {
+                    SetBestFittingSize(size);
                     return true;
                     return true;
+                }
                 else
                     delete m_imp;
             }
             else
                 else
                     delete m_imp;
             }
             else
+            {
+                SetBestFittingSize(size);
                 return true;
                 return true;
-
-            classInfo = NextBackend();
+            }
         }
 
         m_imp = NULL;
         }
 
         m_imp = NULL;
@@ -135,9 +140,9 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
 
 bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
                 const wxURI& location,
 
 bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
                 const wxURI& location,
-                const wxPoint& pos, 
+                const wxPoint& pos,
                 const wxSize& size,
                 const wxSize& size,
-                long style, 
+                long style,
                 const wxString& szBackend,
                 const wxValidator& validator,
                 const wxString& name)
                 const wxString& szBackend,
                 const wxValidator& validator,
                 const wxString& name)
@@ -151,33 +156,35 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
             return false;
         }
 
             return false;
         }
 
-        if (!m_imp->Load(location))
+        if (!Load(location))
         {
             delete m_imp;
             m_imp = NULL;
             return false;
         }
 
         {
             delete m_imp;
             m_imp = NULL;
             return false;
         }
 
+        SetBestFittingSize(size);
         return true;
     }
     else
     {
         wxClassInfo::sm_classTable->BeginFind();
 
         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))
         {
             if(!DoCreate(classInfo, parent, id,
                          pos, size, style, validator, name))
-                continue;        
+                continue;
 
 
-            if (m_imp->Load(location))
+            if (Load(location))
+            {
+                SetBestFittingSize(size);
                 return true;
                 return true;
+            }
             else
                 delete m_imp;
             else
                 delete m_imp;
-
-            classInfo = NextBackend();
         }
 
         m_imp = NULL;
         }
 
         m_imp = NULL;
@@ -192,24 +199,20 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
 //---------------------------------------------------------------------------
 bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
                             wxWindow* parent, wxWindowID id,
 //---------------------------------------------------------------------------
 bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
                             wxWindow* parent, wxWindowID id,
-                            const wxPoint& pos, 
+                            const wxPoint& pos,
                             const wxSize& size,
                             const wxSize& size,
-                            long style, 
+                            long style,
                             const wxValidator& validator,
                             const wxString& name)
 {
     m_imp = (wxMediaBackend*)classInfo->CreateObject();
                             const wxValidator& validator,
                             const wxString& name)
 {
     m_imp = (wxMediaBackend*)classInfo->CreateObject();
-    
+
     if( m_imp->CreateControl(this, parent, id, pos, size,
                              style, validator, name) )
     {
     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;
     }
         return true;
     }
-    
+
     delete m_imp;
     return false;
 }
     delete m_imp;
     return false;
 }
@@ -221,7 +224,7 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
 // Search through the RTTI hashmap one at a
 // time, attempting to create each derivative
 // of wxMediaBackend
 // Search through the RTTI hashmap one at a
 // time, attempting to create each derivative
 // of wxMediaBackend
-// 
+//
 //
 // STL isn't compatable with and will have a compilation error
 // on a wxNode, however, wxHashTable::compatibility_iterator is
 //
 // STL isn't compatable with and will have a compilation error
 // on a wxNode, however, wxHashTable::compatibility_iterator is
@@ -290,12 +293,12 @@ bool wxMediaCtrl::Load(const wxURI& location)
 // wxMediaCtrl::Stop
 // wxMediaCtrl::GetPlaybackRate
 // wxMediaCtrl::SetPlaybackRate
 // 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::GetState
 // wxMediaCtrl::DoGetBestSize
-// 
+//
 // 1) Check to see whether the backend exists and is loading
 // 2) Call the backend's version of the method, returning success
 //    if the backend's version succeeds
 // 1) Check to see whether the backend exists and is loading
 // 2) Call the backend's version of the method, returning success
 //    if the backend's version succeeds
@@ -335,25 +338,43 @@ bool wxMediaCtrl::SetPlaybackRate(double dRate)
     return false;
 }
 
     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()
 {
 {
+    //FIXME
     if(m_imp && m_bLoaded)
     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()
 {
 {
+    //FIXME
     if(m_imp && m_bLoaded)
     if(m_imp && m_bLoaded)
-        return m_imp->GetDuration();
-    return 0;
+        return (wxFileOffset) m_imp->GetDuration().ToLong();
+    return wxInvalidOffset;
 }
 
 wxMediaState wxMediaCtrl::GetState()
 }
 
 wxMediaState wxMediaCtrl::GetState()
@@ -372,7 +393,7 @@ wxSize wxMediaCtrl::DoGetBestSize() const
 
 //---------------------------------------------------------------------------
 // wxMediaCtrl::DoMoveWindow
 
 //---------------------------------------------------------------------------
 // wxMediaCtrl::DoMoveWindow
-// 
+//
 // 1) Call parent's version so that our control's window moves where
 //    it's supposed to
 // 2) If the backend exists and is loaded, move the video
 // 1) Call parent's version so that our control's window moves where
 //    it's supposed to
 // 2) If the backend exists and is loaded, move the video
@@ -386,32 +407,10 @@ void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h)
         m_imp->Move(x, y, w, h);
 }
 
         m_imp->Move(x, y, w, h);
 }
 
-void wxMediaCtrl::Loop(bool bLoop)
-{
-    m_bLoop = bLoop;
-}
-
-bool wxMediaCtrl::IsLooped()
-{
-    return m_bLoop;
-}
-
-void wxMediaCtrl::OnMediaFinished(const wxMediaEvent& WXUNUSED(evt))
-{
-    if(m_bLoop)
-    {
-#ifdef __WXDEBUG__
-        wxASSERT( Play() );
-#else
-        Play();
-#endif
-    }
-}
-
 //DARWIN gcc compiler badly screwed up - needs destructor impl in source
 wxMediaBackend::~wxMediaBackend()
 {                               }
 //DARWIN gcc compiler badly screwed up - needs destructor impl in source
 wxMediaBackend::~wxMediaBackend()
 {                               }
-#include <wx/html/forcelnk.h>
+#include "wx/html/forcelnk.h"
 FORCE_LINK(basewxmediabackends);
 
 //---------------------------------------------------------------------------
 FORCE_LINK(basewxmediabackends);
 
 //---------------------------------------------------------------------------