Skip to content

Commit

Permalink
Fix lagging framestep with madvr
Browse files Browse the repository at this point in the history
  • Loading branch information
clsid2 committed Dec 20, 2021
1 parent e6e5c17 commit fb9806c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 26 deletions.
46 changes: 22 additions & 24 deletions src/mpc-hc/MainFrm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2391,7 +2391,7 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
SendNowPlayingToApi();
}

if (GetMediaState() == State_Running && !m_fAudioOnly) {
if (m_CachedFilterState == State_Running && !m_fAudioOnly) {
BOOL fActive = FALSE;
if (SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &fActive, 0) && fActive) {
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, nullptr, SPIF_SENDWININICHANGE);
Expand Down Expand Up @@ -2743,9 +2743,7 @@ LRESULT CMainFrame::OnGraphNotify(WPARAM wParam, LPARAM lParam)
CComPtr<IDvdState> pStateData;
switch (evCode) {
case EC_PAUSED:
if (!m_fFrameSteppingActive && m_CachedFilterState != State_Paused) {
UpdateCachedMediaState();
}
UpdateCachedMediaState();
break;
case EC_COMPLETE:
UpdateCachedMediaState();
Expand All @@ -2763,6 +2761,7 @@ LRESULT CMainFrame::OnGraphNotify(WPARAM wParam, LPARAM lParam)
if (m_fFrameSteppingActive) {
m_nStepForwardCount++;
}
UpdateCachedMediaState();
break;
case EC_DEVICE_LOST:
UpdateCachedMediaState();
Expand Down Expand Up @@ -7981,9 +7980,6 @@ void CMainFrame::OnPlayPlay()
MoveVideoWindow(false, true);
}

// Restart playback
MediaControlRun();

if (m_fFrameSteppingActive) {
m_pFS->CancelStep();
m_fFrameSteppingActive = false;
Expand All @@ -7993,6 +7989,9 @@ void CMainFrame::OnPlayPlay()
}
m_nStepForwardCount = 0;

// Restart playback
MediaControlRun();

SetAlwaysOnTop(s.iOnTop);

SetTimersPlay();
Expand Down Expand Up @@ -8051,11 +8050,10 @@ void CMainFrame::OnPlayPause()
}

if (GetLoadState() == MLS::LOADED) {

if (GetPlaybackMode() == PM_FILE
|| GetPlaybackMode() == PM_DVD
|| GetPlaybackMode() == PM_ANALOG_CAPTURE) {
MediaControlPause();
MediaControlPause(true);
} else {
ASSERT(FALSE);
}
Expand Down Expand Up @@ -8243,11 +8241,18 @@ void CMainFrame::OnPlayFramestep(UINT nID)
KillTimerDelayedSeek();

m_OSD.EnableShowMessage(false);
if (nID == ID_PLAY_FRAMESTEP && m_pFS) {
if (GetMediaState() != State_Paused) {
SendMessage(WM_COMMAND, ID_PLAY_PAUSE);

if (m_CachedFilterState == State_Paused) {
// Double check the state, because graph may have silently gone into a running state after performing a framestep
if (UpdateCachedMediaState() != State_Paused) {
MediaControlPause(true);
}
} else {
KillTimer(TIMER_STATS);
MediaControlPause(true);
}

if (nID == ID_PLAY_FRAMESTEP && m_pFS) {
// To support framestep back, store the initial position when
// stepping forward
if (m_nStepForwardCount == 0) {
Expand All @@ -8267,10 +8272,6 @@ void CMainFrame::OnPlayFramestep(UINT nID)

m_pFS->Step(1, nullptr);
} else if (m_pMS && (m_nStepForwardCount == 0) && (S_OK == m_pMS->IsFormatSupported(&TIME_FORMAT_FRAME))) {
if (GetMediaState() != State_Paused) {
SendMessage(WM_COMMAND, ID_PLAY_PAUSE);
}

if (SUCCEEDED(m_pMS->SetTimeFormat(&TIME_FORMAT_FRAME))) {
REFERENCE_TIME rtCurPos;

Expand All @@ -8282,10 +8283,6 @@ void CMainFrame::OnPlayFramestep(UINT nID)
m_pMS->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
}
} else { // nID == ID_PLAY_FRAMESTEP_BACK
if (GetMediaState() != State_Paused) {
SendMessage(WM_COMMAND, ID_PLAY_PAUSE);
}

const REFERENCE_TIME rtAvgTimePerFrame = std::llround(GetAvgTimePerFrame() * 10000000LL);
REFERENCE_TIME rtCurPos = 0;

Expand Down Expand Up @@ -10629,8 +10626,9 @@ OAFilterState CMainFrame::GetMediaState() const
OAFilterState ret = -1;
if (m_eMediaLoadState == MLS::LOADED) {
if (m_CachedFilterState != -1) {
#if DEBUG & 0
ASSERT(GetMediaStateDirect() == m_CachedFilterState);
#if DEBUG & 1
ret = GetMediaStateDirect();
ASSERT(ret == m_CachedFilterState || m_fFrameSteppingActive);
#endif
return m_CachedFilterState;
} else {
Expand All @@ -10640,9 +10638,10 @@ OAFilterState CMainFrame::GetMediaState() const
return ret;
}

void CMainFrame::UpdateCachedMediaState()
OAFilterState CMainFrame::UpdateCachedMediaState()
{
m_CachedFilterState = GetMediaStateDirect();
return m_CachedFilterState;
}

bool CMainFrame::MediaControlRun(bool waitforcompletion)
Expand All @@ -10669,7 +10668,6 @@ bool CMainFrame::MediaControlPause(bool waitforcompletion)
{
m_dwLastPause = GetTickCount64();
if (m_pMC) {
ASSERT(m_CachedFilterState != State_Paused);
m_CachedFilterState = State_Paused;
if (FAILED(m_pMC->Pause())) {
// still in transition to paused state
Expand Down
2 changes: 1 addition & 1 deletion src/mpc-hc/MainFrm.h
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ class CMainFrame : public CFrameWnd, public CDropClient

OAFilterState GetMediaStateDirect() const;
OAFilterState GetMediaState() const;
void CMainFrame::UpdateCachedMediaState();
OAFilterState CMainFrame::UpdateCachedMediaState();
bool MediaControlRun(bool waitforcompletion = false);
bool MediaControlPause(bool waitforcompletion = false);
bool MediaControlStop(bool waitforcompletion = false);
Expand Down
2 changes: 1 addition & 1 deletion src/mpc-hc/PlayerSeekBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -847,7 +847,7 @@ void CPlayerSeekBar::OnMouseMove(UINT nFlags, CPoint point)

checkHover(point);

const OAFilterState fs = m_pMainFrame->GetMediaState();
const OAFilterState fs = m_pMainFrame->m_CachedFilterState;
if (fs != -1) {
if (m_pMainFrame->CanPreviewUse()) {
UpdateToolTipPosition(point);
Expand Down

0 comments on commit fb9806c

Please sign in to comment.