From 79057e9160eafee6655ef8b19760cca6f8470d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Franch?= Date: Mon, 5 Oct 2026 16:50:22 +0200 Subject: [PATCH] refactor(libs): drop replacements of modules that titles ship themselves Co-Authored-By: Claude --- CONTRIBUTING.md | 1 + core/libs/CMakeLists.txt | 21 - core/libs/prx/libREDGalaxy64/Export.cpp | 196 -- core/libs/prx/libRenoirCore.PS5/Export.cpp | 145 -- .../libs/prx/libSceNpCppWebApi/CMakeLists.txt | 21 - core/libs/prx/libSceNpCppWebApi/Export.cpp | 1194 ----------- core/libs/prx/libcohtml/CMakeLists.txt | 6 - core/libs/prx/libcohtml/DEPLOY.md | 16 - core/libs/prx/libcohtml/Export.cpp | 307 --- core/libs/prx/libfmod/CMakeLists.txt | 11 - core/libs/prx/libfmod/Export.cpp | 1902 ----------------- core/libs/prx/libfmodstudio/CMakeLists.txt | 10 - core/libs/prx/libfmodstudio/Export.cpp | 1007 --------- .../tests/GuestNpCppWebApiIntrusivePtr.cpp | 256 --- core/libs/tests/GuestNpCppWebApiString.cpp | 112 - docs/dev/TechnicalDebt.md | 2 - tools/package_release.py | 1 - 17 files changed, 1 insertion(+), 5207 deletions(-) delete mode 100644 core/libs/prx/libREDGalaxy64/Export.cpp delete mode 100644 core/libs/prx/libRenoirCore.PS5/Export.cpp delete mode 100644 core/libs/prx/libSceNpCppWebApi/CMakeLists.txt delete mode 100644 core/libs/prx/libSceNpCppWebApi/Export.cpp delete mode 100644 core/libs/prx/libcohtml/CMakeLists.txt delete mode 100644 core/libs/prx/libcohtml/DEPLOY.md delete mode 100644 core/libs/prx/libcohtml/Export.cpp delete mode 100644 core/libs/prx/libfmod/CMakeLists.txt delete mode 100644 core/libs/prx/libfmod/Export.cpp delete mode 100644 core/libs/prx/libfmodstudio/CMakeLists.txt delete mode 100644 core/libs/prx/libfmodstudio/Export.cpp delete mode 100644 core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp delete mode 100644 core/libs/tests/GuestNpCppWebApiString.cpp diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a34bd71a5..c12a36055 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,6 +7,7 @@ - A silent stub is allowed only when it unblocks a title and only affects the UI; add it to [silent stubs](docs/dev/TechnicalDebt.md#silent-stubs). - Missing imports fail at startup with a clear error; don't replace them with fallbacks that keep running. - Implement the general behaviour of a function, not what one title happens to need. +- Don't add replacements for modules that titles ship themselves in `sce_module/`, `sce_modules/` or `prx/`: engine or middleware modules (Cohtml, FMOD, GOG Galaxy) and SDK libraries that only wrap other system libraries (NpCppWebApi over NpWebApi2). The relinker converts and loads the title's own module, and a host library with the same name is left out of `DT_NEEDED`. Only system libraries, which reach the kernel or the hardware, are reimplemented in [core/libs/prx](core/libs/prx). - Avoid non-standard extensions (`__attribute__`, etc.) where standard C++ is enough. Helper symbols that must not become NIDs use the `_nid_no_patch` or `_nid_no_patch_cut` suffix. - The relinker uses only the C++20 standard library. - Third-party code is added as a submodule under `3rdparty/` and built from source, not found on the system. diff --git a/core/libs/CMakeLists.txt b/core/libs/CMakeLists.txt index 510110335..dfe86ccd6 100644 --- a/core/libs/CMakeLists.txt +++ b/core/libs/CMakeLists.txt @@ -118,17 +118,6 @@ foreach(LIB_DIR ${LIBS_DIRS}) endif() endforeach() -set(LIBCOHTML_PATCHED ${PATCHED_DIR}/libcohtml.prx) -set(LIBCOHTML_PROSPERO_PATCHED ${PATCHED_DIR}/libcohtml.Prospero.prx) -add_custom_command( - OUTPUT ${LIBCOHTML_PROSPERO_PATCHED} - COMMAND ${CMAKE_COMMAND} -E copy "${LIBCOHTML_PATCHED}" "${LIBCOHTML_PROSPERO_PATCHED}" - DEPENDS ${LIBCOHTML_PATCHED} - VERBATIM -) -add_custom_target(libcohtml_prospero DEPENDS ${LIBCOHTML_PROSPERO_PATCHED}) -list(APPEND PATCHED_OUTPUTS ${LIBCOHTML_PROSPERO_PATCHED}) - add_custom_target(libs DEPENDS ${PATCHED_OUTPUTS}) if(BUILD_TESTING) @@ -170,16 +159,6 @@ if(BUILD_TESTING) add_test(NAME host_thread_local COMMAND host_thread_local_tests) set_tests_properties(host_thread_local PROPERTIES TIMEOUT 15) - add_test_executable(guest_np_cpp_web_api_intrusive_ptr_tests tests/GuestNpCppWebApiIntrusivePtr.cpp) - target_include_directories(guest_np_cpp_web_api_intrusive_ptr_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(guest_np_cpp_web_api_intrusive_ptr_tests PRIVATE libSceNpCppWebApi libc) - configure_windows_unwind(guest_np_cpp_web_api_intrusive_ptr_tests) - add_test(NAME guest_np_cpp_web_api_intrusive_ptr COMMAND guest_np_cpp_web_api_intrusive_ptr_tests) - if(WIN32) - set_tests_properties(guest_np_cpp_web_api_intrusive_ptr PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(savedata_core_write_replacement_tests tests/SaveDataWriteReplacement.cpp) target_include_directories(savedata_core_write_replacement_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(savedata_core_write_replacement_tests PRIVATE libSceSaveData) diff --git a/core/libs/prx/libREDGalaxy64/Export.cpp b/core/libs/prx/libREDGalaxy64/Export.cpp deleted file mode 100644 index bf5c6235f..000000000 --- a/core/libs/prx/libREDGalaxy64/Export.cpp +++ /dev/null @@ -1,196 +0,0 @@ -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" - -extern "C" { - -// CD Projekt RED GOG Galaxy wrapper, bundled with the game as -// modules/libREDGalaxy64.prx (seen in Cyberpunk 2077 PPSA04029). -// Online Galaxy services cannot work under emulation: Init/Shutdown/ -// ProcessData are accepted and ignored, interface getters return null -// (all observed engine call sites null-check the result). -// Roles below were reversed from the module's own export bodies: -// Init references clientID/clientSecret/configFilePath, Shutdown -// releases the facade singletons, ProcessData throttles facade -// ProcessData calls, GetErrorString formats Gog/Std exceptions. - -APS5_EXPORT("1icN9EO2WSg", redGalaxy64Init); -std::uint64_t APS5_VABI redGalaxy64Init(const void* options) { - (void)options; - NotImplemented_nid_no_patch(__func__); - return 1; -} - -APS5_EXPORT("SA7aCTRE5zg", redGalaxy64Shutdown); -void APS5_VABI redGalaxy64Shutdown(void) { - NotImplemented_nid_no_patch(__func__); -} - -APS5_EXPORT("ZVPOpEqpUvo", redGalaxy64ProcessData); -void APS5_VABI redGalaxy64ProcessData(void) { - NotImplemented_nid_no_patch(__func__); -} - -APS5_EXPORT("4trn+7BssaY", redGalaxy64GetErrorString); -const char* APS5_VABI redGalaxy64GetErrorString(void) { - NotImplemented_nid_no_patch(__func__); - return ""; -} - -APS5_EXPORT("DQAUzFVaGl8", redGalaxy64GameServerInit); -std::uint64_t APS5_VABI redGalaxy64GameServerInit(const void* options) { - (void)options; - NotImplemented_nid_no_patch(__func__); - return 1; -} - -APS5_EXPORT("GKomji4WVHw", redGalaxy64ProcessGameServerData); -void APS5_VABI redGalaxy64ProcessGameServerData(void) { - NotImplemented_nid_no_patch(__func__); -} - -APS5_EXPORT("36lort-kFp4", redgalaxy_stub_00); -std::uint64_t APS5_VABI redgalaxy_stub_00(std::uint64_t a0, std::uint64_t a1, std::uint64_t a2) { - (void)a0; - (void)a1; - (void)a2; - NotImplemented_nid_no_patch("36lort-kFp4"); - return 0; -} - -APS5_EXPORT("NgDLhCc6F7Y", redgalaxy_stub_01); -std::uint64_t APS5_VABI redgalaxy_stub_01(const void* a0, const char* a1, std::uint64_t a2) { - (void)a0; - (void)a1; - (void)a2; - NotImplemented_nid_no_patch("NgDLhCc6F7Y"); - return 0; -} - -APS5_EXPORT("huJ+beHcWBE", redgalaxy_stub_02); -std::uint64_t APS5_VABI redgalaxy_stub_02(void) { - NotImplemented_nid_no_patch("huJ+beHcWBE"); - return 0; -} - -APS5_EXPORT("sxiZFliOEDU", redgalaxy_stub_03); -std::uint64_t APS5_VABI redgalaxy_stub_03(void) { - NotImplemented_nid_no_patch("sxiZFliOEDU"); - return 0; -} - -APS5_EXPORT("49Bdn1OOJ90", redgalaxy_stub_04); -std::uint64_t APS5_VABI redgalaxy_stub_04(void) { - NotImplemented_nid_no_patch("49Bdn1OOJ90"); - return 0; -} - -APS5_EXPORT("8ahh9DUqZLY", redgalaxy_stub_05); -std::uint64_t APS5_VABI redgalaxy_stub_05(void) { - NotImplemented_nid_no_patch("8ahh9DUqZLY"); - return 0; -} - -APS5_EXPORT("Ard4nEfw5Vs", redgalaxy_stub_06); -std::uint64_t APS5_VABI redgalaxy_stub_06(void) { - NotImplemented_nid_no_patch("Ard4nEfw5Vs"); - return 0; -} - -APS5_EXPORT("AzO2fwK+MUs", redgalaxy_stub_07); -std::uint64_t APS5_VABI redgalaxy_stub_07(void) { - NotImplemented_nid_no_patch("AzO2fwK+MUs"); - return 0; -} - -APS5_EXPORT("HKIwQPq45o4", redgalaxy_stub_08); -std::uint64_t APS5_VABI redgalaxy_stub_08(void) { - NotImplemented_nid_no_patch("HKIwQPq45o4"); - return 0; -} - -APS5_EXPORT("IXRuom5imkM", redgalaxy_stub_09); -std::uint64_t APS5_VABI redgalaxy_stub_09(void) { - NotImplemented_nid_no_patch("IXRuom5imkM"); - return 0; -} - -APS5_EXPORT("LjDqfncevos", redgalaxy_stub_10); -std::uint64_t APS5_VABI redgalaxy_stub_10(void) { - NotImplemented_nid_no_patch("LjDqfncevos"); - return 0; -} - -APS5_EXPORT("Onwg0aGsFhM", redgalaxy_stub_11); -std::uint64_t APS5_VABI redgalaxy_stub_11(void) { - NotImplemented_nid_no_patch("Onwg0aGsFhM"); - return 0; -} - -APS5_EXPORT("oSyqfoYcK40", redgalaxy_stub_12); -std::uint64_t APS5_VABI redgalaxy_stub_12(void) { - NotImplemented_nid_no_patch("oSyqfoYcK40"); - return 0; -} - -APS5_EXPORT("qoS0gqW7RxI", redgalaxy_stub_13); -std::uint64_t APS5_VABI redgalaxy_stub_13(void) { - NotImplemented_nid_no_patch("qoS0gqW7RxI"); - return 0; -} - -APS5_EXPORT("SOtPNNwajSw", redgalaxy_stub_14); -std::uint64_t APS5_VABI redgalaxy_stub_14(void) { - NotImplemented_nid_no_patch("SOtPNNwajSw"); - return 0; -} - -APS5_EXPORT("udfpd9vbE+w", redgalaxy_stub_15); -std::uint64_t APS5_VABI redgalaxy_stub_15(void) { - NotImplemented_nid_no_patch("udfpd9vbE+w"); - return 0; -} - -APS5_EXPORT("vuGujcpcUEk", redgalaxy_stub_16); -std::uint64_t APS5_VABI redgalaxy_stub_16(void) { - NotImplemented_nid_no_patch("vuGujcpcUEk"); - return 0; -} - -APS5_EXPORT("VXUTdiaHbD4", redgalaxy_stub_17); -std::uint64_t APS5_VABI redgalaxy_stub_17(void) { - NotImplemented_nid_no_patch("VXUTdiaHbD4"); - return 0; -} - -APS5_EXPORT("w5-trCio4bQ", redgalaxy_stub_18); -std::uint64_t APS5_VABI redgalaxy_stub_18(void) { - NotImplemented_nid_no_patch("w5-trCio4bQ"); - return 0; -} - -APS5_EXPORT("YpZjREtZb20", redgalaxy_stub_19); -std::uint64_t APS5_VABI redgalaxy_stub_19(void) { - NotImplemented_nid_no_patch("YpZjREtZb20"); - return 0; -} - -APS5_EXPORT("gPJN5c9XCec", redgalaxy_stub_20); -std::uint64_t APS5_VABI redgalaxy_stub_20(void) { - NotImplemented_nid_no_patch("gPJN5c9XCec"); - return 0; -} - -APS5_EXPORT("z4SpWc89no8", redgalaxy_stub_21); -std::uint64_t APS5_VABI redgalaxy_stub_21(void) { - NotImplemented_nid_no_patch("z4SpWc89no8"); - return 0; -} - -APS5_EXPORT("zdzopKdBeU4", redgalaxy_stub_22); -std::uint64_t APS5_VABI redgalaxy_stub_22(void) { - NotImplemented_nid_no_patch("zdzopKdBeU4"); - return 0; -} - -} diff --git a/core/libs/prx/libRenoirCore.PS5/Export.cpp b/core/libs/prx/libRenoirCore.PS5/Export.cpp deleted file mode 100644 index c0cf955a3..000000000 --- a/core/libs/prx/libRenoirCore.PS5/Export.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" - -extern "C" { - -APS5_EXPORT("0DsDTr534gc", renoirStub00); -uint64_t APS5_VABI renoirStub00(void) { - NotImplemented_nid_no_patch("0DsDTr534gc"); - return 0; -} - -APS5_EXPORT("2T56HgbPW08", renoirStub01); -uint64_t APS5_VABI renoirStub01(void) { - NotImplemented_nid_no_patch("2T56HgbPW08"); - return 0; -} - -APS5_EXPORT("3HnCozh8Az8", renoirStub02); -uint64_t APS5_VABI renoirStub02(void) { - NotImplemented_nid_no_patch("3HnCozh8Az8"); - return 0; -} - -APS5_EXPORT("5Ysce+s-CWU", renoirStub03); -uint64_t APS5_VABI renoirStub03(void) { - NotImplemented_nid_no_patch("5Ysce+s-CWU"); - return 0; -} - -APS5_EXPORT("AdlSqA4lGS8", renoirStub04); -uint64_t APS5_VABI renoirStub04(void) { - NotImplemented_nid_no_patch("AdlSqA4lGS8"); - return 0; -} - -APS5_EXPORT("bC37hk7rHqs", renoirStub05); -uint64_t APS5_VABI renoirStub05(void) { - NotImplemented_nid_no_patch("bC37hk7rHqs"); - return 0; -} - -APS5_EXPORT("dfPK9R6M0qM", renoirStub06); -uint64_t APS5_VABI renoirStub06(void) { - NotImplemented_nid_no_patch("dfPK9R6M0qM"); - return 0; -} - -APS5_EXPORT("fZiBbVa2ZDU", renoirStub07); -uint64_t APS5_VABI renoirStub07(void) { - NotImplemented_nid_no_patch("fZiBbVa2ZDU"); - return 0; -} - -APS5_EXPORT("hkWBH8-WfW4", renoirStub08); -uint64_t APS5_VABI renoirStub08(void) { - NotImplemented_nid_no_patch("hkWBH8-WfW4"); - return 0; -} - -APS5_EXPORT("hUxvGdi64Io", renoirStub09); -uint64_t APS5_VABI renoirStub09(void) { - NotImplemented_nid_no_patch("hUxvGdi64Io"); - return 0; -} - -APS5_EXPORT("NxqsZxGisrA", renoirStub10); -uint64_t APS5_VABI renoirStub10(void) { - NotImplemented_nid_no_patch("NxqsZxGisrA"); - return 0; -} - -APS5_EXPORT("OgZVIkaNmb0", renoirStub11); -uint64_t APS5_VABI renoirStub11(void) { - NotImplemented_nid_no_patch("OgZVIkaNmb0"); - return 0; -} - -APS5_EXPORT("ojLQdRUnVgA", renoirStub12); -uint64_t APS5_VABI renoirStub12(void) { - NotImplemented_nid_no_patch("ojLQdRUnVgA"); - return 0; -} - -APS5_EXPORT("s0qDfgsAgVg", renoirStub13); -uint64_t APS5_VABI renoirStub13(void) { - NotImplemented_nid_no_patch("s0qDfgsAgVg"); - return 0; -} - -APS5_EXPORT("sgrd-r1Nw60", renoirStub14); -uint64_t APS5_VABI renoirStub14(void) { - NotImplemented_nid_no_patch("sgrd-r1Nw60"); - return 0; -} - -APS5_EXPORT("sjTRb8YD7dQ", renoirStub15); -uint64_t APS5_VABI renoirStub15(void) { - NotImplemented_nid_no_patch("sjTRb8YD7dQ"); - return 0; -} - -APS5_EXPORT("tG86XGc2VtE", renoirStub16); -uint64_t APS5_VABI renoirStub16(void) { - NotImplemented_nid_no_patch("tG86XGc2VtE"); - return 0; -} - -APS5_EXPORT("umlGxOcNzgc", renoirStub17); -uint64_t APS5_VABI renoirStub17(void) { - NotImplemented_nid_no_patch("umlGxOcNzgc"); - return 0; -} - -APS5_EXPORT("vPxA9OFW0os", renoirStub18); -uint64_t APS5_VABI renoirStub18(void) { - NotImplemented_nid_no_patch("vPxA9OFW0os"); - return 0; -} - -APS5_EXPORT("X2qEBlOLkNo", renoirStub19); -uint64_t APS5_VABI renoirStub19(void) { - NotImplemented_nid_no_patch("X2qEBlOLkNo"); - return 0; -} - -APS5_EXPORT("ynh4E+BIaqY", renoirStub20); -uint64_t APS5_VABI renoirStub20(void) { - NotImplemented_nid_no_patch("ynh4E+BIaqY"); - return 0; -} - -APS5_EXPORT("YXe6ABbHZPs", renoirStub21); -uint64_t APS5_VABI renoirStub21(void) { - NotImplemented_nid_no_patch("YXe6ABbHZPs"); - return 0; -} - -APS5_EXPORT("z0jsXZVz75I", renoirStub22); -uint64_t APS5_VABI renoirStub22(void) { - NotImplemented_nid_no_patch("z0jsXZVz75I"); - return 0; -} - -} diff --git a/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt b/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt deleted file mode 100644 index 2519e8cc8..000000000 --- a/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -add_library(libSceNpCppWebApi SHARED EXCLUDE_FROM_ALL Export.cpp) -target_include_directories(libSceNpCppWebApi PRIVATE ${LIBS_INCLUDE_DIR}) -configure_windows_unwind(libSceNpCppWebApi) - -if(MINGW) - foreach(runtimeLinkFlag IN ITEMS -static-libgcc -static-libstdc++ -static) - string(REPLACE "${runtimeLinkFlag}" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - endforeach() -endif() - -if(BUILD_TESTING) - add_test_executable(guest_np_cpp_web_api_string_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpCppWebApiString.cpp) - target_include_directories(guest_np_cpp_web_api_string_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_np_cpp_web_api_string_tests PRIVATE libSceNpCppWebApi libc) - configure_windows_unwind(guest_np_cpp_web_api_string_tests) - add_test(NAME guest_np_cpp_web_api_string COMMAND guest_np_cpp_web_api_string_tests) - if(WIN32) - set_tests_properties(guest_np_cpp_web_api_string PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() diff --git a/core/libs/prx/libSceNpCppWebApi/Export.cpp b/core/libs/prx/libSceNpCppWebApi/Export.cpp deleted file mode 100644 index 75caf2847..000000000 --- a/core/libs/prx/libSceNpCppWebApi/Export.cpp +++ /dev/null @@ -1,1194 +0,0 @@ -#include -#include -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" - -static constexpr int SCE_NP_WEBAPI_ERROR_UNAVAILABLE = static_cast(0x80552901); - -// Offline PSN: request entry points (API calls, transaction start/readData, factories) fail with -// SCE_NP_WEBAPI_ERROR_UNAVAILABLE; parameter bookkeeping succeeds; response accessors stay unimplemented -// because a failed request never produces a response. -extern "C" { - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V111UserFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_4UserEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody18setStartSerialRankERKi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody8setGroupERKNS3_5GroupE() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody8setLimitERKi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody8setUsersERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_4UserEEEEE() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody9setOffsetERKi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V122GetRankingResponseBody10getEntriesEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V122RecordScoreRequestBody10setCommentEPKc() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V122RecordScoreRequestBody12setSmallDataEPKvm() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V122RecordScoreRequestBody15setNeedsTmpRankERKb() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V122RecordScoreRequestBody19setComparedDateTimeERK10SceRtcTick() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V122RecordScoreRequestBody7setPcIdERKi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V128GetRankingRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_21GetRankingRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V129RecordScoreRequestBodyFactory6createEPNS1_6Common10LibContextElPNS5_12IntrusivePtrINS3_22RecordScoreRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V14User12setAccountIdERKm() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V14User7setPcIdERKi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi10getRankingEiRKNS4_21ParameterToGetRankingERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_22GetRankingResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi21ParameterToGetRanking10initializeEPNS1_6Common10LibContextEi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi21ParameterToGetRanking24setgetRankingRequestBodyENS1_6Common12IntrusivePtrINS3_21GetRankingRequestBodyEEE() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi21ParameterToGetRanking9terminateEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi21ParameterToGetRankingC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi21ParameterToGetRankingD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi22getLargeDataByObjectIdEiRKNS4_33ParameterToGetLargeDataByObjectIdERNS1_6Common21DownStreamTransactionINS8_12IntrusivePtrINS4_37GetLargeDataByObjectIdResponseHeadersEEEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi33ParameterToGetLargeDataByObjectId10initializeEPNS1_6Common10LibContextEPKc() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi33ParameterToGetLargeDataByObjectId9terminateEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi33ParameterToGetLargeDataByObjectIdC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V17ViewApi33ParameterToGetLargeDataByObjectIdD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19BoardsApi18getBoardDefinitionEiRKNS4_29ParameterToGetBoardDefinitionERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_30GetBoardDefinitionResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19BoardsApi29ParameterToGetBoardDefinition10initializeEPNS1_6Common10LibContextEi() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19BoardsApi29ParameterToGetBoardDefinition9terminateEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19BoardsApi29ParameterToGetBoardDefinitionC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19BoardsApi29ParameterToGetBoardDefinitionD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi11recordScoreEiRKNS4_22ParameterToRecordScoreERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_23RecordScoreResponseBodyEEENSA_INS4_26RecordScoreResponseHeadersEEEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi15recordLargeDataEiRKNS4_26ParameterToRecordLargeDataERNS1_6Common19UpStreamTransactionINS8_12IntrusivePtrINS3_27RecordLargeDataResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi22ParameterToRecordScore10initializeEPNS1_6Common10LibContextEiNS6_12IntrusivePtrINS3_22RecordScoreRequestBodyEEE() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi22ParameterToRecordScore22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi22ParameterToRecordScore9terminateEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi22ParameterToRecordScoreC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi22ParameterToRecordScoreD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi26ParameterToRecordLargeData10initializeEPNS1_6Common10LibContextEiNS5_19XPsnAtomicOperationEPKc() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi26ParameterToRecordLargeData9terminateEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi26ParameterToRecordLargeDataC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V19RecordApi26ParameterToRecordLargeDataD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi12downloadDataEiRKNS4_23ParameterToDownloadDataERNS1_6Common21DownStreamTransactionINS8_12IntrusivePtrINS4_27DownloadDataResponseHeadersEEEEE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData10initializeEPNS1_6Common10LibContextEPKci() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData9terminateEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadDataC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadDataD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsD1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10LibContextC1Ev(uint64_t* self) { - *self = 0; - return 0; -} - -// Initialization succeeds as on an offline console (see libSceJson2); individual requests fail. -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10initializeERKNS2_10InitParamsERNS2_10LibContextE(const void* params, uint64_t* context) { - (void)params; - if (context) *context = 1; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEEC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEED1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; -} - -struct IntrusivePtr { - void* object; - void (APS5_VABI* deleter)(void*); - void* libContext; -}; -static_assert(sizeof(IntrusivePtr) == 0x18); - -static constexpr std::size_t ReferenceCountOffset = 0; -static constexpr std::size_t VectorReferenceCountOffset = 0x30; - -static std::atomic_ref ReferenceCount(void* object, const std::size_t offset) { - return std::atomic_ref(*reinterpret_cast(static_cast(object) + offset)); -} - -static void CopyIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* source, const std::size_t referenceCountOffset) { - *self = *source; - if (self->object) ReferenceCount(self->object, referenceCountOffset).fetch_add(1); -} - -static void ReleaseIntrusivePtr(IntrusivePtr* self, const std::size_t referenceCountOffset, const char* function) { - if (!self->object) return; - if (ReferenceCount(self->object, referenceCountOffset).fetch_sub(1) != 1) return; - if (!self->deleter) NotImplemented_nid_no_patch(function); - self->deleter(self->object); - self->object = nullptr; - self->deleter = nullptr; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, ReferenceCountOffset); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, ReferenceCountOffset); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, VectorReferenceCountOffset, __func__); -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEED2Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextEm() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE8sendDataEPKvm() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE8readDataEPcm() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEEC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEED1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE8readDataEPcm() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEEC1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEED1Ev(void* self) { - (void)self; - return 0; -} - -struct CommonString { - std::int32_t referenceCount; - char* buffer; - std::uint64_t bufferSize; - void* libContext; -}; -static_assert(sizeof(CommonString) == 0x20 && offsetof(CommonString, buffer) == 0x08); -static_assert(offsetof(CommonString, bufferSize) == 0x10 && offsetof(CommonString, libContext) == 0x18); - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(CommonString* self, void* libContext) { - self->referenceCount = 0; - self->buffer = nullptr; - self->bufferSize = 0; - self->libContext = libContext; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self) { - if (self->buffer != nullptr) NotImplemented_nid_no_patch("sce::Np::CppWebApi::Common::String buffer release"); -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEE8pushBackERKS8_() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEEC1EPNS2_10LibContextE(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEED1Ev(void* self) { - (void)self; - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE3endEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE5beginEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common9terminateERNS2_10LibContextE(uint64_t* context) { - *context = 0; - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V122GetRankingResponseBody22getLastUpdatedDateTimeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V123RecordScoreResponseBody10getTmpRankEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V123RecordScoreResponseBody16getTmpSerialRankEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody11getSortModeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13getEntryLimitEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13getUpdateModeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13sortModeIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody15entryLimitIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody15updateModeIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody16getMaxScoreLimitEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody16getMinScoreLimitEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody18maxScoreLimitIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody18minScoreLimitIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody20getLargeDataNumLimitEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody21getLargeDataSizeLimitEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody22largeDataNumLimitIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody23largeDataSizeLimitIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry10getCommentEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry11getObjectIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry11getOnlineIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12commentIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12getAccountIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12getSmallDataEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry13getSerialRankEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry13objectIdIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry14getHighestRankEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry14smallDataIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry20getHighestSerialRankEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry7getPcIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry7getRankEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry8getScoreEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V19RecordApi26RecordScoreResponseHeaders24getXPsnAtomicOperationIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V15EntryEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6BinaryEEptEv(const IntrusivePtr* self) { - return self->object; -} - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE18getResponseHeadersERSB_() { - return SCE_NP_WEBAPI_ERROR_UNAVAILABLE; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary4sizeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary9getBinaryEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self) { - return self->buffer != nullptr ? self->buffer : ""; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEdeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEneERKS9_() { - NotImplemented_nid_no_patch(__func__); - return 0; -} - - -APS5_EXPORT("+gSMGXHgrPU", sceNpCppWebApiUnknown00); -int APS5_VABI sceNpCppWebApiUnknown00(void) { - NotImplemented_nid_no_patch("+gSMGXHgrPU"); - return 0; -} - -APS5_EXPORT("-XNfwZTFkWw", sceNpCppWebApiUnknown01); -int APS5_VABI sceNpCppWebApiUnknown01(void) { - NotImplemented_nid_no_patch("-XNfwZTFkWw"); - return 0; -} - -APS5_EXPORT("0f5+eBcgB14", sceNpCppWebApiUnknown02); -int APS5_VABI sceNpCppWebApiUnknown02(void) { - NotImplemented_nid_no_patch("0f5+eBcgB14"); - return 0; -} - -APS5_EXPORT("1iq5Jtw4jVs", sceNpCppWebApiUnknown03); -int APS5_VABI sceNpCppWebApiUnknown03(void) { - NotImplemented_nid_no_patch("1iq5Jtw4jVs"); - return 0; -} - -APS5_EXPORT("1wpCXuFzH10", sceNpCppWebApiUnknown04); -int APS5_VABI sceNpCppWebApiUnknown04(void) { - NotImplemented_nid_no_patch("1wpCXuFzH10"); - return 0; -} - -APS5_EXPORT("4AFThLW28xQ", sceNpCppWebApiUnknown05); -int APS5_VABI sceNpCppWebApiUnknown05(void) { - NotImplemented_nid_no_patch("4AFThLW28xQ"); - return 0; -} - -APS5_EXPORT("8-9Y4oS+OuE", sceNpCppWebApiUnknown06); -int APS5_VABI sceNpCppWebApiUnknown06(void) { - NotImplemented_nid_no_patch("8-9Y4oS+OuE"); - return 0; -} - -APS5_EXPORT("8dWkWjo5EeE", sceNpCppWebApiUnknown07); -int APS5_VABI sceNpCppWebApiUnknown07(void) { - NotImplemented_nid_no_patch("8dWkWjo5EeE"); - return 0; -} - -APS5_EXPORT("BHvfIGdarBQ", sceNpCppWebApiUnknown08); -int APS5_VABI sceNpCppWebApiUnknown08(void) { - NotImplemented_nid_no_patch("BHvfIGdarBQ"); - return 0; -} - -APS5_EXPORT("Fxxr5lYBfl4", sceNpCppWebApiUnknown09); -int APS5_VABI sceNpCppWebApiUnknown09(void) { - NotImplemented_nid_no_patch("Fxxr5lYBfl4"); - return 0; -} - -APS5_EXPORT("M1LnjRscx-w", sceNpCppWebApiUnknown10); -int APS5_VABI sceNpCppWebApiUnknown10(void) { - NotImplemented_nid_no_patch("M1LnjRscx-w"); - return 0; -} - -APS5_EXPORT("PsX657reZeo", sceNpCppWebApiUnknown11); -int APS5_VABI sceNpCppWebApiUnknown11(void) { - NotImplemented_nid_no_patch("PsX657reZeo"); - return 0; -} - -APS5_EXPORT("RvH9AZ5rCkQ", sceNpCppWebApiUnknown12); -int APS5_VABI sceNpCppWebApiUnknown12(void) { - NotImplemented_nid_no_patch("RvH9AZ5rCkQ"); - return 0; -} - -APS5_EXPORT("SR3BKonD8yk", sceNpCppWebApiUnknown13); -int APS5_VABI sceNpCppWebApiUnknown13(void) { - NotImplemented_nid_no_patch("SR3BKonD8yk"); - return 0; -} - -APS5_EXPORT("TSoQhYKyq5g", sceNpCppWebApiUnknown14); -int APS5_VABI sceNpCppWebApiUnknown14(void) { - NotImplemented_nid_no_patch("TSoQhYKyq5g"); - return 0; -} - -APS5_EXPORT("TgsJjQqp+2k", sceNpCppWebApiUnknown15); -int APS5_VABI sceNpCppWebApiUnknown15(void) { - NotImplemented_nid_no_patch("TgsJjQqp+2k"); - return 0; -} - -APS5_EXPORT("UHQxE3HhTXA", sceNpCppWebApiUnknown16); -int APS5_VABI sceNpCppWebApiUnknown16(void) { - NotImplemented_nid_no_patch("UHQxE3HhTXA"); - return 0; -} - -APS5_EXPORT("ZN-glpk0Rug", sceNpCppWebApiUnknown17); -int APS5_VABI sceNpCppWebApiUnknown17(void) { - NotImplemented_nid_no_patch("ZN-glpk0Rug"); - return 0; -} - -APS5_EXPORT("ZQzXwokCnUE", sceNpCppWebApiUnknown18); -int APS5_VABI sceNpCppWebApiUnknown18(void) { - NotImplemented_nid_no_patch("ZQzXwokCnUE"); - return 0; -} - -APS5_EXPORT("ZwjmbSr4Cxc", sceNpCppWebApiUnknown19); -int APS5_VABI sceNpCppWebApiUnknown19(void) { - NotImplemented_nid_no_patch("ZwjmbSr4Cxc"); - return 0; -} - -APS5_EXPORT("b7leY-LNVnI", sceNpCppWebApiUnknown20); -int APS5_VABI sceNpCppWebApiUnknown20(void) { - NotImplemented_nid_no_patch("b7leY-LNVnI"); - return 0; -} - -APS5_EXPORT("c3J9K9XbQqE", sceNpCppWebApiUnknown21); -int APS5_VABI sceNpCppWebApiUnknown21(void) { - NotImplemented_nid_no_patch("c3J9K9XbQqE"); - return 0; -} - -APS5_EXPORT("cSLbQUQO2Ns", sceNpCppWebApiUnknown22); -int APS5_VABI sceNpCppWebApiUnknown22(void) { - NotImplemented_nid_no_patch("cSLbQUQO2Ns"); - return 0; -} - -APS5_EXPORT("cqOxjL0ZfFA", sceNpCppWebApiUnknown23); -int APS5_VABI sceNpCppWebApiUnknown23(void) { - NotImplemented_nid_no_patch("cqOxjL0ZfFA"); - return 0; -} - -APS5_EXPORT("d1eEjWR60wk", sceNpCppWebApiUnknown24); -int APS5_VABI sceNpCppWebApiUnknown24(void) { - NotImplemented_nid_no_patch("d1eEjWR60wk"); - return 0; -} - -APS5_EXPORT("epwr+cBCIFs", sceNpCppWebApiUnknown25); -int APS5_VABI sceNpCppWebApiUnknown25(void) { - NotImplemented_nid_no_patch("epwr+cBCIFs"); - return 0; -} - -APS5_EXPORT("eruduJ0KrT0", sceNpCppWebApiUnknown26); -int APS5_VABI sceNpCppWebApiUnknown26(void) { - NotImplemented_nid_no_patch("eruduJ0KrT0"); - return 0; -} - -APS5_EXPORT("fG06a38iao8", sceNpCppWebApiUnknown27); -int APS5_VABI sceNpCppWebApiUnknown27(void) { - NotImplemented_nid_no_patch("fG06a38iao8"); - return 0; -} - -APS5_EXPORT("jfpSx14AeLc", sceNpCppWebApiUnknown28); -int APS5_VABI sceNpCppWebApiUnknown28(void) { - NotImplemented_nid_no_patch("jfpSx14AeLc"); - return 0; -} - -APS5_EXPORT("kBxwE4YfbIM", sceNpCppWebApiUnknown29); -int APS5_VABI sceNpCppWebApiUnknown29(void) { - NotImplemented_nid_no_patch("kBxwE4YfbIM"); - return 0; -} - -APS5_EXPORT("kz2Z38yTLq0", sceNpCppWebApiUnknown30); -int APS5_VABI sceNpCppWebApiUnknown30(void) { - NotImplemented_nid_no_patch("kz2Z38yTLq0"); - return 0; -} - -APS5_EXPORT("lB8driFKaoU", sceNpCppWebApiUnknown31); -int APS5_VABI sceNpCppWebApiUnknown31(void) { - NotImplemented_nid_no_patch("lB8driFKaoU"); - return 0; -} - -APS5_EXPORT("mCsV7izOkjY", sceNpCppWebApiUnknown32); -int APS5_VABI sceNpCppWebApiUnknown32(void) { - NotImplemented_nid_no_patch("mCsV7izOkjY"); - return 0; -} - -APS5_EXPORT("n1yCLMxpseQ", sceNpCppWebApiUnknown33); -int APS5_VABI sceNpCppWebApiUnknown33(void) { - NotImplemented_nid_no_patch("n1yCLMxpseQ"); - return 0; -} - -APS5_EXPORT("nL9vSVq-29s", sceNpCppWebApiUnknown34); -int APS5_VABI sceNpCppWebApiUnknown34(void) { - NotImplemented_nid_no_patch("nL9vSVq-29s"); - return 0; -} - -APS5_EXPORT("nmz5JYKcMfY", sceNpCppWebApiUnknown35); -int APS5_VABI sceNpCppWebApiUnknown35(void) { - NotImplemented_nid_no_patch("nmz5JYKcMfY"); - return 0; -} - -APS5_EXPORT("oHRl7a+zdMU", sceNpCppWebApiUnknown36); -int APS5_VABI sceNpCppWebApiUnknown36(void) { - NotImplemented_nid_no_patch("oHRl7a+zdMU"); - return 0; -} - -APS5_EXPORT("pSpO3hPNv64", sceNpCppWebApiUnknown37); -int APS5_VABI sceNpCppWebApiUnknown37(void) { - NotImplemented_nid_no_patch("pSpO3hPNv64"); - return 0; -} - -APS5_EXPORT("q4UFICay6Hk", sceNpCppWebApiUnknown38); -int APS5_VABI sceNpCppWebApiUnknown38(void) { - NotImplemented_nid_no_patch("q4UFICay6Hk"); - return 0; -} - -APS5_EXPORT("qiD2PU2Jstc", sceNpCppWebApiUnknown39); -int APS5_VABI sceNpCppWebApiUnknown39(void) { - NotImplemented_nid_no_patch("qiD2PU2Jstc"); - return 0; -} - -APS5_EXPORT("tFe964qzGEM", sceNpCppWebApiUnknown40); -int APS5_VABI sceNpCppWebApiUnknown40(void) { - NotImplemented_nid_no_patch("tFe964qzGEM"); - return 0; -} - -APS5_EXPORT("tHaO36kincQ", sceNpCppWebApiUnknown41); -int APS5_VABI sceNpCppWebApiUnknown41(void) { - NotImplemented_nid_no_patch("tHaO36kincQ"); - return 0; -} - -APS5_EXPORT("umm5m+mXiZs", sceNpCppWebApiUnknown42); -int APS5_VABI sceNpCppWebApiUnknown42(void) { - NotImplemented_nid_no_patch("umm5m+mXiZs"); - return 0; -} - -APS5_EXPORT("uwhztB49KOQ", sceNpCppWebApiUnknown43); -int APS5_VABI sceNpCppWebApiUnknown43(void) { - NotImplemented_nid_no_patch("uwhztB49KOQ"); - return 0; -} - -APS5_EXPORT("w4K4nTYwhVE", sceNpCppWebApiUnknown44); -int APS5_VABI sceNpCppWebApiUnknown44(void) { - NotImplemented_nid_no_patch("w4K4nTYwhVE"); - return 0; -} - -APS5_EXPORT("wFcm6bgWB9Q", sceNpCppWebApiUnknown45); -int APS5_VABI sceNpCppWebApiUnknown45(void) { - NotImplemented_nid_no_patch("wFcm6bgWB9Q"); - return 0; -} - -APS5_EXPORT("wp8+c84G5Xw", sceNpCppWebApiUnknown46); -int APS5_VABI sceNpCppWebApiUnknown46(void) { - NotImplemented_nid_no_patch("wp8+c84G5Xw"); - return 0; -} - -APS5_EXPORT("zjqTmP0ST9A", sceNpCppWebApiUnknown47); -int APS5_VABI sceNpCppWebApiUnknown47(void) { - NotImplemented_nid_no_patch("zjqTmP0ST9A"); - return 0; -} - -APS5_EXPORT("zzO8ZGJ74ng", sceNpCppWebApiUnknown48); -int APS5_VABI sceNpCppWebApiUnknown48(void) { - NotImplemented_nid_no_patch("zzO8ZGJ74ng"); - return 0; -} - -APS5_EXPORT("12wY179+CE8", sceNpCppWebApiUnknown49); -int APS5_VABI sceNpCppWebApiUnknown49(void) { - NotImplemented_nid_no_patch("12wY179+CE8"); - return 0; -} - -APS5_EXPORT("3bjEFf8OhTs", sceNpCppWebApiUnknown50); -int APS5_VABI sceNpCppWebApiUnknown50(void) { - NotImplemented_nid_no_patch("3bjEFf8OhTs"); - return 0; -} - -APS5_EXPORT("6FK4IOnANkc", sceNpCppWebApiUnknown51); -int APS5_VABI sceNpCppWebApiUnknown51(void) { - NotImplemented_nid_no_patch("6FK4IOnANkc"); - return 0; -} - -APS5_EXPORT("EJAOHYWUki4", sceNpCppWebApiUnknown52); -int APS5_VABI sceNpCppWebApiUnknown52(void) { - NotImplemented_nid_no_patch("EJAOHYWUki4"); - return 0; -} - -APS5_EXPORT("FlagLhjAEmc", sceNpCppWebApiUnknown53); -int APS5_VABI sceNpCppWebApiUnknown53(void) { - NotImplemented_nid_no_patch("FlagLhjAEmc"); - return 0; -} - -APS5_EXPORT("G3h-NDHnyW4", sceNpCppWebApiUnknown54); -int APS5_VABI sceNpCppWebApiUnknown54(void) { - NotImplemented_nid_no_patch("G3h-NDHnyW4"); - return 0; -} - -APS5_EXPORT("H0XjNhflED4", sceNpCppWebApiUnknown55); -int APS5_VABI sceNpCppWebApiUnknown55(void) { - NotImplemented_nid_no_patch("H0XjNhflED4"); - return 0; -} - -APS5_EXPORT("IbWx007Acn4", sceNpCppWebApiUnknown56); -int APS5_VABI sceNpCppWebApiUnknown56(void) { - NotImplemented_nid_no_patch("IbWx007Acn4"); - return 0; -} - -APS5_EXPORT("Is+nI7Hq9jU", sceNpCppWebApiUnknown57); -int APS5_VABI sceNpCppWebApiUnknown57(void) { - NotImplemented_nid_no_patch("Is+nI7Hq9jU"); - return 0; -} - -APS5_EXPORT("Kc4x2uy0FFk", sceNpCppWebApiUnknown58); -int APS5_VABI sceNpCppWebApiUnknown58(void) { - NotImplemented_nid_no_patch("Kc4x2uy0FFk"); - return 0; -} - -APS5_EXPORT("OK+Ggpve7B0", sceNpCppWebApiUnknown59); -int APS5_VABI sceNpCppWebApiUnknown59(void) { - NotImplemented_nid_no_patch("OK+Ggpve7B0"); - return 0; -} - -APS5_EXPORT("P3daBLFFREw", sceNpCppWebApiUnknown60); -int APS5_VABI sceNpCppWebApiUnknown60(void) { - NotImplemented_nid_no_patch("P3daBLFFREw"); - return 0; -} - -APS5_EXPORT("RZcseJ3THfY", sceNpCppWebApiUnknown61); -int APS5_VABI sceNpCppWebApiUnknown61(void) { - NotImplemented_nid_no_patch("RZcseJ3THfY"); - return 0; -} - -APS5_EXPORT("RbvteD35X-8", sceNpCppWebApiUnknown62); -int APS5_VABI sceNpCppWebApiUnknown62(void) { - NotImplemented_nid_no_patch("RbvteD35X-8"); - return 0; -} - -APS5_EXPORT("XCtf+23QT0k", sceNpCppWebApiUnknown63); -int APS5_VABI sceNpCppWebApiUnknown63(void) { - NotImplemented_nid_no_patch("XCtf+23QT0k"); - return 0; -} - -APS5_EXPORT("a4q15LI1a4E", sceNpCppWebApiUnknown64); -int APS5_VABI sceNpCppWebApiUnknown64(void) { - NotImplemented_nid_no_patch("a4q15LI1a4E"); - return 0; -} - -APS5_EXPORT("eT4TQB7OsLA", sceNpCppWebApiUnknown65); -int APS5_VABI sceNpCppWebApiUnknown65(void) { - NotImplemented_nid_no_patch("eT4TQB7OsLA"); - return 0; -} - -APS5_EXPORT("g2dEqFnhFuw", sceNpCppWebApiUnknown66); -int APS5_VABI sceNpCppWebApiUnknown66(void) { - NotImplemented_nid_no_patch("g2dEqFnhFuw"); - return 0; -} - -APS5_EXPORT("lPAMjFZEpt8", sceNpCppWebApiUnknown67); -int APS5_VABI sceNpCppWebApiUnknown67(void) { - NotImplemented_nid_no_patch("lPAMjFZEpt8"); - return 0; -} - -APS5_EXPORT("mBagn+lW-iM", sceNpCppWebApiUnknown68); -int APS5_VABI sceNpCppWebApiUnknown68(void) { - NotImplemented_nid_no_patch("mBagn+lW-iM"); - return 0; -} - -APS5_EXPORT("mkWsKEh0h0o", sceNpCppWebApiUnknown69); -int APS5_VABI sceNpCppWebApiUnknown69(void) { - NotImplemented_nid_no_patch("mkWsKEh0h0o"); - return 0; -} - -APS5_EXPORT("nE0ooeCMRm8", sceNpCppWebApiUnknown70); -int APS5_VABI sceNpCppWebApiUnknown70(void) { - NotImplemented_nid_no_patch("nE0ooeCMRm8"); - return 0; -} - -APS5_EXPORT("qf2I9BlKXis", sceNpCppWebApiUnknown71); -int APS5_VABI sceNpCppWebApiUnknown71(void) { - NotImplemented_nid_no_patch("qf2I9BlKXis"); - return 0; -} - -APS5_EXPORT("xwy1I52dE8o", sceNpCppWebApiUnknown72); -int APS5_VABI sceNpCppWebApiUnknown72(void) { - NotImplemented_nid_no_patch("xwy1I52dE8o"); - return 0; -} -} diff --git a/core/libs/prx/libcohtml/CMakeLists.txt b/core/libs/prx/libcohtml/CMakeLists.txt deleted file mode 100644 index 842799d34..000000000 --- a/core/libs/prx/libcohtml/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -add_library(libcohtml SHARED EXCLUDE_FROM_ALL - ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp -) -target_include_directories(libcohtml PRIVATE ${LIBS_INCLUDE_DIR}) -set_target_properties(libcohtml PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(libcohtml) diff --git a/core/libs/prx/libcohtml/DEPLOY.md b/core/libs/prx/libcohtml/DEPLOY.md deleted file mode 100644 index 0b4cbdc5d..000000000 --- a/core/libs/prx/libcohtml/DEPLOY.md +++ /dev/null @@ -1,16 +0,0 @@ -# libcohtml — deploy note - -Game `DT_NEEDED` expects exactly: `libcohtml.Prospero.prx`. - -Copy next to the relinked eboot (same directory): - -- `build/core/libs/libs/libcohtml.Prospero.prx` (patched build output, 50 NIDs) — required. -- `libgcc_s_seh-1.dll`, `libstdc++-6.dll`, `libwinpthread-1.dll` from `winlibs-gcc15/mingw64/bin` — required on Windows (see [technical debt](../../../../docs/dev/TechnicalDebt.md)). - -Do NOT deploy: - -- `libcohtml.prx` (build intermediate kept for the NID-patch pipeline, wrong `DT_NEEDED` name). -- Anything under `build/core/libs/libs/unpatched/` (NIDs not patched). -- `libc.prx` / `libkernel.prx` are not runtime imports of this module (no such DLL dependency); the game may need its other modules separately (out of scope). - -Scope: raw-NID stubs only; real Cohtml rendering stays out of scope. diff --git a/core/libs/prx/libcohtml/Export.cpp b/core/libs/prx/libcohtml/Export.cpp deleted file mode 100644 index 4ae1996b4..000000000 --- a/core/libs/prx/libcohtml/Export.cpp +++ /dev/null @@ -1,307 +0,0 @@ -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" - -extern "C" { - -APS5_EXPORT("1fOA53oGwU8", cohtml_stub_00); -std::uint64_t APS5_VABI cohtml_stub_00(void) { - NotImplemented_nid_no_patch("1fOA53oGwU8"); - return 0; -} - -APS5_EXPORT("2vxXHkZlhbw", cohtml_stub_01); -std::uint64_t APS5_VABI cohtml_stub_01(void) { - NotImplemented_nid_no_patch("2vxXHkZlhbw"); - return 0; -} - -APS5_EXPORT("3rew70M0SmY", cohtml_stub_02); -std::uint64_t APS5_VABI cohtml_stub_02(void) { - NotImplemented_nid_no_patch("3rew70M0SmY"); - return 0; -} - -APS5_EXPORT("4Le0SBPvnF8", cohtml_stub_03); -std::uint64_t APS5_VABI cohtml_stub_03(void) { - NotImplemented_nid_no_patch("4Le0SBPvnF8"); - return 0; -} - -APS5_EXPORT("53ZTBeo2a54", cohtml_stub_04); -std::uint64_t APS5_VABI cohtml_stub_04(void) { - NotImplemented_nid_no_patch("53ZTBeo2a54"); - return 0; -} - -APS5_EXPORT("6PaNuQipllM", cohtml_stub_05); -std::uint64_t APS5_VABI cohtml_stub_05(void) { - NotImplemented_nid_no_patch("6PaNuQipllM"); - return 0; -} - -APS5_EXPORT("7hn5DAs2bLk", cohtml_stub_06); -std::uint64_t APS5_VABI cohtml_stub_06(void) { - NotImplemented_nid_no_patch("7hn5DAs2bLk"); - return 0; -} - -APS5_EXPORT("8EYWdAM2-R0", cohtml_stub_07); -std::uint64_t APS5_VABI cohtml_stub_07(void) { - NotImplemented_nid_no_patch("8EYWdAM2-R0"); - return 0; -} - -APS5_EXPORT("9bGvfp1zbKo", cohtml_stub_08); -std::uint64_t APS5_VABI cohtml_stub_08(void) { - NotImplemented_nid_no_patch("9bGvfp1zbKo"); - return 0; -} - -APS5_EXPORT("a4E5dJh0onE", cohtml_stub_09); -std::uint64_t APS5_VABI cohtml_stub_09(void) { - NotImplemented_nid_no_patch("a4E5dJh0onE"); - return 0; -} - -APS5_EXPORT("BhL-ZtSHmB8", cohtml_stub_10); -std::uint64_t APS5_VABI cohtml_stub_10(void) { - NotImplemented_nid_no_patch("BhL-ZtSHmB8"); - return 0; -} - -APS5_EXPORT("blvwzOvsEAA", cohtml_stub_11); -std::uint64_t APS5_VABI cohtml_stub_11(void) { - NotImplemented_nid_no_patch("blvwzOvsEAA"); - return 0; -} - -APS5_EXPORT("dko-cMqv5yw", cohtml_stub_12); -std::uint64_t APS5_VABI cohtml_stub_12(void) { - NotImplemented_nid_no_patch("dko-cMqv5yw"); - return 0; -} - -APS5_EXPORT("EG4kqkxLU3Q", cohtml_stub_13); -std::uint64_t APS5_VABI cohtml_stub_13(void) { - NotImplemented_nid_no_patch("EG4kqkxLU3Q"); - return 0; -} - -APS5_EXPORT("-El4B0xJF2U", cohtml_stub_14); -std::uint64_t APS5_VABI cohtml_stub_14(void) { - NotImplemented_nid_no_patch("-El4B0xJF2U"); - return 0; -} - -APS5_EXPORT("EMhQNylkSwk", cohtml_stub_15); -std::uint64_t APS5_VABI cohtml_stub_15(void) { - NotImplemented_nid_no_patch("EMhQNylkSwk"); - return 0; -} - -APS5_EXPORT("-eNSKAypRz0", cohtml_stub_16); -std::uint64_t APS5_VABI cohtml_stub_16(void) { - NotImplemented_nid_no_patch("-eNSKAypRz0"); - return 0; -} - -APS5_EXPORT("FG9VRZfson0", cohtml_stub_17); -std::uint64_t APS5_VABI cohtml_stub_17(void) { - NotImplemented_nid_no_patch("FG9VRZfson0"); - return 0; -} - -APS5_EXPORT("fNvtExaHN4U", cohtml_stub_18); -std::uint64_t APS5_VABI cohtml_stub_18(void) { - NotImplemented_nid_no_patch("fNvtExaHN4U"); - return 0; -} - -APS5_EXPORT("g10DkPARoa8", cohtml_stub_19); -std::uint64_t APS5_VABI cohtml_stub_19(void) { - NotImplemented_nid_no_patch("g10DkPARoa8"); - return 0; -} - -APS5_EXPORT("gwQczxoDmG0", cohtml_stub_20); -std::uint64_t APS5_VABI cohtml_stub_20(void) { - NotImplemented_nid_no_patch("gwQczxoDmG0"); - return 0; -} - -APS5_EXPORT("HQF4O9D+Di4", cohtml_stub_21); -std::uint64_t APS5_VABI cohtml_stub_21(void) { - NotImplemented_nid_no_patch("HQF4O9D+Di4"); - return 0; -} - -APS5_EXPORT("igt3a6Q0VMc", cohtml_stub_22); -std::uint64_t APS5_VABI cohtml_stub_22(void) { - NotImplemented_nid_no_patch("igt3a6Q0VMc"); - return 0; -} - -APS5_EXPORT("kyApuhEHHxQ", cohtml_stub_23); -std::uint64_t APS5_VABI cohtml_stub_23(void) { - NotImplemented_nid_no_patch("kyApuhEHHxQ"); - return 0; -} - -APS5_EXPORT("Ljp75QXUi7s", cohtml_stub_24); -std::uint64_t APS5_VABI cohtml_stub_24(void) { - NotImplemented_nid_no_patch("Ljp75QXUi7s"); - return 0; -} - -APS5_EXPORT("loJ5Ef3MZrs", cohtml_stub_25); -std::uint64_t APS5_VABI cohtml_stub_25(void) { - NotImplemented_nid_no_patch("loJ5Ef3MZrs"); - return 0; -} - -APS5_EXPORT("LWe+u8SHKgU", cohtml_stub_26); -std::uint64_t APS5_VABI cohtml_stub_26(void) { - NotImplemented_nid_no_patch("LWe+u8SHKgU"); - return 0; -} - -APS5_EXPORT("nhn1ds+I2t4", cohtml_stub_27); -std::uint64_t APS5_VABI cohtml_stub_27(void) { - NotImplemented_nid_no_patch("nhn1ds+I2t4"); - return 0; -} - -APS5_EXPORT("NmVsRWgsKt4", cohtml_stub_28); -std::uint64_t APS5_VABI cohtml_stub_28(void) { - NotImplemented_nid_no_patch("NmVsRWgsKt4"); - return 0; -} - -APS5_EXPORT("ONEnhMinebs", cohtml_stub_29); -std::uint64_t APS5_VABI cohtml_stub_29(void) { - NotImplemented_nid_no_patch("ONEnhMinebs"); - return 0; -} - -APS5_EXPORT("PdOmR8dy1fM", cohtml_stub_30); -std::uint64_t APS5_VABI cohtml_stub_30(void) { - NotImplemented_nid_no_patch("PdOmR8dy1fM"); - return 0; -} - -APS5_EXPORT("PSwGBN5Icv8", cohtml_stub_31); -std::uint64_t APS5_VABI cohtml_stub_31(void) { - NotImplemented_nid_no_patch("PSwGBN5Icv8"); - return 0; -} - -APS5_EXPORT("RalyfwiTt8o", cohtml_stub_32); -std::uint64_t APS5_VABI cohtml_stub_32(void) { - NotImplemented_nid_no_patch("RalyfwiTt8o"); - return 0; -} - -APS5_EXPORT("t+OHUjVWIwU", cohtml_stub_33); -std::uint64_t APS5_VABI cohtml_stub_33(void) { - NotImplemented_nid_no_patch("t+OHUjVWIwU"); - return 0; -} - -APS5_EXPORT("Ter8YCVZ9tQ", cohtml_stub_34); -std::uint64_t APS5_VABI cohtml_stub_34(void) { - NotImplemented_nid_no_patch("Ter8YCVZ9tQ"); - return 0; -} - -APS5_EXPORT("tG3LJfAOH3k", cohtml_stub_35); -std::uint64_t APS5_VABI cohtml_stub_35(void) { - NotImplemented_nid_no_patch("tG3LJfAOH3k"); - return 0; -} - -APS5_EXPORT("ukSFhKPmCTg", cohtml_stub_36); -std::uint64_t APS5_VABI cohtml_stub_36(void) { - NotImplemented_nid_no_patch("ukSFhKPmCTg"); - return 0; -} - -APS5_EXPORT("V7KGze2XjJc", cohtml_stub_37); -std::uint64_t APS5_VABI cohtml_stub_37(void) { - NotImplemented_nid_no_patch("V7KGze2XjJc"); - return 0; -} - -APS5_EXPORT("vlmAvJqR7mQ", cohtml_stub_38); -std::uint64_t APS5_VABI cohtml_stub_38(void) { - NotImplemented_nid_no_patch("vlmAvJqR7mQ"); - return 0; -} - -APS5_EXPORT("VzhxjXDzYSI", cohtml_stub_39); -std::uint64_t APS5_VABI cohtml_stub_39(void) { - NotImplemented_nid_no_patch("VzhxjXDzYSI"); - return 0; -} - -APS5_EXPORT("X3FzDPzpD2Y", cohtml_stub_40); -std::uint64_t APS5_VABI cohtml_stub_40(void) { - NotImplemented_nid_no_patch("X3FzDPzpD2Y"); - return 0; -} - -APS5_EXPORT("x68HPh+vxsE", cohtml_stub_41); -std::uint64_t APS5_VABI cohtml_stub_41(void) { - NotImplemented_nid_no_patch("x68HPh+vxsE"); - return 0; -} - -APS5_EXPORT("XUe8OAKB-vQ", cohtml_stub_42); -std::uint64_t APS5_VABI cohtml_stub_42(void) { - NotImplemented_nid_no_patch("XUe8OAKB-vQ"); - return 0; -} - -APS5_EXPORT("y6UNQtnr0wY", cohtml_stub_43); -std::uint64_t APS5_VABI cohtml_stub_43(void) { - NotImplemented_nid_no_patch("y6UNQtnr0wY"); - return 0; -} - -APS5_EXPORT("YoHAXkBV06c", cohtml_stub_44); -std::uint64_t APS5_VABI cohtml_stub_44(void) { - NotImplemented_nid_no_patch("YoHAXkBV06c"); - return 0; -} - -APS5_EXPORT("Z9XFJCfmId4", cohtml_stub_45); -std::uint64_t APS5_VABI cohtml_stub_45(void) { - NotImplemented_nid_no_patch("Z9XFJCfmId4"); - return 0; -} - -APS5_EXPORT("zEniuuzG2W0", cohtml_stub_46); -std::uint64_t APS5_VABI cohtml_stub_46(void) { - NotImplemented_nid_no_patch("zEniuuzG2W0"); - return 0; -} - -APS5_EXPORT("zH9Z2nK1fmA", cohtml_stub_47); -std::uint64_t APS5_VABI cohtml_stub_47(void) { - NotImplemented_nid_no_patch("zH9Z2nK1fmA"); - return 0; -} - -APS5_EXPORT("ZHGgdWeYTo8", cohtml_stub_48); -std::uint64_t APS5_VABI cohtml_stub_48(void) { - NotImplemented_nid_no_patch("ZHGgdWeYTo8"); - return 0; -} - -APS5_EXPORT("ZWftPxZ4E6k", cohtml_stub_49); -std::uint64_t APS5_VABI cohtml_stub_49(void) { - NotImplemented_nid_no_patch("ZWftPxZ4E6k"); - return 0; -} - -} diff --git a/core/libs/prx/libfmod/CMakeLists.txt b/core/libs/prx/libfmod/CMakeLists.txt deleted file mode 100644 index 5d1cb47f7..000000000 --- a/core/libs/prx/libfmod/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -add_library(libfmod SHARED EXCLUDE_FROM_ALL - ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp -) - -target_include_directories(libfmod PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include -) -target_link_libraries(libfmod PRIVATE libkernel libc SDL2-static) -target_compile_options(libfmod PRIVATE -fkeep-inline-functions) -configure_windows_unwind(libfmod) diff --git a/core/libs/prx/libfmod/Export.cpp b/core/libs/prx/libfmod/Export.cpp deleted file mode 100644 index bd7545a64..000000000 --- a/core/libs/prx/libfmod/Export.cpp +++ /dev/null @@ -1,1902 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" -#include "SDL.h" - -// FMOD_MODE bits (subset, from fmod_common.h) — used to detect memory buffers. -constexpr unsigned FMOD_LOOP_OFF = 0x00000001u; -constexpr unsigned FMOD_LOOP_NORMAL = 0x00000002u; -constexpr unsigned FMOD_LOOP_BIDI = 0x00000004u; -constexpr unsigned FMOD_2D_FLAG = 0x00000008u; -constexpr unsigned FMOD_3D_FLAG = 0x00000010u; -constexpr unsigned FMOD_CREATESTREAM_FLAG = 0x00000080u; -constexpr unsigned FMOD_OPENMEMORY_FLAG = 0x00000800u; -constexpr unsigned FMOD_OPENMEMORY_POINT_FLAG = 0x10000000u; -constexpr unsigned FMOD_OPENRAW_FLAG = 0x00001000u; -constexpr unsigned FMOD_NONBLOCKING_FLAG = 0x00010000u; - -enum FMOD_OUTPUTTYPE { - FMOD_OUTPUTTYPE_AUTODETECT = 0, - FMOD_OUTPUTTYPE_UNKNOWN = 1, - FMOD_OUTPUTTYPE_NOSOUND = 2, - FMOD_OUTPUTTYPE_WAVWRITER = 3, - FMOD_OUTPUTTYPE_NOSOUND_NRT = 4, - FMOD_OUTPUTTYPE_WAVWRITER_NRT = 5, - FMOD_OUTPUTTYPE_WASAPI = 6, - FMOD_OUTPUTTYPE_ASIO = 7, - FMOD_OUTPUTTYPE_PULSEAUDIO = 8, - FMOD_OUTPUTTYPE_ALSA = 9, - FMOD_OUTPUTTYPE_COREAUDIO = 10, - FMOD_OUTPUTTYPE_AUDIOTRACK = 11, - FMOD_OUTPUTTYPE_OPENSL = 12, - FMOD_OUTPUTTYPE_AUDIOOUT = 13, - FMOD_OUTPUTTYPE_AUDIO3D = 14, - FMOD_OUTPUTTYPE_MAX = 15 -}; - -enum FMOD_SPEAKERMODE { - FMOD_SPEAKERMODE_DEFAULT = 0, - FMOD_SPEAKERMODE_RAW = 1, - FMOD_SPEAKERMODE_MONO = 2, - FMOD_SPEAKERMODE_STEREO = 3, - FMOD_SPEAKERMODE_QUAD = 4, - FMOD_SPEAKERMODE_SURROUND = 5, - FMOD_SPEAKERMODE_5POINT1 = 6, - FMOD_SPEAKERMODE_7POINT1 = 7, - FMOD_SPEAKERMODE_7POINT1POINT4 = 8, - FMOD_SPEAKERMODE_MAX = 9 -}; - -enum FMOD_SOUND_TYPE { - FMOD_SOUND_TYPE_UNKNOWN = 0, - FMOD_SOUND_TYPE_AIFF = 1, - FMOD_SOUND_TYPE_ASF = 2, - FMOD_SOUND_TYPE_DLS = 3, - FMOD_SOUND_TYPE_FLAC = 4, - FMOD_SOUND_TYPE_FSB = 5, - FMOD_SOUND_TYPE_IT = 6, - FMOD_SOUND_TYPE_MIDI = 7, - FMOD_SOUND_TYPE_MOD = 8, - FMOD_SOUND_TYPE_MPEG = 9, - FMOD_SOUND_TYPE_OGGVORBIS = 10, - FMOD_SOUND_TYPE_PLAYLIST = 11, - FMOD_SOUND_TYPE_RAW = 12, - FMOD_SOUND_TYPE_S3M = 13, - FMOD_SOUND_TYPE_USER = 14, - FMOD_SOUND_TYPE_XM = 15, - FMOD_SOUND_TYPE_XMA = 16, - FMOD_SOUND_TYPE_AUDIOQUEUE = 17, - FMOD_SOUND_TYPE_AT9 = 18, - FMOD_SOUND_TYPE_VB = 19, - FMOD_SOUND_TYPE_MAX = 20 -}; - -enum FMOD_SOUND_FORMAT { - FMOD_SOUND_FORMAT_NONE = 0, - FMOD_SOUND_FORMAT_PCM8 = 1, - FMOD_SOUND_FORMAT_PCM16 = 2, - FMOD_SOUND_FORMAT_PCM24 = 3, - FMOD_SOUND_FORMAT_PCM32 = 4, - FMOD_SOUND_FORMAT_PCMFLOAT = 5, - FMOD_SOUND_FORMAT_BITSTREAM = 6, - FMOD_SOUND_FORMAT_MAX = 7 -}; - -enum FMOD_OPENSTATE { - FMOD_OPENSTATE_READY = 0, - FMOD_OPENSTATE_LOADING = 1, - FMOD_OPENSTATE_ERROR = 2, - FMOD_OPENSTATE_CONNECTING = 3, - FMOD_OPENSTATE_BUFFERING = 4, - FMOD_OPENSTATE_SEEKING = 5, - FMOD_OPENSTATE_PLAYING = 6, - FMOD_OPENSTATE_SETPOSITION = 7, - FMOD_OPENSTATE_MAX = 8 -}; - -enum FMOD_SOUNDGROUP_BEHAVIOR { - FMOD_SOUNDGROUP_BEHAVIOR_FAIL = 0, - FMOD_SOUNDGROUP_BEHAVIOR_MUTE = 1, - FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST = 2, - FMOD_SOUNDGROUP_BEHAVIOR_MAX = 3 -}; - -enum FMOD_DSP_TYPE { - FMOD_DSP_TYPE_UNKNOWN = 0, - FMOD_DSP_TYPE_MIXER = 1, - FMOD_DSP_TYPE_OSCILLATOR = 2, - FMOD_DSP_TYPE_LOWPASS = 3, - FMOD_DSP_TYPE_ITLOWPASS = 4, - FMOD_DSP_TYPE_HIGHPASS = 5, - FMOD_DSP_TYPE_ECHO = 6, - FMOD_DSP_TYPE_FADER = 7, - FMOD_DSP_TYPE_FLANGE = 8, - FMOD_DSP_TYPE_DISTORTION = 9, - FMOD_DSP_TYPE_NORMALIZE = 10, - FMOD_DSP_TYPE_LIMITER = 11, - FMOD_DSP_TYPE_PARAMEQ = 12, - FMOD_DSP_TYPE_PITCHSHIFT = 13, - FMOD_DSP_TYPE_CHORUS = 14, - FMOD_DSP_TYPE_VSTPLUGIN = 15, - FMOD_DSP_TYPE_WINAMPPLUGIN = 16, - FMOD_DSP_TYPE_ITECHO = 17, - FMOD_DSP_TYPE_COMPRESSOR = 18, - FMOD_DSP_TYPE_SFXREVERB = 19, - FMOD_DSP_TYPE_LOWPASS_SIMPLE = 20, - FMOD_DSP_TYPE_DELAY = 21, - FMOD_DSP_TYPE_TREMOLO = 22, - FMOD_DSP_TYPE_SEND = 24, - FMOD_DSP_TYPE_RETURN = 25, - FMOD_DSP_TYPE_HIGHPASS_SIMPLE = 26, - FMOD_DSP_TYPE_PAN = 27, - FMOD_DSP_TYPE_THREE_EQ = 28, - FMOD_DSP_TYPE_FFT = 29, - FMOD_DSP_TYPE_LOUDNESS_METER = 30, - FMOD_DSP_TYPE_ENVELOPEFOLLOWER = 31, - FMOD_DSP_TYPE_CONVOLUTIONREVERB = 32, - FMOD_DSP_TYPE_TRANSCEIVER = 33, - FMOD_DSP_TYPE_MAX = 34 -}; - -enum FMOD_DSPCONNECTION_TYPE { - FMOD_DSPCONNECTION_TYPE_STANDARD = 0, - FMOD_DSPCONNECTION_TYPE_SIDECHAIN = 1, - FMOD_DSPCONNECTION_TYPE_SEND = 2, - FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN = 3, - FMOD_DSPCONNECTION_TYPE_MAX = 4 -}; - -enum FMOD_DSP_FFT_WINDOW { - FMOD_DSP_FFT_WINDOW_RECT = 0, - FMOD_DSP_FFT_WINDOW_TRIANGLE = 1, - FMOD_DSP_FFT_WINDOW_HAMMING = 2, - FMOD_DSP_FFT_WINDOW_HANNING = 3, - FMOD_DSP_FFT_WINDOW_BLACKMAN = 4, - FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS = 5, - FMOD_DSP_FFT_WINDOW_MAX = 6 -}; - -enum FMOD_PLUGINTYPE { - FMOD_PLUGINTYPE_OUTPUT = 0, - FMOD_PLUGINTYPE_CODEC = 1, - FMOD_PLUGINTYPE_DSP = 2, - FMOD_PLUGINTYPE_MAX = 3 -}; - -enum FMOD_DRIVER_STATE { - FMOD_DRIVER_STATE_CONNECTED = 1, - FMOD_DRIVER_STATE_DEFAULT = 2 -}; - -enum FMOD_PORT_TYPE { - FMOD_PORT_TYPE_MUSIC = 0, - FMOD_PORT_TYPE_COPY = 1, - FMOD_PORT_TYPE_SPLIT = 2, - FMOD_PORT_TYPE_FEEDBACK = 3, - FMOD_PORT_TYPE_MAX = 4 -}; - -enum FMOD_SYSTEM_CALLBACK_TYPE { - FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED = 1, - FMOD_SYSTEM_CALLBACK_DEVICELOST = 2, - FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED = 4, - FMOD_SYSTEM_CALLBACK_THREADCREATED = 8, - FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION = 16, - FMOD_SYSTEM_CALLBACK_PREMIX = 32, - FMOD_SYSTEM_CALLBACK_POSTMIX = 64, - FMOD_SYSTEM_CALLBACK_ERROR = 128, - FMOD_SYSTEM_CALLBACK_MIDMIX = 256, - FMOD_SYSTEM_CALLBACK_THREADDESTROYED = 512, - FMOD_SYSTEM_CALLBACK_PREUPDATE = 1024, - FMOD_SYSTEM_CALLBACK_POSTUPDATE = 2048, - FMOD_SYSTEM_CALLBACK_ALL = 0xFFFFFFFF -}; - -enum FMOD_CHANNELCONTROL_TYPE { - FMOD_CHANNELCONTROL_CHANNEL = 0, - FMOD_CHANNELCONTROL_CHANNELGROUP = 1, - FMOD_CHANNELCONTROL_MAX = 2 -}; - -enum FMOD_CHANNELCONTROL_CALLBACK_TYPE { - FMOD_CHANNELCONTROL_CALLBACK_END = 0, - FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE = 1, - FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT = 2, - FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION = 3, - FMOD_CHANNELCONTROL_CALLBACK_MAX = 4 -}; - -enum FMOD_TAGTYPE { - FMOD_TAGTYPE_UNKNOWN = 0, - FMOD_TAGTYPE_ID3V1 = 1, - FMOD_TAGTYPE_ID3V2 = 2, - FMOD_TAGTYPE_VORBISCOMMENT = 3, - FMOD_TAGTYPE_SHOUTCAST = 4, - FMOD_TAGTYPE_ICECAST = 5, - FMOD_TAGTYPE_ASF = 6, - FMOD_TAGTYPE_MIDI = 7, - FMOD_TAGTYPE_PLAYLIST = 8, - FMOD_TAGTYPE_FMOD = 9, - FMOD_TAGTYPE_USER = 10, - FMOD_TAGTYPE_MAX = 11 -}; - -enum FMOD_TAGDATATYPE { - FMOD_TAGDATATYPE_BINARY = 0, - FMOD_TAGDATATYPE_INT = 1, - FMOD_TAGDATATYPE_FLOAT = 2, - FMOD_TAGDATATYPE_STRING = 3, - FMOD_TAGDATATYPE_STRING_UTF16 = 4, - FMOD_TAGDATATYPE_STRING_UTF16BE = 5, - FMOD_TAGDATATYPE_STRING_UTF8 = 6, - FMOD_TAGDATATYPE_CDTOC = 7, - FMOD_TAGDATATYPE_MAX = 8 -}; - -struct FMOD_GUID { - unsigned Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; -}; - -struct FMOD_VECTOR { - float x; - float y; - float z; -}; - -struct FMOD_3D_ATTRIBUTES { - FMOD_VECTOR position; - FMOD_VECTOR velocity; - FMOD_VECTOR forward; - FMOD_VECTOR up; -}; - -struct FMOD_CREATESOUNDEXINFO { - int cbsize; - unsigned length; - unsigned fileoffset; - int numchannels; - int defaultfrequency; - FMOD_SOUND_FORMAT format; - unsigned decodebuffersize; - int initialsubsound; - int numsubsounds; - void* inclusionlist; - unsigned inclusionlistnum; - unsigned char dlsrawdata[8]; - char* encryptionkey; -}; - -struct FMOD_REVERB_PROPERTIES { - int Instance; - float Environment; - float EnvSize; - float EnvDiffusion; - int Room; - int RoomHF; - int RoomLF; - float DecayTime; - float DecayHFRatio; - float DecayLFRatio; - int Reflections; - float ReflectionsDelay; - int Reverb; - float ReverbDelay; - float EchoTime; - float EchoDepth; - float ModulationTime; - float ModulationDepth; - float AirAbsorptionHF; - float HFReference; - float LFReference; - float RoomRolloffFactor; - float Diffusion; - float Density; - unsigned Flags; -}; - -struct FMOD_ADVANCEDSETTINGS { - int cbSize; - unsigned maxMPEGCodecs; - unsigned maxADPCMCodecs; - unsigned maxXMACodecs; - unsigned maxVorbisCodecs; - unsigned maxAT9Codecs; - unsigned maxFADPCMCodecs; - unsigned maxPCMCodecs; - unsigned ASIONumChannels; - char* ASIOChannelList; - char* ASIOSpeakerList; - float vol0virtualvol; - unsigned defaultDecodeBufferSize; - unsigned short profilePort; - unsigned geometryMaxFadeTime; - float distanceFilterCenterFreq; - int reverb3Dinstance; - unsigned DSPBufferPoolSize; - unsigned stackSizeStream; - unsigned stackSizeNonBlocking; - unsigned stackSizeMixer; - int resamplerMethod; - unsigned commandQueueSize; - unsigned handleInitialSize; -}; - -struct FMOD_CPU_USAGE { - float dsp; - float stream; - float geometry; - float update; - float convolution1; - float convolution2; -}; - -struct FMOD_TAG { - FMOD_TAGTYPE type; - FMOD_TAGDATATYPE datatype; - char* name; - void* data; - unsigned datalen; - bool updated; -}; - -struct FMOD_SYNC_POINT { - void* opaque; -}; - -struct FMOD_DSP_DESCRIPTION { - unsigned pluginsdkversion; - char name[32]; - unsigned version; - int numinputbuffers; - int numoutputbuffers; - void* create; - void* release; - void* reset; - void* read; - void* process; - void* setposition; - int numparameters; - void* paramdesc; - void* setparameterfloat; - void* setparameterint; - void* setparameterbool; - void* setparameterdata; - void* getparameterfloat; - void* getparameterint; - void* getparameterbool; - void* getparameterdata; - void* shouldiprocess; - void* userdata; - void* sys_register; - void* sys_deregister; - void* sys_mix; -}; - -struct FMOD_DSP_PARAMETER_DESC { - int type; - char name[16]; - char label[16]; - char* description; -}; - -struct FMOD_DSP_METERING_INFO { - int numsamples; - float peaklevel[32]; - float rmslevel[32]; - short numchannels; -}; - -struct FMOD_DSP_BUFFER_ARRAY { - int numbuffers; - int* buffernumchannels; - int* bufferchannelmask; - float** buffers; - FMOD_SPEAKERMODE speakermode; -}; - -struct FMOD_DSP_STATE { - void* instance; - void* plugindata; - int channelmask; - FMOD_SPEAKERMODE source_speakermode; - float* sidechaindata; - int sidechainchannels; - void* callbacks; - int systemobject; -}; - -struct FMOD_SYSTEM { - int unused; -}; - -struct FMOD_CHANNELCONTROL { - int unused; -}; - -struct FMOD_CHANNELGROUP { - int unused; -}; - -typedef int (*FMOD_SYSTEM_CALLBACK)(FMOD_SYSTEM* system, FMOD_SYSTEM_CALLBACK_TYPE type, void* commanddata1, void* commanddata2, void* userdata); -typedef int (*FMOD_CHANNELCONTROL_CALLBACK)(FMOD_CHANNELCONTROL* channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void* commanddata1, void* commanddata2); - -namespace { - -std::mutex gFmodMutex; - -constexpr int FMOD_OK = 0; -constexpr unsigned FMOD_VERSION_CURRENT = 0x00020206; - -// ---- Real-audio backend (SDL queue, mirrors libSceAudioOut) ---- -// Silent fallback is kept via ANYPS5_FMOD_SILENT=1 or NOSOUND output type -// or when SDL cannot be opened. When silent, update() is a no-op and -// isPlaying() keeps the previous sticky behaviour so the old smoke test -// (playSound(nullptr) -> playing==true) still passes. -constexpr int kFmodOutRate = 48000; -constexpr int kFmodOutCh = 2; -constexpr int kFmodMixFrames = 1024; - -static SDL_AudioDeviceID gFmodDevice = 0; -static SDL_AudioSpec gFmodSpec = {}; -static bool gFmodSdlTried = false; -static bool gFmodSilent = false; - -static bool FmodSilentRequested() { - const char* s = std::getenv("ANYPS5_FMOD_SILENT"); - if (s && (s[0] == '1' || s[0] == 'y' || s[0] == 'Y')) return true; - s = std::getenv("ANYPS5_FMOD_NOSOUND"); - if (s && (s[0] == '1' || s[0] == 'y' || s[0] == 'Y')) return true; - return false; -} - -static bool FmodEnsureDevice() { - if (gFmodDevice != 0) return true; - if (gFmodSdlTried) return gFmodDevice != 0; - gFmodSdlTried = true; - if (FmodSilentRequested()) { - gFmodSilent = true; - return false; - } - if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { - gFmodSilent = true; - return false; - } - SDL_AudioSpec desired{}; - desired.freq = kFmodOutRate; - desired.format = AUDIO_F32SYS; - desired.channels = static_cast(kFmodOutCh); - desired.samples = 1024; - desired.callback = nullptr; - SDL_AudioSpec obtained{}; - gFmodDevice = SDL_OpenAudioDevice(nullptr, 0, &desired, &obtained, SDL_AUDIO_ALLOW_ANY_CHANGE); - if (gFmodDevice == 0) { - gFmodSilent = true; - return false; - } - gFmodSpec = obtained; - SDL_PauseAudioDevice(gFmodDevice, 0); - return true; -} - -static void FmodMakeSine(std::vector& out, int rate, int ch, float freqHz, float seconds) { - const size_t frames = static_cast(rate * seconds); - out.resize(frames * static_cast(ch)); - const float phaseInc = 2.0f * 3.14159265358979323846f * freqHz / static_cast(rate); - float phase = 0.0f; - for (size_t f = 0; f < frames; f++) { - const float s = std::sin(phase) * 0.25f; - phase += phaseInc; - for (int c = 0; c < ch; c++) out[f * static_cast(ch) + static_cast(c)] = s; - } -} - -// Minimal WAV (RIFF/WAVE) parser -> float stereo 48k. Returns false if not WAV. -static bool FmodParseWav(const uint8_t* data, size_t len, std::vector& outPcm, int& outRate, int& outCh) { - if (len < 44 || std::memcmp(data, "RIFF", 4) != 0 || std::memcmp(data + 8, "WAVE", 4) != 0) return false; - uint16_t audioFmt = 0, numCh = 0, bitsPerSample = 0; - uint32_t sampleRate = 0; - const uint8_t* snd = nullptr; - size_t sndLen = 0; - size_t off = 12; - auto rd16 = [](const uint8_t* p) -> uint16_t { return static_cast(p[0] | (p[1] << 8)); }; - auto rd32 = [](const uint8_t* p) -> uint32_t { return static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); }; - while (off + 8 <= len) { - const uint8_t* chunk = data + off; - uint32_t chunkLen = rd32(chunk + 4); - if (off + 8 + chunkLen > len) break; - if (std::memcmp(chunk, "fmt ", 4) == 0 && chunkLen >= 16) { - audioFmt = rd16(chunk + 8); - numCh = rd16(chunk + 10); - sampleRate = rd32(chunk + 12); - bitsPerSample = rd16(chunk + 22); - } else if (std::memcmp(chunk, "data", 4) == 0) { - snd = chunk + 8; - sndLen = chunkLen; - } - off += 8 + ((chunkLen + 1) & ~static_cast(1)); - } - if (!snd || sndLen == 0 || numCh == 0 || sampleRate == 0) return false; - if (audioFmt != 1 && audioFmt != 3) return false; // PCM or FLOAT - int bytesPerSamp = bitsPerSample / 8; - if (bytesPerSamp <= 0) return false; - size_t frames = sndLen / (static_cast(numCh) * static_cast(bytesPerSamp)); - if (frames == 0) return false; - if (frames > 48000u * 30u) frames = 48000u * 30u; // cap 30s - std::vector tmp; - tmp.reserve(frames * 2); - for (size_t f = 0; f < frames; f++) { - float l = 0.0f, r = 0.0f; - for (int c = 0; c < numCh && c < 8; c++) { - const uint8_t* p = snd + (f * numCh + c) * bytesPerSamp; - float s = 0.0f; - if (audioFmt == 1) { - if (bitsPerSample == 8) s = (static_cast(p[0]) - 128) / 128.0f; - else if (bitsPerSample == 16) { int16_t v; std::memcpy(&v, p, 2); s = v / 32768.0f; } - else if (bitsPerSample == 24) { int32_t v = (p[0] | (p[1] << 8) | (p[2] << 16)); if (v & 0x800000) v |= ~0xFFFFFF; s = v / 8388608.0f; } - else if (bitsPerSample == 32) { int32_t v; std::memcpy(&v, p, 4); s = v / 2147483648.0f; } - else return false; - } else { - if (bitsPerSample == 32) { float v; std::memcpy(&v, p, 4); s = v; } - else return false; - } - if (c == 0) l = s; - else if (c == 1) r = s; - else { l += s; r += s; } - } - if (numCh == 1) r = l; - tmp.push_back(l); - tmp.push_back(r); - } - // Resample to 48k if needed (linear). - if (sampleRate != static_cast(kFmodOutRate)) { - const size_t inFrames = tmp.size() / 2; - const size_t outFrames = static_cast((static_cast(inFrames) * kFmodOutRate) / sampleRate); - std::vector rs; - rs.reserve(outFrames * 2); - for (size_t i = 0; i < outFrames; i++) { - double pos = (static_cast(i) * sampleRate) / kFmodOutRate; - size_t i0 = static_cast(pos); - size_t i1 = i0 + 1 < inFrames ? i0 + 1 : i0; - float t = static_cast(pos - i0); - rs.push_back(tmp[i0 * 2] * (1 - t) + tmp[i1 * 2] * t); - rs.push_back(tmp[i0 * 2 + 1] * (1 - t) + tmp[i1 * 2 + 1] * t); - } - outPcm.swap(rs); - } else { - outPcm.swap(tmp); - } - outRate = kFmodOutRate; - outCh = 2; - return true; -} - -} - -namespace FMOD { - -class System; -class ChannelGroup; -class Channel; -class Sound; -class SoundGroup; -class DSP; -class DSPConnection; -class Geometry; -class Reverb3D; - -class Sound { -public: - std::string name; - unsigned mode = 0; - unsigned length = 0; - int loopCount = 0; - float minDistance = 0.0f; - float maxDistance = 10000.0f; - SoundGroup* soundGroup = nullptr; - void* userData = nullptr; - // Real-audio decoded PCM (float stereo 48k, interleaved). Empty = silent/placeholder. - std::vector pcm; - int pcmRate = kFmodOutRate; - int pcmCh = 2; - int APS5_VABI release(); - int APS5_VABI getSystemObject(System** system); - int APS5_VABI setMode(unsigned mode) { - std::lock_guard lock(gFmodMutex); - this->mode = mode; - return FMOD_OK; - } - int APS5_VABI getMode(unsigned* mode) { - std::lock_guard lock(gFmodMutex); - if (mode) *mode = this->mode; - return FMOD_OK; - } - int APS5_VABI set3DMinMaxDistance(float mindistance, float maxdistance) { - std::lock_guard lock(gFmodMutex); - minDistance = mindistance; - maxDistance = maxdistance; - return FMOD_OK; - } - int APS5_VABI getNumSubSounds(int* numsubsounds) { - std::lock_guard lock(gFmodMutex); - if (numsubsounds) *numsubsounds = 0; - return FMOD_OK; - } - int APS5_VABI getLength(unsigned* length, unsigned lengthtype) { - std::lock_guard lock(gFmodMutex); - if (!length) return FMOD_OK; - if (!pcm.empty()) { - const unsigned frames = static_cast(pcm.size() / 2); - // FMOD_TIMEUNIT: MS=1, PCM=2, PCMBYTES=4, RAWBYTES=8 - if (lengthtype == 1) *length = (frames * 1000u) / static_cast(kFmodOutRate); - else if (lengthtype == 2) *length = frames; - else if (lengthtype == 4 || lengthtype == 8) *length = frames * 2u * sizeof(float); - else *length = frames; - return FMOD_OK; - } - *length = this->length; - return FMOD_OK; - } - int APS5_VABI getFormat(FMOD_SOUND_TYPE* type, FMOD_SOUND_FORMAT* format, int* channels, int* bits) { - std::lock_guard lock(gFmodMutex); - if (!pcm.empty()) { - if (type) *type = FMOD_SOUND_TYPE_UNKNOWN; - if (format) *format = FMOD_SOUND_FORMAT_PCMFLOAT; - if (channels) *channels = 2; - if (bits) *bits = 32; - return FMOD_OK; - } - if (type) *type = FMOD_SOUND_TYPE_UNKNOWN; - if (format) *format = FMOD_SOUND_FORMAT_PCM16; - if (channels) *channels = 2; - if (bits) *bits = 16; - return FMOD_OK; - } - int APS5_VABI getName(char* name, int namelen) { - std::lock_guard lock(gFmodMutex); - if (name && namelen > 0) { - std::strncpy(name, this->name.c_str(), static_cast(namelen - 1)); - name[namelen - 1] = '\0'; - } - return FMOD_OK; - } - int APS5_VABI setLoopCount(int loopcount) { - std::lock_guard lock(gFmodMutex); - loopCount = loopcount; - return FMOD_OK; - } - int APS5_VABI getLoopCount(int* loopcount) { - std::lock_guard lock(gFmodMutex); - if (loopcount) *loopcount = loopCount; - return FMOD_OK; - } - int APS5_VABI setSoundGroup(SoundGroup* soundgroup) { - std::lock_guard lock(gFmodMutex); - soundGroup = soundgroup; - return FMOD_OK; - } - int APS5_VABI getSoundGroup(SoundGroup** soundgroup) { - std::lock_guard lock(gFmodMutex); - if (soundgroup) *soundgroup = soundGroup; - return FMOD_OK; - } - int APS5_VABI getSubSound(int index, Sound** subsound) { - (void)index; - std::lock_guard lock(gFmodMutex); - if (subsound) *subsound = nullptr; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } - int APS5_VABI getOpenState(FMOD_OPENSTATE* openstate, unsigned* percentbuffered, bool* starving, bool* diskbusy) { - std::lock_guard lock(gFmodMutex); - if (openstate) *openstate = FMOD_OPENSTATE_READY; - if (percentbuffered) *percentbuffered = 100; - if (starving) *starving = false; - if (diskbusy) *diskbusy = false; - return FMOD_OK; - } - int APS5_VABI readData(void* buffer, unsigned length, unsigned* read) { - std::lock_guard lock(gFmodMutex); - if (buffer && length) std::memset(buffer, 0, length); - if (read) *read = length; - return FMOD_OK; - } - int APS5_VABI seekData(unsigned pcm) { - (void)pcm; - return FMOD_OK; - } -}; - -class SoundGroup { -public: - int maxAudible = 0; - float volume = 1.0f; - void* userData = nullptr; - int APS5_VABI release() { - std::lock_guard lock(gFmodMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI setMaxAudible(int maxaudible) { - std::lock_guard lock(gFmodMutex); - maxAudible = maxaudible; - return FMOD_OK; - } - int APS5_VABI getMaxAudible(int* maxaudible) { - std::lock_guard lock(gFmodMutex); - if (maxaudible) *maxaudible = maxAudible; - return FMOD_OK; - } - int APS5_VABI setVolume(float volume) { - std::lock_guard lock(gFmodMutex); - this->volume = volume; - return FMOD_OK; - } - int APS5_VABI getVolume(float* volume) { - std::lock_guard lock(gFmodMutex); - if (volume) *volume = this->volume; - return FMOD_OK; - } - int APS5_VABI stop() { return FMOD_OK; } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } - int APS5_VABI getNumSounds(int* numsounds) { - std::lock_guard lock(gFmodMutex); - if (numsounds) *numsounds = 0; - return FMOD_OK; - } -}; - -class DSPConnection { -public: - DSP* input = nullptr; - DSP* output = nullptr; - void* userData = nullptr; - int APS5_VABI getInput(DSP** input) { - std::lock_guard lock(gFmodMutex); - if (input) *input = this->input; - return FMOD_OK; - } - int APS5_VABI getOutput(DSP** output) { - std::lock_guard lock(gFmodMutex); - if (output) *output = this->output; - return FMOD_OK; - } - int APS5_VABI getType(FMOD_DSPCONNECTION_TYPE* type) { - std::lock_guard lock(gFmodMutex); - if (type) *type = FMOD_DSPCONNECTION_TYPE_STANDARD; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class DSP { -public: - FMOD_DSP_TYPE type = FMOD_DSP_TYPE_UNKNOWN; - bool active = true; - bool bypass = false; - void* userData = nullptr; - int APS5_VABI release() { - std::lock_guard lock(gFmodMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI setActive(bool active) { - std::lock_guard lock(gFmodMutex); - this->active = active; - return FMOD_OK; - } - int APS5_VABI getActive(bool* active) { - std::lock_guard lock(gFmodMutex); - if (active) *active = this->active; - return FMOD_OK; - } - int APS5_VABI setBypass(bool bypass) { - std::lock_guard lock(gFmodMutex); - this->bypass = bypass; - return FMOD_OK; - } - int APS5_VABI getBypass(bool* bypass) { - std::lock_guard lock(gFmodMutex); - if (bypass) *bypass = this->bypass; - return FMOD_OK; - } - int APS5_VABI reset() { return FMOD_OK; } - int APS5_VABI setParameterFloat(int index, float value) { - (void)index; (void)value; - return FMOD_OK; - } - int APS5_VABI getParameterFloat(int index, float* value) { - (void)index; - std::lock_guard lock(gFmodMutex); - if (value) *value = 0.0f; - return FMOD_OK; - } - int APS5_VABI getType(FMOD_DSP_TYPE* type) { - std::lock_guard lock(gFmodMutex); - if (type) *type = this->type; - return FMOD_OK; - } - int APS5_VABI getInfo(char* name, unsigned* version, int* channels, int* configwidth, int* configheight) { - std::lock_guard lock(gFmodMutex); - if (name) name[0] = '\0'; - if (version) *version = 0; - if (channels) *channels = 0; - if (configwidth) *configwidth = 0; - if (configheight) *configheight = 0; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class ChannelControl { -public: - float volume = 1.0f; - float pitch = 1.0f; - bool paused = false; - bool mute = false; - bool playing = false; - unsigned mode = 0; - bool volumeRamp = false; - void* userData = nullptr; - // Mixer state for real-audio backend (used when this control is a Channel - // with decoded PCM; groups keep mixHasData==false and use sticky flag). - size_t mixCursor = 0; - size_t mixTotal = 0; - bool mixHasData = false; - bool mixLoop = false; - int APS5_VABI setVolume(float volume) { - std::lock_guard lock(gFmodMutex); - this->volume = volume; - return FMOD_OK; - } - int APS5_VABI getVolume(float* volume) { - std::lock_guard lock(gFmodMutex); - if (volume) *volume = this->volume; - return FMOD_OK; - } - int APS5_VABI setPitch(float pitch) { - std::lock_guard lock(gFmodMutex); - this->pitch = pitch; - return FMOD_OK; - } - int APS5_VABI getPitch(float* pitch) { - std::lock_guard lock(gFmodMutex); - if (pitch) *pitch = this->pitch; - return FMOD_OK; - } - int APS5_VABI setPaused(bool paused) { - std::lock_guard lock(gFmodMutex); - this->paused = paused; - return FMOD_OK; - } - int APS5_VABI getPaused(bool* paused) { - std::lock_guard lock(gFmodMutex); - if (paused) *paused = this->paused; - return FMOD_OK; - } - int APS5_VABI setMute(bool mute) { - std::lock_guard lock(gFmodMutex); - this->mute = mute; - return FMOD_OK; - } - int APS5_VABI getMute(bool* mute) { - std::lock_guard lock(gFmodMutex); - if (mute) *mute = this->mute; - return FMOD_OK; - } - int APS5_VABI stop() { - std::lock_guard lock(gFmodMutex); - playing = false; - return FMOD_OK; - } - int APS5_VABI isPlaying(bool* isplaying) { - std::lock_guard lock(gFmodMutex); - if (!isplaying) return FMOD_OK; - if (mixHasData) { - *isplaying = playing && !paused && (mixLoop || mixCursor < mixTotal); - } else { - *isplaying = playing && !paused; - } - return FMOD_OK; - } - int APS5_VABI setMode(unsigned mode) { - std::lock_guard lock(gFmodMutex); - this->mode = mode; - return FMOD_OK; - } - int APS5_VABI getMode(unsigned* mode) { - std::lock_guard lock(gFmodMutex); - if (mode) *mode = this->mode; - return FMOD_OK; - } - int APS5_VABI addFadePoint(unsigned long long dspclock, float volume) { - (void)dspclock; (void)volume; - return FMOD_OK; - } - int APS5_VABI setDelay(unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels) { - (void)dspclock_start; (void)dspclock_end; (void)stopchannels; - return FMOD_OK; - } - int APS5_VABI getDelay(unsigned long long* dspclock_start, unsigned long long* dspclock_end, bool* stopchannels) { - std::lock_guard lock(gFmodMutex); - if (dspclock_start) *dspclock_start = 0; - if (dspclock_end) *dspclock_end = 0; - if (stopchannels) *stopchannels = false; - return FMOD_OK; - } - int APS5_VABI setVolumeRamp(bool ramp) { - std::lock_guard lock(gFmodMutex); - volumeRamp = ramp; - return FMOD_OK; - } - int APS5_VABI getVolumeRamp(bool* ramp) { - std::lock_guard lock(gFmodMutex); - if (ramp) *ramp = volumeRamp; - return FMOD_OK; - } - int APS5_VABI setCallback(FMOD_CHANNELCONTROL_CALLBACK callback) { - (void)callback; - return FMOD_OK; - } - int APS5_VABI isVirtual(bool* isvirtual) { - std::lock_guard lock(gFmodMutex); - if (isvirtual) *isvirtual = false; - return FMOD_OK; - } - int APS5_VABI getIndex(int* index) { - std::lock_guard lock(gFmodMutex); - if (index) *index = 0; - return FMOD_OK; - } - int APS5_VABI getSystemObject(System** system); - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } - int APS5_VABI set3DAttributes(const FMOD_VECTOR* pos, const FMOD_VECTOR* vel) { - (void)pos; (void)vel; - return FMOD_OK; - } - int APS5_VABI setLowPassGain(float gain) { - (void)gain; - return FMOD_OK; - } - int APS5_VABI getLowPassGain(float* gain) { - std::lock_guard lock(gFmodMutex); - if (gain) *gain = 1.0f; - return FMOD_OK; - } - int APS5_VABI setPan(float pan) { - (void)pan; - return FMOD_OK; - } - int APS5_VABI getDSPClock(unsigned long long* dspclock, unsigned long long* parentclock) { - std::lock_guard lock(gFmodMutex); - if (dspclock) *dspclock = 0; - if (parentclock) *parentclock = 0; - return FMOD_OK; - } - int APS5_VABI getDSP(int index, DSP** dsp) { - (void)index; - std::lock_guard lock(gFmodMutex); - if (dsp) *dsp = nullptr; - return FMOD_OK; - } -}; - -class Channel : public ChannelControl { -public: - Sound* sound = nullptr; - ChannelGroup* group = nullptr; - float frequency = 48000.0f; - int priority = 128; - unsigned position = 0; - int loopCount = 0; - System* owner = nullptr; - int APS5_VABI setPriority(int priority) { - std::lock_guard lock(gFmodMutex); - this->priority = priority; - return FMOD_OK; - } - int APS5_VABI getPriority(int* priority) { - std::lock_guard lock(gFmodMutex); - if (priority) *priority = this->priority; - return FMOD_OK; - } - int APS5_VABI setFrequency(float frequency) { - std::lock_guard lock(gFmodMutex); - this->frequency = frequency; - return FMOD_OK; - } - int APS5_VABI getFrequency(float* frequency) { - std::lock_guard lock(gFmodMutex); - if (frequency) *frequency = this->frequency; - return FMOD_OK; - } - int APS5_VABI setPosition(unsigned position, unsigned postype) { - (void)postype; - std::lock_guard lock(gFmodMutex); - this->position = position; - // Keep mixer cursor in sync (PCM frames). postype==2 (PCM) assumed. - mixCursor = static_cast(position); - if (mixHasData && mixCursor > mixTotal) mixCursor = mixTotal; - return FMOD_OK; - } - int APS5_VABI getPosition(unsigned* position, unsigned postype) { - (void)postype; - std::lock_guard lock(gFmodMutex); - if (position) *position = static_cast(mixHasData ? mixCursor : this->position); - return FMOD_OK; - } - int APS5_VABI setChannelGroup(ChannelGroup* channelgroup) { - std::lock_guard lock(gFmodMutex); - group = channelgroup; - return FMOD_OK; - } - int APS5_VABI getChannelGroup(ChannelGroup** channelgroup) { - std::lock_guard lock(gFmodMutex); - if (channelgroup) *channelgroup = group; - return FMOD_OK; - } - int APS5_VABI setLoopCount(int loopcount) { - std::lock_guard lock(gFmodMutex); - loopCount = loopcount; - return FMOD_OK; - } - int APS5_VABI getCurrentSound(Sound** sound) { - std::lock_guard lock(gFmodMutex); - if (sound) *sound = this->sound; - return FMOD_OK; - } -}; - -class ChannelGroup : public ChannelControl { -public: - std::string name; - int APS5_VABI release() { - std::lock_guard lock(gFmodMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI addGroup(ChannelGroup* group, bool propagatedspclock, DSPConnection** connection) { - (void)group; (void)propagatedspclock; - std::lock_guard lock(gFmodMutex); - if (connection) *connection = nullptr; - return FMOD_OK; - } - int APS5_VABI getNumGroups(int* numgroups) { - std::lock_guard lock(gFmodMutex); - if (numgroups) *numgroups = 0; - return FMOD_OK; - } - int APS5_VABI getGroup(int index, ChannelGroup** group) { - (void)index; - std::lock_guard lock(gFmodMutex); - if (group) *group = nullptr; - return FMOD_OK; - } - int APS5_VABI getParentGroup(ChannelGroup** group) { - std::lock_guard lock(gFmodMutex); - if (group) *group = nullptr; - return FMOD_OK; - } - int APS5_VABI getName(char* name, int namelen) { - std::lock_guard lock(gFmodMutex); - if (name && namelen > 0) { - std::strncpy(name, this->name.c_str(), static_cast(namelen - 1)); - name[namelen - 1] = '\0'; - } - return FMOD_OK; - } - int APS5_VABI getNumChannels(int* numchannels) { - std::lock_guard lock(gFmodMutex); - if (numchannels) *numchannels = 0; - return FMOD_OK; - } - int APS5_VABI getChannel(int index, Channel** channel) { - (void)index; - std::lock_guard lock(gFmodMutex); - if (channel) *channel = nullptr; - return FMOD_OK; - } -}; - -class Geometry { -public: - void* userData = nullptr; - int APS5_VABI release() { - std::lock_guard lock(gFmodMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI addPolygon(float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR* vertices, int* polygonindex) { - (void)directocclusion; (void)reverbocclusion; (void)doublesided; (void)numvertices; (void)vertices; - std::lock_guard lock(gFmodMutex); - if (polygonindex) *polygonindex = 0; - return FMOD_OK; - } - int APS5_VABI setActive(bool active) { - (void)active; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class Reverb3D { -public: - void* userData = nullptr; - int APS5_VABI release() { - std::lock_guard lock(gFmodMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI set3DAttributes(const FMOD_VECTOR* pos, float mindistance, float maxdistance) { - (void)pos; (void)mindistance; (void)maxdistance; - return FMOD_OK; - } - int APS5_VABI setActive(bool active) { - (void)active; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -static std::vector gFmodChannels; - -static int APS5_VABI SoundReleaseImpl(Sound* self) { - std::lock_guard lock(gFmodMutex); - for (Channel* ch : gFmodChannels) { - if (ch && ch->sound == self) { - ch->playing = false; - ch->sound = nullptr; - ch->mixHasData = false; - } - } - delete self; - return FMOD_OK; -} - -int APS5_VABI Sound::release() { return SoundReleaseImpl(this); } - -class System { -public: - bool initialized = false; - int maxChannels = 0; - unsigned initFlags = 0; - int driver = 0; - FMOD_OUTPUTTYPE output = FMOD_OUTPUTTYPE_AUTODETECT; - int softwareChannels = 0; - int numListeners = 1; - float dopplerScale = 1.0f; - float distanceFactor = 1.0f; - float rolloffScale = 1.0f; - void* userData = nullptr; - ChannelGroup* masterChannelGroup = nullptr; - SoundGroup* masterSoundGroup = nullptr; - static int APS5_VABI create(System** system) { - std::lock_guard lock(gFmodMutex); - if (!system) return FMOD_OK; - *system = new System(); - return FMOD_OK; - } - static int APS5_VABI create(System** system, unsigned headerversion) { - (void)headerversion; - return create(system); - } - int APS5_VABI release() { - std::lock_guard lock(gFmodMutex); - // Drop channels owned by this system (game holds raw pointers; mark - // them stopped and free to avoid unbounded growth). - for (auto it = gFmodChannels.begin(); it != gFmodChannels.end();) { - if (*it && (*it)->owner == this) { - delete *it; - it = gFmodChannels.erase(it); - } else { - ++it; - } - } - delete masterChannelGroup; - delete masterSoundGroup; - masterChannelGroup = nullptr; - masterSoundGroup = nullptr; - delete this; - return FMOD_OK; - } - int APS5_VABI init(int maxchannels, unsigned flags, void* extradriverdata) { - (void)extradriverdata; - std::lock_guard lock(gFmodMutex); - maxChannels = maxchannels; - initFlags = flags; - initialized = true; - if (!masterChannelGroup) masterChannelGroup = new ChannelGroup(); - if (!masterSoundGroup) masterSoundGroup = new SoundGroup(); - // Real-audio: try SDL unless NOSOUND output or env requests silent. - // Keep silent backend as fallback (no failure returned). - bool wantSilent = FmodSilentRequested() || - output == FMOD_OUTPUTTYPE_NOSOUND || - output == FMOD_OUTPUTTYPE_NOSOUND_NRT; - if (!wantSilent) { - // Unlock during SDL open (SDL may call back)? FmodEnsureDevice uses - // no FMOD lock internally except SDL, so we can call with lock held - // for simplicity; SDL_OpenAudioDevice does not call into FMOD. - if (!FmodEnsureDevice()) { - APS5_LOG_ERR("%s", "FMOD: SDL audio unavailable, silent fallback"); - } else { - APS5_LOG_OUT("%s", "FMOD: SDL audio output active (48k stereo)"); - } - } - return FMOD_OK; - } - int APS5_VABI close() { - std::lock_guard lock(gFmodMutex); - initialized = false; - return FMOD_OK; - } - int APS5_VABI update() { - std::lock_guard lock(gFmodMutex); - if (!initialized) return FMOD_OK; - if (gFmodSilent || gFmodDevice == 0) return FMOD_OK; // silent fallback - // Throttle like libSceAudioOut: avoid unbounded queue growth. - Uint32 queued = SDL_GetQueuedAudioSize(gFmodDevice); - const Uint32 oneBuf = static_cast(kFmodMixFrames * kFmodOutCh * sizeof(float)); - if (queued > oneBuf * 8u) return FMOD_OK; - float mix[kFmodMixFrames * 2] = {}; - bool anyActive = false; - for (Channel* ch : gFmodChannels) { - if (!ch || ch->owner != this) continue; - if (!ch->playing || ch->paused || ch->mute) continue; - if (!ch->mixHasData || !ch->sound || ch->sound->pcm.empty()) continue; - Sound* s = ch->sound; - const size_t total = ch->mixTotal; - if (total == 0) continue; - size_t cur = ch->mixCursor; - const float vol = ch->volume; - if (vol <= 0.0f) { - // Still advance cursor so silent channels finish. - size_t adv = kFmodMixFrames; - if (!ch->mixLoop) { - if (cur + adv >= total) { cur = total; ch->playing = false; } - else cur += adv; - } else { - cur = (cur + adv) % (total ? total : 1); - } - ch->mixCursor = cur; - ch->position = static_cast(cur); - continue; - } - anyActive = true; - const float* pcm = s->pcm.data(); - size_t pos = cur; - for (int i = 0; i < kFmodMixFrames; i++) { - if (pos >= total) { - if (ch->mixLoop || s->loopCount != 0 || - (s->mode & FMOD_LOOP_NORMAL) != 0) { - pos = 0; - } else { - break; - } - } - mix[i * 2] += pcm[pos * 2] * vol; - mix[i * 2 + 1] += pcm[pos * 2 + 1] * vol; - pos++; - } - // Advance cursor by frames consumed (approx, ignoring loop wrap details above). - size_t adv = static_cast(kFmodMixFrames); - if (!ch->mixLoop && s->loopCount == 0 && (s->mode & FMOD_LOOP_NORMAL) == 0) { - if (cur + adv >= total) { - cur = total; - ch->playing = false; - } else { - cur += adv; - } - } else { - cur = total ? ((cur + adv) % total) : 0; - } - ch->mixCursor = cur; - ch->position = static_cast(cur); - } - if (!anyActive) { - // Still queue silence rarely to keep device alive? No — skip to - // avoid filling queue with silence when nothing plays. - return FMOD_OK; - } - for (int i = 0; i < kFmodMixFrames * 2; i++) { - if (mix[i] > 1.0f) mix[i] = 1.0f; - else if (mix[i] < -1.0f) mix[i] = -1.0f; - } - // Convert to device format if needed. - if (gFmodSpec.format == AUDIO_F32SYS || gFmodSpec.format == 0) { - if (SDL_QueueAudio(gFmodDevice, mix, sizeof(mix)) < 0) { - APS5_LOG_ERR("%s", "FMOD: SDL_QueueAudio failed"); - } - } else { - int16_t tmp[kFmodMixFrames * 2]; - for (int i = 0; i < kFmodMixFrames * 2; i++) { - float v = mix[i] * 32767.0f; - if (v > 32767.0f) v = 32767.0f; - if (v < -32768.0f) v = -32768.0f; - tmp[i] = static_cast(v); - } - // Resample/format convert via SDL if spec differs (channels/rate). - // For minimal path, queue directly when spec is S16 stereo 48k; - // otherwise use SDL_ConvertAudio. - if (gFmodSpec.channels == 2 && gFmodSpec.freq == kFmodOutRate && - (gFmodSpec.format == AUDIO_S16SYS)) { - SDL_QueueAudio(gFmodDevice, tmp, sizeof(tmp)); - } else { - SDL_AudioCVT cvt{}; - if (SDL_BuildAudioCVT(&cvt, AUDIO_F32SYS, 2, kFmodOutRate, - gFmodSpec.format, gFmodSpec.channels, gFmodSpec.freq) >= 0) { - std::vector buf(sizeof(mix) * 4u); - std::memcpy(buf.data(), mix, sizeof(mix)); - cvt.buf = buf.data(); - cvt.len = static_cast(sizeof(mix)); - if (SDL_ConvertAudio(&cvt) == 0) { - SDL_QueueAudio(gFmodDevice, cvt.buf, static_cast(cvt.len_cvt)); - } - } - } - } - return FMOD_OK; - } - int APS5_VABI setOutput(FMOD_OUTPUTTYPE output) { - std::lock_guard lock(gFmodMutex); - this->output = output; - if (output == FMOD_OUTPUTTYPE_NOSOUND || output == FMOD_OUTPUTTYPE_NOSOUND_NRT) { - gFmodSilent = true; - } - return FMOD_OK; - } - int APS5_VABI getOutput(FMOD_OUTPUTTYPE* output) { - std::lock_guard lock(gFmodMutex); - if (output) *output = this->output; - return FMOD_OK; - } - int APS5_VABI getNumDrivers(int* numdrivers) { - std::lock_guard lock(gFmodMutex); - if (numdrivers) *numdrivers = 1; - return FMOD_OK; - } - int APS5_VABI getDriverInfo(int id, char* name, int namelen, FMOD_GUID* guid, int* systemrate, FMOD_SPEAKERMODE* speakermode, int* speakermodechannels) { - (void)id; - std::lock_guard lock(gFmodMutex); - if (name && namelen > 0) { - const char* driverName = (gFmodDevice != 0 && !gFmodSilent) ? "AnyPS5 FMOD Output" : "AnyPS5 Null Output"; - std::strncpy(name, driverName, static_cast(namelen - 1)); - name[namelen - 1] = '\0'; - } - if (guid) std::memset(guid, 0, sizeof(*guid)); - if (systemrate) *systemrate = 48000; - if (speakermode) *speakermode = FMOD_SPEAKERMODE_STEREO; - if (speakermodechannels) *speakermodechannels = 2; - return FMOD_OK; - } - int APS5_VABI setDriver(int driver) { - std::lock_guard lock(gFmodMutex); - this->driver = driver; - return FMOD_OK; - } - int APS5_VABI getDriver(int* driver) { - std::lock_guard lock(gFmodMutex); - if (driver) *driver = this->driver; - return FMOD_OK; - } - int APS5_VABI setSoftwareChannels(int numsoftwarechannels) { - std::lock_guard lock(gFmodMutex); - softwareChannels = numsoftwarechannels; - return FMOD_OK; - } - int APS5_VABI getSoftwareChannels(int* numsoftwarechannels) { - std::lock_guard lock(gFmodMutex); - if (numsoftwarechannels) *numsoftwarechannels = softwareChannels; - return FMOD_OK; - } - int APS5_VABI setSoftwareFormat(int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers) { - (void)samplerate; (void)speakermode; (void)numrawspeakers; - return FMOD_OK; - } - int APS5_VABI getSoftwareFormat(int* samplerate, FMOD_SPEAKERMODE* speakermode, int* numrawspeakers) { - std::lock_guard lock(gFmodMutex); - if (samplerate) *samplerate = 48000; - if (speakermode) *speakermode = FMOD_SPEAKERMODE_STEREO; - if (numrawspeakers) *numrawspeakers = 0; - return FMOD_OK; - } - int APS5_VABI setDSPBufferSize(unsigned bufferlength, int numbuffers) { - (void)bufferlength; (void)numbuffers; - return FMOD_OK; - } - int APS5_VABI getDSPBufferSize(unsigned* bufferlength, int* numbuffers) { - std::lock_guard lock(gFmodMutex); - if (bufferlength) *bufferlength = 1024; - if (numbuffers) *numbuffers = 4; - return FMOD_OK; - } - int APS5_VABI setAdvancedSettings(FMOD_ADVANCEDSETTINGS* settings) { - (void)settings; - return FMOD_OK; - } - int APS5_VABI getAdvancedSettings(FMOD_ADVANCEDSETTINGS* settings) { - std::lock_guard lock(gFmodMutex); - if (settings) std::memset(settings, 0, sizeof(*settings)); - return FMOD_OK; - } - int APS5_VABI setCallback(FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask) { - (void)callback; (void)callbackmask; - return FMOD_OK; - } - int APS5_VABI setFileSystem(void* useropen, void* userclose, void* userread, void* userseek, void* userasyncread, void* userasynccancel, int blockalign) { - (void)useropen; (void)userclose; (void)userread; (void)userseek; - (void)userasyncread; (void)userasynccancel; (void)blockalign; - return FMOD_OK; - } - int APS5_VABI setPluginPath(const char* pluginpath) { - (void)pluginpath; - return FMOD_OK; - } - int APS5_VABI loadPlugin(const char* filename, unsigned* handle, FMOD_PLUGINTYPE plugintype) { - (void)filename; (void)plugintype; - std::lock_guard lock(gFmodMutex); - if (handle) *handle = 0; - return FMOD_OK; - } - int APS5_VABI getVersion(unsigned* version) { - std::lock_guard lock(gFmodMutex); - if (version) *version = FMOD_VERSION_CURRENT; - return FMOD_OK; - } - int APS5_VABI getOutputHandle(void** handle) { - std::lock_guard lock(gFmodMutex); - if (handle) *handle = nullptr; - return FMOD_OK; - } - int APS5_VABI getChannelsPlaying(int* channels, int* realchannels) { - std::lock_guard lock(gFmodMutex); - int active = 0; - for (Channel* ch : gFmodChannels) { - if (!ch || ch->owner != this) continue; - if (!ch->playing || ch->paused) continue; - if (ch->mixHasData) { - if (ch->mixLoop || ch->mixCursor < ch->mixTotal) active++; - } - // Null/empty sounds (smoke test) are not counted to preserve old - // behaviour (previously always returned 0). - } - if (channels) *channels = active; - if (realchannels) *realchannels = active; - return FMOD_OK; - } - int APS5_VABI getCPUUsage(FMOD_CPU_USAGE* usage) { - std::lock_guard lock(gFmodMutex); - if (usage) std::memset(usage, 0, sizeof(*usage)); - return FMOD_OK; - } - int APS5_VABI getFileUsage(long long* samplebytesread, long long* streambytesread, long long* otherbytesread) { - std::lock_guard lock(gFmodMutex); - if (samplebytesread) *samplebytesread = 0; - if (streambytesread) *streambytesread = 0; - if (otherbytesread) *otherbytesread = 0; - return FMOD_OK; - } - int APS5_VABI getSpectrum(float* spectrumarray, int numvalues, int channeloffset, FMOD_DSP_FFT_WINDOW window) { - (void)channeloffset; (void)window; - std::lock_guard lock(gFmodMutex); - if (spectrumarray && numvalues > 0) std::memset(spectrumarray, 0, sizeof(float) * static_cast(numvalues)); - return FMOD_OK; - } - int APS5_VABI getWaveData(float* wavearray, int numvalues, int channeloffset) { - (void)channeloffset; - std::lock_guard lock(gFmodMutex); - if (wavearray && numvalues > 0) std::memset(wavearray, 0, sizeof(float) * static_cast(numvalues)); - return FMOD_OK; - } - int APS5_VABI createSound(const char* name_or_data, unsigned mode, FMOD_CREATESOUNDEXINFO* exinfo, Sound** sound) { - std::lock_guard lock(gFmodMutex); - if (!sound) return FMOD_OK; - Sound* created = new Sound(); - created->mode = mode; - unsigned exLen = exinfo ? exinfo->length : 0; - if (exLen) created->length = exLen; - const bool isMem = (mode & (FMOD_OPENMEMORY_FLAG | FMOD_OPENMEMORY_POINT_FLAG)) != 0; - const bool isRaw = (mode & FMOD_OPENRAW_FLAG) != 0; - if (isMem && name_or_data && exLen > 0 && exLen < (1u << 30)) { - const uint8_t* buf = reinterpret_cast(name_or_data); - // Keep a copy of the name only for file-based sounds; for memory - // buffers the pointer is binary data (not a C string). - created->name.clear(); - std::vector pcm; - int rate = kFmodOutRate, ch = 2; - bool decoded = false; - if (!isRaw) { - decoded = FmodParseWav(buf, exLen, pcm, rate, ch); - } - if (!decoded && isRaw) { - // OPENRAW: interpret buffer using exinfo (default stereo 48k PCM16). - int rawCh = exinfo ? exinfo->numchannels : 0; - int rawRate = exinfo ? exinfo->defaultfrequency : 0; - int rawFmt = exinfo ? static_cast(exinfo->format) : 2; - if (rawCh <= 0 || rawCh > 8) rawCh = 2; - if (rawRate <= 0) rawRate = kFmodOutRate; - size_t bytesPerSamp = 2; - if (rawFmt == 1) bytesPerSamp = 1; // PCM8 - else if (rawFmt == 2) bytesPerSamp = 2; // PCM16 - else if (rawFmt == 5) bytesPerSamp = 4; // FLOAT - else bytesPerSamp = 2; - size_t frames = exLen / (static_cast(rawCh) * bytesPerSamp); - if (frames > 0 && frames < 48000u * 60u) { - pcm.reserve(frames * 2); - for (size_t f = 0; f < frames; f++) { - float l = 0, r = 0; - for (int c = 0; c < rawCh; c++) { - const uint8_t* p = buf + (f * rawCh + c) * bytesPerSamp; - float s = 0; - if (rawFmt == 1) s = (static_cast(p[0]) - 128) / 128.0f; - else if (rawFmt == 2) { int16_t v; std::memcpy(&v, p, 2); s = v / 32768.0f; } - else if (rawFmt == 5) { float v; std::memcpy(&v, p, 4); s = v; } - if (c == 0) l = s; else if (c == 1) r = s; else { l += s; r += s; } - } - if (rawCh == 1) r = l; - pcm.push_back(l); pcm.push_back(r); - } - // Resample if needed. - if (rawRate != kFmodOutRate && !pcm.empty()) { - size_t inF = pcm.size() / 2; - size_t outF = static_cast((static_cast(inF) * kFmodOutRate) / rawRate); - std::vector rs; rs.reserve(outF * 2); - for (size_t i = 0; i < outF; i++) { - double pos = (static_cast(i) * rawRate) / kFmodOutRate; - size_t i0 = static_cast(pos); - size_t i1 = i0 + 1 < inF ? i0 + 1 : i0; - float t = static_cast(pos - i0); - rs.push_back(pcm[i0 * 2] * (1 - t) + pcm[i1 * 2] * t); - rs.push_back(pcm[i0 * 2 + 1] * (1 - t) + pcm[i1 * 2 + 1] * t); - } - pcm.swap(rs); - } - decoded = !pcm.empty(); - rate = kFmodOutRate; ch = 2; - } - } - if (decoded) { - created->pcm.swap(pcm); - created->pcmRate = rate; - created->pcmCh = ch; - } else { - // Compressed (Vorbis/MP3/FSB/AT9...) or unknown: audible - // placeholder so the mixer path can be heard. Real decoders - // (Vorbis/MP3/AT9) remain future work — see docs/dev/TechnicalDebt. - FmodMakeSine(created->pcm, kFmodOutRate, 2, 440.0f, 1.0f); - created->pcmRate = kFmodOutRate; - created->pcmCh = 2; - } - } else { - if (name_or_data) { - // File-based: store name only (first bytes may still be checked - // for embedded RIFF in case game passes a path that is data). - size_t nlen = std::strlen(name_or_data); - if (nlen < 256) created->name = name_or_data; - } - // Placeholder 0.5s sine so file-based playSound is audible. - FmodMakeSine(created->pcm, kFmodOutRate, 2, 330.0f, 0.5f); - created->pcmRate = kFmodOutRate; - created->pcmCh = 2; - } - *sound = created; - return FMOD_OK; - } - int APS5_VABI createStream(const char* name_or_data, unsigned mode, FMOD_CREATESOUNDEXINFO* exinfo, Sound** sound) { - return createSound(name_or_data, mode, exinfo, sound); - } - int APS5_VABI createDSP(FMOD_DSP_DESCRIPTION* description, DSP** dsp) { - (void)description; - std::lock_guard lock(gFmodMutex); - if (dsp) *dsp = new DSP(); - return FMOD_OK; - } - int APS5_VABI createDSPByType(FMOD_DSP_TYPE type, DSP** dsp) { - std::lock_guard lock(gFmodMutex); - if (dsp) { - *dsp = new DSP(); - (*dsp)->type = type; - } - return FMOD_OK; - } - int APS5_VABI playSound(Sound* sound, ChannelGroup* channelgroup, bool paused, Channel** channel) { - std::lock_guard lock(gFmodMutex); - if (!channel) return FMOD_OK; - Channel* created = new Channel(); - created->sound = sound; - created->group = channelgroup ? channelgroup : masterChannelGroup; - created->paused = paused; - created->playing = true; - created->owner = this; - created->mixCursor = 0; - if (sound && !sound->pcm.empty()) { - created->mixHasData = true; - created->mixTotal = sound->pcm.size() / 2; - const bool loopMode = (sound->mode & FMOD_LOOP_NORMAL) != 0; - created->mixLoop = loopMode || sound->loopCount != 0; - } else { - created->mixHasData = false; - created->mixTotal = 0; - created->mixLoop = false; - } - gFmodChannels.push_back(created); - *channel = created; - return FMOD_OK; - } - int APS5_VABI playDSP(DSP* dsp, ChannelGroup* channelgroup, bool paused, Channel** channel) { - (void)dsp; - std::lock_guard lock(gFmodMutex); - if (!channel) return FMOD_OK; - Channel* created = new Channel(); - created->group = channelgroup ? channelgroup : masterChannelGroup; - created->paused = paused; - created->playing = true; - created->owner = this; - created->mixHasData = false; - gFmodChannels.push_back(created); - *channel = created; - return FMOD_OK; - } - int APS5_VABI getChannel(int channelid, Channel** channel) { - (void)channelid; - std::lock_guard lock(gFmodMutex); - if (channel) *channel = nullptr; - return FMOD_OK; - } - int APS5_VABI getMasterSoundGroup(SoundGroup** soundgroup) { - std::lock_guard lock(gFmodMutex); - if (soundgroup) *soundgroup = masterSoundGroup; - return FMOD_OK; - } - int APS5_VABI getMasterChannelGroup(ChannelGroup** channelgroup) { - std::lock_guard lock(gFmodMutex); - if (channelgroup) *channelgroup = masterChannelGroup; - return FMOD_OK; - } - int APS5_VABI setReverbProperties(int instance, FMOD_REVERB_PROPERTIES* prop) { - (void)instance; (void)prop; - return FMOD_OK; - } - int APS5_VABI getReverbProperties(int instance, FMOD_REVERB_PROPERTIES* prop) { - (void)instance; - std::lock_guard lock(gFmodMutex); - if (prop) std::memset(prop, 0, sizeof(*prop)); - return FMOD_OK; - } - int APS5_VABI createReverb3D(Reverb3D** reverb) { - std::lock_guard lock(gFmodMutex); - if (reverb) *reverb = new Reverb3D(); - return FMOD_OK; - } - int APS5_VABI createGeometry(int maxpolygons, int maxvertices, Geometry** geometry) { - (void)maxpolygons; (void)maxvertices; - std::lock_guard lock(gFmodMutex); - if (geometry) *geometry = new Geometry(); - return FMOD_OK; - } - int APS5_VABI loadGeometry(const void* data, int datasize, Geometry** geometry) { - (void)data; (void)datasize; - std::lock_guard lock(gFmodMutex); - if (geometry) *geometry = new Geometry(); - return FMOD_OK; - } - int APS5_VABI setGeometrySettings(float maxworldsize) { - (void)maxworldsize; - return FMOD_OK; - } - int APS5_VABI getGeometrySettings(float* maxworldsize) { - std::lock_guard lock(gFmodMutex); - if (maxworldsize) *maxworldsize = 0.0f; - return FMOD_OK; - } - int APS5_VABI set3DNumListeners(int numlisteners) { - std::lock_guard lock(gFmodMutex); - numListeners = numlisteners; - return FMOD_OK; - } - int APS5_VABI get3DNumListeners(int* numlisteners) { - std::lock_guard lock(gFmodMutex); - if (numlisteners) *numlisteners = numListeners; - return FMOD_OK; - } - int APS5_VABI set3DListenerAttributes(int listener, const FMOD_VECTOR* pos, const FMOD_VECTOR* vel, const FMOD_VECTOR* forward, const FMOD_VECTOR* up) { - (void)listener; (void)pos; (void)vel; (void)forward; (void)up; - return FMOD_OK; - } - int APS5_VABI mixerSuspend() { return FMOD_OK; } - int APS5_VABI mixerResume() { return FMOD_OK; } - int APS5_VABI set3DSettings(float dopplerscale, float distancefactor, float rolloffscale) { - std::lock_guard lock(gFmodMutex); - dopplerScale = dopplerscale; - distanceFactor = distancefactor; - rolloffScale = rolloffscale; - return FMOD_OK; - } - int APS5_VABI get3DSettings(float* dopplerscale, float* distancefactor, float* rolloffscale) { - std::lock_guard lock(gFmodMutex); - if (dopplerscale) *dopplerscale = dopplerScale; - if (distancefactor) *distancefactor = distanceFactor; - if (rolloffscale) *rolloffscale = rolloffScale; - return FMOD_OK; - } - int APS5_VABI createChannelGroup(const char* name, ChannelGroup** channelgroup) { - std::lock_guard lock(gFmodMutex); - if (!channelgroup) return FMOD_OK; - *channelgroup = new ChannelGroup(); - if (name) (*channelgroup)->name = name; - return FMOD_OK; - } - int APS5_VABI createSoundGroup(SoundGroup** soundgroup) { - std::lock_guard lock(gFmodMutex); - if (soundgroup) *soundgroup = new SoundGroup(); - return FMOD_OK; - } - int APS5_VABI lockDSP() { return FMOD_OK; } - int APS5_VABI unlockDSP() { return FMOD_OK; } - int APS5_VABI getSoundRAM(int* currentalloced, int* maxalloced, int* total) { - std::lock_guard lock(gFmodMutex); - if (currentalloced) *currentalloced = 0; - if (maxalloced) *maxalloced = 0; - if (total) *total = 0; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gFmodMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gFmodMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } - int APS5_VABI setStreamBufferSize(unsigned filebuffersize, unsigned filebuffersizetype) { - (void)filebuffersize; (void)filebuffersizetype; - return FMOD_OK; - } - int APS5_VABI attachChannelGroupToPort(FMOD_PORT_TYPE porttype, unsigned long long portindex, ChannelGroup* channelgroup) { - (void)porttype; (void)portindex; (void)channelgroup; - return FMOD_OK; - } - int APS5_VABI detachChannelGroupFromPort(ChannelGroup* channelgroup) { - (void)channelgroup; - return FMOD_OK; - } - int APS5_VABI setNetworkProxy(const char* proxy) { - (void)proxy; - return FMOD_OK; - } -}; - -int APS5_VABI Sound::getSystemObject(System** system) { - std::lock_guard lock(gFmodMutex); - if (system) *system = nullptr; - return FMOD_OK; -} - -int APS5_VABI ChannelControl::getSystemObject(System** system) { - std::lock_guard lock(gFmodMutex); - if (system) *system = nullptr; - return FMOD_OK; -} - -} - -extern "C" { - -int APS5_VABI FMOD_System_Create(FMOD_SYSTEM** system) { - std::lock_guard lock(gFmodMutex); - if (!system) return 0; - *system = reinterpret_cast(new FMOD::System()); - return 0; -} - -int APS5_VABI FMOD_Memory_Initialize(void* poolmem, int poollen, void* useralloc, void* userrealloc, void* userfree, unsigned memtypeflags) { - (void)poolmem; (void)poollen; (void)useralloc; (void)userrealloc; (void)userfree; (void)memtypeflags; - return 0; -} - -int APS5_VABI FMOD_Memory_GetStats(int* currentalloced, int* maxalloced, int blocking) { - (void)blocking; - std::lock_guard lock(gFmodMutex); - if (currentalloced) *currentalloced = 0; - if (maxalloced) *maxalloced = 0; - return 0; -} - -namespace { - -// Round2 NID identification via real FMOD headers (const-correct manglings). -// VS1Vg5yOLH0 = FMOD::System::setFileSystem(open,close,read,seek,asyncRead,asyncCancel,blockalign) -// WAU72lnwYic = FMOD::System::setCallback(callback,mask) -// Both are ABI-compatible with void*/int (func ptrs are 8B, mask 4B); we keep -// the silent backend (return OK) — file callbacks are not needed for -// OPENMEMORY sounds used by Legends, and callbacks are stored nowhere. -__attribute__((used)) int APS5_VABI fmod_system_setfilesystem(void* self, void* a1, void* a2, void* a3, void* a4, void* a5, void* a6, int a7) { - (void)self; (void)a1; (void)a2; (void)a3; (void)a4; (void)a5; (void)a6; (void)a7; - return 0; -} -__attribute__((used)) int APS5_VABI fmod_system_setcallback(void* self, void* cb, unsigned mask) { - (void)self; (void)cb; (void)mask; - return 0; -} - -} - -APS5_EXPORT("VS1Vg5yOLH0", fmod_system_setfilesystem); -APS5_EXPORT("WAU72lnwYic", fmod_system_setcallback); - -} diff --git a/core/libs/prx/libfmodstudio/CMakeLists.txt b/core/libs/prx/libfmodstudio/CMakeLists.txt deleted file mode 100644 index 38c8ce484..000000000 --- a/core/libs/prx/libfmodstudio/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -add_library(libfmodstudio SHARED EXCLUDE_FROM_ALL - ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp -) - -target_include_directories(libfmodstudio PRIVATE - ${LIBS_INCLUDE_DIR} -) -target_link_libraries(libfmodstudio PRIVATE libkernel libc) -target_compile_options(libfmodstudio PRIVATE -fkeep-inline-functions) -configure_windows_unwind(libfmodstudio) diff --git a/core/libs/prx/libfmodstudio/Export.cpp b/core/libs/prx/libfmodstudio/Export.cpp deleted file mode 100644 index 8f7baefc3..000000000 --- a/core/libs/prx/libfmodstudio/Export.cpp +++ /dev/null @@ -1,1007 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" - -enum FMOD_STUDIO_STOP_MODE { - FMOD_STUDIO_STOP_ALLOWFADEOUT = 0, - FMOD_STUDIO_STOP_IMMEDIATE = 1, - FMOD_STUDIO_STOP_MAX = 2 -}; - -enum FMOD_STUDIO_PLAYBACK_STATE { - FMOD_STUDIO_PLAYBACK_PLAYING = 0, - FMOD_STUDIO_PLAYBACK_SUSTAINING = 1, - FMOD_STUDIO_PLAYBACK_STOPPED = 2, - FMOD_STUDIO_PLAYBACK_STARTING = 3, - FMOD_STUDIO_PLAYBACK_STOPPING = 4, - FMOD_STUDIO_PLAYBACK_MAX = 5 -}; - -enum FMOD_STUDIO_LOADING_STATE { - FMOD_STUDIO_LOADING_STATE_UNLOADING = 0, - FMOD_STUDIO_LOADING_STATE_UNLOADED = 1, - FMOD_STUDIO_LOADING_STATE_LOADING = 2, - FMOD_STUDIO_LOADING_STATE_LOADED = 3, - FMOD_STUDIO_LOADING_STATE_ERROR = 4, - FMOD_STUDIO_LOADING_STATE_MAX = 5 -}; - -enum FMOD_STUDIO_EVENT_PROPERTY { - FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY = 0, - FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY = 1, - FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD = 2, - FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE = 3, - FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE = 4, - FMOD_STUDIO_EVENT_PROPERTY_MAX = 5 -}; - -enum FMOD_STUDIO_SYSTEM_CALLBACK_TYPE { - FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE = 1, - FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE = 2, - FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD = 4, - FMOD_STUDIO_SYSTEM_CALLBACK_ALL = 0xFFFFFFFF -}; - -enum FMOD_STUDIO_EVENT_CALLBACK_TYPE { - FMOD_STUDIO_EVENT_CALLBACK_CREATED = 1, - FMOD_STUDIO_EVENT_CALLBACK_DESTROYED = 2, - FMOD_STUDIO_EVENT_CALLBACK_STARTING = 4, - FMOD_STUDIO_EVENT_CALLBACK_STARTED = 8, - FMOD_STUDIO_EVENT_CALLBACK_RESTARTED = 16, - FMOD_STUDIO_EVENT_CALLBACK_STOPPED = 32, - FMOD_STUDIO_EVENT_CALLBACK_START_FAILED = 64, - FMOD_STUDIO_EVENT_CALLBACK_ALL = 0xFFFFFFFF -}; - -struct FMOD_GUID { - unsigned Data1; - unsigned short Data2; - unsigned short Data3; - unsigned char Data4[8]; -}; - -struct FMOD_VECTOR { - float x; - float y; - float z; -}; - -struct FMOD_3D_ATTRIBUTES { - FMOD_VECTOR position; - FMOD_VECTOR velocity; - FMOD_VECTOR forward; - FMOD_VECTOR up; -}; - -struct FMOD_CHANNELGROUP { - int unused; -}; - -struct FMOD_DSP_DESCRIPTION { - unsigned pluginsdkversion; - char name[32]; - unsigned version; -}; - -struct FMOD_STUDIO_PARAMETER_ID { - unsigned data1; - unsigned data2; -}; - -struct FMOD_STUDIO_PARAMETER_DESCRIPTION { - char name[256]; - float minimum; - float maximum; - float defaultvalue; -}; - -struct FMOD_STUDIO_BANK_INFO { - int size; - void* userdata; - int userdatalength; -}; - -struct FMOD_STUDIO_ADVANCEDSETTINGS { - int cbsize; - unsigned commandqueuesize; - unsigned handleinitialsize; -}; - -struct FMOD_STUDIO_CPU_USAGE { - float update; - float nonstreaming; - float streaming; -}; - -struct FMOD_STUDIO_BUFFER_USAGE { - int studiocommandqueue; - int studiohandle; - int values[6]; -}; - -struct FMOD_STUDIO_MEMORY_USAGE { - int exclusive; - int inclusive; - int sampledata; -}; - -struct FMOD_STUDIO_SOUND_INFO { - const char* name_or_data; - unsigned mode; - int subsoundindex; -}; - -struct FMOD_STUDIO_SYSTEM { - int unused; -}; - -struct FMOD_STUDIO_EVENTINSTANCE { - int unused; -}; - -typedef int (*FMOD_STUDIO_SYSTEM_CALLBACK)(FMOD_STUDIO_SYSTEM* system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void* commanddata, void* userdata); -typedef int (*FMOD_STUDIO_EVENT_CALLBACK)(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void* parameters); - -namespace { - -std::mutex gStudioMutex; - -constexpr int FMOD_OK = 0; - -} - -namespace FMOD { -namespace Studio { - -class System; -class Bank; -class EventDescription; -class EventInstance; -class Bus; -class VCA; -class CommandReplay; - -class ID : public FMOD_GUID { -}; - -class Bank { -public: - std::string path; - bool sampleDataLoaded = false; - void* userData = nullptr; - bool APS5_VABI isValid() { - return true; - } - int APS5_VABI getID(ID* id) { - std::lock_guard lock(gStudioMutex); - if (id) std::memset(id, 0, sizeof(*id)); - return FMOD_OK; - } - int APS5_VABI getPath(char* path, int size, int* retrieved) { - std::lock_guard lock(gStudioMutex); - if (path && size > 0) { - std::strncpy(path, this->path.c_str(), static_cast(size - 1)); - path[size - 1] = '\0'; - } - if (retrieved) *retrieved = static_cast(this->path.size() + 1); - return FMOD_OK; - } - int APS5_VABI unload() { - std::lock_guard lock(gStudioMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI loadSampleData() { - std::lock_guard lock(gStudioMutex); - sampleDataLoaded = true; - return FMOD_OK; - } - int APS5_VABI unloadSampleData() { - std::lock_guard lock(gStudioMutex); - sampleDataLoaded = false; - return FMOD_OK; - } - int APS5_VABI getLoadingState(FMOD_STUDIO_LOADING_STATE* state) { - std::lock_guard lock(gStudioMutex); - if (state) *state = FMOD_STUDIO_LOADING_STATE_LOADED; - return FMOD_OK; - } - int APS5_VABI getSampleLoadingState(FMOD_STUDIO_LOADING_STATE* state) { - std::lock_guard lock(gStudioMutex); - if (state) *state = sampleDataLoaded ? FMOD_STUDIO_LOADING_STATE_LOADED : FMOD_STUDIO_LOADING_STATE_UNLOADED; - return FMOD_OK; - } - int APS5_VABI getStringCount(int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getEventCount(int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getEventList(EventDescription** array, int capacity, int* count) { - (void)array; (void)capacity; - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getBusCount(int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getBusList(Bus** array, int capacity, int* count) { - (void)array; (void)capacity; - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getVCACount(int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getVCAList(VCA** array, int capacity, int* count) { - (void)array; (void)capacity; - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class EventDescription { -public: - std::string path; - bool sampleDataLoaded = false; - void* userData = nullptr; - int APS5_VABI isValid() { - return true; - } - int APS5_VABI getID(ID* id) { - std::lock_guard lock(gStudioMutex); - if (id) std::memset(id, 0, sizeof(*id)); - return FMOD_OK; - } - int APS5_VABI getPath(char* path, int size, int* retrieved) { - std::lock_guard lock(gStudioMutex); - if (path && size > 0) { - std::strncpy(path, this->path.c_str(), static_cast(size - 1)); - path[size - 1] = '\0'; - } - if (retrieved) *retrieved = static_cast(this->path.size() + 1); - return FMOD_OK; - } - int APS5_VABI getInstanceCount(int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI getInstanceList(EventInstance** array, int capacity, int* count) { - (void)array; (void)capacity; - std::lock_guard lock(gStudioMutex); - if (count) *count = 0; - return FMOD_OK; - } - int APS5_VABI createInstance(EventInstance** instance); - int APS5_VABI loadSampleData() { - std::lock_guard lock(gStudioMutex); - sampleDataLoaded = true; - return FMOD_OK; - } - int APS5_VABI unloadSampleData() { - std::lock_guard lock(gStudioMutex); - sampleDataLoaded = false; - return FMOD_OK; - } - int APS5_VABI getSampleLoadingState(FMOD_STUDIO_LOADING_STATE* state) { - std::lock_guard lock(gStudioMutex); - if (state) *state = sampleDataLoaded ? FMOD_STUDIO_LOADING_STATE_LOADED : FMOD_STUDIO_LOADING_STATE_UNLOADED; - return FMOD_OK; - } - int APS5_VABI getLength(int* length) { - std::lock_guard lock(gStudioMutex); - if (length) *length = 0; - return FMOD_OK; - } - int APS5_VABI isSnapshot(bool* snapshot) { - std::lock_guard lock(gStudioMutex); - if (snapshot) *snapshot = false; - return FMOD_OK; - } - int APS5_VABI isOneshot(bool* oneshot) { - std::lock_guard lock(gStudioMutex); - if (oneshot) *oneshot = false; - return FMOD_OK; - } - int APS5_VABI isStream(bool* isstream) { - std::lock_guard lock(gStudioMutex); - if (isstream) *isstream = false; - return FMOD_OK; - } - int APS5_VABI is3D(bool* is3d) { - std::lock_guard lock(gStudioMutex); - if (is3d) *is3d = false; - return FMOD_OK; - } - int APS5_VABI hasSustainPoint(bool* sustainpoint) { - std::lock_guard lock(gStudioMutex); - if (sustainpoint) *sustainpoint = false; - return FMOD_OK; - } - int APS5_VABI getMinimumDistance(float* distance) { - std::lock_guard lock(gStudioMutex); - if (distance) *distance = 0.0f; - return FMOD_OK; - } - int APS5_VABI getMaximumDistance(float* distance) { - std::lock_guard lock(gStudioMutex); - if (distance) *distance = 10000.0f; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class EventInstance { -public: - EventDescription* description = nullptr; - bool playing = false; - bool paused = false; - float volume = 1.0f; - float pitch = 1.0f; - void* userData = nullptr; - std::unordered_map paramsByName; - int APS5_VABI isValid() { - return true; - } - int APS5_VABI getDescription(EventDescription** description) { - std::lock_guard lock(gStudioMutex); - if (description) *description = this->description; - return FMOD_OK; - } - int APS5_VABI getVolume(float* volume, float* finalvolume) { - std::lock_guard lock(gStudioMutex); - if (volume) *volume = this->volume; - if (finalvolume) *finalvolume = this->volume; - return FMOD_OK; - } - int APS5_VABI setVolume(float volume) { - std::lock_guard lock(gStudioMutex); - this->volume = volume; - return FMOD_OK; - } - int APS5_VABI getPitch(float* pitch, float* finalpitch) { - std::lock_guard lock(gStudioMutex); - if (pitch) *pitch = this->pitch; - if (finalpitch) *finalpitch = this->pitch; - return FMOD_OK; - } - int APS5_VABI setPitch(float pitch) { - std::lock_guard lock(gStudioMutex); - this->pitch = pitch; - return FMOD_OK; - } - int APS5_VABI getPaused(bool* paused) { - std::lock_guard lock(gStudioMutex); - if (paused) *paused = this->paused; - return FMOD_OK; - } - int APS5_VABI setPaused(bool paused) { - std::lock_guard lock(gStudioMutex); - this->paused = paused; - return FMOD_OK; - } - int APS5_VABI start() { - std::lock_guard lock(gStudioMutex); - playing = true; - return FMOD_OK; - } - int APS5_VABI stop(FMOD_STUDIO_STOP_MODE mode) { - (void)mode; - std::lock_guard lock(gStudioMutex); - playing = false; - return FMOD_OK; - } - int APS5_VABI release() { - std::lock_guard lock(gStudioMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE* state) { - std::lock_guard lock(gStudioMutex); - if (state) *state = playing ? FMOD_STUDIO_PLAYBACK_PLAYING : FMOD_STUDIO_PLAYBACK_STOPPED; - return FMOD_OK; - } - int APS5_VABI setTimelinePosition(int position) { - (void)position; - return FMOD_OK; - } - int APS5_VABI getTimelinePosition(int* position) { - std::lock_guard lock(gStudioMutex); - if (position) *position = 0; - return FMOD_OK; - } - int APS5_VABI setParameterByName(const char* name, float value, bool ignoreseekspeed) { - (void)ignoreseekspeed; - std::lock_guard lock(gStudioMutex); - if (name) paramsByName[name] = value; - return FMOD_OK; - } - int APS5_VABI getParameterByName(const char* name, float* value, float* finalvalue) { - std::lock_guard lock(gStudioMutex); - float stored = 0.0f; - if (name) { - auto it = paramsByName.find(name); - if (it != paramsByName.end()) stored = it->second; - } - if (value) *value = stored; - if (finalvalue) *finalvalue = stored; - return FMOD_OK; - } - int APS5_VABI setParameterByID(FMOD_STUDIO_PARAMETER_ID id, float value, bool ignoreseekspeed) { - (void)id; (void)ignoreseekspeed; - return FMOD_OK; - } - int APS5_VABI keyOff() { return FMOD_OK; } - int APS5_VABI setReverbLevel(int index, float level) { - (void)index; (void)level; - return FMOD_OK; - } - int APS5_VABI set3DAttributes(const FMOD_3D_ATTRIBUTES* attributes) { - (void)attributes; - return FMOD_OK; - } - int APS5_VABI setListenerMask(unsigned mask) { - (void)mask; - return FMOD_OK; - } - int APS5_VABI getChannelGroup(FMOD_CHANNELGROUP** group) { - std::lock_guard lock(gStudioMutex); - if (group) *group = nullptr; - return FMOD_OK; - } - int APS5_VABI setCallback(FMOD_STUDIO_EVENT_CALLBACK callback) { - (void)callback; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } - int APS5_VABI hasSustainPoint(bool* sustainpoint) { - std::lock_guard lock(gStudioMutex); - if (sustainpoint) *sustainpoint = false; - return FMOD_OK; - } - int APS5_VABI triggerCue() { return FMOD_OK; } -}; - -int APS5_VABI EventDescription::createInstance(EventInstance** instance) { - std::lock_guard lock(gStudioMutex); - if (!instance) return FMOD_OK; - *instance = new EventInstance(); - (*instance)->description = this; - return FMOD_OK; -} - -class Bus { -public: - std::string path; - float volume = 1.0f; - bool paused = false; - bool mute = false; - void* userData = nullptr; - int APS5_VABI isValid() { - return true; - } - int APS5_VABI getVolume(float* volume, float* finalvolume) { - std::lock_guard lock(gStudioMutex); - if (volume) *volume = this->volume; - if (finalvolume) *finalvolume = this->volume; - return FMOD_OK; - } - int APS5_VABI setVolume(float volume) { - std::lock_guard lock(gStudioMutex); - this->volume = volume; - return FMOD_OK; - } - int APS5_VABI getPaused(bool* paused) { - std::lock_guard lock(gStudioMutex); - if (paused) *paused = this->paused; - return FMOD_OK; - } - int APS5_VABI setPaused(bool paused) { - std::lock_guard lock(gStudioMutex); - this->paused = paused; - return FMOD_OK; - } - int APS5_VABI getMute(bool* mute) { - std::lock_guard lock(gStudioMutex); - if (mute) *mute = this->mute; - return FMOD_OK; - } - int APS5_VABI setMute(bool mute) { - std::lock_guard lock(gStudioMutex); - this->mute = mute; - return FMOD_OK; - } - int APS5_VABI stopAllEvents(FMOD_STUDIO_STOP_MODE mode) { - (void)mode; - return FMOD_OK; - } - int APS5_VABI getChannelGroup(FMOD_CHANNELGROUP** group) { - std::lock_guard lock(gStudioMutex); - if (group) *group = nullptr; - return FMOD_OK; - } - int APS5_VABI lockChannelGroup() { return FMOD_OK; } - int APS5_VABI unlockChannelGroup() { return FMOD_OK; } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class VCA { -public: - std::string path; - float volume = 1.0f; - void* userData = nullptr; - int APS5_VABI isValid() { - return true; - } - int APS5_VABI getVolume(float* volume, float* finalvolume) { - std::lock_guard lock(gStudioMutex); - if (volume) *volume = this->volume; - if (finalvolume) *finalvolume = this->volume; - return FMOD_OK; - } - int APS5_VABI setVolume(float volume) { - std::lock_guard lock(gStudioMutex); - this->volume = volume; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class CommandReplay { -public: - void* userData = nullptr; - int APS5_VABI isValid() { - return true; - } - int APS5_VABI getLength(float* length) { - std::lock_guard lock(gStudioMutex); - if (length) *length = 0.0f; - return FMOD_OK; - } - int APS5_VABI start() { return FMOD_OK; } - int APS5_VABI stop() { return FMOD_OK; } - int APS5_VABI seekToTime(float time) { - (void)time; - return FMOD_OK; - } - int APS5_VABI release() { - std::lock_guard lock(gStudioMutex); - delete this; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } -}; - -class System { -public: - bool initialized = false; - int maxChannels = 0; - int numListeners = 1; - void* userData = nullptr; - std::unordered_map paramsByName; - std::vector banks; - static int APS5_VABI create(System** system, unsigned headerversion) { - (void)headerversion; - std::lock_guard lock(gStudioMutex); - if (!system) return FMOD_OK; - *system = new System(); - return FMOD_OK; - } - int APS5_VABI isValid() { - return true; - } - int APS5_VABI release() { - std::lock_guard lock(gStudioMutex); - for (Bank* bank : banks) delete bank; - banks.clear(); - delete this; - return FMOD_OK; - } - int APS5_VABI initialize(int maxchannels, unsigned studioflags, unsigned flags, void* extradriverdata) { - (void)studioflags; (void)flags; (void)extradriverdata; - std::lock_guard lock(gStudioMutex); - maxChannels = maxchannels; - initialized = true; - return FMOD_OK; - } - int APS5_VABI update() { return FMOD_OK; } - int APS5_VABI getEvent(const char* pathOrID, EventDescription** event) { - std::lock_guard lock(gStudioMutex); - if (!event) return FMOD_OK; - *event = new EventDescription(); - if (pathOrID) (*event)->path = pathOrID; - return FMOD_OK; - } - int APS5_VABI getBankList(Bank** array, int capacity, int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = static_cast(banks.size()); - if (array && capacity > 0) { - int filled = capacity < static_cast(banks.size()) ? capacity : static_cast(banks.size()); - for (int i = 0; i < filled; i++) array[i] = banks[static_cast(i)]; - } - return FMOD_OK; - } - int APS5_VABI getBankCount(int* count) { - std::lock_guard lock(gStudioMutex); - if (count) *count = static_cast(banks.size()); - return FMOD_OK; - } - int APS5_VABI loadBankFile(const char* filename, unsigned flags, Bank** bank) { - (void)flags; - std::lock_guard lock(gStudioMutex); - if (!bank) return FMOD_OK; - *bank = new Bank(); - if (filename) (*bank)->path = filename; - banks.push_back(*bank); - return FMOD_OK; - } - int APS5_VABI loadBankMemory(const char* buffer, int length, unsigned mode, unsigned flags, Bank** bank) { - (void)buffer; (void)length; (void)mode; (void)flags; - std::lock_guard lock(gStudioMutex); - if (!bank) return FMOD_OK; - *bank = new Bank(); - banks.push_back(*bank); - return FMOD_OK; - } - int APS5_VABI unloadAll() { - std::lock_guard lock(gStudioMutex); - for (Bank* bank : banks) delete bank; - banks.clear(); - return FMOD_OK; - } - int APS5_VABI flushCommands() { return FMOD_OK; } - int APS5_VABI flushSampleLoading() { return FMOD_OK; } - int APS5_VABI setNumListeners(int numlisteners) { - std::lock_guard lock(gStudioMutex); - numListeners = numlisteners; - return FMOD_OK; - } - int APS5_VABI getNumListeners(int* numlisteners) { - std::lock_guard lock(gStudioMutex); - if (numlisteners) *numlisteners = numListeners; - return FMOD_OK; - } - int APS5_VABI setListenerAttributes(int index, const FMOD_3D_ATTRIBUTES* attributes, const FMOD_VECTOR* attenuationposition) { - (void)index; (void)attributes; (void)attenuationposition; - return FMOD_OK; - } - int APS5_VABI getBus(const char* pathOrID, Bus** bus) { - std::lock_guard lock(gStudioMutex); - if (!bus) return FMOD_OK; - *bus = new Bus(); - if (pathOrID) (*bus)->path = pathOrID; - return FMOD_OK; - } - int APS5_VABI getVCA(const char* pathOrID, VCA** vca) { - std::lock_guard lock(gStudioMutex); - if (!vca) return FMOD_OK; - *vca = new VCA(); - if (pathOrID) (*vca)->path = pathOrID; - return FMOD_OK; - } - int APS5_VABI getParameterByName(const char* name, float* value, float* finalvalue) { - std::lock_guard lock(gStudioMutex); - float stored = 0.0f; - if (name) { - auto it = paramsByName.find(name); - if (it != paramsByName.end()) stored = it->second; - } - if (value) *value = stored; - if (finalvalue) *finalvalue = stored; - return FMOD_OK; - } - int APS5_VABI setParameterByName(const char* name, float value, bool ignoreseekspeed) { - (void)ignoreseekspeed; - std::lock_guard lock(gStudioMutex); - if (name) paramsByName[name] = value; - return FMOD_OK; - } - int APS5_VABI setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask) { - (void)callback; (void)callbackmask; - return FMOD_OK; - } - int APS5_VABI registerPlugin(const FMOD_DSP_DESCRIPTION* description) { - (void)description; - return FMOD_OK; - } - int APS5_VABI setUserData(void* userdata) { - std::lock_guard lock(gStudioMutex); - userData = userdata; - return FMOD_OK; - } - int APS5_VABI getUserData(void** userdata) { - std::lock_guard lock(gStudioMutex); - if (userdata) *userdata = userData; - return FMOD_OK; - } - int APS5_VABI getCPUUsage(FMOD_STUDIO_CPU_USAGE* usage) { - std::lock_guard lock(gStudioMutex); - if (usage) std::memset(usage, 0, sizeof(*usage)); - return FMOD_OK; - } - int APS5_VABI getBufferUsage(FMOD_STUDIO_BUFFER_USAGE* usage) { - std::lock_guard lock(gStudioMutex); - if (usage) std::memset(usage, 0, sizeof(*usage)); - return FMOD_OK; - } - int APS5_VABI resetBufferUsage() { return FMOD_OK; } - int APS5_VABI getMemoryUsage(FMOD_STUDIO_MEMORY_USAGE* memoryusage) { - std::lock_guard lock(gStudioMutex); - if (memoryusage) std::memset(memoryusage, 0, sizeof(*memoryusage)); - return FMOD_OK; - } -}; - -} -} - -extern "C" { - -namespace { - -// Round2: 20/25 studio stubs identified via real FMOD headers (const-correct -// Itanium manglings, verified with g++ + c++filt + NidCompute SHA1+suffix). -// Wrappers below are ABI-compatible (this+params, SysV) with the real const -// methods; most delegate to the existing non-const logic (const is -// compile-time only, same calling convention). - -// +V2QcIcvWpw = EventDescription::createInstance(EventInstance**) const -__attribute__((used)) int APS5_VABI fmodstudio_real_createInstance(const void* self, void** out) { - std::lock_guard lock(gStudioMutex); - if (!out) return 0; - auto* desc = const_cast(static_cast(self)); - auto* inst = new FMOD::Studio::EventInstance(); - inst->description = desc; - *out = inst; - return 0; -} -// 2QOSvz5hvAg = EventInstance::getPlaybackState(PLAYBACK_STATE*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getPlaybackState(const void* self, int* state) { - std::lock_guard lock(gStudioMutex); - const auto* inst = static_cast(self); - if (state) *state = (inst && inst->playing) ? 0 : 2; // PLAYING=0, STOPPED=2 - return 0; -} -// 3loRRCoqXfU = EventInstance::isValid() const -__attribute__((used)) int APS5_VABI fmodstudio_real_ei_isValid(const void* self) { - (void)self; - return 1; -} -// 6E6MUTGjxhI = System::getEvent(const char*, EventDescription**) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getEvent(const void* self, const char* path, void** out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (!out) return 0; - auto* ed = new FMOD::Studio::EventDescription(); - if (path) ed->path = path; - *out = ed; - return 0; -} -// 6nWYF1yMOl4 = Bank::getLoadingState(LOADING_STATE*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_bankLoading(const void* self, int* state) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (state) *state = 3; // LOADED - return 0; -} -// 7hd4bRJuLMg = System::getCoreSystem(CoreSystem**) const (placeholder 256B zeroed) -__attribute__((used)) int APS5_VABI fmodstudio_real_getCoreSystem(const void* self, void** out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (!out) return 0; - void* placeholder = std::calloc(1, 256); - *out = placeholder; - return 0; -} -// -7VafNNns2A = EventInstance::getUserData(void**) const -__attribute__((used)) int APS5_VABI fmodstudio_real_ei_getUserData(const void* self, void** out) { - std::lock_guard lock(gStudioMutex); - const auto* inst = static_cast(self); - if (out) *out = inst ? inst->userData : nullptr; - return 0; -} -// AdR01fo-WaM = System::getParameterByName(const char*, float*, float*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_sysGetParam(const void* self, const char* name, float* v, float* fv) { - std::lock_guard lock(gStudioMutex); - const auto* sys = static_cast(self); - float stored = 0.0f; - if (sys && name) { - auto it = sys->paramsByName.find(name); - if (it != sys->paramsByName.end()) stored = it->second; - } - if (v) *v = stored; - if (fv) *fv = stored; - return 0; -} -// alleMuKEWr8 = EventDescription::isOneshot(bool*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_isOneshot(const void* self, bool* out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (out) *out = false; - return 0; -} -// Bu8uFP7ME2k = System::getVCA(const char*, VCA**) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getVCA(const void* self, const char* path, void** out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (!out) return 0; - auto* vca = new FMOD::Studio::VCA(); - if (path) vca->path = path; - *out = vca; - return 0; -} -// DsFsPD0MWNc = System::getSoundInfo(const char*, SOUND_INFO*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getSoundInfo(const void* self, const char* key, void* info) { - (void)self; (void)key; - std::lock_guard lock(gStudioMutex); - if (info) std::memset(info, 0, sizeof(FMOD_STUDIO_SOUND_INFO)); - return 0; -} -// --f9RJwAh1A = EventDescription::getSampleLoadingState(LOADING_STATE*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_edSampleState(const void* self, int* state) { - std::lock_guard lock(gStudioMutex); - const auto* ed = static_cast(self); - if (state) *state = (ed && ed->sampleDataLoaded) ? 3 : 1; // LOADED=3, UNLOADED=1 - return 0; -} -// fbAVXdyBuso = Bank::isValid() const -__attribute__((used)) int APS5_VABI fmodstudio_real_bankIsValid(const void* self) { - (void)self; - return 1; -} -// LG53EJZJDnA = EventInstance::setCallback(callback, mask) (non-const, 2 params) -__attribute__((used)) int APS5_VABI fmodstudio_real_eiSetCallback(void* self, void* cb, unsigned mask) { - (void)self; (void)cb; (void)mask; - return 0; -} -// nhBPjhZ+VWs = EventDescription::is3D(bool*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_is3D(const void* self, bool* out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (out) *out = false; - return 0; -} -// omDBr+dcDVc = EventDescription::getInstanceCount(int*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getInstanceCount(const void* self, int* out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (out) *out = 0; - return 0; -} -// uWXqw4LeM5Q = EventDescription::isValid() const -__attribute__((used)) int APS5_VABI fmodstudio_real_edIsValid(const void* self) { - (void)self; - return 1; -} -// VdQjbIsdhXQ = EventDescription::getLength(int*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_edGetLength(const void* self, int* out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (out) *out = 0; - return 0; -} -// WP51b8simn8 = EventInstance::getTimelinePosition(int*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getTimeline(const void* self, int* out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (out) *out = 0; - return 0; -} -// Zi1n4MvZ3-0 = System::getBufferUsage(BUFFER_USAGE*) const -__attribute__((used)) int APS5_VABI fmodstudio_real_getBufferUsage(const void* self, void* out) { - (void)self; - std::lock_guard lock(gStudioMutex); - if (out) std::memset(out, 0, sizeof(FMOD_STUDIO_BUFFER_USAGE)); - return 0; -} - -__attribute__((used)) int fmodstudio_nid_stub_10() { NotImplemented_nid_no_patch("Cm2cmtCv8cA"); return 0; } -__attribute__((used)) int fmodstudio_nid_stub_12() { NotImplemented_nid_no_patch("EfM9xXvBmxk"); return 0; } -__attribute__((used)) int fmodstudio_nid_stub_15() { NotImplemented_nid_no_patch("Js90KQXVS4s"); return 0; } -__attribute__((used)) int fmodstudio_nid_stub_18() { NotImplemented_nid_no_patch("oCYWES02VPc"); return 0; } -__attribute__((used)) int fmodstudio_nid_stub_22() { NotImplemented_nid_no_patch("vVwA2cZA5e4"); return 0; } - -} - -APS5_EXPORT("+V2QcIcvWpw", fmodstudio_real_createInstance); -APS5_EXPORT("2QOSvz5hvAg", fmodstudio_real_getPlaybackState); -APS5_EXPORT("3loRRCoqXfU", fmodstudio_real_ei_isValid); -APS5_EXPORT("6E6MUTGjxhI", fmodstudio_real_getEvent); -APS5_EXPORT("6nWYF1yMOl4", fmodstudio_real_bankLoading); -APS5_EXPORT("7hd4bRJuLMg", fmodstudio_real_getCoreSystem); -APS5_EXPORT("-7VafNNns2A", fmodstudio_real_ei_getUserData); -APS5_EXPORT("AdR01fo-WaM", fmodstudio_real_sysGetParam); -APS5_EXPORT("alleMuKEWr8", fmodstudio_real_isOneshot); -APS5_EXPORT("Bu8uFP7ME2k", fmodstudio_real_getVCA); -APS5_EXPORT("Cm2cmtCv8cA", fmodstudio_nid_stub_10); -APS5_EXPORT("DsFsPD0MWNc", fmodstudio_real_getSoundInfo); -APS5_EXPORT("EfM9xXvBmxk", fmodstudio_nid_stub_12); -APS5_EXPORT("--f9RJwAh1A", fmodstudio_real_edSampleState); -APS5_EXPORT("fbAVXdyBuso", fmodstudio_real_bankIsValid); -APS5_EXPORT("Js90KQXVS4s", fmodstudio_nid_stub_15); -APS5_EXPORT("LG53EJZJDnA", fmodstudio_real_eiSetCallback); -APS5_EXPORT("nhBPjhZ+VWs", fmodstudio_real_is3D); -APS5_EXPORT("oCYWES02VPc", fmodstudio_nid_stub_18); -APS5_EXPORT("omDBr+dcDVc", fmodstudio_real_getInstanceCount); -APS5_EXPORT("uWXqw4LeM5Q", fmodstudio_real_edIsValid); -APS5_EXPORT("VdQjbIsdhXQ", fmodstudio_real_edGetLength); -APS5_EXPORT("vVwA2cZA5e4", fmodstudio_nid_stub_22); -APS5_EXPORT("WP51b8simn8", fmodstudio_real_getTimeline); -APS5_EXPORT("Zi1n4MvZ3-0", fmodstudio_real_getBufferUsage); - -} diff --git a/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp b/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp deleted file mode 100644 index 8b5c7b585..000000000 --- a/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp +++ /dev/null @@ -1,256 +0,0 @@ -#include "prx/libc/include/general/VabiMacros.hpp" -#include -#include -#include -#include -#include - -using Deleter = void (APS5_VABI*)(void*); - -struct IntrusivePtr { - void* object; - Deleter deleter; - void* libContext; -}; - -using Construct = void (APS5_VABI*)(IntrusivePtr*); -using Copy = void (APS5_VABI*)(IntrusivePtr*, const IntrusivePtr*); -using Destroy = void (APS5_VABI*)(IntrusivePtr*); -using Access = void* (APS5_VABI*)(const IntrusivePtr*); - -extern "C" { -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEC1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEC1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEC1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEC1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEC1Ev(IntrusivePtr*); - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1ERS7_(IntrusivePtr*, const IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1ERS7_(IntrusivePtr*, const IntrusivePtr*); - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEED1Ev(IntrusivePtr*); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEED1Ev(IntrusivePtr*); - -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V15EntryEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6BinaryEEptEv(const IntrusivePtr*); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEdeEv(const IntrusivePtr*); -} - -static void Require(bool value) { if (!value) std::abort(); } - -static constexpr std::size_t ObjectSize = 0x40; -static constexpr std::size_t VectorReferenceCountOffset = 0x30; - -struct DestroyCase { - Destroy destroy; - std::size_t referenceCountOffset; -}; - -static void* deletedObject = nullptr; -static int deleterCalls = 0; - -static void APS5_VABI RecordDelete(void* object) { - deletedObject = object; - ++deleterCalls; -} - -static std::int32_t ReadCount(const unsigned char* object, const std::size_t offset) { - std::int32_t value; - std::memcpy(&value, object + offset, sizeof(value)); - return value; -} - -static void WriteCount(unsigned char* object, const std::size_t offset, const std::int32_t value) { - std::memcpy(object + offset, &value, sizeof(value)); -} - -static bool OnlyCountChanged(const unsigned char* object, const std::size_t offset) { - for (std::size_t index = 0; index < ObjectSize; ++index) { - if (index >= offset && index < offset + sizeof(std::int32_t)) continue; - if (object[index] != 0x5a) return false; - } - return true; -} - -static void TestConstruct(const Construct construct) { - IntrusivePtr pointer; - std::memset(&pointer, 0xa5, sizeof(pointer)); - construct(&pointer); - Require(pointer.object == nullptr); - Require(pointer.deleter == nullptr); - Require(pointer.libContext == nullptr); -} - -static void TestAccess(const Access access) { - int object = 0; - int context = 0; - const IntrusivePtr empty{nullptr, RecordDelete, &context}; - Require(access(&empty) == nullptr); - const IntrusivePtr filled{&object, nullptr, nullptr}; - Require(access(&filled) == &object); -} - -static void TestCopy(const Copy copy) { - alignas(8) unsigned char object[ObjectSize]; - std::memset(object, 0x5a, sizeof(object)); - WriteCount(object, 0, 1); - int context = 0; - - const IntrusivePtr source{object, RecordDelete, &context}; - IntrusivePtr target; - std::memset(&target, 0xa5, sizeof(target)); - copy(&target, &source); - Require(target.object == object); - Require(target.deleter == RecordDelete); - Require(target.libContext == &context); - Require(source.object == object); - Require(ReadCount(object, 0) == 2); - Require(OnlyCountChanged(object, 0)); - - const IntrusivePtr empty{nullptr, RecordDelete, &context}; - std::memset(&target, 0xa5, sizeof(target)); - copy(&target, &empty); - Require(target.object == nullptr); - Require(target.deleter == RecordDelete); - Require(target.libContext == &context); -} - -static void TestDestroy(const DestroyCase& testCase) { - alignas(8) unsigned char object[ObjectSize]; - std::memset(object, 0x5a, sizeof(object)); - int context = 0; - const std::size_t offset = testCase.referenceCountOffset; - - deleterCalls = 0; - deletedObject = nullptr; - - IntrusivePtr empty{nullptr, RecordDelete, &context}; - testCase.destroy(&empty); - Require(empty.object == nullptr); - Require(empty.deleter == RecordDelete); - Require(empty.libContext == &context); - Require(deleterCalls == 0); - - WriteCount(object, offset, 2); - IntrusivePtr shared{object, RecordDelete, &context}; - testCase.destroy(&shared); - Require(ReadCount(object, offset) == 1); - Require(shared.object == object); - Require(shared.deleter == RecordDelete); - Require(shared.libContext == &context); - Require(deleterCalls == 0); - - IntrusivePtr last{object, RecordDelete, &context}; - testCase.destroy(&last); - Require(ReadCount(object, offset) == 0); - Require(OnlyCountChanged(object, offset)); - Require(deleterCalls == 1); - Require(deletedObject == object); - Require(last.object == nullptr); - Require(last.deleter == nullptr); - Require(last.libContext == &context); - - WriteCount(object, offset, 1); - IntrusivePtr pooled{object, nullptr, &context}; - bool thrown = false; - try { - testCase.destroy(&pooled); - } catch (const std::runtime_error&) { - thrown = true; - } - Require(thrown); - Require(deleterCalls == 1); -} - -static void TestSharedOwnership() { - alignas(8) unsigned char object[ObjectSize]; - std::memset(object, 0x5a, sizeof(object)); - WriteCount(object, 0, 1); - deleterCalls = 0; - deletedObject = nullptr; - - IntrusivePtr owner; - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1Ev(&owner); - owner.object = object; - owner.deleter = RecordDelete; - - IntrusivePtr argument; - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1ERS7_(&argument, &owner); - Require(_ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(&argument) == object); - Require(ReadCount(object, 0) == 2); - - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev(&argument); - Require(ReadCount(object, 0) == 1); - Require(deleterCalls == 0); - - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev(&owner); - Require(ReadCount(object, 0) == 0); - Require(deleterCalls == 1); - Require(deletedObject == object); - Require(_ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(&owner) == nullptr); -} - -int main() { - Require(sizeof(IntrusivePtr) == 0x18); - - const Construct constructors[] = { - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1Ev, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEC1Ev, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1Ev, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEC1Ev, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEC1Ev, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEC1Ev, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEC1Ev, - }; - for (const auto construct : constructors) TestConstruct(construct); - - const Access accessors[] = { - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V15EntryEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6BinaryEEptEv, - _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEdeEv, - }; - for (const auto access : accessors) TestAccess(access); - - const Copy copies[] = { - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1ERS7_, - _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1ERS7_, - }; - for (const auto copy : copies) TestCopy(copy); - - const DestroyCase destructors[] = { - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEED1Ev, 0}, - {_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEED1Ev, VectorReferenceCountOffset}, - }; - for (const auto& testCase : destructors) TestDestroy(testCase); - - TestSharedOwnership(); - return 0; -} diff --git a/core/libs/tests/GuestNpCppWebApiString.cpp b/core/libs/tests/GuestNpCppWebApiString.cpp deleted file mode 100644 index c54ee17c3..000000000 --- a/core/libs/tests/GuestNpCppWebApiString.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "prx/libc/include/general/VabiMacros.hpp" -#include -#include -#include -#include -#include - -extern "C" { -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(void* self, void* libContext); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(void* self); -const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const void* self); -} - -namespace { - -void Require(bool value) { if (!value) std::abort(); } - -constexpr std::size_t kStringSize = 0x20; -constexpr std::size_t kGuardSize = 0x10; -constexpr std::size_t kReferenceCountOffset = 0x00; -constexpr std::size_t kBufferOffset = 0x08; -constexpr std::size_t kBufferSizeOffset = 0x10; -constexpr std::size_t kLibContextOffset = 0x18; -constexpr unsigned char kFill = 0xA5; - -struct Storage { - alignas(8) unsigned char bytes[kStringSize + kGuardSize]; -}; - -template -TValue Load(const Storage& storage, std::size_t offset) { - TValue value; - std::memcpy(&value, storage.bytes + offset, sizeof(value)); - return value; -} - -template -void Store(Storage& storage, std::size_t offset, TValue value) { - std::memcpy(storage.bytes + offset, &value, sizeof(value)); -} - -bool GuardIntact(const Storage& storage) { - for (std::size_t i = kStringSize; i < sizeof(storage.bytes); i++) { - if (storage.bytes[i] != kFill) return false; - } - return true; -} - -bool DestructorThrows(Storage& storage) { - try { - _ZN3sce2Np9CppWebApi6Common6StringD1Ev(storage.bytes); - } catch (const std::runtime_error&) { - return true; - } - return false; -} - -void TestConstructedStringIsEmpty() { - std::uint64_t libContext = 1; - Storage storage; - std::memset(storage.bytes, kFill, sizeof(storage.bytes)); - - _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(storage.bytes, &libContext); - - Require(Load(storage, kReferenceCountOffset) == 0); - Require(Load(storage, kBufferOffset) == nullptr); - Require(Load(storage, kBufferSizeOffset) == 0); - Require(Load(storage, kLibContextOffset) == &libContext); - Require(GuardIntact(storage)); - - const char* text = _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(storage.bytes); - Require(text != nullptr && text[0] == '\0'); - - Storage before = storage; - _ZN3sce2Np9CppWebApi6Common6StringD1Ev(storage.bytes); - Require(std::memcmp(before.bytes, storage.bytes, sizeof(storage.bytes)) == 0); -} - -void TestNullLibContextIsStored() { - Storage storage; - std::memset(storage.bytes, kFill, sizeof(storage.bytes)); - - _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(storage.bytes, nullptr); - - Require(Load(storage, kLibContextOffset) == nullptr); - Require(Load(storage, kBufferOffset) == nullptr); - Require(_ZNK3sce2Np9CppWebApi6Common6String5c_strEv(storage.bytes)[0] == '\0'); - _ZN3sce2Np9CppWebApi6Common6StringD1Ev(storage.bytes); -} - -void TestBufferIsReturnedAndNotDroppedSilently() { - std::uint64_t libContext = 1; - char text[] = "ranking"; - Storage storage; - std::memset(storage.bytes, kFill, sizeof(storage.bytes)); - - _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(storage.bytes, &libContext); - Store(storage, kBufferOffset, text); - Store(storage, kBufferSizeOffset, sizeof(text)); - - Require(_ZNK3sce2Np9CppWebApi6Common6String5c_strEv(storage.bytes) == text); - Require(DestructorThrows(storage)); - Require(std::strcmp(text, "ranking") == 0); -} - -} - -int main() { - TestConstructedStringIsEmpty(); - TestNullLibContextIsStored(); - TestBufferIsReturnedAndNotDroppedSilently(); -} diff --git a/docs/dev/TechnicalDebt.md b/docs/dev/TechnicalDebt.md index cd0f433c1..657c1707a 100644 --- a/docs/dev/TechnicalDebt.md +++ b/docs/dev/TechnicalDebt.md @@ -108,10 +108,8 @@ Throughout the project, every function at every stage either **does exactly what - [sceHttp2GetMemoryPoolStats](../../core/libs/prx/libSceHttp2/Export.cpp) (libSceHttp2) - unknown signature - [sceNetGetMemoryPoolStats](../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) - unknown signature - [sceHttpSetRequestStatusCallback](../../core/libs/prx/libSceHttp/Export.cpp) (libSceHttp) - no reference implements it (shadPS4 only logs and returns 0); when the callback runs and what status it gets is unknown -- [sce::Np::CppWebApi::Common::IntrusivePtr](../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - the 0x18-byte layout (object, deleter, `LibContext*`) and the offset of the 32-bit reference count in the pointee (0x00, 0x30 for `Vector`) come from the module bundled with one title (PPSA21564); other SDK versions are not checked. The destructor throws on the last reference of a pointer without a deleter: destroying the object needs its destructor and the `LibContext` allocator, which are not implemented - [sceNpSessionSignalingGetMemoryInfo](../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) (libSceNpSessionSignaling) - unknown signature - [sceNpSessionSignalingGetConnectionStatistics](../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) (libSceNpSessionSignaling) - unknown signature -- [sce::Np::CppWebApi::Common::String](../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - the 0x20-byte layout (32-bit reference count, buffer at 0x08, buffer size at 0x10, `LibContext*` at 0x18) comes from the module bundled with one title (PPSA21564); other SDK versions are not checked. The destructor throws for a non-null buffer: releasing it needs the `LibContext` allocator, which is not implemented - [sceUserServiceGetAgeLevel](../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - the meaning of the value is unknown; 0 is reported, as for the unset game presets. PPSA12544 (Unity) only stores it for its user profile - [sceGameUpdateGetAddcontLatestVersion](../../core/libs/prx/libSceGameUpdate/Export.cpp) (libSceGameUpdate) - a null `entitlement_label` throws: KytyPS5 accepts it, prosper returns `0x80412803`. Bytes after `found` are zeroed as in KytyPS5; prosper leaves them untouched - [sceSystemServiceDisableMediaPlay](../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - unknown signature diff --git a/tools/package_release.py b/tools/package_release.py index 25296672b..53add7365 100644 --- a/tools/package_release.py +++ b/tools/package_release.py @@ -11,7 +11,6 @@ def package(platform, build, output, version): raise ValueError(f"Invalid release tag for asset filenames: {version}") libraries = sorted((build / "core/libs/libs").glob("*.prx")) expected = {f"{directory.name}.prx" for directory in Path("core/libs/prx").iterdir() if directory.is_dir()} - expected.add("libcohtml.Prospero.prx") missing = expected - {library.name for library in libraries} if missing: raise RuntimeError(f"Missing patched libraries: {', '.join(sorted(missing))}")