From f3d6c93339798ece207f96c38b169ecfaaf9694b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 15 Apr 2024 13:50:16 +0200 Subject: [PATCH] Add empty AtracCtx2 implementation, and a dev setting to select it. Savestates don't work. --- CMakeLists.txt | 2 + Core/Config.cpp | 1 + Core/Config.h | 1 + Core/Core.vcxproj | 2 + Core/Core.vcxproj.filters | 6 +++ Core/HLE/AtracCtx.cpp | 4 ++ Core/HLE/AtracCtx.h | 15 +++--- Core/HLE/AtracCtx2.cpp | 73 +++++++++++++++++++++++++++++ Core/HLE/AtracCtx2.h | 35 ++++++++++++++ Core/HLE/sceAtrac.cpp | 26 ++++++---- Core/HLE/sceAudiocodec.h | 4 +- UI/GameSettingsScreen.cpp | 2 + UWP/CoreUWP/CoreUWP.vcxproj | 2 + UWP/CoreUWP/CoreUWP.vcxproj.filters | 6 +++ android/jni/Android.mk | 1 + libretro/Makefile.common | 1 + 16 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 Core/HLE/AtracCtx2.cpp create mode 100644 Core/HLE/AtracCtx2.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 64a10be42c..37e33e968a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2081,6 +2081,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/HLE/sceAdler.h Core/HLE/AtracCtx.cpp Core/HLE/AtracCtx.h + Core/HLE/AtracCtx2.cpp + Core/HLE/AtracCtx2.h Core/HLE/sceAtrac.cpp Core/HLE/sceAtrac.h Core/HLE/sceAudio.cpp diff --git a/Core/Config.cpp b/Core/Config.cpp index 50f12cc59b..2175c1a55d 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -699,6 +699,7 @@ static const ConfigSetting soundSettings[] = { ConfigSetting("AchievementSoundVolume", &g_Config.iAchievementSoundVolume, 6, CfgFlag::PER_GAME), ConfigSetting("AudioDevice", &g_Config.sAudioDevice, "", CfgFlag::DEFAULT), ConfigSetting("AutoAudioDevice", &g_Config.bAutoAudioDevice, true, CfgFlag::DEFAULT), + ConfigSetting("UseNewAtrac", &g_Config.bUseNewAtrac, false, CfgFlag::DEFAULT), }; static bool DefaultShowTouchControls() { diff --git a/Core/Config.h b/Core/Config.h index 2008572f1b..f504a39a43 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -274,6 +274,7 @@ public: bool bExtraAudioBuffering; // For bluetooth std::string sAudioDevice; bool bAutoAudioDevice; + bool bUseNewAtrac; // UI bool bShowDebuggerOnLoad; diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 2cdf17d477..af66592e01 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -567,6 +567,7 @@ + @@ -1176,6 +1177,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 3c1493fc11..2fd6262e01 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1312,6 +1312,9 @@ HLE\Libraries + + HLE\Libraries + @@ -2100,6 +2103,9 @@ HLE\Libraries + + HLE\Libraries + diff --git a/Core/HLE/AtracCtx.cpp b/Core/HLE/AtracCtx.cpp index 3cfad06b3d..d8a2725e1a 100644 --- a/Core/HLE/AtracCtx.cpp +++ b/Core/HLE/AtracCtx.cpp @@ -175,6 +175,10 @@ void Atrac::AnalyzeReset() { bufferPos_ = 0; } +u8 *Atrac::BufferStart() { + return ignoreDataBuf_ ? Memory::GetPointerWrite(first_.addr) : dataBuf_; +} + void AtracBase::UpdateContextFromPSPMem() { if (!context_.IsValid()) { return; diff --git a/Core/HLE/AtracCtx.h b/Core/HLE/AtracCtx.h index 5fa111bc39..fdaa82b5ec 100644 --- a/Core/HLE/AtracCtx.h +++ b/Core/HLE/AtracCtx.h @@ -17,9 +17,12 @@ #pragma once +#include + #include "Common/CommonTypes.h" #include "Common/Swap.h" +#include "Core/MemMap.h" #include "Core/HLE/sceAtrac.h" struct AtracSingleResetBufferInfo { @@ -205,7 +208,6 @@ public: void CreateDecoder(); - virtual uint32_t CurBufferAddress(int adjust = 0) const = 0; virtual int CurrentSample() const = 0; virtual int RemainingFrames() const = 0; virtual u32 SecondBufferSize() const = 0; @@ -230,8 +232,6 @@ public: virtual void InitLowLevel(u32 paramsAddr, bool jointStereo) = 0; protected: - virtual void AnalyzeReset() = 0; - Track track_{}; u16 outputChannels_ = 2; int loopNum_ = 0; @@ -247,7 +247,7 @@ public: ResetData(); } - uint32_t CurBufferAddress(int adjust = 0) const override { + uint32_t CurBufferAddress(int adjust = 0) const { u32 off = track_.FileOffsetBySample(currentSample_ + adjust); if (off < first_.size && ignoreDataBuf_) { return first_.addr + off; @@ -256,10 +256,7 @@ public: return 0; } - u8 *BufferStart() { - return ignoreDataBuf_ ? Memory::GetPointerWrite(first_.addr) : dataBuf_; - } - + u8 *BufferStart(); void DoState(PointerWrap &p) override; void WriteContextToPSPMem() override; @@ -285,7 +282,7 @@ public: int GetSecondBufferInfo(u32 *fileOffset, u32 *desiredSize) override; u32 DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) override; u32 GetNextSamples() override; - void InitLowLevel(u32 paramsAddr, bool jointStereo); + void InitLowLevel(u32 paramsAddr, bool jointStereo) override; protected: void AnalyzeReset(); diff --git a/Core/HLE/AtracCtx2.cpp b/Core/HLE/AtracCtx2.cpp new file mode 100644 index 0000000000..0c868982f7 --- /dev/null +++ b/Core/HLE/AtracCtx2.cpp @@ -0,0 +1,73 @@ +#include "Common/Log.h" +#include "AtracCtx2.h" + +void Atrac2::DoState(PointerWrap &p) { + _assert_msg_(false, "Savestates not yet support with new Atrac implementation"); +} + +void Atrac2::WriteContextToPSPMem() { + +} + +int Atrac2::Analyze(u32 addr, u32 size) { + return 0; +} +int Atrac2::AnalyzeAA3(u32 addr, u32 size, u32 filesize) { + return 0; +} + +int Atrac2::RemainingFrames() const { + return 0; +} + +u32 Atrac2::SecondBufferSize() const { + return 0; +} + +void Atrac2::GetStreamDataInfo(u32 *writePtr, u32 *writableBytes, u32 *readOffset) { + +} + +int Atrac2::AddStreamData(u32 bytesToAdd) { + return 0; +} + +u32 Atrac2::AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) { + return 0; +} + +void Atrac2::SetLoopNum(int loopNum) { + +} + +u32 Atrac2::ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) { + return 0; +} + +void Atrac2::GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) { + +} + +int Atrac2::SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels, int successCode) { + return 0; +} + +u32 Atrac2::SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) { + return 0; +} + +int Atrac2::GetSecondBufferInfo(u32 *fileOffset, u32 *desiredSize) { + return 0; +} + +u32 Atrac2::DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) { + return 0; +} + +u32 Atrac2::GetNextSamples() { + return 0; +} + +void Atrac2::InitLowLevel(u32 paramsAddr, bool jointStereo) { + +} diff --git a/Core/HLE/AtracCtx2.h b/Core/HLE/AtracCtx2.h new file mode 100644 index 0000000000..df6734d285 --- /dev/null +++ b/Core/HLE/AtracCtx2.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include "Core/HLE/AtracCtx.h" + + +class Atrac2 : public AtracBase { +public: + 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 RemainingFrames() const override; + u32 SecondBufferSize() const override; + + void GetStreamDataInfo(u32 *writePtr, u32 *writableBytes, u32 *readOffset) override; + int AddStreamData(u32 bytesToAdd) override; + u32 AddStreamDataSas(u32 bufPtr, u32 bytesToAdd) override; + void SetLoopNum(int loopNum) override; + u32 ResetPlayPosition(int sample, int bytesWrittenFirstBuf, int bytesWrittenSecondBuf) override; + void GetResetBufferInfo(AtracResetBufferInfo *bufferInfo, int sample) override; + int SetData(u32 buffer, u32 readSize, u32 bufferSize, int outputChannels, int successCode) override; + u32 SetSecondBuffer(u32 secondBuffer, u32 secondBufferSize) override; + int GetSecondBufferInfo(u32 *fileOffset, u32 *desiredSize) override; + u32 DecodeData(u8 *outbuf, u32 outbufPtr, u32 *SamplesNum, u32 *finish, int *remains) override; + u32 GetNextSamples() override; + void InitLowLevel(u32 paramsAddr, bool jointStereo) override; + +private: + int currentSample_ = 0; +}; diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index 775d21ec28..15513b031d 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -35,6 +35,7 @@ #include "Core/HLE/sceKernelMemory.h" #include "Core/HLE/sceAtrac.h" #include "Core/HLE/AtracCtx.h" +#include "Core/HLE/AtracCtx2.h" #include "Core/System.h" // Notes about sceAtrac buffer management @@ -136,6 +137,14 @@ void __AtracDoState(PointerWrap &p) { } } +static AtracBase *allocAtrac(bool forceOld = false) { + if (g_Config.bUseNewAtrac && !forceOld) { + return new Atrac2(); + } else { + return new Atrac(); + } +} + static AtracBase *getAtrac(int atracID) { if (atracID < 0 || atracID >= PSP_NUM_ATRAC_IDS) { return nullptr; @@ -169,13 +178,14 @@ static int deleteAtrac(int atracID) { return ATRAC_ERROR_BAD_ATRACID; } -// Really, allocate a new Atrac context of a specific codec type. +// Really, allocate an Atrac context of a specific codec type. +// Useful to initialize a context for low level decode. static u32 sceAtracGetAtracID(int codecType) { if (codecType != PSP_MODE_AT_3 && codecType != PSP_MODE_AT_3_PLUS) { return hleReportError(ME, ATRAC_ERROR_INVALID_CODECTYPE, "invalid codecType"); } - AtracBase *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); atrac->GetTrackMut().codecType = codecType; int atracID = createAtrac(atrac); if (atracID < 0) { @@ -619,7 +629,7 @@ static int sceAtracSetDataAndGetID(u32 buffer, int bufferSize) { bufferSize = 0x10000000; } - Atrac *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); int ret = atrac->Analyze(buffer, bufferSize); if (ret < 0) { // Already logged. @@ -639,7 +649,7 @@ static int sceAtracSetHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 buffer if (readSize > bufferSize) { return hleLogError(ME, ATRAC_ERROR_INCORRECT_READ_SIZE, "read size too large"); } - Atrac *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); int ret = atrac->Analyze(buffer, readSize); if (ret < 0) { // Already logged. @@ -795,7 +805,7 @@ static u32 sceAtracSetMOutData(int atracID, u32 buffer, u32 bufferSize) { // Note: This doesn't seem to be part of any available libatrac3plus library. static int sceAtracSetMOutDataAndGetID(u32 buffer, u32 bufferSize) { - Atrac *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); int ret = atrac->Analyze(buffer, bufferSize); if (ret < 0) { // Already logged. @@ -819,7 +829,7 @@ static int sceAtracSetMOutHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 bu if (readSize > bufferSize) { return hleLogError(ME, ATRAC_ERROR_INCORRECT_READ_SIZE, "read size too large"); } - Atrac *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); int ret = atrac->Analyze(buffer, readSize); if (ret < 0) { // Already logged. @@ -840,7 +850,7 @@ static int sceAtracSetMOutHalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 bu } static int sceAtracSetAA3DataAndGetID(u32 buffer, u32 bufferSize, u32 fileSize, u32 metadataSizeAddr) { - Atrac *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); int ret = atrac->AnalyzeAA3(buffer, bufferSize, fileSize); if (ret < 0) { // Already logged. @@ -962,7 +972,7 @@ static int sceAtracSetAA3HalfwayBufferAndGetID(u32 buffer, u32 readSize, u32 buf return hleLogError(ME, ATRAC_ERROR_INCORRECT_READ_SIZE, "read size too large"); } - Atrac *atrac = new Atrac(); + AtracBase *atrac = allocAtrac(); int ret = atrac->AnalyzeAA3(buffer, readSize, fileSize); if (ret < 0) { // Already logged. diff --git a/Core/HLE/sceAudiocodec.h b/Core/HLE/sceAudiocodec.h index 8f190cb84e..21d9106e82 100644 --- a/Core/HLE/sceAudiocodec.h +++ b/Core/HLE/sceAudiocodec.h @@ -17,6 +17,8 @@ #pragma once +class PointerWrap; + typedef struct { s32_le unk0; s32_le unk4; @@ -58,4 +60,4 @@ typedef struct { void __AudioCodecInit(); void __AudioCodecShutdown(); void Register_sceAudiocodec(); -void __sceAudiocodecDoState(PointerWrap &p); \ No newline at end of file +void __sceAudiocodecDoState(PointerWrap &p); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 2be2db01fd..3ffdd66445 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1783,6 +1783,8 @@ void DeveloperToolsScreen::CreateViews() { cpuTests->SetEnabled(TestsAvailable()); #endif + list->Add(new CheckBox(&g_Config.bUseNewAtrac, dev->T("Use experimental sceAtrac"))); + AddOverlayList(list, screenManager()); list->Add(new CheckBox(&g_Config.bEnableLogging, dev->T("Enable Logging")))->OnClick.Handle(this, &DeveloperToolsScreen::OnLoggingChanged); diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj index 372cf7e0ee..5a8eafb8dd 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj +++ b/UWP/CoreUWP/CoreUWP.vcxproj @@ -175,6 +175,7 @@ + @@ -427,6 +428,7 @@ + diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters index 1d6c5090dc..591347ecc2 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj.filters +++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters @@ -1202,6 +1202,9 @@ HLE + + HLE + @@ -1888,6 +1891,9 @@ HLE + + HLE + diff --git a/android/jni/Android.mk b/android/jni/Android.mk index bd1939220d..cfc31293e8 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -615,6 +615,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/HLE/sceAdler.cpp \ $(SRC)/Core/HLE/sceAtrac.cpp \ $(SRC)/Core/HLE/AtracCtx.cpp \ + $(SRC)/Core/HLE/AtracCtx2.cpp \ $(SRC)/Core/HLE/__sceAudio.cpp.arm \ $(SRC)/Core/HLE/sceAudio.cpp.arm \ $(SRC)/Core/HLE/sceAudiocodec.cpp.arm \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 3aded79f28..47a886af34 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -652,6 +652,7 @@ SOURCES_CXX += \ $(COREDIR)/HLE/HLEHelperThread.cpp \ $(COREDIR)/HLE/HLETables.cpp \ $(COREDIR)/HLE/AtracCtx.cpp \ + $(COREDIR)/HLE/AtracCtx2.cpp \ $(COREDIR)/HLE/sceAdler.cpp \ $(COREDIR)/HLE/sceAtrac.cpp \ $(COREDIR)/HLE/sceAudio.cpp \