// wxDXMediaCtrlImpl
//---------------------------------------------------------------------------
+#undef wxUSE_DIRECTSHOW
+#define wxUSE_DIRECTSHOW 0
+
#if wxUSE_DIRECTSHOW
#include <dshow.h>
virtual double GetPlaybackRate();
virtual bool SetPlaybackRate(double);
+ bool MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+
MCIDEVICEID m_hDev;
wxMediaCtrl* m_ctrl;
bool m_bVideo;
};
-//---------------------------------------------------------------------------
-// wxAVIFileMediaCtrlImpl
-//---------------------------------------------------------------------------
-/*
-#include <Vfw.h>
-//msvfw32.dll
-//#pragma comment(lib, "vfw32.lib")
-
-class wxAVIFileMediaCtrlImpl : public wxMediaCtrlImpl
-{
-public:
-
- wxAVIFileMediaCtrlImpl();
- ~wxAVIFileMediaCtrlImpl();
-
- virtual bool Create(wxMediaCtrl* ctrl);
-
- virtual bool Play();
- virtual bool Pause();
- virtual bool Stop();
-
- virtual bool Load(const wxString& fileName);
- virtual bool Load(const wxURI& location);
-
- virtual wxMediaState GetState();
-
- virtual bool SetPosition(long where);
- virtual long GetPosition();
- virtual long GetDuration();
-
- virtual void DoMoveWindow(int x, int y, int w, int h);
- wxSize DoGetBestSize() const;
-
- virtual double GetPlaybackRate();
- virtual bool SetPlaybackRate(double);
-
- HMODULE m_hDll;
- PAVIFILE m_hAVIFile;
- wxMediaCtrl* m_ctrl;
-};
-*/
-
//###########################################################################
//
// IMPLEMENTATION
{
delete m_imp;
#endif
-// m_imp = new wxWMMEMediaCtrlImpl;
-// if(!m_imp->Create(this))
+ m_imp = new wxWMMEMediaCtrlImpl;
+ if(!m_imp->Create(this))
{
-// delete m_imp;
+ delete m_imp;
m_imp = NULL;
return false;
}
{
delete m_imp;
#endif
-// m_imp = new wxWMMEMediaCtrlImpl;
-// if(!m_imp->Create(this))
+ m_imp = new wxWMMEMediaCtrlImpl;
+ if(!m_imp->Create(this))
{
-// delete m_imp;
+ delete m_imp;
m_imp = NULL;
return false;
}
wxWMMEMediaCtrlImpl::wxWMMEMediaCtrlImpl() : m_bVideo(false)
{
-
+/* TCHAR sz[5000];
+ mciGetErrorString(nError, sz, 5000);
+ wxMessageBox(wxString::Format(_T("Error:%s"), sz));
+ */
}
wxWMMEMediaCtrlImpl::~wxWMMEMediaCtrlImpl()
return true;
}
-bool wxWMMEMediaCtrlImpl::Play()
-{
- return (mciSendCommand(m_hDev, MCI_PLAY, 0, 0) == 0) ||
- (mciSendCommand(m_hDev, MCI_RESUME, 0, 0) == 0);
-}
-
-bool wxWMMEMediaCtrlImpl::Pause()
-{
- return (mciSendCommand(m_hDev, MCI_PAUSE, MCI_WAIT, 0) == 0);
-}
-
-bool wxWMMEMediaCtrlImpl::Stop()
-{
- return (mciSendCommand(m_hDev, MCI_STOP, MCI_WAIT, 0) == 0) &&
- SetPosition(GetDuration());
-}
-
-#include "wx/log.h"
-
bool wxWMMEMediaCtrlImpl::Load(const wxString& fileName)
{
if(m_bLoaded)
MCI_OPEN_PARMS openParms;
MCI_SET_PARMS setParms;
- memset(&openParms, 0, sizeof(MCI_DGV_OPEN_PARMS));
openParms.lpstrElementName = (wxChar*) fileName.c_str();
- bool bFound = false;
-
- for(size_t i = MCI_DEVTYPE_FIRST; i <= MCI_DEVTYPE_LAST; ++i)
- {
- openParms.lpstrDeviceType = (LPSTR)i;
-
- DWORD nError;
-
- if ((nError = mciSendCommand(0, MCI_OPEN,
- MCI_OPEN_ELEMENT|MCI_OPEN_ELEMENT|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID,
- (DWORD)(LPVOID)&openParms)) == 0)
- {
- bFound = true;
- break;
- }
- }
-
- if(!bFound)
- return false;
+ //Here's where the trick lies - if you don't specify MCI_OPEN_TYPE,
+ //then it actually automagically finds the device for you!
+ if ( mciSendCommand(0, MCI_OPEN,
+ MCI_OPEN_ELEMENT,
+ (DWORD)(LPVOID)&openParms) != 0)
+ return false;
m_hDev = openParms.wDeviceID;
-
setParms.dwCallback = 0;
setParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
(DWORD)(LPVOID)&setParms) != 0)
return false;
-
- //TODO: Does this work?
- /*
MCI_DGV_WINDOW_PARMS windowParms;
- windowParms.hWnd = (HWND)m_ctrl->GetHWND();
+ windowParms.hWnd = (HWND)m_ctrl->GetHandle();
m_bVideo = (mciSendCommand(m_hDev, MCI_WINDOW,
MCI_DGV_WINDOW_HWND, (DWORD)(LPVOID)&windowParms) == 0);
-*/
m_bLoaded = true;
+ //work around refresh issues
+ m_ctrl->InvalidateBestSize();
+ m_ctrl->GetParent()->Layout();
+ m_ctrl->GetParent()->Refresh();
+ m_ctrl->GetParent()->Update();
+
return true;
}
return false;
}
+bool wxWMMEMediaCtrlImpl::Play()
+{
+ //the directshow driver ("mpegvideo") will crash if we don't do a playParms here
+ MCI_PLAY_PARMS playParms;
+ playParms.dwCallback = (WORD)(HWND)m_ctrl->GetHWND();
+ bool bOK = mciSendCommand(m_hDev, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&playParms) == 0;
+ return (bOK) ;/*||
+ (mciSendCommand(m_hDev, MCI_RESUME, 0, 0) == 0);*/
+}
+
+bool wxWMMEMediaCtrlImpl::Pause()
+{
+ return (mciSendCommand(m_hDev, MCI_PAUSE, MCI_WAIT, 0) == 0);
+}
+
+bool wxWMMEMediaCtrlImpl::Stop()
+{
+ return (mciSendCommand(m_hDev, MCI_STOP, MCI_WAIT, 0) == 0) &&
+ (mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0) == 0);
+}
+
+
wxMediaState wxWMMEMediaCtrlImpl::GetState()
{
MCI_STATUS_PARMS statusParms;
if( mciSendCommand(m_hDev, MCI_SEEK, MCI_TO, (DWORD)(LPVOID)&seekParms) != 0)
return false;
-/* TCHAR sz[5000];
- mciGetErrorString(nError, sz, 5000);
- wxMessageBox(wxString::Format(_T("Error:%s"), sz));
- */
if (bReplay)
return Play();
{
if(m_bVideo)
{
- //TODO: Does this work?
- /*
MCI_DGV_RECT_PARMS rect;
mciSendCommand(m_hDev, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD)(LPSTR)&rect);
return wxSize(rect.rc.right, rect.rc.bottom);
- */
}
return wxSize(0,0);
}
return false;
}
-//---------------------------------------------------------------------------
-//
-// wxAVIFileMediaCtrlImpl
-//
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// Functions located in msvfw32.dll
-//---------------------------------------------------------------------------
-
-/*
-
-typedef void (WINAPI *LPAVIFileInit) ();
-typedef void (WINAPI *LPAVIFileExit) ();
-
-typedef ULONG (WINAPI *LPAVIFileOpen) (
-PAVIFILE FAR * ppfile,
-const wxChar* szFile,
-UINT uMode,
-LPCLSID lpHandler
-);
-
-typedef ULONG (WINAPI *LPAVIFileRelease) (PAVIFILE pfile);
-
-wxAVIFileMediaCtrlImpl::wxAVIFileMediaCtrlImpl()
-{
-}
-
-wxAVIFileMediaCtrlImpl::~wxAVIFileMediaCtrlImpl()
-{
-}
-
-bool wxAVIFileMediaCtrlImpl::Create(wxMediaCtrl* ctrl)
-{
- m_hDll = ::LoadLibrary(_T("avifil32.dll"));
-
- if(m_hDll == NULL)
- return false;
-
- LPAVIFileInit pAVIFileInit = (LPAVIFileInit) ::GetProcAddress(m_hDll, _T("AVIFileInit"));
-
- if(!pAVIFileInit)
- return false;
-
- (*pAVIFileInit)();
-
- m_ctrl = ctrl;
- return false;
-}
-
-
-bool wxAVIFileMediaCtrlImpl::Load(const wxString& fileName)
-{
-// if( AVIFileOpen(&m_hAVIFile, fileName.c_str(), OF_SHARE_DENY_WRITE, 0L) != 0)
- return false;
-
- m_bLoaded = true;
-
- return true;
-}
-
-bool wxAVIFileMediaCtrlImpl::Load(const wxURI& WXUNUSED(location))
-{
- return false;
-}
-
-bool wxAVIFileMediaCtrlImpl::Play()
-{
- return 0;
-}
-
-bool wxAVIFileMediaCtrlImpl::Pause()
-{
- return 0;
-}
-
-bool wxAVIFileMediaCtrlImpl::Stop()
+bool wxWMMEMediaCtrlImpl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
- return 0;
-}
-
-wxMediaState wxAVIFileMediaCtrlImpl::GetState()
-{
- return wxMEDIASTATE_STOPPED;
-}
-
-bool wxAVIFileMediaCtrlImpl::SetPosition(long where)
-{
- return 0;
-}
-
-long wxAVIFileMediaCtrlImpl::GetPosition()
-{
- return 0;
-}
-
-long wxAVIFileMediaCtrlImpl::GetDuration()
-{
- return 0;
-}
-
-void wxAVIFileMediaCtrlImpl::DoMoveWindow(int, int, int, int)
-{
-}
-
-wxSize wxAVIFileMediaCtrlImpl::DoGetBestSize() const
-{
- return wxSize(0,0);
-}
-
-double wxAVIFileMediaCtrlImpl::GetPlaybackRate()
-{
- return 1.0;
-}
+ if(nMsg == MM_MCINOTIFY)
+ {
+ wxASSERT(lParam == (WXLPARAM) m_hDev);
+ if(wParam == (WXWPARAM) MCI_NOTIFY_SUCCESSFUL && lParam == (WXLPARAM) m_hDev)
+ {
+#ifdef __WXDEBUG__
+ wxASSERT(mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0) == 0);
+#else
+ mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0);
+#endif
-bool wxAVIFileMediaCtrlImpl::SetPlaybackRate(double)
-{
+ wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED, m_ctrl->GetId());
+ m_ctrl->GetParent()->ProcessEvent(theEvent);
+ }
+ return true;
+ }
return false;
}
- */
-
#endif //wxUSE_MEDIACTRL
\ No newline at end of file