Merge pull request #20116 from hrydgard/even-more-atrac-prep

Even more Atrac refactoring
This commit is contained in:
Henrik Rydgård 2025-03-16 12:14:20 +01:00 committed by GitHub
commit 8c8c823c6a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 158 additions and 111 deletions

View file

@ -547,13 +547,23 @@ int Atrac::AnalyzeAA3(u32 addr, u32 size, u32 fileSize) {
return AnalyzeAA3Track(addr, size, fileSize, &track_);
}
int AtracBase::GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) {
*endSample = GetTrack().endSample;
*loopStartSample = GetTrack().loopStartSample == -1 ? -1 : GetTrack().loopStartSample - GetTrack().FirstSampleOffsetFull();
*loopEndSample = GetTrack().loopEndSample == -1 ? -1 : GetTrack().loopEndSample - GetTrack().FirstSampleOffsetFull();
int Atrac::GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const {
*endSample = track_.endSample;
*loopStartSample = track_.loopStartSample == -1 ? -1 : track_.loopStartSample - track_.FirstSampleOffsetFull();
*loopEndSample = track_.loopEndSample == -1 ? -1 : track_.loopEndSample - track_.FirstSampleOffsetFull();
return 0;
}
int Atrac::GetNextDecodePosition(int *pos) const {
if (currentSample_ >= track_.endSample) {
*pos = 0;
return SCE_ERROR_ATRAC_ALL_DATA_DECODED;
} else {
*pos = currentSample_;
return 0;
}
}
void Atrac::CalculateStreamInfo(u32 *outReadOffset) {
u32 readOffset = first_.fileoffset;
if (bufferState_ == ATRAC_STATUS_ALL_DATA_LOADED) {
@ -860,7 +870,7 @@ u32 Atrac::AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) {
}
u32 Atrac::GetNextSamples() {
if (CurrentSample() >= track_.endSample) {
if (currentSample_ >= track_.endSample) {
return 0;
}
@ -1100,7 +1110,11 @@ u32 Atrac::DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, i
return 0;
}
void AtracBase::SetLoopNum(int loopNum) {
int Atrac::SetLoopNum(int loopNum) {
if (track_.loopinfo.size() == 0) {
return SCE_ERROR_ATRAC_NO_LOOP_INFORMATION;
}
// Spammed in MHU
loopNum_ = loopNum;
// Logic here looks wacky?
@ -1112,18 +1126,27 @@ void AtracBase::SetLoopNum(int loopNum) {
track_.loopEndSample = track_.endSample + track_.FirstSampleOffsetFull();
}
WriteContextToPSPMem();
return 0;
}
u32 Atrac::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) {
int Atrac::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf, bool *delay) {
*delay = false;
if (BufferState() == ATRAC_STATUS_STREAMED_LOOP_WITH_TRAILER && SecondBufferSize() == 0) {
return SCE_ERROR_ATRAC_SECOND_BUFFER_NEEDED;
} else if ((u32)sample + track_.firstSampleOffset > (u32)track_.endSample + track_.firstSampleOffset) {
// NOTE: Above we have to add firstSampleOffset to both sides - we seem to rely on wraparound.
return SCE_ERROR_ATRAC_BAD_SAMPLE;
}
// Reuse the same calculation as before.
AtracResetBufferInfo bufferInfo;
GetResetBufferInfo(&bufferInfo, sample);
if ((u32)bytesWrittenFirstBuf < bufferInfo.first.minWriteBytes || (u32)bytesWrittenFirstBuf > bufferInfo.first.writableBytes) {
return hleLogError(Log::ME, SCE_ERROR_ATRAC_BAD_FIRST_RESET_SIZE, "first byte count not in valid range");
return SCE_ERROR_ATRAC_BAD_FIRST_RESET_SIZE;
}
if ((u32)bytesWrittenSecondBuf < bufferInfo.second.minWriteBytes || (u32)bytesWrittenSecondBuf > bufferInfo.second.writableBytes) {
return hleLogError(Log::ME, SCE_ERROR_ATRAC_BAD_SECOND_RESET_SIZE, "second byte count not in valid range");
return SCE_ERROR_ATRAC_BAD_SECOND_RESET_SIZE;
}
if (bufferState_ == ATRAC_STATUS_ALL_DATA_LOADED) {
@ -1146,7 +1169,9 @@ u32 Atrac::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrit
}
} else {
if (bufferInfo.first.filePos > track_.fileSize) {
return hleDelayResult(hleLogError(Log::ME, SCE_ERROR_ATRAC_API_FAIL, "invalid file position"), "reset play pos", 200);
*delay = true;
// The decoder failed during skip-frame operation.
return SCE_ERROR_ATRAC_API_FAIL;
}
// Move the offset to the specified position.
@ -1171,7 +1196,7 @@ u32 Atrac::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrit
}
WriteContextToPSPMem();
return hleNoLog(0);
return 0;
}
void Atrac::InitLowLevel(u32 paramsAddr, bool jointStereo) {

View file

@ -141,12 +141,13 @@ struct Track {
return codecType == PSP_MODE_AT_3_PLUS ? ATRAC3PLUS_MAX_SAMPLES : ATRAC3_MAX_SAMPLES;
}
void UpdateBitrate() {
bitrate = (bytesPerFrame * 352800) / 1000;
int Bitrate() const {
int bitrate = (bytesPerFrame * 352800) / 1000;
if (codecType == PSP_MODE_AT_3_PLUS)
bitrate = ((bitrate >> 11) + 8) & 0xFFFFFFF0;
else
bitrate = (bitrate + 511) >> 10;
return bitrate;
}
// This appears to be buggy, should probably include FirstOffsetExtra?
@ -183,20 +184,7 @@ public:
virtual void DoState(PointerWrap &p) = 0;
const Track &GetTrack() const {
return track_;
}
// This should be rare.
Track &GetTrackMut() {
return track_;
}
int Channels() const {
return track_.channels;
}
int SamplesPerFrame() const {
return track_.SamplesPerFrame();
}
virtual int Channels() const = 0;
int GetOutputChannels() const {
return outputChannels_;
@ -215,10 +203,10 @@ public:
return bufferState_;
}
int LoopNum() const {
return loopNum_;
}
virtual int SetLoopNum(int loopNum) = 0;
virtual int LoopNum() const = 0;
virtual int LoopStatus() const = 0;
u32 CodecType() const {
return track_.codecType;
}
@ -228,9 +216,12 @@ public:
void CreateDecoder();
virtual int CurrentSample() const = 0;
virtual int GetNextDecodePosition(int *pos) const = 0;
virtual int RemainingFrames() const = 0;
virtual u32 SecondBufferSize() const = 0;
virtual int Bitrate() const = 0;
virtual int BytesPerFrame() const = 0;
virtual int SamplesPerFrame() const = 0;
virtual int Analyze(u32 addr, u32 size) = 0;
virtual int AnalyzeAA3(u32 addr, u32 size, u32 filesize) = 0;
@ -241,8 +232,7 @@ public:
virtual void GetStreamDataInfo(u32 *writePtr, u32 *writableBytes, u32 *readOffset) = 0;
virtual int AddStreamData(u32 bytesToAdd) = 0;
virtual u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) = 0;
virtual void SetLoopNum(int loopNum);
virtual u32 ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) = 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;
@ -253,7 +243,7 @@ public:
virtual u32 GetNextSamples() = 0;
virtual void InitLowLevel(u32 paramsAddr, bool jointStereo) = 0;
int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample);
virtual int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const = 0;
protected:
Track track_{};
@ -288,26 +278,46 @@ public:
int Analyze(u32 addr, u32 size) override;
int AnalyzeAA3(u32 addr, u32 size, u32 filesize) override;
int CurrentSample() const override {
return currentSample_;
}
int GetNextDecodePosition(int *pos) const override;
int RemainingFrames() const override;
u32 SecondBufferSize() const override {
return second_.size;
}
int Channels() const override {
return track_.channels;
}
int LoopNum() const override {
return loopNum_;
}
int LoopStatus() const override {
if (track_.loopinfo.size() > 0)
return 1;
else
return 0;
}
int Bitrate() const override {
return track_.Bitrate();
}
int BytesPerFrame() const override {
return track_.BytesPerFrame();
}
int SamplesPerFrame() const override {
return track_.SamplesPerFrame();
}
// This should be rare.
Track &GetTrackMut() {
return track_;
}
int SetLoopNum(int loopNum) override;
// Ask where in memory new data should be written.
void GetStreamDataInfo(u32 *writePtr, u32 *writableBytes, u32 *readOffset) override;
// Notify the player that the user has written some new data.
int AddStreamData(u32 bytesToAdd) override;
u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) override;
u32 ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) 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;
u32 SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) override;
@ -317,6 +327,8 @@ public:
u32 GetNextSamples() override;
void InitLowLevel(u32 paramsAddr, bool jointStereo) override;
int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const override;
protected:
void AnalyzeReset();

