From 5987f174f7c8a776ffb3e5419111851c3b811c15 Mon Sep 17 00:00:00 2001 From: Ryan Norton Date: Fri, 12 Nov 2004 06:29:08 +0000 Subject: [PATCH 1/1] workaround to call directshow drivers without actually using directshow git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30482 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/mediactrl.cpp | 284 ++++++++++-------------------------------- 1 file changed, 66 insertions(+), 218 deletions(-) diff --git a/src/msw/mediactrl.cpp b/src/msw/mediactrl.cpp index 34a0a33510..559ba3584a 100644 --- a/src/msw/mediactrl.cpp +++ b/src/msw/mediactrl.cpp @@ -83,6 +83,9 @@ public: // wxDXMediaCtrlImpl //--------------------------------------------------------------------------- +#undef wxUSE_DIRECTSHOW +#define wxUSE_DIRECTSHOW 0 + #if wxUSE_DIRECTSHOW #include @@ -179,53 +182,13 @@ public: 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 -//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 @@ -256,10 +219,10 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa { 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; } @@ -294,10 +257,10 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, const wxURI& location, { 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; } @@ -685,7 +648,10 @@ void wxDXMediaCtrlImpl::DoMoveWindow(int x, int y, int w, int h) wxWMMEMediaCtrlImpl::wxWMMEMediaCtrlImpl() : m_bVideo(false) { - +/* TCHAR sz[5000]; + mciGetErrorString(nError, sz, 5000); + wxMessageBox(wxString::Format(_T("Error:%s"), sz)); + */ } wxWMMEMediaCtrlImpl::~wxWMMEMediaCtrlImpl() @@ -699,25 +665,6 @@ bool wxWMMEMediaCtrlImpl::Create(wxMediaCtrl* ctrl) 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) @@ -726,32 +673,17 @@ bool wxWMMEMediaCtrlImpl::Load(const wxString& fileName) 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; @@ -759,17 +691,19 @@ bool wxWMMEMediaCtrlImpl::Load(const wxString& fileName) (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; } @@ -778,6 +712,28 @@ bool wxWMMEMediaCtrlImpl::Load(const wxURI& WXUNUSED(location)) 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; @@ -803,10 +759,6 @@ bool wxWMMEMediaCtrlImpl::SetPosition(long where) 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(); @@ -846,13 +798,10 @@ wxSize wxWMMEMediaCtrlImpl::DoGetBestSize() const { 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); } @@ -867,126 +816,25 @@ bool wxWMMEMediaCtrlImpl::SetPlaybackRate(double) 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 -- 2.45.2