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);
{
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<wxLongLong_t>(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<long>(outDuration)) * 1000;
+#endif
+ }
}
//---------------------------------------------------------------------------
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;
}
//---------------------------------------------------------------------------
// 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