Add breakpoints to most sceAtrac mem access.

This commit is contained in:
Unknown W. Brackets 2014-09-22 22:30:30 -07:00
parent 6b6bf3f8e6
commit 4702ae0e41
5 changed files with 25 additions and 13 deletions

View File

@ -24,6 +24,7 @@
#include "Core/MemMap.h"
#include "Core/Reporting.h"
#include "Core/Config.h"
#include "Core/Debugger/Breakpoints.h"
#include "Core/HW/MediaEngine.h"
#include "Core/HW/BufferQueue.h"
#include "Common/ChunkFile.h"
@ -549,12 +550,13 @@ u32 sceAtracGetAtracID(int codecType) {
return atracID;
}
u32 _AtracAddStreamData(int atracID, u8 *buf, u32 bytesToAdd) {
u32 _AtracAddStreamData(int atracID, u32 bufPtr, u32 bytesToAdd) {
Atrac *atrac = getAtrac(atracID);
if (!atrac)
return 0;
int addbytes = std::min(bytesToAdd, atrac->first.filesize - atrac->first.fileoffset);
memcpy(atrac->data_buf + atrac->first.fileoffset, buf, addbytes);
Memory::Memcpy(atrac->data_buf + atrac->first.fileoffset, bufPtr, addbytes);
CBreakPoints::ExecMemCheck(bufPtr, false, addbytes, currentMIPS->pc);
atrac->first.size += bytesToAdd;
if (atrac->first.size > atrac->first.filesize)
atrac->first.size = atrac->first.filesize;
@ -590,6 +592,7 @@ u32 sceAtracAddStreamData(int atracID, u32 bytesToAdd) {
if (bytesToAdd > 0) {
int addbytes = std::min(bytesToAdd, atrac->first.filesize - atrac->first.fileoffset);
Memory::Memcpy(atrac->data_buf + atrac->first.fileoffset, atrac->first.addr + atrac->first.offset, addbytes);
CBreakPoints::ExecMemCheck(atrac->first.addr + atrac->first.offset, false, addbytes, currentMIPS->pc);
}
atrac->first.size += bytesToAdd;
if (atrac->first.size > atrac->first.filesize)
@ -601,7 +604,7 @@ u32 sceAtracAddStreamData(int atracID, u32 bytesToAdd) {
return 0;
}
u32 _AtracDecodeData(int atracID, u8* outbuf, u32 *SamplesNum, u32* finish, int *remains) {
u32 _AtracDecodeData(int atracID, u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) {
Atrac *atrac = getAtrac(atracID);
u32 ret = 0;
@ -694,6 +697,10 @@ u32 _AtracDecodeData(int atracID, u8* outbuf, u32 *SamplesNum, u32* finish, int
atrac->pFrame->extended_data[1] + inbufOffset,
};
avret = swr_convert(atrac->pSwrCtx, &out, numSamples, inbuf, numSamples);
if (outbufPtr != 0) {
u32 outBytes = numSamples * atrac->atracOutputChannels * sizeof(s16);
CBreakPoints::ExecMemCheck(outbufPtr, true, outBytes, currentMIPS->pc);
}
if (avret < 0) {
ERROR_LOG(ME, "swr_convert: Error while converting %d", avret);
}
@ -744,7 +751,7 @@ u32 sceAtracDecodeData(int atracID, u32 outAddr, u32 numSamplesAddr, u32 finishF
u32 numSamples = 0;
u32 finish = 0;
int remains = 0;
ret = _AtracDecodeData(atracID, Memory::GetPointer(outAddr), &numSamples, &finish, &remains);
ret = _AtracDecodeData(atracID, Memory::GetPointer(outAddr), outAddr, &numSamples, &finish, &remains);
if (ret != (int)ATRAC_ERROR_BAD_ATRACID && ret != (int)ATRAC_ERROR_NO_DATA) {
if (Memory::IsValidAddress(numSamplesAddr))
Memory::Write_U32(numSamples, numSamplesAddr);
@ -1237,7 +1244,9 @@ int _AtracSetData(Atrac *atrac, u32 buffer, u32 bufferSize) {
#ifdef USE_FFMPEG
atrac->data_buf = new u8[atrac->first.filesize];
Memory::Memcpy(atrac->data_buf, buffer, std::min(bufferSize, atrac->first.filesize));
u32 copybytes = std::min(bufferSize, atrac->first.filesize);
Memory::Memcpy(atrac->data_buf, buffer, copybytes);
CBreakPoints::ExecMemCheck(buffer, false, copybytes, currentMIPS->pc);
return __AtracSetContext(atrac);
#endif // USE_FFMPEG
@ -1248,7 +1257,9 @@ int _AtracSetData(Atrac *atrac, u32 buffer, u32 bufferSize) {
WARN_LOG(ME, "This is an atrac3+ stereo audio");
}
atrac->data_buf = new u8[atrac->first.filesize];
Memory::Memcpy(atrac->data_buf, buffer, std::min(bufferSize, atrac->first.filesize));
u32 copybytes = std::min(bufferSize, atrac->first.filesize);
Memory::Memcpy(atrac->data_buf, buffer, copybytes);
CBreakPoints::ExecMemCheck(buffer, false, copybytes, currentMIPS->pc);
return __AtracSetContext(atrac);
}
@ -1868,6 +1879,7 @@ int sceAtracLowLevelDecode(int atracID, u32 sourceAddr, u32 sourceBytesConsumedA
u32 sourcebytes = atrac->first.writableBytes;
if (sourcebytes > 0) {
Memory::Memcpy(atrac->data_buf + atrac->first.size, sourceAddr, sourcebytes);
CBreakPoints::ExecMemCheck(sourceAddr, false, sourcebytes, currentMIPS->pc);
if (atrac->decodePos >= atrac->first.size) {
atrac->decodePos = atrac->first.size;
}

View File

@ -66,6 +66,6 @@ typedef struct
// provide some decoder interface
u32 _AtracAddStreamData(int atracID, u8 *buf, u32 bytesToAdd);
u32 _AtracDecodeData(int atracID, u8* outbuf, u32 *SamplesNum, u32* finish, int *remains);
u32 _AtracAddStreamData(int atracID, u32 bufPtr, u32 bytesToAdd);
u32 _AtracDecodeData(int atracID, u8* outbuf, u32 outbufPtr, u32 *SamplesNum, u32* finish, int *remains);
int _AtracGetIDByContext(u32 contextAddr);

View File

@ -564,7 +564,7 @@ u32 __sceSasConcatenateATRAC3(u32 core, int voiceNum, u32 atrac3DataAddr, int at
DEBUG_LOG_REPORT(SCESAS, "__sceSasConcatenateATRAC3(%08x, %i, %08x, %i)", core, voiceNum, atrac3DataAddr, atrac3DataLength);
SasVoice &v = sas->voices[voiceNum];
if (Memory::IsValidAddress(atrac3DataAddr))
v.atrac3.addStreamData(Memory::GetPointer(atrac3DataAddr), atrac3DataLength);
v.atrac3.addStreamData(atrac3DataAddr, atrac3DataLength);
return 0;
}

View File

@ -188,7 +188,7 @@ int SasAtrac3::getNextSamples(s16* outbuf, int wantedSamples) {
u32 numSamples = 0;
int remains = 0;
static s16 buf[0x800];
_AtracDecodeData(atracID, (u8*)buf, &numSamples, &finish, &remains);
_AtracDecodeData(atracID, (u8*)buf, 0, &numSamples, &finish, &remains);
if (numSamples > 0)
sampleQueue->push((u8*)buf, numSamples * sizeof(s16));
else
@ -198,9 +198,9 @@ int SasAtrac3::getNextSamples(s16* outbuf, int wantedSamples) {
return finish;
}
int SasAtrac3::addStreamData(u8* buf, u32 addbytes) {
int SasAtrac3::addStreamData(u32 bufPtr, u32 addbytes) {
if (atracID > 0) {
_AtracAddStreamData(atracID, buf, addbytes);
_AtracAddStreamData(atracID, bufPtr, addbytes);
}
return 0;
}

View File

@ -126,7 +126,7 @@ public:
~SasAtrac3() { if (sampleQueue) delete sampleQueue; }
int setContext(u32 context);
int getNextSamples(s16* outbuf, int wantedSamples);
int addStreamData(u8* buf, u32 addbytes);
int addStreamData(u32 bufPtr, u32 addbytes);
void DoState(PointerWrap &p);
private: