X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6e0e886278e51807256f0d7c32208855620ebba5..d485bda109d5ef0fef36a3f737549e9b9f54baab:/src/msw/mediactrl_am.cpp diff --git a/src/msw/mediactrl_am.cpp b/src/msw/mediactrl_am.cpp index 75acd4f99e..227df16d5d 100644 --- a/src/msw/mediactrl_am.cpp +++ b/src/msw/mediactrl_am.cpp @@ -1478,11 +1478,12 @@ public: #endif wxSize m_bestSize; // Cached size -#ifdef __WXDEBUG__ // Stuff for getting useful debugging strings + // Stuff for getting useful debugging strings +#if wxDEBUG_LEVEL wxDynamicLibrary m_dllQuartz; LPAMGETERRORTEXT m_lpAMGetErrorText; wxString GetErrorString(HRESULT hrdsv); -#endif // __WXDEBUG__ +#endif // wxDEBUG_LEVEL wxEvtHandler* m_evthandler; friend class wxAMMediaEvtHandler; @@ -1509,7 +1510,7 @@ private: bool m_bLoadEventSent; // Whether or not FinishLoaded was already called // prevents it being called multiple times - DECLARE_NO_COPY_CLASS(wxAMMediaEvtHandler) + wxDECLARE_NO_COPY_CLASS(wxAMMediaEvtHandler); }; //=========================================================================== @@ -1527,7 +1528,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxAMMediaBackend, wxMediaBackend) //--------------------------------------------------------------------------- // Usual debugging macros //--------------------------------------------------------------------------- -#ifdef __WXDEBUG__ +#if wxDEBUG_LEVEL #define MAX_ERROR_TEXT_LEN 160 // Get the error string for Active Movie @@ -1539,14 +1540,14 @@ wxString wxAMMediaBackend::GetErrorString(HRESULT hrdsv) { return wxString::Format(wxT("DirectShow error \"%s\" \n") wxT("(numeric %X)\n") - wxT("occured"), + wxT("occurred"), szError, (int)hrdsv); } else { return wxString::Format(wxT("Unknown error \n") wxT("(numeric %X)\n") - wxT("occured"), + wxT("occurred"), (int)hrdsv); } } @@ -1614,13 +1615,13 @@ bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, { // First get the AMGetErrorText procedure in debug // mode for more meaningful messages -#ifdef __WXDEBUG__ - if ( m_dllQuartz.Load(_T("quartz.dll"), wxDL_VERBATIM) ) +#if wxDEBUG_LEVEL + if ( m_dllQuartz.Load(wxT("quartz.dll"), wxDL_VERBATIM) ) { m_lpAMGetErrorText = (LPAMGETERRORTEXT) m_dllQuartz.GetSymbolAorW(wxT("AMGetErrorText")); } -#endif // __WXDEBUG__ +#endif // wxDEBUG_LEVEL @@ -1822,8 +1823,8 @@ void wxAMMediaBackend::FinishLoad() bool wxAMMediaBackend::ShowPlayerControls(wxMediaCtrlPlayerControls flags) { // Note that IMediaPlayer doesn't have a statusbar by - // default but IActiveMovie does - so lets try to keep - // the interface consistant + // default but IActiveMovie does - so let's try to keep + // the interface consistent. if(!flags) { GetAM()->put_Enabled(VARIANT_FALSE); @@ -1983,7 +1984,7 @@ double wxAMMediaBackend::GetVolume() bool wxAMMediaBackend::SetVolume(double dVolume) { // inverse the transformation above - long lVolume = 2000*log10(dVolume + (1 - dVolume)*0.00001); + long lVolume = static_cast(2000*log10(dVolume + (1 - dVolume)*0.00001)); HRESULT hr = GetAM()->put_Volume(lVolume); if(FAILED(hr)) @@ -2008,18 +2009,27 @@ wxLongLong wxAMMediaBackend::GetDuration() { double outDuration; HRESULT hr = GetAM()->get_Duration(&outDuration); - if(FAILED(hr)) + switch ( hr ) { - wxAMLOG(hr); - return 0; - } + default: + wxAMLOG(hr); + // fall through - // h,m,s,milli - outDuration is in 1 second (double) - outDuration *= 1000; - wxLongLong ll; - ll.Assign(outDuration); + case S_FALSE: + return 0; - return ll; + case S_OK: + // outDuration is in seconds, we need milliseconds +#ifdef wxLongLong_t + return static_cast(outDuration * 1000); +#else + // In principle it's possible to have video of duration greater + // than ~1193 hours which corresponds LONG_MAX in milliseconds so + // cast to wxLongLong first and multiply by 1000 only then to avoid + // the overflow (resulting in maximal duration of ~136 years). + return wxLongLong(static_cast(outDuration)) * 1000; +#endif + } } //--------------------------------------------------------------------------- @@ -2091,36 +2101,37 @@ void wxAMMediaBackend::DoGetDownloadProgress(wxLongLong* pLoadProgress, wxLongLong* pLoadTotal) { #ifndef __WXWINCE__ - LONGLONG loadTotal = 0, loadProgress = 0; - IUnknown* pFG; - IAMOpenProgress* pOP; - HRESULT hr; - hr = m_pAM->get_FilterGraph(&pFG); - if(SUCCEEDED(hr)) + IUnknown* pFG = NULL; + + HRESULT hr = m_pAM->get_FilterGraph(&pFG); + + // notice that the call above may return S_FALSE and leave pFG NULL + if(SUCCEEDED(hr) && pFG) { + IAMOpenProgress* pOP = NULL; hr = pFG->QueryInterface(IID_IAMOpenProgress, (void**)&pOP); - if(SUCCEEDED(hr)) - { + if(SUCCEEDED(hr) && pOP) + { + LONGLONG + loadTotal = 0, + loadProgress = 0; hr = pOP->QueryProgress(&loadTotal, &loadProgress); pOP->Release(); + + if(SUCCEEDED(hr)) + { + *pLoadProgress = loadProgress; + *pLoadTotal = loadTotal; + pFG->Release(); + return; + } } pFG->Release(); } +#endif // !__WXWINCE__ - if(SUCCEEDED(hr)) - { - *pLoadProgress = loadProgress; - *pLoadTotal = loadTotal; - } - else -#endif - { - // When not loading from a URL QueryProgress will return - // E_NOINTERFACE or whatever - // wxAMFAIL(hr); - *pLoadProgress = 0; - *pLoadTotal = 0; - } + *pLoadProgress = 0; + *pLoadTotal = 0; } //--------------------------------------------------------------------------- @@ -2256,8 +2267,9 @@ void wxAMMediaEvtHandler::OnActiveX(wxActiveXEvent& event) // End of wxAMMediaBackend //--------------------------------------------------------------------------- -// in source file that contains stuff you don't directly use -#include "wx/html/forcelnk.h" -FORCE_LINK_ME(wxmediabackend_am) +// Allow the user code to use wxFORCE_LINK_MODULE() to ensure that this object +// file is not discarded by the linker. +#include "wx/link.h" +wxFORCE_LINK_THIS_MODULE(wxmediabackend_am) #endif // wxUSE_MEDIACTRL && wxUSE_ACTIVEX