Merge the "Analyze" function into SetData

This commit is contained in:
Henrik Rydgård
2025-03-16 19:32:00 +01:00
parent a0cc07559e
commit 4fbdb58beb
5 changed files with 60 additions and 146 deletions
+31 -45
View File
@@ -167,16 +167,6 @@ void Atrac::ResetData() {
kernelMemory.Free(context_.ptr);
}
void Atrac::AnalyzeReset() {
// Reset some values.
track_.AnalyzeReset();
currentSample_ = 0;
loopNum_ = 0;
decodePos_ = 0;
bufferPos_ = 0;
}
u8 *Atrac::BufferStart() {
return ignoreDataBuf_ ? Memory::GetPointerWrite(first_.addr) : dataBuf_;
}
@@ -241,37 +231,6 @@ void Track::DebugLog() {
DEBUG_LOG(Log::ME, "loopStartSample: %d loopEndSample: %d", loopStartSample, loopEndSample);
}
int Atrac::Analyze(const Track &track, u32 addr, u32 size, u32 fileSize) {
first_ = {};
first_.addr = addr;
first_.size = size;
AnalyzeReset();
// 72 is about the size of the minimum required data to even be valid.
if (size < 72) {
return SCE_ERROR_ATRAC_SIZE_TOO_SMALL;
}
// TODO: Check the range (addr, size) instead.
if (!Memory::IsValidAddress(addr)) {
return SCE_KERNEL_ERROR_ILLEGAL_ADDRESS;
}
bool aa3 = fileSize != 0;
// TODO: Validate stuff.
if (!aa3 && Memory::ReadUnchecked_U32(addr) != RIFF_CHUNK_MAGIC) {
ERROR_LOG(Log::ME, "Couldn't find RIFF header");
return SCE_ERROR_ATRAC_UNKNOWN_FORMAT;
}
track_ = track;
first_._filesize_dontuse = aa3 ? fileSize : track_.fileSize;
track_.DebugLog();
return 0;
}
int AnalyzeAtracTrack(u32 addr, u32 size, Track *track) {
struct RIFFFmtChunk {
u16_le fmtTag;
@@ -692,9 +651,31 @@ int Atrac::GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) {
return 0;
}
int Atrac::SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) {
int Atrac::SetData(const Track &track, u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) {
// 72 is about the size of the minimum required data to even be valid.
if (readSize < 72) {
return SCE_ERROR_ATRAC_SIZE_TOO_SMALL;
}
// TODO: Check the range (addr, size) instead.
if (!Memory::IsValidAddress(buffer)) {
return SCE_KERNEL_ERROR_ILLEGAL_ADDRESS;
}
first_ = {};
first_.addr = buffer;
first_.size = readSize;
currentSample_ = 0;
loopNum_ = 0;
decodePos_ = 0;
bufferPos_ = 0;
outputChannels_ = outputChannels;
track_ = track;
first_._filesize_dontuse = track_.fileSize;
track_.DebugLog();
if (outputChannels != track_.channels) {
WARN_LOG(Log::ME, "Atrac::SetData: outputChannels %d doesn't match track_.channels %d", outputChannels, track_.channels);
}
@@ -1195,7 +1176,10 @@ int Atrac::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrit
return 0;
}
void Atrac::InitLowLevel(u32 paramsAddr, bool jointStereo) {
void Atrac::InitLowLevel(u32 paramsAddr, bool jointStereo, int codecType) {
track_ = Track();
track_.codecType = codecType;
track_.endSample = 0;
track_.channels = Memory::Read_U32(paramsAddr);
outputChannels_ = Memory::Read_U32(paramsAddr + 4);
bufferMaxSize_ = Memory::Read_U32(paramsAddr + 8);
@@ -1203,14 +1187,16 @@ void Atrac::InitLowLevel(u32 paramsAddr, bool jointStereo) {
first_.writableBytes = track_.bytesPerFrame;
ResetData();
if (track_.codecType == PSP_MODE_AT_3) {
if (codecType == PSP_MODE_AT_3) {
track_.bitrate = (track_.bytesPerFrame * 352800) / 1000;
track_.bitrate = (track_.bitrate + 511) >> 10;
track_.jointStereo = false;
} else if (track_.codecType == PSP_MODE_AT_3_PLUS) {
} else if (codecType == PSP_MODE_AT_3_PLUS) {
track_.bitrate = (track_.bytesPerFrame * 352800) / 1000;
track_.bitrate = ((track_.bitrate >> 11) + 8) & 0xFFFFFFF0;
track_.jointStereo = false;
} else {
_dbg_assert_msg_(false, "bad codec type %08x", codecType);
}
track_.dataByteOffset = 0;
+6 -23
View File
@@ -96,7 +96,7 @@ struct Track {
int jointStereo = 0;
// Number of audio channels in the track.
u16 channels = 0;
u16 channels = 2;
// The size of an encoded frame in bytes.
u16 bytesPerFrame = 0;
@@ -113,7 +113,7 @@ struct Track {
// Last sample number. Inclusive. Though, we made it so that in Analyze, it's exclusive in the file.
// Does not take firstSampleOffset into account.
int endSample = 0;
int endSample = -1;
// NOTE: The below CAN be written.
// Loop configuration. The PSP only supports one loop but we store them all.
@@ -163,15 +163,6 @@ struct Track {
return (u32)(dataByteOffset + bytesPerFrame + frameOffset * bytesPerFrame);
}
void AnalyzeReset() {
endSample = -1;
loopinfo.clear();
loopStartSample = -1;
loopEndSample = -1;
channels = 2;
// TODO: Could probably reset more.
}
void DebugLog();
};
@@ -223,9 +214,6 @@ public:
virtual int BytesPerFrame() const = 0;
virtual int SamplesPerFrame() const = 0;
// Set filesize to 0 for autodetect, unless you are using aa3.
virtual int Analyze(const Track &track, u32 addr, u32 size, u32 filesize) = 0;
void UpdateContextFromPSPMem();
virtual void WriteContextToPSPMem() = 0;
@@ -234,14 +222,14 @@ public:
virtual u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) = 0;
virtual int ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf, bool *delay) = 0;
virtual int GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) = 0;
virtual int SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) = 0;
virtual int SetData(const Track &track, u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) = 0;
virtual int GetSecondBufferInfo(u32 *fileOffset, u32 *desiredSize);
virtual u32 SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) = 0;
virtual u32 DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) = 0;
virtual int DecodeLowLevel(const u8 *srcData, int *bytesConsumed, s16 *dstData, int *bytesWritten) = 0;
virtual u32 GetNextSamples() = 0;
virtual void InitLowLevel(u32 paramsAddr, bool jointStereo) = 0;
virtual void InitLowLevel(u32 paramsAddr, bool jointStereo, int codecType) = 0;
virtual int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const = 0;
@@ -275,8 +263,6 @@ public:
void DoState(PointerWrap &p) override;
void WriteContextToPSPMem() override;
int Analyze(const Track &track, u32 addr, u32 size, u32 filesize) override;
int GetNextDecodePosition(int *pos) const override;
int RemainingFrames() const override;
@@ -326,19 +312,16 @@ public:
u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) override;
int ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf, bool *delay) override;
int GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) override;
int SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) override;
int SetData(const Track &track, u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) override;
u32 SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) override;
u32 DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) override;
int DecodeLowLevel(const u8 *srcData, int *bytesConsumed, s16 *dstData, int *bytesWritten) override;
// Returns how many samples the next DecodeData will write.
u32 GetNextSamples() override;
void InitLowLevel(u32 paramsAddr, bool jointStereo) override;
void InitLowLevel(u32 paramsAddr, bool jointStereo, int codecType) override;
int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const override;
protected:
void AnalyzeReset();
private:
void UpdateBufferState();
void ResetData();
+2 -24
View File
@@ -46,10 +46,6 @@ void Atrac2::DoState(PointerWrap &p) {
void Atrac2::WriteContextToPSPMem() {
}
int Atrac2::Analyze(const Track &track, u32 addr, u32 size, u32 filesize) {
return 0;
}
int Atrac2::RemainingFrames() const {
return 0;
}
@@ -83,7 +79,7 @@ int Atrac2::GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSam
return 0;
}
int Atrac2::SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) {
int Atrac2::SetData(const Track &track, u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) {
if (readSize == bufferSize) {
bufferState_ = ATRAC_STATUS_ALL_DATA_LOADED;
} else {
@@ -105,25 +101,7 @@ u32 Atrac2::GetNextSamples() {
return 0;
}
void Atrac2::InitLowLevel(u32 paramsAddr, bool jointStereo) {
track_.AnalyzeReset();
track_.channels = Memory::Read_U32(paramsAddr);
outputChannels_ = Memory::Read_U32(paramsAddr + 4);
track_.bytesPerFrame = Memory::Read_U32(paramsAddr + 8);
if (track_.codecType == PSP_MODE_AT_3) {
track_.bitrate = (track_.bytesPerFrame * 352800) / 1000;
track_.bitrate = (track_.bitrate + 511) >> 10;
track_.jointStereo = false;
} else if (track_.codecType == PSP_MODE_AT_3_PLUS) {
track_.bitrate = (track_.bytesPerFrame * 352800) / 1000;
track_.bitrate = ((track_.bitrate >> 11) + 8) & 0xFFFFFFF0;
track_.jointStereo = false;
}
track_.dataByteOffset = 0;
bufferState_ = ATRAC_STATUS_LOW_LEVEL;
currentSample_ = 0;
CreateDecoder();
WriteContextToPSPMem();
void Atrac2::InitLowLevel(u32 paramsAddr, bool jointStereo, int codecType) {
}
int Atrac2::DecodeLowLevel(const u8 *srcData, int *bytesConsumed, s16 *dstData, int *bytesWritten) {
+2 -4
View File
@@ -11,8 +11,6 @@ public:
void DoState(PointerWrap &p) override;
void WriteContextToPSPMem() override;
int Analyze(const Track &track, u32 addr, u32 size, u32 filesize) override;
void SetID(int id) override {}
int GetID() const override { return 0; }
@@ -31,14 +29,14 @@ public:
u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) override;
int ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf, bool *delay) override;
int GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) override;
int SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) override;
int SetData(const Track &track, u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) override;
u32 SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) override;
u32 SecondBufferSize() const override;
u32 DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) override;
int DecodeLowLevel(const u8 *srcData, int *bytesConsumed, s16 *dstData, int *bytesWritten) override;
u32 GetNextSamples() override;
void InitLowLevel(u32 paramsAddr, bool jointStereo) override;
void InitLowLevel(u32 paramsAddr, bool jointStereo, int codecType) override;
int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const override;
+19 -50
View File
@@ -581,14 +581,14 @@ static u32 sceAtracSetHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u32 b
return hleLogError(Log::ME, SCE_ERROR_ATRAC_WRONG_CODECTYPE, "atracID uses different codec type than data");
}
ret = atrac->Analyze(track, buffer, readSize, 0);
ret = atrac->SetData(track, buffer, readSize, bufferSize, 2);
if (ret < 0) {
// Must not delay.
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, readSize, bufferSize, 2);
// not sure the real delay time
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data", 100);
return hleDelayResult(hleLogDebug(Log::ME, ret), "atrac set data", 100);
}
static u32 sceAtracSetSecondBuffer(int atracID, u32 secondBuffer, u32 secondBufferSize) {
@@ -616,12 +616,13 @@ static u32 sceAtracSetData(int atracID, u32 buffer, u32 bufferSize) {
return hleReportError(Log::ME, SCE_ERROR_ATRAC_WRONG_CODECTYPE, "atracID uses different codec type than data");
}
ret = atrac->Analyze(track, buffer, bufferSize, 0);
ret = atrac->SetData(track, buffer, bufferSize, bufferSize, 2);
if (ret < 0) {
// Must not delay.
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, bufferSize, bufferSize, 2);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data", 100);
return hleDelayResult(hleLogDebug(Log::ME, ret), "atrac set data", 100);
}
static int sceAtracSetDataAndGetID(u32 buffer, int bufferSize) {
@@ -639,12 +640,7 @@ static int sceAtracSetDataAndGetID(u32 buffer, int bufferSize) {
}
AtracBase *atrac = allocAtrac();
ret = atrac->Analyze(track, buffer, bufferSize, 0);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, bufferSize, bufferSize, 2);
ret = atrac->SetData(track, buffer, bufferSize, bufferSize, 2);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
@@ -671,12 +667,7 @@ static int sceAtracSetHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 buffer
}
AtracBase *atrac = allocAtrac();
ret = atrac->Analyze(track, buffer, readSize, 0);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, readSize, bufferSize, 2);
ret = atrac->SetData(track, buffer, readSize, bufferSize, 2);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
@@ -795,11 +786,7 @@ static int sceAtracSetMOutHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u
return hleLogError(Log::ME, ret);
}
ret = atrac->Analyze(track, buffer, readSize, 0);
if (ret < 0) {
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, readSize, bufferSize, 1);
ret = atrac->SetData(track, buffer, readSize, bufferSize, 1);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data mono", 100);
}
@@ -819,11 +806,11 @@ static u32 sceAtracSetMOutData(int atracID, u32 buffer, u32 bufferSize) {
return hleLogError(Log::ME, ret);
}
ret = atrac->Analyze(track, buffer, bufferSize, 0);
ret = atrac->SetData(track, buffer, bufferSize, bufferSize, 1);
if (ret < 0) {
// Must not delay.
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, bufferSize, bufferSize, 1);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data mono", 100);
}
@@ -840,12 +827,7 @@ static int sceAtracSetMOutDataAndGetID(u32 buffer, u32 bufferSize) {
}
AtracBase *atrac = allocAtrac();
ret = atrac->Analyze(track, buffer, bufferSize, 0);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, bufferSize, bufferSize, 1);
ret = atrac->SetData(track, buffer, bufferSize, bufferSize, 1);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
@@ -874,12 +856,7 @@ static int sceAtracSetMOutHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 bu
}
AtracBase *atrac = allocAtrac();
ret = atrac->Analyze(track, buffer, readSize, 0);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, readSize, bufferSize, 1);
ret = atrac->SetData(track, buffer, readSize, bufferSize, 1);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
@@ -902,12 +879,7 @@ static int sceAtracSetAA3DataAndGetID(u32 buffer, u32 bufferSize, u32 fileSize,
}
AtracBase *atrac = allocAtrac();
ret = atrac->Analyze(track, buffer, bufferSize, fileSize);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, bufferSize, bufferSize, 2);
ret = atrac->SetData(track, buffer, bufferSize, bufferSize, 2);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
@@ -975,6 +947,8 @@ static int sceAtracLowLevelInitDecoder(int atracID, u32 paramsAddr) {
return hleReportError(Log::ME, 0, "invalid pointers");
}
int codecType = atracContextTypes[atracID];
bool jointStereo = false;
if (atrac->CodecType() == PSP_MODE_AT_3) {
// See if we can match the actual jointStereo value.
@@ -991,7 +965,7 @@ static int sceAtracLowLevelInitDecoder(int atracID, u32 paramsAddr) {
}
}
atrac->InitLowLevel(paramsAddr, jointStereo);
atrac->InitLowLevel(paramsAddr, jointStereo, codecType);
const char *codecName = atrac->CodecType() == PSP_MODE_AT_3 ? "atrac3" : "atrac3+";
const char *channelName = atrac->Channels() == 1 ? "mono" : "stereo";
@@ -1035,12 +1009,7 @@ static int sceAtracSetAA3HalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 buf
}
AtracBase *atrac = allocAtrac();
ret = atrac->Analyze(track, buffer, readSize, fileSize);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);
}
ret = atrac->SetData(buffer, readSize, bufferSize, 2);
ret = atrac->SetData(track, buffer, readSize, bufferSize, 2);
if (ret < 0) {
delete atrac;
return hleLogError(Log::ME, ret);