mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #20116 from hrydgard/even-more-atrac-prep
Even more Atrac refactoring
This commit is contained in:
commit
8c8c823c6a
6 changed files with 158 additions and 111 deletions
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue