mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-13 09:39:33 +01:00
Some cleanup and refactor.
This commit is contained in:
1 parent
36fdb09056
commit
8b02766702
4 files changed
+51
-46
No files matched your search
+2
-1
@@ -239,7 +239,6 @@ public:
|
||||
protected:
|
||||
Track track_{};
|
||||
u16 outputChannels_ = 2;
|
||||
int loopNum_ = 0;
|
||||
|
||||
// TODO: Save the internal state of this, now technically possible.
|
||||
AudioDecoder *decoder_ = nullptr;
|
||||
@@ -288,6 +287,7 @@ public:
|
||||
return loopNum_;
|
||||
}
|
||||
int LoopStatus() const override {
|
||||
// This doesn't match tests.
|
||||
if (track_.loopinfo.size() > 0)
|
||||
return 1;
|
||||
else
|
||||
@@ -355,6 +355,7 @@ private:
|
||||
int currentSample_ = 0;
|
||||
u32 decodePos_ = 0;
|
||||
u32 bufferMaxSize_ = 0;
|
||||
int loopNum_ = 0;
|
||||
|
||||
// Used to track streaming.
|
||||
u32 bufferPos_ = 0;
|
||||
|
||||
+39
-39
@@ -86,7 +86,7 @@ int Atrac2::RemainingFrames() const {
|
||||
// No longer looping in this case, outside the loop.
|
||||
return PSP_ATRAC_NONLOOP_STREAM_DATA_IS_ON_MEMORY;
|
||||
}
|
||||
if (loopNum_ == 0) {
|
||||
if (info.loopNum == 0) {
|
||||
return PSP_ATRAC_LOOP_STREAM_DATA_IS_ON_MEMORY;
|
||||
}
|
||||
return info.streamDataByte / info.sampleSize;
|
||||
@@ -131,53 +131,27 @@ int Atrac2::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWri
|
||||
return SCE_ERROR_ATRAC_BAD_SECOND_RESET_SIZE;
|
||||
}
|
||||
|
||||
const SceAtracIdInfo &info = context_->info;
|
||||
SceAtracIdInfo &info = context_->info;
|
||||
if (info.state == ATRAC_STATUS_ALL_DATA_LOADED) {
|
||||
// Always adds zero bytes.
|
||||
} else if (info.state == ATRAC_STATUS_HALFWAY_BUFFER) {
|
||||
/*
|
||||
// Okay, it's a valid number of bytes. Let's set them up.
|
||||
if (bytesWrittenFirstBuf != 0) {
|
||||
first_.fileoffset += bytesWrittenFirstBuf;
|
||||
first_.size += bytesWrittenFirstBuf;
|
||||
first_.offset += bytesWrittenFirstBuf;
|
||||
// Just reinitialize the context at the start.
|
||||
_dbg_assert_(info.dataOff + info.streamDataByte == bufferInfo.first.filePos);
|
||||
int readSize = info.dataOff + info.streamDataByte + bytesWrittenFirstBuf;
|
||||
InitContext(0, info.buffer, readSize, info.bufferByte);
|
||||
if (readSize == info.dataEnd) {
|
||||
// Now, it's possible we'll transition to a full buffer here, if all the bytes were written. Let's do it.
|
||||
info.state = ATRAC_STATUS_ALL_DATA_LOADED;
|
||||
}
|
||||
|
||||
// Did we transition to a full buffer?
|
||||
if (first_.size >= track_.fileSize) {
|
||||
first_.size = track_.fileSize;
|
||||
bufferState_ = ATRAC_STATUS_ALL_DATA_LOADED;
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
if (bufferInfo.first.filePos > track_.fileSize) {
|
||||
*delay = true;
|
||||
return SCE_ERROR_ATRAC_API_FAIL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
// Move the offset to the specified position.
|
||||
first_.fileoffset = bufferInfo.first.filePos;
|
||||
|
||||
if (bytesWrittenFirstBuf != 0) {
|
||||
if (!ignoreDataBuf_) {
|
||||
Memory::Memcpy(dataBuf_ + first_.fileoffset, first_.addr, bytesWrittenFirstBuf, "AtracResetPlayPosition");
|
||||
}
|
||||
first_.fileoffset += bytesWrittenFirstBuf;
|
||||
}
|
||||
first_.size = first_.fileoffset;
|
||||
first_.offset = bytesWrittenFirstBuf;
|
||||
|
||||
bufferHeaderSize_ = 0;
|
||||
bufferPos_ = track_.bytesPerFrame;
|
||||
bufferValidBytes_ = bytesWrittenFirstBuf - bufferPos_;
|
||||
*/
|
||||
InitContext((bufferInfo.first.writePosPtr - info.buffer) + info.dataOff, info.buffer, bytesWrittenFirstBuf, info.bufferByte);
|
||||
}
|
||||
|
||||
// _dbg_assert_(track_.codecType == PSP_MODE_AT_3 || track_.codecType == PSP_MODE_AT_3_PLUS);
|
||||
// SeekToSample(sample);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -206,6 +180,7 @@ void Atrac2::SeekToSample(int sample) {
|
||||
|
||||
for (u32 pos = start; pos < off; pos += track_.bytesPerFrame) {
|
||||
decoder_->Decode(Memory::GetPointer(info.buffer + pos), track_.bytesPerFrame, nullptr, 2, nullptr, nullptr);
|
||||
_dbg_assert_(decodeTemp_[track_.SamplesPerFrame() * track_.channels] == 1337); // Sentinel
|
||||
}
|
||||
}
|
||||
|
||||
@@ -281,6 +256,15 @@ int Atrac2::SetLoopNum(int loopNum) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Atrac2::LoopNum() const {
|
||||
return context_->info.loopNum;
|
||||
}
|
||||
|
||||
int Atrac2::LoopStatus() const {
|
||||
// ????
|
||||
return context_->info.loopEnd > 0;
|
||||
}
|
||||
|
||||
u32 Atrac2::GetNextSamples() {
|
||||
SceAtracIdInfo &info = context_->info;
|
||||
// TODO: Handle end-of-track short block.
|
||||
@@ -345,6 +329,7 @@ void Atrac2::GetStreamDataInfo(u32 *writePtr, u32 *bytesToRead, u32 *readFileOff
|
||||
*readFileOffset = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// Just ask for the rest of the data. The game can supply as much of it as it wants at a time.
|
||||
*writePtr = info.buffer + fileOffset;
|
||||
*readFileOffset = fileOffset;
|
||||
@@ -457,6 +442,7 @@ u32 Atrac2::DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish,
|
||||
context_->codec.inBuf = inAddr; // just because.
|
||||
int bytesConsumed = 0;
|
||||
int outSamples = 0;
|
||||
_dbg_assert_(decodeTemp_[track_.SamplesPerFrame() * track_.channels] == 1337); // Sentinel
|
||||
if (!decoder_->Decode(Memory::GetPointer(inAddr), track_.bytesPerFrame, &bytesConsumed, outputChannels_, decodeTemp_, &outSamples)) {
|
||||
// Decode failed.
|
||||
*SamplesNum = 0;
|
||||
@@ -464,10 +450,15 @@ u32 Atrac2::DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish,
|
||||
context_->codec.err = 0x20b; // checked on hardware for 0xFF corruption. it's possible that there are more codes.
|
||||
return SCE_ERROR_ATRAC_API_FAIL; // tested.
|
||||
}
|
||||
if (bytesConsumed != info.sampleSize) {
|
||||
WARN_LOG(Log::ME, "bytesConsumed mismatch: %d vs %d", bytesConsumed, info.sampleSize);
|
||||
}
|
||||
_dbg_assert_(decodeTemp_[track_.SamplesPerFrame() * track_.channels] == 1337); // Sentinel
|
||||
|
||||
// Write the decoded samples to memory.
|
||||
// TODO: We can detect cases where we can safely just decode directly into output (full samplesToWrite, outbuf != nullptr)
|
||||
if (outbuf) {
|
||||
_dbg_assert_(samplesToWrite <= track_.SamplesPerFrame());
|
||||
memcpy(outbuf, decodeTemp_, samplesToWrite * outputChannels_ * sizeof(int16_t));
|
||||
}
|
||||
|
||||
@@ -517,7 +508,9 @@ int Atrac2::SetData(const Track &track, u32 bufferAddr, u32 readSize, u32 buffer
|
||||
CreateDecoder();
|
||||
|
||||
if (!decodeTemp_) {
|
||||
decodeTemp_ = new int16_t[track_.SamplesPerFrame() * track_.channels];
|
||||
_dbg_assert_(track_.channels <= 2);
|
||||
decodeTemp_ = new int16_t[track_.SamplesPerFrame() * track_.channels + 1];
|
||||
decodeTemp_[track_.SamplesPerFrame() * track_.channels] = 1337; // Sentinel
|
||||
}
|
||||
|
||||
context_->codec.inBuf = bufferAddr;
|
||||
@@ -546,6 +539,8 @@ int Atrac2::SetData(const Track &track, u32 bufferAddr, u32 readSize, u32 buffer
|
||||
}
|
||||
}
|
||||
|
||||
INFO_LOG(Log::ME, "Atrac streaming mode setup: %s", AtracStatusToString(info.state));
|
||||
|
||||
InitContext(0, bufferAddr, readSize, bufferSize);
|
||||
return 0;
|
||||
}
|
||||
@@ -567,8 +562,8 @@ void Atrac2::InitContext(int offset, u32 bufferAddr, u32 readSize, u32 bufferSiz
|
||||
info.numFrame = 0;
|
||||
info.dataOff = track_.dataByteOffset;
|
||||
info.curOff = track_.dataByteOffset; // Note: This and streamOff get incremented by bytesPerFrame before the return from this function by skipping frames.
|
||||
info.streamOff = track_.dataByteOffset;
|
||||
info.streamDataByte = readSize - track_.dataByteOffset;
|
||||
info.streamOff = track_.dataByteOffset - offset;
|
||||
info.streamDataByte = readSize - info.streamOff;
|
||||
info.dataEnd = track_.fileSize;
|
||||
info.decodePos = track_.FirstSampleOffsetFull();
|
||||
discardedSamples_ = track_.FirstSampleOffsetFull();
|
||||
@@ -582,6 +577,11 @@ void Atrac2::InitContext(int offset, u32 bufferAddr, u32 readSize, u32 bufferSiz
|
||||
if (!decoder_->Decode(Memory::GetPointer(info.buffer + info.streamOff), info.sampleSize, &bytesConsumed, track_.channels, decodeTemp_, &outSamples)) {
|
||||
ERROR_LOG(Log::ME, "Error decoding the 'dummy' buffer at offset %d in the buffer", info.streamOff);
|
||||
}
|
||||
if (bytesConsumed != info.sampleSize) {
|
||||
WARN_LOG(Log::ME, "bytesConsumed mismatch: %d vs %d", bytesConsumed, info.sampleSize);
|
||||
}
|
||||
_dbg_assert_(decodeTemp_[track_.SamplesPerFrame() * track_.channels] == 1337); // Sentinel
|
||||
|
||||
info.curOff += track_.bytesPerFrame;
|
||||
if (AtracStatusIsStreaming(info.state)) {
|
||||
info.streamOff += track_.bytesPerFrame;
|
||||
|
||||
@@ -22,9 +22,9 @@ public:
|
||||
int GetNextDecodePosition(int *pos) const override;
|
||||
|
||||
int RemainingFrames() const override;
|
||||
int LoopStatus() const override { return 0; }
|
||||
int LoopStatus() const override;
|
||||
int Bitrate() const override;
|
||||
int LoopNum() const override { return context_->info.loopNum; }
|
||||
int LoopNum() const override;
|
||||
int SamplesPerFrame() const override { return context_->info.codec == PSP_MODE_AT_3_PLUS ? ATRAC3PLUS_MAX_SAMPLES : ATRAC3_MAX_SAMPLES; }
|
||||
int Channels() const override { return context_->info.numChan; }
|
||||
int BytesPerFrame() const override { return context_->info.sampleSize; }
|
||||
|
||||
@@ -393,13 +393,16 @@ static u32 sceAtracGetInternalErrorInfo(int atracID, u32 errorAddr) {
|
||||
if (err != 0) {
|
||||
return hleLogError(Log::ME, err);
|
||||
}
|
||||
u32 errorCode = atrac->GetInternalCodecError();
|
||||
if (Memory::IsValidAddress(errorAddr))
|
||||
|
||||
const u32 errorCode = atrac->GetInternalCodecError();
|
||||
if (Memory::IsValidAddress(errorAddr)) {
|
||||
Memory::WriteUnchecked_U32(errorCode, errorAddr);
|
||||
}
|
||||
|
||||
if (errorCode) {
|
||||
return hleLogError(Log::ME, 0, "code: %08x", errorCode);
|
||||
return hleLogWarning(Log::ME, 0, "code: %08x", errorCode);
|
||||
} else {
|
||||
return hleLogInfo(Log::ME, 0);
|
||||
return hleLogDebug(Log::ME, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -710,6 +713,7 @@ static u32 sceAtracSetLoopNum(int atracID, int loopNum) {
|
||||
if (err != 0) {
|
||||
return hleLogError(Log::ME, err);
|
||||
}
|
||||
|
||||
int ret = atrac->SetLoopNum(loopNum);
|
||||
if (ret == SCE_ERROR_ATRAC_NO_LOOP_INFORMATION && loopNum == -1) {
|
||||
// Not really an issue
|
||||
|
||||
Reference in new issue
Block a user