Psmf: Handle older states for delayed state change.

This commit is contained in:
Unknown W. Brackets committed 2020-10-19 19:06:32 -07:00
1 parent d4c02ccc1c
commit c8b2dd123f
1 file changed
+14 -6
+14 -6
View File
@@ -709,6 +709,8 @@ void __PsmfPlayerDoState(PointerWrap &p) {
if (s >= 3) {
Do(p, eventPsmfPlayerStatusChange);
CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange);
} else {
eventPsmfPlayerStatusChange = -1;
}
Do(p, psmfPlayerLibVersion);
} else {
@@ -726,6 +728,13 @@ void __PsmfShutdown() {
psmfPlayerMap.clear();
}
static void DelayPsmfStateChange(u32 psmfPlayer, u32 newState, s64 delayUs) {
if (eventPsmfPlayerStatusChange == -1) {
eventPsmfPlayerStatusChange = CoreTiming::RegisterEvent("PsmfPlayerStatusChange", &__PsmfPlayerStatusChange);
}
CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | newState);
}
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) || !Memory::IsValidAddress(psmfData)) {
// Crashes on a PSP.
@@ -1147,7 +1156,7 @@ static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr)
videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP;
int delayUs = 20000;
CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_INIT);
DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_INIT, delayUs);
return hleDelayResult(0, "player create", delayUs);
}
@@ -1165,7 +1174,7 @@ static int scePsmfPlayerStop(u32 psmfPlayer) {
INFO_LOG(ME, "scePsmfPlayerStop(%08x)", psmfPlayer);
int delayUs = 3000;
CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY);
DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_STANDBY, delayUs);
return hleDelayResult(0, "psmfplayer stop", delayUs);
}
@@ -1293,8 +1302,7 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of
_PsmfPlayerFillRingbuffer(psmfplayer);
psmfplayer->totalDurationTimestamp = psmfplayer->mediaengine->getLastTimeStamp();
CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY);
DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_STANDBY, delayUs);
return hleDelayResult(0, "psmfplayer set", delayUs);
}
@@ -1478,10 +1486,10 @@ static int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts)
// Does not alter current pts, it just catches up when Update()/etc. get there.
int delayUs = psmfplayer->status == PSMF_PLAYER_STATUS_PLAYING ? 3000 : 0;
if(delayUs == 0)
if (delayUs == 0)
psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING;
else
CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_PLAYING);
DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_PLAYING, delayUs);
psmfplayer->warmUp = 0;
psmfplayer->mediaengine->openContext();