From 21fd209f0e2a3d58d4376b89cd769799f0ff9fd7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 8 Nov 2015 19:54:57 -0800 Subject: [PATCH] Atrac: Correct outputs of sceAtracGetSoundSample(). Without these being correct (especially without loopEnd vs. endSample being correct), Toukiden Kiwami doesn't play background music. --- Core/HLE/sceAtrac.cpp | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index fb466f307d..072480346b 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -1408,23 +1408,28 @@ static u32 sceAtracGetSecondBufferInfo(int atracID, u32 outposAddr, u32 outBytes static u32 sceAtracGetSoundSample(int atracID, u32 outEndSampleAddr, u32 outLoopStartSampleAddr, u32 outLoopEndSampleAddr) { Atrac *atrac = getAtrac(atracID); if (!atrac) { - ERROR_LOG(ME, "sceAtracGetSoundSample(%i, %08x, %08x, %08x): bad atrac ID", atracID, outEndSampleAddr, outLoopStartSampleAddr, outLoopEndSampleAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->data_buf) { - ERROR_LOG(ME, "sceAtracGetSoundSample(%i, %08x, %08x, %08x): no data", atracID, outEndSampleAddr, outLoopStartSampleAddr, outLoopEndSampleAddr); - return ATRAC_ERROR_NO_DATA; + return hleLogError(ME, ATRAC_ERROR_BAD_ATRACID, "bad atrac ID"); + } else if (atrac->bufferState == ATRAC_STATUS_NO_DATA) { + return hleLogError(ME, ATRAC_ERROR_NO_DATA, "no data"); + } else if (atrac->bufferState == ATRAC_STATUS_LOW_LEVEL) { + return hleLogError(ME, ATRAC_ERROR_IS_LOW_LEVEL, "cannot use for low level stream"); + } else if (atrac->bufferState == ATRAC_STATUS_FOR_SCESAS) { + return hleLogError(ME, ATRAC_ERROR_IS_FOR_SCESAS, "cannot use for SAS stream"); } else { - if (Memory::IsValidAddress(outEndSampleAddr)) - Memory::Write_U32(atrac->endSample, outEndSampleAddr); - if (Memory::IsValidAddress(outLoopStartSampleAddr)) - Memory::Write_U32(atrac->loopStartSample - atrac->firstSampleoffset, outLoopStartSampleAddr); - if (Memory::IsValidAddress(outLoopEndSampleAddr)) - Memory::Write_U32(atrac->loopEndSample - atrac->firstSampleoffset, outLoopEndSampleAddr); - if (Memory::IsValidAddress(outEndSampleAddr) && (Memory::IsValidAddress(outLoopStartSampleAddr)) && (Memory::IsValidAddress(outLoopEndSampleAddr))) - DEBUG_LOG(ME, "sceAtracGetSoundSample(%i, %08x[%08x], %08x[%d], %08x[%d])", atracID, outEndSampleAddr, atrac->endSample, outLoopStartSampleAddr, atrac->loopStartSample, outLoopEndSampleAddr, atrac->loopEndSample); - else - DEBUG_LOG_REPORT(ME, "sceAtracGetSoundSample(%i, %08x[%08x], %08x[%d], %08x[%d]) invalid address", atracID, outEndSampleAddr, atrac->endSample - 1, outLoopStartSampleAddr, atrac->loopStartSample, outLoopEndSampleAddr, atrac->loopEndSample); + auto outEndSample = PSPPointer::Create(outEndSampleAddr); + if (outEndSample.IsValid()) + *outEndSample = atrac->endSample; + auto outLoopStart = PSPPointer::Create(outLoopStartSampleAddr); + if (outLoopStart.IsValid()) + *outLoopStart = atrac->loopStartSample == -1 ? -1 : atrac->loopStartSample - atrac->firstSampleoffset - atrac->firstOffsetExtra(); + auto outLoopEnd = PSPPointer::Create(outLoopEndSampleAddr); + if (outLoopEnd.IsValid()) + *outLoopEnd = atrac->loopEndSample == -1 ? -1 : atrac->loopEndSample - atrac->firstSampleoffset - atrac->firstOffsetExtra(); + if (!outEndSample.IsValid() || !outLoopStart.IsValid() || !outLoopEnd.IsValid()) { + return hleReportError(ME, 0, "invalid address"); + } + return hleLogSuccessI(ME, 0); } return 0; } @@ -2399,7 +2404,7 @@ const HLEFunction sceAtrac3plus[] = { {0X36FAABFB, &WrapU_IU, "sceAtracGetNextSample", 'x', "ix" }, {0X9AE849A7, &WrapU_IU, "sceAtracGetRemainFrame", 'x', "ip" }, {0X83E85EA0, &WrapU_IUU, "sceAtracGetSecondBufferInfo", 'x', "ixx" }, - {0XA2BBA8BE, &WrapU_IUUU, "sceAtracGetSoundSample", 'x', "ixxx" }, + {0XA2BBA8BE, &WrapU_IUUU, "sceAtracGetSoundSample", 'x', "ippp" }, {0X5D268707, &WrapU_IUUU, "sceAtracGetStreamDataInfo", 'x', "ixxx" }, {0X61EB33F5, &WrapU_I, "sceAtracReleaseAtracID", 'x', "i" }, {0X644E5607, &WrapU_IIII, "sceAtracResetPlayPosition", 'x', "iiii" },