View file

@ -35,6 +35,10 @@
// * Half Minute Hero (bufsize 65536)
// * Flatout (tricky! needs investigation)
Atrac2::Atrac2(int codecType) {
track_.codecType = codecType;
}
void Atrac2::DoState(PointerWrap &p) {
_assert_msg_(false, "Savestates not yet support with new Atrac implementation.\n\nTurn it off in Developer settings.\n\n");
}
@ -106,7 +110,8 @@ u32 Atrac2::AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) {
return 0;
}
u32 Atrac2::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) {
int Atrac2::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf, bool *delay) {
*delay = false;
return 0;
}
@ -114,6 +119,10 @@ int Atrac2::GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) {
return 0;
}
int Atrac2::GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const {
return 0;
}
int Atrac2::SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) {
if (readSize == bufferSize) {
bufferState_ = ATRAC_STATUS_ALL_DATA_LOADED;

View file

@ -7,20 +7,27 @@
class Atrac2 : public AtracBase {
public:
Atrac2(int codecType);
void DoState(PointerWrap &p) override;
void WriteContextToPSPMem() override;
int Analyze(u32 addr, u32 size) override;
int AnalyzeAA3(u32 addr, u32 size, u32 filesize) override;
int CurrentSample() const override { return currentSample_; }
int GetNextDecodePosition(int *pos) const { return 0; }
int RemainingFrames() const override;
int LoopStatus() const override { return 0; }
int Bitrate() const override { return 0; }
int LoopNum() const override { return 0; }
int SamplesPerFrame() const override { return 0; }
int Channels() const override { return 2; }
int BytesPerFrame() const override { return 0; }
int SetLoopNum(int loopNum) override { return 0; }
void GetStreamDataInfo(u32 *writePtr, u32 *writableBytes, u32 *readOffset) override;
int AddStreamData(u32 bytesToAdd) override;
u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) override;
u32 ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) 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;
u32 SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) override;
@ -31,6 +38,8 @@ public:
u32 GetNextSamples() override;
void InitLowLevel(u32 paramsAddr, bool jointStereo) override;
int GetSoundSample(int *endSample, int *loopStartSample, int *loopEndSample) const override;
private:
int currentSample_ = 0;
};

