diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 0e3895d01d..893459c167 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -74,11 +74,12 @@ struct PsmfData { struct PsmfPlayerData { int videoCodec; - int videoStreamNum; - int audioCodec; - int audioStreamNum; - int playMode; - int playSpeed; + int videoStreamNum; + int audioCodec; + int audioStreamNum; + int playMode; + int playSpeed; + long psmfPlayerLastTimestamp; }; struct PsmfEntry { @@ -144,17 +145,17 @@ public: void DoState(PointerWrap &p); int videoCodec; - int videoStreamNum; - int audioCodec; - int audioStreamNum; - int playMode; - int playSpeed; + int videoStreamNum; + int audioCodec; + int audioStreamNum; + int playMode; + int playSpeed; + long psmfPlayerLastTimestamp; int displayBuffer; int displayBufferSize; int playbackThreadPriority; int psmfMaxAheadTimestamp; - long psmfPlayerLastTimestamp; SceMpegAu psmfPlayerAtracAu; SceMpegAu psmfPlayerAvcAu; @@ -249,6 +250,7 @@ PsmfPlayer::PsmfPlayer(u32 data) { audioStreamNum = Memory::Read_U32(data + 12); playMode = Memory::Read_U32(data+ 16); playSpeed = Memory::Read_U32(data + 20); + psmfPlayerLastTimestamp = bswap32(Memory::Read_U32(data + PSMF_LAST_TIMESTAMP_OFFSET)) ; } void Psmf::DoState(PointerWrap &p) { @@ -298,11 +300,11 @@ void Psmf::DoState(PointerWrap &p) { void PsmfPlayer::DoState(PointerWrap &p) { p.Do(videoCodec); - p.Do(videoStreamNum); - p.Do(audioCodec); - p.Do(audioStreamNum); - p.Do(playMode); - p.Do(playSpeed); + p.Do(videoStreamNum); + p.Do(audioCodec); + p.Do(audioStreamNum); + p.Do(playMode); + p.Do(playSpeed); p.Do(displayBuffer); p.Do(displayBufferSize); @@ -367,9 +369,6 @@ void __PsmfDoState(PointerWrap &p) } } - // TODO: Actually load this from a map. - psmfPlayerStatus = PSMF_PLAYER_STATUS_NONE; - p.DoMarker("scePsmf"); } @@ -652,47 +651,22 @@ u32 scePsmfGetEPidWithTimestamp(u32 psmfStruct, u32 ts) return psmf->psmfEntry.id; } -const HLEFunction scePsmf[] = { - {0xc22c8327, WrapU_UU, "scePsmfSetPsmf"}, - {0xC7DB3A5B, WrapU_UUU, "scePsmfGetCurrentStreamType"}, - {0x28240568, WrapU_U, "scePsmfGetCurrentStreamNumber"}, - {0x1E6D9013, WrapU_UUU, "scePsmfSpecifyStreamWithStreamType"}, - {0x0C120E1D, WrapU_UUU, "scePsmfSpecifyStreamWithStreamTypeNumber"}, - {0x4BC9BDE0, 0, "scePsmfSpecifyStream"}, - {0x76D3AEBA, WrapU_UU, "scePsmfGetPresentationStartTime"}, - {0xBD8AE0D8, WrapU_UU, "scePsmfGetPresentationEndTime"}, - {0xEAED89CD, WrapU_U, "scePsmfGetNumberOfStreams"}, - {0x7491C438, WrapU_U, "scePsmfGetNumberOfEPentries"}, - {0x0BA514E5, WrapU_UU, "scePsmfGetVideoInfo"}, - {0xA83F7113, WrapU_UU, "scePsmfGetAudioInfo"}, - {0x971A3A90, 0, "scePsmfCheckEPmap"}, - {0x68d42328, WrapU_UU, "scePsmfGetNumberOfSpecificStreams"}, - {0x5b70fcc1, 0, "scePsmfQueryStreamOffset"}, - {0x9553cc91, 0, "scePsmfQueryStreamSize"}, - {0xB78EB9E9, WrapU_UU, "scePsmfGetHeaderSize"}, - {0xA5EBFE81, WrapU_UU, "scePsmfGetStreamSize"}, - {0xE1283895, WrapU_U, "scePsmfGetPsmfVersion"}, - {0x2673646B, 0, "scePsmfVerifyPsmf"}, - {0x4E624A34, WrapU_UIU, "scePsmfGetEPWithId"}, - {0x7C0E7AC3, WrapU_UUU, "scePsmfGetEPWithTimestamp"}, - {0x5F457515, WrapU_UU, "scePsmfGetEPidWithTimestamp"}, -}; - int scePsmfPlayerCreate(u32 psmfPlayer, u32 psmfPlayerDataAddr) { ERROR_LOG(HLE, "UNIMPL scePsmfPlayerCreate(%08x, %08x)", psmfPlayer, psmfPlayerDataAddr); PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer) { - psmfplayer = new PsmfPlayer(psmfPlayerDataAddr); - psmfPlayerMap[psmfPlayer] = psmfplayer; + ERROR_LOG(HLE, "scePsmfPlayerCreate - invalid psmf"); + return ERROR_PSMF_NOT_FOUND; } + if (Memory::IsValidAddress(psmfPlayerDataAddr)) { psmfplayer->displayBuffer = Memory::Read_U32(psmfPlayerDataAddr); psmfplayer->displayBufferSize = Memory::Read_U32(psmfPlayerDataAddr + 4); psmfplayer->playbackThreadPriority = Memory::Read_U32(psmfPlayerDataAddr + 8); } - psmfplayer->psmfMaxAheadTimestamp = getMaxAheadTimestamp(581); + psmfplayer->psmfMaxAheadTimestamp = getMaxAheadTimestamp(581); psmfPlayerStatus = PSMF_PLAYER_STATUS_INIT; return 0; } @@ -748,14 +722,14 @@ int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts) data.audioStreamNum = psmfplayer->audioStreamNum; data.playMode = psmfplayer->playMode; data.playSpeed = psmfplayer->playSpeed; + data.psmfPlayerLastTimestamp = psmfplayer->psmfPlayerLastTimestamp; Memory::WriteStruct(psmfPlayer, &data); psmfplayer->psmfPlayerAtracAu.dts = initPts; - psmfplayer->psmfPlayerAtracAu.pts = initPts; - psmfplayer->psmfPlayerAvcAu.dts = initPts; - psmfplayer->psmfPlayerAvcAu.pts = initPts; + psmfplayer->psmfPlayerAtracAu.pts = initPts; + psmfplayer->psmfPlayerAvcAu.dts = initPts; + psmfplayer->psmfPlayerAvcAu.pts = initPts; - //TODO : analyzePSMFLastTimestamp psmfPlayerStatus = PSMF_PLAYER_STATUS_PLAYING; return 0; } @@ -776,7 +750,7 @@ int scePsmfPlayerUpdate(u32 psmfPlayer) return ERROR_PSMF_NOT_FOUND; } - if (psmfplayer->psmfPlayerAvcAu.pts > 0) { + if (psmfplayer->psmfPlayerAvcAu.pts > 0) { if (psmfplayer->psmfPlayerAvcAu.pts > psmfplayer->psmfPlayerLastTimestamp) { psmfPlayerStatus = PSMF_PLAYER_STATUS_PLAYING_FINISHED; } @@ -981,6 +955,32 @@ u32 scePsmfPlayerConfigPlayer(u32 psmfPlayer, int configMode, int configAttr) return 0; } +const HLEFunction scePsmf[] = { + {0xc22c8327, WrapU_UU, "scePsmfSetPsmf"}, + {0xC7DB3A5B, WrapU_UUU, "scePsmfGetCurrentStreamType"}, + {0x28240568, WrapU_U, "scePsmfGetCurrentStreamNumber"}, + {0x1E6D9013, WrapU_UUU, "scePsmfSpecifyStreamWithStreamType"}, + {0x0C120E1D, WrapU_UUU, "scePsmfSpecifyStreamWithStreamTypeNumber"}, + {0x4BC9BDE0, 0, "scePsmfSpecifyStream"}, + {0x76D3AEBA, WrapU_UU, "scePsmfGetPresentationStartTime"}, + {0xBD8AE0D8, WrapU_UU, "scePsmfGetPresentationEndTime"}, + {0xEAED89CD, WrapU_U, "scePsmfGetNumberOfStreams"}, + {0x7491C438, WrapU_U, "scePsmfGetNumberOfEPentries"}, + {0x0BA514E5, WrapU_UU, "scePsmfGetVideoInfo"}, + {0xA83F7113, WrapU_UU, "scePsmfGetAudioInfo"}, + {0x971A3A90, 0, "scePsmfCheckEPmap"}, + {0x68d42328, WrapU_UU, "scePsmfGetNumberOfSpecificStreams"}, + {0x5b70fcc1, 0, "scePsmfQueryStreamOffset"}, + {0x9553cc91, 0, "scePsmfQueryStreamSize"}, + {0xB78EB9E9, WrapU_UU, "scePsmfGetHeaderSize"}, + {0xA5EBFE81, WrapU_UU, "scePsmfGetStreamSize"}, + {0xE1283895, WrapU_U, "scePsmfGetPsmfVersion"}, + {0x2673646B, 0, "scePsmfVerifyPsmf"}, + {0x4E624A34, WrapU_UIU, "scePsmfGetEPWithId"}, + {0x7C0E7AC3, WrapU_UUU, "scePsmfGetEPWithTimestamp"}, + {0x5F457515, WrapU_UU, "scePsmfGetEPidWithTimestamp"}, +}; + const HLEFunction scePsmfPlayer[] = { {0x235d8787, WrapI_UU, "scePsmfPlayerCreate"}, diff --git a/Core/HLE/sceSas.cpp b/Core/HLE/sceSas.cpp index 377034a0a0..1e4c8c7a9b 100644 --- a/Core/HLE/sceSas.cpp +++ b/Core/HLE/sceSas.cpp @@ -134,7 +134,7 @@ u32 sceSasSetVoice(u32 core, int voiceNum, u32 vagAddr, int size, int loop) v.type = VOICETYPE_VAG; v.vagAddr = vagAddr; v.vagSize = size; - v.loop = loop ? true : false; + v.loop = loop ? false : true; v.ChangedParams(true); return 0; } @@ -162,7 +162,7 @@ u32 sceSasSetVoicePCM(u32 core, int voiceNum, u32 pcmAddr, int size, int loop) v.type = VOICETYPE_PCM; v.pcmAddr = pcmAddr; v.pcmSize = size; - v.loop = loop ? true : false; + v.loop = loop ? false : true; v.playing = true; v.ChangedParams(true); return 0;