From 8d94f8446447f06eb3ed755b084fb0b8152460a7 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 24 Jan 2013 19:21:32 +0800 Subject: [PATCH 1/3] Fix black intro for Naruto Shippuden Kizuna Drive --- Core/HLE/scePsmf.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 0e3895d01d..5c37d8c5d7 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -74,11 +74,11 @@ 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; }; struct PsmfEntry { @@ -144,11 +144,11 @@ 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; int displayBuffer; int displayBufferSize; @@ -683,16 +683,17 @@ 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; } @@ -751,9 +752,9 @@ int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts) 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; From f6598d2cd6527791507aaa6cf1c428dc21272ce9 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 24 Jan 2013 19:40:26 +0800 Subject: [PATCH 2/3] Add psmfPlayerLastTimestamp to psmfplayer --- Core/HLE/scePsmf.cpp | 77 ++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 5c37d8c5d7..893459c167 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -79,6 +79,7 @@ struct PsmfPlayerData { int audioStreamNum; int playMode; int playSpeed; + long psmfPlayerLastTimestamp; }; struct PsmfEntry { @@ -149,12 +150,12 @@ public: 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,32 +651,6 @@ 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); @@ -686,14 +659,14 @@ int scePsmfPlayerCreate(u32 psmfPlayer, u32 psmfPlayerDataAddr) 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; } @@ -749,6 +722,7 @@ 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; @@ -756,7 +730,6 @@ int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts) psmfplayer->psmfPlayerAvcAu.dts = initPts; psmfplayer->psmfPlayerAvcAu.pts = initPts; - //TODO : analyzePSMFLastTimestamp psmfPlayerStatus = PSMF_PLAYER_STATUS_PLAYING; return 0; } @@ -777,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; } @@ -982,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"}, From ae9fcb5a6fe9e06707ba7f2cda0abf06d47280bb Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 24 Jan 2013 20:13:12 +0800 Subject: [PATCH 3/3] Fix high pitch noise and looping issues in few games --- Core/HLE/sceSas.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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;