From d940f80b88b368bcab3b96e6ce1503c58fbb0f06 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Mon, 19 Oct 2020 16:29:42 +0800 Subject: [PATCH 1/2] PsmfPlayer:The status will not be changed until the delay result is finished. --- Core/HLE/scePsmf.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 0a601db8d4..9ae78eb018 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -29,6 +29,7 @@ #include "Core/HLE/sceMpeg.h" #include "Core/HLE/sceKernelMemory.h" #include "Core/HW/MediaEngine.h" +#include "Core/CoreTiming.h" #include "GPU/GPUInterface.h" #include "GPU/GPUState.h" @@ -59,6 +60,8 @@ static int videoPixelMode = GE_CMODE_32BIT_ABGR8888; static int videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; static int psmfPlayerLibVersion = 0; +int eventPsmfPlayerStatusChange = -1; + enum PsmfPlayerError { ERROR_PSMF_NOT_INITIALIZED = 0x80615001, ERROR_PSMF_BAD_VERSION = 0x80615002, @@ -666,10 +669,20 @@ static PsmfPlayer *getPsmfPlayer(u32 psmfplayer) return 0; } +static void __PsmfPlayerStatusChange(u64 userdata, int cyclesLate) { + PsmfPlayerStatus status = PsmfPlayerStatus(userdata & 0xFFFFFFFF); + u32 psmfPlayer = userdata >> 32; + PsmfPlayer *player = getPsmfPlayer(psmfPlayer); + if (player) { + player->status = status; + } +} + void __PsmfInit() { videoPixelMode = GE_CMODE_32BIT_ABGR8888; videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; psmfPlayerLibVersion = 0; + eventPsmfPlayerStatusChange = CoreTiming::RegisterEvent("PsmfPlayerStatusChange", &__PsmfPlayerStatusChange); } void __PsmfPlayerLoadModule(int devkitVersion) { @@ -1129,8 +1142,9 @@ static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr) videoPixelMode = GE_CMODE_32BIT_ABGR8888; videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; - psmfplayer->status = PSMF_PLAYER_STATUS_INIT; - return hleDelayResult(0, "player create", 20000); + int delayUs = 20000; + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_INIT); + return hleDelayResult(0, "player create", delayUs); } static int scePsmfPlayerStop(u32 psmfPlayer) { @@ -1146,8 +1160,9 @@ static int scePsmfPlayerStop(u32 psmfPlayer) { psmfplayer->AbortFinish(); INFO_LOG(ME, "scePsmfPlayerStop(%08x)", psmfPlayer); - psmfplayer->status = PSMF_PLAYER_STATUS_STANDBY; - return hleDelayResult(0, "psmfplayer stop", 3000); + int delayUs = 3000; + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY); + return hleDelayResult(0, "psmfplayer stop", delayUs); } static int scePsmfPlayerBreak(u32 psmfPlayer) @@ -1275,8 +1290,7 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of psmfplayer->totalDurationTimestamp = psmfplayer->mediaengine->getLastTimeStamp(); - psmfplayer->status = PSMF_PLAYER_STATUS_STANDBY; - + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY); return hleDelayResult(0, "psmfplayer set", delayUs); } @@ -1460,7 +1474,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; - psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING; + if(delayUs == 0) + psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING; + else + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_PLAYING); psmfplayer->warmUp = 0; psmfplayer->mediaengine->openContext(); From c79d20ca07370bcb16a5cba959958b66c9cc81c2 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Mon, 19 Oct 2020 16:57:51 +0800 Subject: [PATCH 2/2] DoState. --- Core/HLE/scePsmf.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 9ae78eb018..fa829c28af 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -698,7 +698,7 @@ void __PsmfDoState(PointerWrap &p) { } void __PsmfPlayerDoState(PointerWrap &p) { - auto s = p.Section("scePsmfPlayer", 1, 2); + auto s = p.Section("scePsmfPlayer", 1, 3); if (!s) return; @@ -706,6 +706,10 @@ void __PsmfPlayerDoState(PointerWrap &p) { Do(p, videoPixelMode); Do(p, videoLoopStatus); if (s >= 2) { + if (s >= 3) { + Do(p, eventPsmfPlayerStatusChange); + CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); + } Do(p, psmfPlayerLibVersion); } else { // Assume the latest, which is what we were emulating before.