Fix wxMediaCtrl::SetPosition() in MSW WMP backend

Step the control one frame forward to actually show the frame at the
given position, otherwise the control only showed black screen.

Closes https://github.com/wxWidgets/wxWidgets/pull/678
This commit is contained in:
ashishmore
2018-01-19 13:25:30 -05:00
committed by Vadim Zeitlin
parent 3e79f903b4
commit 87bd82ab6f
2 changed files with 31 additions and 2 deletions

View File

@@ -173,6 +173,7 @@ wxMSW:
- Send wxEVT_WEBVIEW_NAVIGATING when redirecting (Josue Andrade Gomes).
- Fix build with MSVS 2005 broken in 3.1.1.
- Add wxwidgets.props property sheet file for MSVS users.
- Fix jumping to the given position in wxMediaCtrl (ashishmore).
wxOSX:

View File

@@ -105,6 +105,7 @@ const IID IID_IWMPPlayer2 = {0x0E6B01D1,0xD407,0x4C85,{0xBF,0x5F,0x1C,0x01,0xF6,
const IID IID_IWMPCore2 = {0xBC17E5B7,0x7561,0x4C18,{0xBB,0x90,0x17,0xD4,0x85,0x77,0x56,0x59}};
const IID IID_IWMPCore3 = {0x7587C667,0x628F,0x499F,{0x88,0xE7,0x6A,0x6F,0x4E,0x88,0x84,0x64}};
const IID IID_IWMPNetwork = {0xEC21B779,0xEDEF,0x462D,{0xBB,0xA4,0xAD,0x9D,0xDE,0x2B,0x29,0xA7}};
const IID IID_IWMPControls2 = {0X6F030D25,0X0890,0X480F,{0X97, 0X75, 0X1F,0X7E,0X40,0XAB,0X5B,0X8E}};
enum WMPOpenState
{
@@ -265,6 +266,12 @@ public:
};
struct IWMPControls2 : public IWMPControls
{
public:
virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE step(
/* [in] */ long lStep ) = 0;
};
struct IWMPSettings : public IDispatch
{
@@ -665,6 +672,8 @@ public:
IWMPPlayer* m_pWMPPlayer; // Main activex interface
IWMPSettings* m_pWMPSettings; // Settings such as volume
IWMPControls* m_pWMPControls; // Control interface (play etc.)
IWMPControls2* m_pWMPControls2; // Control interface (play etc.)
wxSize m_bestSize; // Actual movie size
bool m_bWasStateChanged; // See the "introduction"
@@ -717,7 +726,8 @@ wxWMP10MediaBackend::wxWMP10MediaBackend()
#endif
m_pWMPPlayer(NULL),
m_pWMPSettings(NULL),
m_pWMPControls(NULL)
m_pWMPControls(NULL),
m_pWMPControls2(NULL)
{
m_evthandler = NULL;
@@ -749,6 +759,8 @@ wxWMP10MediaBackend::~wxWMP10MediaBackend()
m_pWMPSettings->Release();
if (m_pWMPControls)
m_pWMPControls->Release();
if (m_pWMPControls2)
m_pWMPControls->Release();
}
}
@@ -787,6 +799,8 @@ bool wxWMP10MediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
wxLogSysError(wxT("Could not obtain controls from WMP10!"));
return false;
}
if (m_pWMPControls )
m_pWMPControls->QueryInterface(IID_IWMPControls2, (void**)&m_pWMPControls2);
}
#endif
@@ -1136,8 +1150,18 @@ bool wxWMP10MediaBackend::Stop()
//---------------------------------------------------------------------------
bool wxWMP10MediaBackend::SetPosition(wxLongLong where)
{
// The display does not update if only put_currentPosition is called.
// We have to find the time for the previous frame, set the control
// to that position and then tell it to step forward one frame. This
// forces the control to draw the frame to the screen, otherwise we get
// just a black screen.
double timePerFrameInMSec = 0;
if (m_pWMPControls2)
timePerFrameInMSec = 1000 / GetPlaybackRate();
HRESULT hr = m_pWMPControls->put_currentPosition(
((LONGLONG)where.GetValue()) / 1000.0
((LONGLONG)where.GetValue() - timePerFrameInMSec) / 1000.0
);
if(FAILED(hr))
{
@@ -1145,6 +1169,10 @@ bool wxWMP10MediaBackend::SetPosition(wxLongLong where)
return false;
}
if (m_pWMPControls2)
m_pWMPControls2->step(1);
return true;
}