View file

@ -157,11 +157,15 @@ void __AtracDoState(PointerWrap &p) {
}
}
static AtracBase *allocAtrac(bool forceOld = false) {
if (g_Config.bUseExperimentalAtrac && !forceOld) {
return new Atrac2();
static AtracBase *allocAtrac(int codecType = 0) {
if (g_Config.bUseExperimentalAtrac) {
return new Atrac2(codecType);
} else {
return new Atrac();
Atrac *atrac = new Atrac();
if (codecType) {
atrac->GetTrackMut().codecType = codecType;
}
return atrac;
}
}
@ -205,8 +209,7 @@ static u32 sceAtracGetAtracID(int codecType) {
return hleReportError(Log::ME, SCE_ERROR_ATRAC_INVALID_CODECTYPE, "invalid codecType");
}
AtracBase *atrac = allocAtrac();
atrac->GetTrackMut().codecType = codecType;
AtracBase *atrac = allocAtrac(codecType);
int atracID = createAtrac(atrac);
if (atracID < 0) {
delete atrac;
@ -325,10 +328,9 @@ static u32 sceAtracGetBitrate(int atracID, u32 outBitrateAddr) {
return hleLogError(Log::ME, err);
}
atrac->GetTrackMut().UpdateBitrate();
int bitrate = atrac->Bitrate();
if (Memory::IsValidAddress(outBitrateAddr)) {
Memory::WriteUnchecked_U32(atrac->GetTrack().bitrate, outBitrateAddr);
Memory::WriteUnchecked_U32(atrac->Bitrate(), outBitrateAddr);
return hleLogDebug(Log::ME, 0);
} else {
return hleLogError(Log::ME, 0, "invalid address");
@ -404,17 +406,18 @@ static u32 sceAtracGetNextDecodePosition(int atracID, u32 outposAddr) {
return hleLogError(Log::ME, err);
}
if (Memory::IsValidAddress(outposAddr)) {
if (atrac->CurrentSample() >= atrac->GetTrack().endSample) {
Memory::WriteUnchecked_U32(0, outposAddr);
return hleLogDebug(Log::ME, SCE_ERROR_ATRAC_ALL_DATA_DECODED, "all data decoded - beyond endSample");
} else {
Memory::WriteUnchecked_U32(atrac->CurrentSample(), outposAddr);
return hleLogDebug(Log::ME, 0);
}
} else {
int pos = 0;
int ret = atrac->GetNextDecodePosition(&pos);
if (ret < 0) {
return hleLogError(Log::ME, ret);
}
if (!Memory::IsValidAddress(outposAddr)) {
return hleLogError(Log::ME, 0, "invalid address");
}
Memory::WriteUnchecked_U32(pos, outposAddr);
return hleLogDebug(Log::ME, 0);
}
static u32 sceAtracGetNextSample(int atracID, u32 outNAddr) {
@ -545,29 +548,16 @@ static u32 sceAtracResetPlayPosition(int atracID, int sample, int bytesWrittenFi
return hleLogError(Log::ME, err);
}
if (atrac->BufferState() == ATRAC_STATUS_STREAMED_LOOP_WITH_TRAILER && atrac->SecondBufferSize() == 0) {
return hleReportError(Log::ME, SCE_ERROR_ATRAC_SECOND_BUFFER_NEEDED, "no second buffer");
} else if ((u32)sample + atrac->GetTrack().firstSampleOffset > (u32)atrac->GetTrack().endSample + atrac->GetTrack().firstSampleOffset) {
// NOTE: Above we have to add firstSampleOffset to both sides - we seem to rely on wraparound.
return hleLogWarning(Log::ME, SCE_ERROR_ATRAC_BAD_SAMPLE, "invalid sample position");
bool delay = false;
int res = atrac->ResetPlayPosition(sample, bytesWrittenFirstBuf, bytesWrittenSecondBuf, &delay);
if (res < 0) {
if (delay) {
return hleDelayResult(hleLogError(Log::ME, res), "reset play pos", 200);
} else {
return hleLogError(Log::ME, res);
}
}
u32 res = atrac->ResetPlayPosition(sample, bytesWrittenFirstBuf, bytesWrittenSecondBuf);
if (res != 0) {
// Already logged.
return res;
}
return hleDelayResult(0, "reset play pos", 3000);
}
static int _AtracSetData(int atracID, u32 buffer, u32 readSize, u32 bufferSize, int outputChannels) {
AtracBase *atrac = getAtrac(atracID);
// Don't use AtracValidateManaged here.
if (!atrac) {
return SCE_ERROR_ATRAC_BAD_ATRACID;
}
return atrac->SetData(buffer, readSize, bufferSize, outputChannels);
return hleDelayResult(hleLogDebug(Log::ME, res), "reset play pos", 3000);
}
static u32 sceAtracSetHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u32 bufferSize) {
@ -586,7 +576,7 @@ static u32 sceAtracSetHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u32 b
return hleLogError(Log::ME, ret);
}
ret = _AtracSetData(atracID, buffer, readSize, bufferSize, 2);
ret = atrac->SetData(buffer, readSize, bufferSize, 2);
// not sure the real delay time
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data", 100);
}
@ -616,7 +606,7 @@ 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 = _AtracSetData(atracID, buffer, bufferSize, bufferSize, 2);
ret = atrac->SetData(buffer, bufferSize, bufferSize, 2);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data", 100);
}
@ -640,7 +630,7 @@ static int sceAtracSetDataAndGetID(u32 buffer, int bufferSize) {
return hleLogError(Log::ME, atracID, "no free ID");
}
ret = _AtracSetData(atracID, buffer, bufferSize, bufferSize, 2);
ret = atrac->SetData(buffer, bufferSize, bufferSize, 2);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret == 0 ? atracID : ret), "atrac set data", 100);
}
@ -659,7 +649,7 @@ static int sceAtracSetHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 buffer
delete atrac;
return hleLogError(Log::ME, atracID, "no free ID");
}
ret = _AtracSetData(atracID, buffer, readSize, bufferSize, 2);
ret = atrac->SetData(buffer, readSize, bufferSize, 2);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret == 0 ? atracID : ret), "atrac set data", 100);
}
@ -674,17 +664,13 @@ static u32 sceAtracSetLoopNum(int atracID, int loopNum) {
if (err != 0) {
return hleLogError(Log::ME, err);
}
if (atrac->GetTrack().loopinfo.size() == 0) {
if (loopNum == -1) {
// This is very common and not really a problem.
return hleLogDebug(Log::ME, SCE_ERROR_ATRAC_NO_LOOP_INFORMATION, "no loop information to write to!");
} else {
return hleLogError(Log::ME, SCE_ERROR_ATRAC_NO_LOOP_INFORMATION, "no loop information to write to!");
}
}
atrac->SetLoopNum(loopNum);
return hleLogDebug(Log::ME, 0);
int ret = atrac->SetLoopNum(loopNum);
if (ret == SCE_ERROR_ATRAC_NO_LOOP_INFORMATION && loopNum == -1) {
// Not really an issue
return hleLogDebug(Log::ME, ret);
}
return hleLogDebugOrError(Log::ME, ret);
}
static int sceAtracReinit(int at3Count, int at3plusCount) {
@ -770,12 +756,12 @@ static int sceAtracSetMOutHalfwayBuffer(int atracID, u32 buffer, u32 readSize, u
if (ret < 0) {
return hleLogError(Log::ME, ret);
}
if (atrac->GetTrack().channels != 1) {
if (atrac->Channels() != 1) {
// It seems it still sets the data.
atrac->SetData(buffer, readSize, bufferSize, 2);
return hleReportError(Log::ME, SCE_ERROR_ATRAC_NOT_MONO, "not mono data");
} else {
ret = _AtracSetData(atracID, buffer, readSize, bufferSize, 1);
ret = atrac->SetData(buffer, readSize, bufferSize, 1);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data mono", 100);
}
}
@ -792,12 +778,12 @@ static u32 sceAtracSetMOutData(int atracID, u32 buffer, u32 bufferSize) {
if (ret < 0) {
return hleLogError(Log::ME, ret);
}
if (atrac->GetTrack().channels != 1) {
if (atrac->Channels() != 1) {
// It seems it still sets the data.
atrac->SetData(buffer, bufferSize, bufferSize, 2);
return hleReportError(Log::ME, SCE_ERROR_ATRAC_NOT_MONO, "not mono data");
} else {
ret = _AtracSetData(atracID, buffer, bufferSize, bufferSize, 1);
ret = atrac->SetData(buffer, bufferSize, bufferSize, 1);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret), "atrac set data mono", 100);
}
}
@ -810,7 +796,7 @@ static int sceAtracSetMOutDataAndGetID(u32 buffer, u32 bufferSize) {
delete atrac;
return hleLogError(Log::ME, ret);
}
if (atrac->GetTrack().channels != 1) {
if (atrac->Channels() != 1) {
delete atrac;
return hleReportError(Log::ME, SCE_ERROR_ATRAC_NOT_MONO, "not mono data");
}
@ -820,7 +806,7 @@ static int sceAtracSetMOutDataAndGetID(u32 buffer, u32 bufferSize) {
return hleLogError(Log::ME, atracID, "no free ID");
}
ret = _AtracSetData(atracID, buffer, bufferSize, bufferSize, 1);
ret = atrac->SetData(buffer, bufferSize, bufferSize, 1);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret == 0 ? atracID : ret), "atrac set data", 100);
}
@ -834,7 +820,7 @@ static int sceAtracSetMOutHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 bu
delete atrac;
return hleLogError(Log::ME, ret);
}
if (atrac->GetTrack().channels != 1) {
if (atrac->Channels() != 1) {
delete atrac;
return hleReportError(Log::ME, SCE_ERROR_ATRAC_NOT_MONO, "not mono data");
}
@ -844,7 +830,7 @@ static int sceAtracSetMOutHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 bu
return hleLogError(Log::ME, atracID, "no free ID");
}
ret = _AtracSetData(atracID, buffer, readSize, bufferSize, 1);
ret = atrac->SetData(buffer, readSize, bufferSize, 1);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret == 0 ? atracID : ret), "atrac set data", 100);
}
@ -861,7 +847,7 @@ static int sceAtracSetAA3DataAndGetID(u32 buffer, u32 bufferSize, u32 fileSize,
return hleLogError(Log::ME, atracID, "no free ID");
}
ret = _AtracSetData(atracID, buffer, bufferSize, bufferSize, 2);
ret = atrac->SetData(buffer, bufferSize, bufferSize, 2);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret == 0 ? atracID : ret), "atrac set data", 100);
}
@ -893,7 +879,7 @@ struct At3HeaderMap {
u8 jointStereo;
bool Matches(const AtracBase *at) const {
return bytes == at->GetTrack().BytesPerFrame() && channels == at->GetTrack().channels;
return bytes == at->BytesPerFrame() && channels == at->Channels();
}
};
@ -929,7 +915,7 @@ static int sceAtracLowLevelInitDecoder(int atracID, u32 paramsAddr) {
}
}
if (!found) {
WARN_LOG_REPORT_ONCE(at3headermap, Log::ME, "AT3 header map lacks entry for bpf: %i channels: %i", atrac->GetTrack().BytesPerFrame(), atrac->GetTrack().channels);
WARN_LOG_REPORT_ONCE(at3headermap, Log::ME, "AT3 header map lacks entry for bpf: %i channels: %i", atrac->BytesPerFrame(), atrac->Channels());
// TODO: Should we return an error code for these values?
}
}
@ -937,7 +923,7 @@ static int sceAtracLowLevelInitDecoder(int atracID, u32 paramsAddr) {
atrac->InitLowLevel(paramsAddr, jointStereo);
const char *codecName = atrac->CodecType() == PSP_MODE_AT_3 ? "atrac3" : "atrac3+";
const char *channelName = atrac->GetTrack().channels == 1 ? "mono" : "stereo";
const char *channelName = atrac->Channels() == 1 ? "mono" : "stereo";
return hleLogInfo(Log::ME, 0, "%s %s audio", codecName, channelName);
}
@ -983,7 +969,7 @@ static int sceAtracSetAA3HalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 buf
return hleLogError(Log::ME, atracID, "no free ID");
}
ret = _AtracSetData(atracID, buffer, readSize, bufferSize, 2);
ret = atrac->SetData(buffer, readSize, bufferSize, 2);
return hleDelayResult(hleLogDebugOrError(Log::ME, ret == 0 ? atracID : ret), "atrac set data", 100);
}

