mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #13562 from shenweip/psmfplayer-status
PsmfPlayer:The status will not be changed until the delay result is finished.
This commit is contained in:
commit
d9cb457c62
1 changed files with 29 additions and 8 deletions
|
@ -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) {
|
||||
|
@ -685,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;
|
||||
|
||||
|
@ -693,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.
|
||||
|
@ -1129,8 +1146,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 +1164,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 +1294,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 +1478,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();
|
||||
|
|
Loading…
Add table
Reference in a new issue