From c43442f801c04fb78c1d890c0652a9a51cb10e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 12 Apr 2024 10:28:13 +0200 Subject: [PATCH] Improve and cleanup logging in sceAtrac --- Core/HLE/sceAtrac.cpp | 294 ++++++++++++++++++++---------------------- 1 file changed, 140 insertions(+), 154 deletions(-) diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index 50bd94d83f..6f2455fcce 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -727,7 +727,6 @@ static Atrac *getAtrac(int atracID) { // This value is actually abused by games to store the SAS voice number. atrac->loopNum_ = atrac->context_->info.loopNum; } - return atrac; } @@ -1072,15 +1071,25 @@ u32 _AtracAddStreamData(int atracID, u32 bufPtr, u32 bytesToAdd) { return 0; } +static u32 AtracValidateData(const Atrac *atrac) { + if (!atrac) { + 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 { + return 0; + } +} + static u32 AtracValidateManaged(const Atrac *atrac) { if (!atrac) { 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"); + return hleLogError(ME, ATRAC_ERROR_IS_LOW_LEVEL, "low level stream, can't use"); } else if (atrac->bufferState_ == ATRAC_STATUS_FOR_SCESAS) { - return hleLogError(ME, ATRAC_ERROR_IS_FOR_SCESAS, "cannot use for SAS stream"); + return hleLogError(ME, ATRAC_ERROR_IS_FOR_SCESAS, "SAS stream, can't use"); } else { return 0; } @@ -1469,146 +1478,130 @@ static u32 sceAtracGetBufferInfoForResetting(int atracID, int sample, u32 buffer return hleLogWarning(ME, ATRAC_ERROR_BAD_SAMPLE, "invalid sample position"); } else { AtracGetResetBufferInfo(atrac, bufferInfo, sample); - return hleLogSuccessInfoI(ME, 0); } } static u32 sceAtracGetBitrate(int atracID, u32 outBitrateAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetBitrate(%i, %08x): bad atrac ID", atracID, outBitrateAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetBitrate(%i, %08x): no data", atracID, outBitrateAddr); - return ATRAC_ERROR_NO_DATA; - } else { - atrac->bitrate_ = (atrac->bytesPerFrame_ * 352800) / 1000; - if (atrac->codecType_ == PSP_MODE_AT_3_PLUS) - atrac->bitrate_ = ((atrac->bitrate_ >> 11) + 8) & 0xFFFFFFF0; - else - atrac->bitrate_ = (atrac->bitrate_ + 511) >> 10; - if (Memory::IsValidAddress(outBitrateAddr)) { - Memory::Write_U32(atrac->bitrate_, outBitrateAddr); - DEBUG_LOG(ME, "sceAtracGetBitrate(%i, %08x[%d])", atracID, outBitrateAddr, atrac->bitrate_); - } - else - DEBUG_LOG_REPORT(ME, "sceAtracGetBitrate(%i, %08x[%d]) invalid address", atracID, outBitrateAddr, atrac->bitrate_); + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; + } + + atrac->bitrate_ = (atrac->bytesPerFrame_ * 352800) / 1000; + if (atrac->codecType_ == PSP_MODE_AT_3_PLUS) + atrac->bitrate_ = ((atrac->bitrate_ >> 11) + 8) & 0xFFFFFFF0; + else + atrac->bitrate_ = (atrac->bitrate_ + 511) >> 10; + if (Memory::IsValidAddress(outBitrateAddr)) { + Memory::WriteUnchecked_U32(atrac->bitrate_, outBitrateAddr); + return hleLogSuccessI(ME, 0); + } else { + return hleLogError(ME, 0, "invalid address"); } - return 0; } static u32 sceAtracGetChannel(int atracID, u32 channelAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetChannel(%i, %08x): bad atrac ID", atracID, channelAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetChannel(%i, %08x): no data", atracID, channelAddr); - return ATRAC_ERROR_NO_DATA; - } else { - if (Memory::IsValidAddress(channelAddr)){ - Memory::Write_U32(atrac->channels_, channelAddr); - DEBUG_LOG(ME, "sceAtracGetChannel(%i, %08x[%d])", atracID, channelAddr, atrac->channels_); - } - else - DEBUG_LOG_REPORT(ME, "sceAtracGetChannel(%i, %08x[%d]) invalid address", atracID, channelAddr, atrac->channels_); + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; + } + + if (Memory::IsValidAddress(channelAddr)){ + Memory::WriteUnchecked_U32(atrac->channels_, channelAddr); + return hleLogSuccessI(ME, 0); + } else { + return hleLogError(ME, 0, "invalid address"); } - return 0; } static u32 sceAtracGetLoopStatus(int atracID, u32 loopNumAddr, u32 statusAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetLoopStatus(%i, %08x, %08x): bad atrac ID", atracID, loopNumAddr, statusAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetLoopStatus(%i, %08x, %08x): no data", atracID, loopNumAddr, statusAddr); - return ATRAC_ERROR_NO_DATA; - } else { - DEBUG_LOG(ME, "sceAtracGetLoopStatus(%i, %08x, %08x)", atracID, loopNumAddr, statusAddr); - if (Memory::IsValidAddress(loopNumAddr)) - Memory::Write_U32(atrac->loopNum_, loopNumAddr); - // return audio's loopinfo in at3 file - if (Memory::IsValidAddress(statusAddr)) { - if (atrac->loopinfo_.size() > 0) - Memory::Write_U32(1, statusAddr); - else - Memory::Write_U32(0, statusAddr); - } + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; + } + + if (Memory::IsValidAddress(loopNumAddr)) + Memory::WriteUnchecked_U32(atrac->loopNum_, loopNumAddr); + // return audio's loopinfo in at3 file + if (Memory::IsValidAddress(statusAddr)) { + if (atrac->loopinfo_.size() > 0) + Memory::WriteUnchecked_U32(1, statusAddr); + else + Memory::WriteUnchecked_U32(0, statusAddr); + return hleLogSuccessI(ME, 0); + } else { + return hleLogError(ME, 0, "invalid address"); } - return 0; } static u32 sceAtracGetInternalErrorInfo(int atracID, u32 errorAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetInternalErrorInfo(%i, %08x): bad atrac ID", atracID, errorAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - WARN_LOG(ME, "sceAtracGetInternalErrorInfo(%i, %08x): no data", atracID, errorAddr); - return ATRAC_ERROR_NO_DATA; - } else { - ERROR_LOG(ME, "UNIMPL sceAtracGetInternalErrorInfo(%i, %08x)", atracID, errorAddr); - if (Memory::IsValidAddress(errorAddr)) - Memory::Write_U32(0, errorAddr); + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; } + ERROR_LOG(ME, "UNIMPL sceAtracGetInternalErrorInfo(%i, %08x)", atracID, errorAddr); + if (Memory::IsValidAddress(errorAddr)) + Memory::WriteUnchecked_U32(0, errorAddr); return 0; } static u32 sceAtracGetMaxSample(int atracID, u32 maxSamplesAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetMaxSample(%i, %08x): bad atrac ID", atracID, maxSamplesAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetMaxSample(%i, %08x): no data", atracID, maxSamplesAddr); - return ATRAC_ERROR_NO_DATA; - } else { - DEBUG_LOG(ME, "sceAtracGetMaxSample(%i, %08x)", atracID, maxSamplesAddr); - if (Memory::IsValidAddress(maxSamplesAddr)) { - Memory::Write_U32(atrac->SamplesPerFrame(), maxSamplesAddr); - } + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; + } + + if (Memory::IsValidAddress(maxSamplesAddr)) { + Memory::WriteUnchecked_U32(atrac->SamplesPerFrame(), maxSamplesAddr); + return hleLogSuccessI(ME, 0); + } else { + return hleLogError(ME, 0, "invalid address"); } - return 0; } static u32 sceAtracGetNextDecodePosition(int atracID, u32 outposAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetNextDecodePosition(%i, %08x): bad atrac ID", atracID, outposAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetNextDecodePosition(%i, %08x): no data", atracID, outposAddr); - return ATRAC_ERROR_NO_DATA; - } else { - DEBUG_LOG(ME, "sceAtracGetNextDecodePosition(%i, %08x)", atracID, outposAddr); - if (atrac->currentSample_ >= atrac->endSample_) { - if (Memory::IsValidAddress(outposAddr)) - Memory::Write_U32(0, outposAddr); - return ATRAC_ERROR_ALL_DATA_DECODED; - } else { - if (Memory::IsValidAddress(outposAddr)) - Memory::Write_U32(atrac->currentSample_, outposAddr); - } + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; + } + + if (Memory::IsValidAddress(outposAddr)) { + if (atrac->currentSample_ >= atrac->endSample_) { + Memory::WriteUnchecked_U32(0, outposAddr); + return hleLogSuccessI(ME, ATRAC_ERROR_ALL_DATA_DECODED, "all data decoded"); + } else { + Memory::WriteUnchecked_U32(atrac->currentSample_, outposAddr); + return hleLogSuccessI(ME, 0); + } + } else { + return hleLogError(ME, 0, "invalid address"); } - return 0; } static u32 sceAtracGetNextSample(int atracID, u32 outNAddr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetNextSample(%i, %08x): bad atrac ID", atracID, outNAddr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetNextSample(%i, %08x): no data", atracID, outNAddr); - return ATRAC_ERROR_NO_DATA; + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; } else { if (atrac->currentSample_ >= atrac->endSample_) { if (Memory::IsValidAddress(outNAddr)) - Memory::Write_U32(0, outNAddr); - DEBUG_LOG(ME, "sceAtracGetNextSample(%i, %08x): 0 samples left", atracID, outNAddr); - return 0; + Memory::WriteUnchecked_U32(0, outNAddr); + return hleLogSuccessI(ME, 0, "0 samples left"); } else { // It seems like the PSP aligns the sample position to 0x800...? u32 skipSamples = atrac->firstSampleOffset_ + atrac->FirstOffsetExtra(); @@ -1628,11 +1621,10 @@ static u32 sceAtracGetNextSample(int atracID, u32 outNAddr) { atrac->bufferState_ = ATRAC_STATUS_ALL_DATA_LOADED; } if (Memory::IsValidAddress(outNAddr)) - Memory::Write_U32(numSamples, outNAddr); - DEBUG_LOG(ME, "sceAtracGetNextSample(%i, %08x): %d samples left", atracID, outNAddr, numSamples); + Memory::WriteUnchecked_U32(numSamples, outNAddr); + return hleLogSuccessI(ME, 0, "%d samples left", numSamples); } } - return 0; } // Obtains the number of frames remaining in the buffer which can be decoded. @@ -1724,11 +1716,11 @@ static u32 sceAtracGetStreamDataInfo(int atracID, u32 writePtrAddr, u32 writable atrac->CalculateStreamInfo(&readOffset); if (Memory::IsValidAddress(writePtrAddr)) - Memory::Write_U32(atrac->first_.addr + atrac->first_.offset, writePtrAddr); + Memory::WriteUnchecked_U32(atrac->first_.addr + atrac->first_.offset, writePtrAddr); if (Memory::IsValidAddress(writableBytesAddr)) - Memory::Write_U32(atrac->first_.writableBytes, writableBytesAddr); + Memory::WriteUnchecked_U32(atrac->first_.writableBytes, writableBytesAddr); if (Memory::IsValidAddress(readOffsetAddr)) - Memory::Write_U32(readOffset, readOffsetAddr); + Memory::WriteUnchecked_U32(readOffset, readOffsetAddr); return hleLogSuccessI(ME, 0); } @@ -1989,6 +1981,7 @@ static int _AtracSetData(Atrac *atrac, u32 buffer, u32 readSize, u32 bufferSize, static int _AtracSetData(int atracID, u32 buffer, u32 readSize, u32 bufferSize, bool needReturnAtracID = false) { Atrac *atrac = getAtrac(atracID); + // Don't use AtracValidateManaged here. if (!atrac) return hleLogError(ME, ATRAC_ERROR_BAD_ATRACID, "invalid atrac ID"); int ret = _AtracSetData(atrac, buffer, readSize, bufferSize, needReturnAtracID ? atracID : 0); @@ -1998,9 +1991,11 @@ static int _AtracSetData(int atracID, u32 buffer, u32 readSize, u32 bufferSize, static u32 sceAtracSetHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u32 bufferSize) { Atrac *atrac = getAtrac(atracID); + // Don't use AtracValidateManaged here. if (!atrac) { - return hleLogError(ME, ATRAC_ERROR_BAD_ATRACID, "bad atrac ID"); + return hleLogError(ME, ATRAC_ERROR_BAD_ATRACID, "invalid atrac ID"); } + if (readSize > bufferSize) { return hleLogError(ME, ATRAC_ERROR_INCORRECT_READ_SIZE, "read size too large"); } @@ -2037,8 +2032,7 @@ static u32 sceAtracSetSecondBuffer(int atracID, u32 secondBuffer, u32 secondBuff atrac->second_.addr = secondBuffer; atrac->second_.size = secondBufferSize; atrac->second_.fileoffset = secondFileOffset; - - return 0; + return hleLogSuccessI(ME, 0); } static u32 sceAtracSetData(int atracID, u32 buffer, u32 bufferSize) { @@ -2115,30 +2109,25 @@ static u32 sceAtracStartEntry() { static u32 sceAtracSetLoopNum(int atracID, int loopNum) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracSetLoopNum(%i, %i): bad atrac ID", atracID, loopNum); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracSetLoopNum(%i, %i): no data", atracID, loopNum); - return ATRAC_ERROR_NO_DATA; - } else { - if (atrac->loopinfo_.size() == 0) { - DEBUG_LOG(ME, "sceAtracSetLoopNum(%i, %i): error: no loop information", atracID, loopNum); - return ATRAC_ERROR_NO_LOOP_INFORMATION; - } - // Spammed in MHU - DEBUG_LOG(ME, "sceAtracSetLoopNum(%i, %i)", atracID, loopNum); - atrac->loopNum_ = loopNum; - if (loopNum != 0 && atrac->loopinfo_.size() == 0) { - // Just loop the whole audio - atrac->loopStartSample_ = atrac->firstSampleOffset_ + atrac->FirstOffsetExtra(); - atrac->loopEndSample_ = atrac->endSample_ + atrac->firstSampleOffset_ + atrac->FirstOffsetExtra(); - } - if (atrac->context_.IsValid()) { - _AtracGenerateContext(atrac); - } + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; } - return 0; + if (atrac->loopinfo_.size() == 0) { + return hleLogError(ME, ATRAC_ERROR_NO_LOOP_INFORMATION, "no loop information"); + } + // Spammed in MHU + atrac->loopNum_ = loopNum; + if (loopNum != 0 && atrac->loopinfo_.size() == 0) { + // Just loop the whole audio + atrac->loopStartSample_ = atrac->firstSampleOffset_ + atrac->FirstOffsetExtra(); + atrac->loopEndSample_ = atrac->endSample_ + atrac->firstSampleOffset_ + atrac->FirstOffsetExtra(); + } + if (atrac->context_.IsValid()) { + _AtracGenerateContext(atrac); + } + return hleLogSuccessI(ME, 0); } static int sceAtracReinit(int at3Count, int at3plusCount) { @@ -2178,30 +2167,27 @@ static int sceAtracReinit(int at3Count, int at3plusCount) { // If we ran out of space, we still initialize some, but return an error. int result = space >= 0 ? 0 : (int)SCE_KERNEL_ERROR_OUT_OF_MEMORY; if (atracInited || next == 0) { - INFO_LOG(ME, "sceAtracReinit(%d, %d)", at3Count, at3plusCount); atracInited = true; - return result; + return hleLogSuccessInfoI(ME, result); } else { - INFO_LOG(ME, "sceAtracReinit(%d, %d): init", at3Count, at3plusCount); atracInited = true; - return hleDelayResult(result, "atrac reinit", 400); + return hleDelayResult(hleLogSuccessInfoI(ME, result), "atrac reinit", 400); } } static int sceAtracGetOutputChannel(int atracID, u32 outputChanPtr) { Atrac *atrac = getAtrac(atracID); - if (!atrac) { - ERROR_LOG(ME, "sceAtracGetOutputChannel(%i, %08x): bad atrac ID", atracID, outputChanPtr); - return ATRAC_ERROR_BAD_ATRACID; - } else if (!atrac->dataBuf_) { - ERROR_LOG(ME, "sceAtracGetOutputChannel(%i, %08x): no data", atracID, outputChanPtr); - return ATRAC_ERROR_NO_DATA; - } else { - DEBUG_LOG(ME, "sceAtracGetOutputChannel(%i, %08x)", atracID, outputChanPtr); - if (Memory::IsValidAddress(outputChanPtr)) - Memory::Write_U32(atrac->outputChannels_, outputChanPtr); + u32 err = AtracValidateData(atrac); + if (err != 0) { + // Already logged. + return err; + } + if (Memory::IsValidAddress(outputChanPtr)) { + Memory::Write_U32(atrac->outputChannels_, outputChanPtr); + return hleLogSuccessI(ME, 0); + } else { + return hleLogError(ME, 0, "invalid address"); } - return 0; } static int sceAtracIsSecondBufferNeeded(int atracID) { @@ -2219,6 +2205,7 @@ static int sceAtracIsSecondBufferNeeded(int atracID) { static int sceAtracSetMOutHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u32 bufferSize) { Atrac *atrac = getAtrac(atracID); + // Don't use AtracValidate* here. if (!atrac) { return hleLogError(ME, ATRAC_ERROR_BAD_ATRACID, "bad atrac ID"); } @@ -2238,14 +2225,14 @@ static int sceAtracSetMOutHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u return hleReportError(ME, ATRAC_ERROR_NOT_MONO, "not mono data"); } else { atrac->outputChannels_ = 1; - ret = _AtracSetData(atracID, buffer, readSize, bufferSize); + return _AtracSetData(atracID, buffer, readSize, bufferSize); } - return ret; } // Note: This doesn't seem to be part of any available libatrac3plus library. static u32 sceAtracSetMOutData(int atracID, u32 buffer, u32 bufferSize) { Atrac *atrac = getAtrac(atracID); + // Don't use AtracValidate* here. if (!atrac) { return hleLogError(ME, ATRAC_ERROR_BAD_ATRACID, "bad atrac ID"); } @@ -2262,9 +2249,8 @@ static u32 sceAtracSetMOutData(int atracID, u32 buffer, u32 bufferSize) { return hleReportError(ME, ATRAC_ERROR_NOT_MONO, "not mono data"); } else { atrac->outputChannels_ = 1; - ret = _AtracSetData(atracID, buffer, bufferSize, bufferSize); + return _AtracSetData(atracID, buffer, bufferSize, bufferSize); } - return ret; } // Note: This doesn't seem to be part of any available libatrac3plus library.