View file

@ -999,7 +999,9 @@ void DrawAudioDecodersView(ImConfig &cfg, ImControl &control) {
ImGui::TableNextColumn();
ImGui::Text("%d", ctx->GetOutputChannels());
ImGui::TableNextColumn();
ImGui::Text("%d", ctx->CurrentSample());
int pos;
ctx->GetNextDecodePosition(&pos);
ImGui::Text("%d", pos);
ImGui::TableNextColumn();
ImGui::Text("%d", ctx->RemainingFrames());
}
@ -1014,9 +1016,13 @@ void DrawAudioDecodersView(ImConfig &cfg, ImControl &control) {
char header[32];
snprintf(header, sizeof(header), "Atrac context %d", cfg.selectedAtracCtx);
if (ctx && ImGui::CollapsingHeader(header, ImGuiTreeNodeFlags_DefaultOpen)) {
ImGui::ProgressBar((float)ctx->CurrentSample() / (float)ctx->GetTrack().endSample, ImVec2(200.0f, 0.0f));
int pos;
ctx->GetNextDecodePosition(&pos);
int endSample, loopStart, loopEnd;
ctx->GetSoundSample(&endSample, &loopStart, &loopEnd);
ImGui::ProgressBar((float)pos / (float)endSample, ImVec2(200.0f, 0.0f));
ImGui::Text("Status: %s", AtracStatusToString(ctx->BufferState()));
ImGui::Text("cur/end sample: %d/%d", ctx->CurrentSample(), ctx->GetTrack().endSample);
ImGui::Text("cur/end sample: %d/%d", pos, endSample);
ImGui::Text("ctx addr: "); ImGui::SameLine(); ImClickableValue("addr", ctx->Decoder()->GetCtxPtr(), control, ImCmd::SHOW_IN_MEMORY_VIEWER);
ImGui::Text("loop: %d", ctx->LoopNum());
}