From 5c72030fb8cc5227b877e2c84a633eea76ff25aa Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 25 Mar 2025 23:54:32 +0200 Subject: [PATCH 01/22] HLE discmap (#2686) * HLE discmap * improved parameters naming * fixed typo --- src/core/libraries/disc_map/disc_map.cpp | 22 +++++++++++----------- src/core/libraries/disc_map/disc_map.h | 10 ++++++---- src/core/libraries/libs.cpp | 1 + src/emulator.cpp | 3 +-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/core/libraries/disc_map/disc_map.cpp b/src/core/libraries/disc_map/disc_map.cpp index bb566a149..e8b40e624 100644 --- a/src/core/libraries/disc_map/disc_map.cpp +++ b/src/core/libraries/disc_map/disc_map.cpp @@ -9,29 +9,29 @@ namespace Libraries::DiscMap { -int PS4_SYSV_ABI sceDiscMapGetPackageSize() { - LOG_WARNING(Lib_DiscMap, "(DUMMY) called"); +int PS4_SYSV_ABI sceDiscMapGetPackageSize(s64 fflags, int* ret1, int* ret2) { return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } -int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD() { - LOG_WARNING(Lib_DiscMap, "(DUMMY) called"); +int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD(char* path, s64 offset, s64 nbytes, int* ret) { return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } -int PS4_SYSV_ABI Func_7C980FFB0AA27E7A() { - LOG_ERROR(Lib_DiscMap, "(STUBBED) called"); +int PS4_SYSV_ABI Func_7C980FFB0AA27E7A(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2) { + *flags = 0; + *ret1 = 0; + *ret2 = 0; return ORBIS_OK; } -int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9() { - LOG_ERROR(Lib_DiscMap, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2) { + return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } int PS4_SYSV_ABI Func_E7EBCE96E92F91F8() { - LOG_ERROR(Lib_DiscMap, "(STUBBED) called"); - return ORBIS_OK; + return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } void RegisterlibSceDiscMap(Core::Loader::SymbolsResolver* sym) { diff --git a/src/core/libraries/disc_map/disc_map.h b/src/core/libraries/disc_map/disc_map.h index 08abee632..dc8b875ac 100644 --- a/src/core/libraries/disc_map/disc_map.h +++ b/src/core/libraries/disc_map/disc_map.h @@ -10,10 +10,12 @@ class SymbolsResolver; } namespace Libraries::DiscMap { -int PS4_SYSV_ABI sceDiscMapGetPackageSize(); -int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD(); -int PS4_SYSV_ABI Func_7C980FFB0AA27E7A(); -int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9(); +int PS4_SYSV_ABI sceDiscMapGetPackageSize(s64 fflags, int* ret1, int* ret2); +int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD(char* path, s64 offset, s64 nbytes, int* ret); +int PS4_SYSV_ABI Func_7C980FFB0AA27E7A(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2); +int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2); int PS4_SYSV_ABI Func_E7EBCE96E92F91F8(); void RegisterlibSceDiscMap(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 074cf524e..cd0fe650b 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -115,6 +115,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::NpParty::RegisterlibSceNpParty(sym); Libraries::Zlib::RegisterlibSceZlib(sym); Libraries::Hmd::RegisterlibSceHmd(sym); + Libraries::DiscMap::RegisterlibSceDiscMap(sym); } } // namespace Libraries diff --git a/src/emulator.cpp b/src/emulator.cpp index 4ec62995b..5f94f008a 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -289,13 +289,12 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector ModulesToLoad{ + constexpr std::array ModulesToLoad{ {{"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2}, {"libSceUlt.sprx", nullptr}, {"libSceJson.sprx", nullptr}, {"libSceJson2.sprx", nullptr}, {"libSceLibcInternal.sprx", &Libraries::LibcInternal::RegisterlibSceLibcInternal}, - {"libSceDiscMap.sprx", &Libraries::DiscMap::RegisterlibSceDiscMap}, {"libSceRtc.sprx", &Libraries::Rtc::RegisterlibSceRtc}, {"libSceCesCs.sprx", nullptr}, {"libSceFont.sprx", nullptr}, From a1ec8b0a88f8a14fdecc0de83b8e20cbbc9b2e32 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:01:21 +0100 Subject: [PATCH 02/22] Handle compute packets that are split between the ends of two command buffers (#2476) * Squashed initial implementation * Logging for checking if buffers are memory contiguous * Add check to see if first instruction is valid in the next buffer to avoid false positives * Oof * Replace old code with IndecisiveTurtle's new, better implementation * Add `unlikely` keyword to the split packet handling branches Co-authored-by: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> --------- Co-authored-by: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> --- src/video_core/amdgpu/liverpool.cpp | 55 +++++++++++++++++++---------- src/video_core/amdgpu/liverpool.h | 5 ++- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 246c8c947..bfe99c754 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -726,20 +726,39 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span -Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { +Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vqid) { FIBER_ENTER(acb_task_name[vqid]); - const auto& queue = asc_queues[{vqid}]; + auto& queue = asc_queues[{vqid}]; - auto base_addr = reinterpret_cast(acb.data()); - while (!acb.empty()) { - const auto* header = reinterpret_cast(acb.data()); - const u32 type = header->type; - if (type != 3) { - // No other types of packets were spotted so far - UNREACHABLE_MSG("Invalid PM4 type {}", type); + auto base_addr = reinterpret_cast(acb); + while (acb_dwords > 0) { + auto* header = reinterpret_cast(acb); + u32 next_dw_off = header->type3.NumWords() + 1; + + // If we have a buffered packet, use it. + if (queue.tmp_dwords > 0) [[unlikely]] { + header = reinterpret_cast(queue.tmp_packet.data()); + next_dw_off = header->type3.NumWords() + 1 - queue.tmp_dwords; + std::memcpy(queue.tmp_packet.data() + queue.tmp_dwords, acb, next_dw_off * sizeof(u32)); + queue.tmp_dwords = 0; + } + + // If the packet is split across ring boundary, buffer until next submission + if (next_dw_off > acb_dwords) [[unlikely]] { + std::memcpy(queue.tmp_packet.data(), acb, acb_dwords * sizeof(u32)); + queue.tmp_dwords = acb_dwords; + if constexpr (!is_indirect) { + *queue.read_addr += acb_dwords; + *queue.read_addr %= queue.ring_size_dw; + } + break; + } + + if (header->type != 3) { + // No other types of packets were spotted so far + UNREACHABLE_MSG("Invalid PM4 type {}", header->type.Value()); } - const u32 count = header->type3.NumWords(); const PM4ItOpcode opcode = header->type3.opcode; const auto* it_body = reinterpret_cast(header) + 1; switch (opcode) { @@ -749,8 +768,8 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } case PM4ItOpcode::IndirectBuffer: { const auto* indirect_buffer = reinterpret_cast(header); - auto task = ProcessCompute( - {indirect_buffer->Address(), indirect_buffer->ib_size}, vqid); + auto task = ProcessCompute(indirect_buffer->Address(), + indirect_buffer->ib_size, vqid); RESUME_ASC(task, vqid); while (!task.handle.done()) { @@ -800,7 +819,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } case PM4ItOpcode::SetShReg: { const auto* set_data = reinterpret_cast(header); - const auto set_size = (count - 1) * sizeof(u32); + const auto set_size = (header->type3.NumWords() - 1) * sizeof(u32); if (set_data->reg_offset >= 0x200 && set_data->reg_offset <= (0x200 + sizeof(ComputeProgram) / 4)) { @@ -895,14 +914,14 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } default: UNREACHABLE_MSG("Unknown PM4 type 3 opcode {:#x} with count {}", - static_cast(opcode), count); + static_cast(opcode), header->type3.NumWords()); } - const auto packet_size_dw = header->type3.NumWords() + 1; - acb = NextPacket(acb, packet_size_dw); + acb += next_dw_off; + acb_dwords -= next_dw_off; if constexpr (!is_indirect) { - *queue.read_addr += packet_size_dw; + *queue.read_addr += next_dw_off; *queue.read_addr %= queue.ring_size_dw; } } @@ -969,7 +988,7 @@ void Liverpool::SubmitAsc(u32 gnm_vqid, std::span acb) { auto& queue = mapped_queues[gnm_vqid]; const auto vqid = gnm_vqid - 1; - const auto& task = ProcessCompute(acb, vqid); + const auto& task = ProcessCompute(acb.data(), acb.size(), vqid); { std::scoped_lock lock{queue.m_access}; queue.submits.emplace(task.handle); diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index c18bcd57b..474c04ec2 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -1496,10 +1496,13 @@ public: } struct AscQueueInfo { + static constexpr size_t Pm4BufferSize = 1024; VAddr map_addr; u32* read_addr; u32 ring_size_dw; u32 pipe_id; + std::array tmp_packet; + u32 tmp_dwords; }; Common::SlotVector asc_queues{}; @@ -1541,7 +1544,7 @@ private: Task ProcessGraphics(std::span dcb, std::span ccb); Task ProcessCeUpdate(std::span ccb); template - Task ProcessCompute(std::span acb, u32 vqid); + Task ProcessCompute(const u32* acb, u32 acb_dwords, u32 vqid); void Process(std::stop_token stoken); From 7d0631cf26f983c035c1df9a071a69a28d619001 Mon Sep 17 00:00:00 2001 From: Ked <58560148+k3dr1@users.noreply.github.com> Date: Wed, 26 Mar 2025 20:35:43 +0800 Subject: [PATCH 03/22] Slightly changed how allInstallDirsDisabled is determined (#2688) --- src/qt_gui/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index d70294e40..34e429368 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -158,8 +158,7 @@ int main(int argc, char* argv[]) { } bool allInstallDirsDisabled = - std::all_of(Config::getGameInstallDirsEnabled().begin(), - Config::getGameInstallDirsEnabled().end(), [](bool val) { return !val; }); + std::ranges::all_of(Config::getGameInstallDirsEnabled(), [](bool val) { return !val; }); // If no game directory is set and no command line argument, prompt for it if (Config::getGameInstallDirs().empty() && allInstallDirsDisabled && From d8204641fafe6d1d23c561434328d9fecdb194be Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:03:35 -0500 Subject: [PATCH 04/22] libkernel: Filesystem code cleanup (#2554) * sceKernelOpen: Clean up flag handling * sceKernelOpen: fix params Based on decompilation, the second parameter of _open should be flags. Additionally swaps the return and parameter types to align with our current standards. * sceKernelOpen: Fix errors Based on POSIX spec, if part of the path is missing, ENOENT is the correct return. Additionally, decompilation suggests that open sets errno too. * Fix exports Fixes function exports to align with what they should be, based on what I've seen from decompilation and our module generator. * Proper errno behavior on open Since sceKernelOpen calls posix_open, errno should be set during this process. Simplest way to handle that is to move the actual open code to posix_open and adjust error cases accordingly. * Reorganize open calls, add error log * Improve close Removes the EPERM return, as it makes no sense, and swaps sceKernelClose with posix_close to properly emulate errno behavior. * Fix log on close * posix_open fixups * Readd hack in posix_close It's either this, or removing LLE DiscMap. Or shadow implements posix sockets. * Missing exports Commented out while I gradually work through them all * Remaining placeholder exports * Swap some stuff around I see nothing that suggests "open" only takes two parameters, so this should be completely safe. It's also more accurate to how these are handled in libkernel, and means I won't need to reorganize anything for readv and writev. * Update file_system.cpp * Implement write and posix_write * Oops * Implement posix_readv and sceKernelReadv Also fixes error behavior on readv, as that function shouldn't be returning any kernel error codes. * Move sceKernelUnlink Will deal with this one later, was just annoyed by how it's location doesn't align with the export order. * Cleanup readv * Implement posix_writev and sceKernelWritev Also fixes error behavior on writev, since it shouldn't ever return kernel errors (since our device files return those) * More cleanup on older functions * Swap around sceKernelLseek and posix_lseek This ensures that these have the correct error behavior, and makes their behavior align with the updated implementations for earlier functions. * Update file_system.cpp * Implement read Also fixes error behavior * Swap sceKernelMkdir and posix_mkdir Fixes errno behavior on kernel calls, also fixed some incorrect error returns. * Fix errno behavior on sceKernelRmdir Also reduces function logging to bring it closer to the level of logging seen in other filesystem functions. * Slight clean up of sceKernelStat Fixes error behavior and changes some of the old data types. * Refactor fstat Fixes errno behavior, implements fstat, and shifts exports around based on file position. Might reorganize function locations later though. * Implement posix_ftruncate Implements posix_ftruncate and fixes errno behavior for sceKernelFtruncate * Add missing error conversions for more device functions * Implement posix_rename, fix sceKernelRename errno behavior * Add posix_preadv and posix_pread Also fixes some incorrect error returns, fixes errno behavior, and removes an unnecessary hack. * Fix compile * Implement posix_getdents, getdirentries, and posix_getdirentries Also fixes errno behavior for the kernel variants of these functions. * Fix errno behavior of sceKernelFsync * Implement posix_pwrite and posix_unlink Also fixes errno behavior in related functions. * Update file_system.cpp * Remove SetPosixErrno Ideally, we've handled all possible error conditions before calling these functions, so treat errors in platform-specific code as IO errors and return POSIX_EIO instead. * Update header exports Not sure where these get used, but might as well keep them consistent with the rest of this. * Check if file exists before calling platform-specific code Bloodborne checks if a file doesn't exist using open, checking if it specifically failed with error code ENOENT. To avoid working with platform-specific errnos, add a proper error return for if the file doesn't exist. Fixes a regression in Bloodborne. * Clang Out of all the changes, this is apparently the only thing Clang-Format doesn't like. I'm honestly surprised. * Improve error checks on posix_unlink Just because a file isn't opened doesn't mean the file doesn't exist. Fixes the error returned if host_path.empty(), and removes the error return for when GetFile fails. * Fix the Bloodborne fix * Limit exports to tested functions * More confirmed working exports * Remaining stuff my games can test * FS exports from firmware tests * Bring back missing exports from main I don't have any bootable things that call these, but since they were working well enough on main, they should be fine to readd. * Add export for posix_pread Spotted in Dreams a while back, might as well add it. * Revert "Remove SetPosixErrno" This reverts commit bdfc0c246ce35cde015f3e48a284052ca4caf45e. * Revert SetPosixErrno changes shadow's using it for posix sockets, so significant modifications would introduce unnecessary merge conflicts. * Update comment * Add EACCES errno to SetPosixErrno Seen in Gravity Rush. Also reorganizes the switch case based on the posix errno value, since ordering by errno makes no sense on some OSes. * More export fixups Missed these during my initial pass through FS stuff because they were in kernel.cpp for some reason. * Symbols from FS tests Tested by messing around with firmware elfs, these atleast don't cause any crashes. * Remove inaccurate error behavior Seek can have offsets past the end of a file. Also add logging for two valid whence values that are unsupported on Windows. I'll need to verify that SEEK_HOLE and SEEK_DATA correspond to 3 and 4 respectively, I've yet to check source to verify. * Fix error log Oops * Clang Clang * Remove close hack Since LLE libSceDiscMap is no longer a concern, this hack shouldn't be needed. Since sockets are still stubbed, and close can be used on sockets, I've added a warning log just in case this still occurs in some titles. * Change SetPosixErrno unreachable to warning I changed it to an unreachable in an earlier commit to make testing easier. At this point, having an unreachable for this seems unnecessary, so change it to a warning instead. * Remove Bloodborne hack Games should be able to unlink files that aren't opened file descriptors. As far as I've tested, this doesn't break Bloodborne. --- src/common/io_file.cpp | 5 +- src/common/io_file.h | 2 + src/core/libraries/kernel/file_system.cpp | 862 ++++++++++++++-------- src/core/libraries/kernel/file_system.h | 8 +- src/core/libraries/kernel/kernel.cpp | 28 +- 5 files changed, 570 insertions(+), 335 deletions(-) diff --git a/src/common/io_file.cpp b/src/common/io_file.cpp index 3db78a145..3efadc6ea 100644 --- a/src/common/io_file.cpp +++ b/src/common/io_file.cpp @@ -125,12 +125,15 @@ namespace { [[nodiscard]] constexpr int ToSeekOrigin(SeekOrigin origin) { switch (origin) { case SeekOrigin::SetOrigin: - default: return SEEK_SET; case SeekOrigin::CurrentPosition: return SEEK_CUR; case SeekOrigin::End: return SEEK_END; + default: + LOG_ERROR(Common_Filesystem, "Unsupported origin {}, defaulting to SEEK_SET", + static_cast(origin)); + return SEEK_SET; } } diff --git a/src/common/io_file.h b/src/common/io_file.h index 45787a092..fb20a2bc5 100644 --- a/src/common/io_file.h +++ b/src/common/io_file.h @@ -61,6 +61,8 @@ enum class SeekOrigin : u32 { SetOrigin, // Seeks from the start of the file. CurrentPosition, // Seeks from the current file pointer position. End, // Seeks from the end of the file. + SeekHole, // Seeks from the start of the next hole in the file. + SeekData, // Seeks from the start of the next non-hole region in the file. }; class IOFile final { diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index ef3c2fe70..3321559ed 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -18,6 +18,7 @@ #include "core/file_sys/fs.h" #include "core/libraries/kernel/file_system.h" #include "core/libraries/kernel/orbis_error.h" +#include "core/libraries/kernel/posix_error.h" #include "core/libraries/libs.h" #include "core/memory.h" #include "kernel.h" @@ -57,7 +58,7 @@ static std::map available_device = { namespace Libraries::Kernel { -int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { +s32 PS4_SYSV_ABI open(const char* raw_path, s32 flags, u16 mode) { LOG_INFO(Kernel_Fs, "path = {} flags = {:#x} mode = {}", raw_path, flags, mode); auto* h = Common::Singleton::Instance(); auto* mnt = Common::Singleton::Instance(); @@ -99,7 +100,8 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { file->m_host_name = mnt->GetHostPath(file->m_guest_name); if (!std::filesystem::is_directory(file->m_host_name)) { // directory doesn't exist h->DeleteHandle(handle); - return ORBIS_KERNEL_ERROR_ENOTDIR; + *__Error() = POSIX_ENOENT; + return -1; } else { if (create) { return handle; // dir already exists @@ -116,61 +118,87 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { } else { file->m_guest_name = path; file->m_host_name = mnt->GetHostPath(file->m_guest_name); + bool exists = std::filesystem::exists(file->m_host_name); int e = 0; - if (read) { - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read); - } else if (write && (create || truncate)) { - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); - } else if (write && create && append) { // CUSA04729 (appends app0/shaderlist.txt) - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append); - } else if (rdwr) { - if (create) { // Create an empty file first. - Common::FS::IOFile out(file->m_host_name, Common::FS::FileAccessMode::Write); + + if (create) { + if (excl && exists) { + // Error if file exists + h->DeleteHandle(handle); + *__Error() = POSIX_EEXIST; + return -1; } - // RW, then scekernelWrite is called and savedata is written just fine now. - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite); - } else if (write) { - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); - } else { - UNREACHABLE(); - } - if (e != 0) { + // Create file if it doesn't exist + Common::FS::IOFile out(file->m_host_name, Common::FS::FileAccessMode::Write); + } else if (!exists) { + // File to open doesn't exist, return ENOENT h->DeleteHandle(handle); - return ErrnoToSceKernelError(e); + *__Error() = POSIX_ENOENT; + return -1; + } + + if (read) { + // Read only + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read); + } else if (write) { + // Write only + if (append) { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append); + } else { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); + } + } else if (rdwr) { + // Read and write + if (append) { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append); + } else { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite); + } + } else { + // Invalid flags + *__Error() = POSIX_EINVAL; + return -1; + } + + if (truncate && e == 0) { + // If the file was opened successfully and truncate was enabled, reduce size to 0 + file->f.SetSize(0); + } + + if (e != 0) { + // Open failed in platform-specific code, errno needs to be converted. + h->DeleteHandle(handle); + SetPosixErrno(e); + return -1; } } file->is_opened = true; return handle; } -int PS4_SYSV_ABI posix_open(const char* path, int flags, /* SceKernelMode*/ u16 mode) { - LOG_INFO(Kernel_Fs, "posix open redirect to sceKernelOpen"); - int result = sceKernelOpen(path, flags, mode); - // Posix calls different only for their return values +s32 PS4_SYSV_ABI posix_open(const char* filename, s32 flags, u16 mode) { + return open(filename, flags, mode); +} + +s32 PS4_SYSV_ABI sceKernelOpen(const char* path, s32 flags, /* SceKernelMode*/ u16 mode) { + s32 result = open(path, flags, mode); if (result < 0) { - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI open(const char* filename, const char* mode) { - LOG_INFO(Kernel_Fs, "open redirect to sceKernelOpen"); - int result = sceKernelOpen(filename, ORBIS_KERNEL_O_RDWR, 0); - if (result < 0) { - return -1; - } - return result; -} - -int PS4_SYSV_ABI sceKernelClose(int d) { - if (d < 3) { // d probably hold an error code - return ORBIS_KERNEL_ERROR_EPERM; +s32 PS4_SYSV_ABI close(s32 fd) { + if (fd < 3) { + // This is technically possible, but it's usually caused by some stubbed function instead. + LOG_WARNING(Kernel_Fs, "called on an std handle, fd = {}", fd); } auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } if (file->type == Core::FileSys::FileType::Regular) { file->f.Close(); @@ -178,63 +206,54 @@ int PS4_SYSV_ABI sceKernelClose(int d) { file->is_opened = false; LOG_INFO(Kernel_Fs, "Closing {}", file->m_guest_name); // FIXME: Lock file mutex before deleting it? - h->DeleteHandle(d); + h->DeleteHandle(fd); return ORBIS_OK; } -int PS4_SYSV_ABI posix_close(int d) { - int result = sceKernelClose(d); +s32 PS4_SYSV_ABI posix_close(s32 fd) { + return close(fd); +} + +s32 PS4_SYSV_ABI sceKernelClose(s32 fd) { + s32 result = close(fd); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_close: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -s64 PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes) { +s64 PS4_SYSV_ABI write(s32 fd, const void* buf, size_t nbytes) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->write(buf, nbytes); + s64 result = file->device->write(buf, nbytes); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } return file->f.WriteRaw(buf, nbytes); } -int PS4_SYSV_ABI sceKernelUnlink(const char* path) { - if (path == nullptr) { - return ORBIS_KERNEL_ERROR_EINVAL; +s64 PS4_SYSV_ABI posix_write(s32 fd, const void* buf, size_t nbytes) { + return write(fd, buf, nbytes); +} + +s64 PS4_SYSV_ABI sceKernelWrite(s32 fd, const void* buf, size_t nbytes) { + s64 result = write(fd, buf, nbytes); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } - - auto* h = Common::Singleton::Instance(); - auto* mnt = Common::Singleton::Instance(); - - bool ro = false; - const auto host_path = mnt->GetHostPath(path, &ro); - if (host_path.empty()) { - return ORBIS_KERNEL_ERROR_EACCES; - } - - if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; - } - - if (std::filesystem::is_directory(host_path)) { - return ORBIS_KERNEL_ERROR_EPERM; - } - - auto* file = h->GetFile(host_path); - if (file != nullptr) { - file->f.Unlink(); - } - - LOG_INFO(Kernel_Fs, "Unlinked {}", path); - return ORBIS_OK; + return result; } size_t ReadFile(Common::FS::IOFile& file, void* buf, size_t nbytes) { @@ -246,59 +265,97 @@ size_t ReadFile(Common::FS::IOFile& file, void* buf, size_t nbytes) { return file.ReadRaw(buf, nbytes); } -size_t PS4_SYSV_ABI _readv(int d, const SceKernelIovec* iov, int iovcnt) { +size_t PS4_SYSV_ABI readv(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - int r = file->device->readv(iov, iovcnt); - if (r < 0) { - ErrSceToPosix(r); + size_t result = file->device->readv(iov, iovcnt); + if (result < 0) { + ErrSceToPosix(result); return -1; } - return r; + return result; } size_t total_read = 0; - for (int i = 0; i < iovcnt; i++) { + for (s32 i = 0; i < iovcnt; i++) { total_read += ReadFile(file->f, iov[i].iov_base, iov[i].iov_len); } return total_read; } -size_t PS4_SYSV_ABI _writev(int fd, const SceKernelIovec* iov, int iovcn) { +size_t PS4_SYSV_ABI posix_readv(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + return readv(fd, iov, iovcnt); +} + +size_t PS4_SYSV_ABI sceKernelReadv(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + size_t result = readv(fd, iov, iovcnt); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +size_t PS4_SYSV_ABI writev(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->writev(iov, iovcn); + size_t result = file->device->writev(iov, iovcnt); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } size_t total_written = 0; - for (int i = 0; i < iovcn; i++) { + for (s32 i = 0; i < iovcnt; i++) { total_written += file->f.WriteRaw(iov[i].iov_base, iov[i].iov_len); } return total_written; } -s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) { - LOG_TRACE(Kernel_Fs, "called: offset {} whence {}", offset, whence); +size_t PS4_SYSV_ABI posix_writev(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + return writev(fd, iov, iovcnt); +} + +size_t PS4_SYSV_ABI sceKernelWritev(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + size_t result = writev(fd, iov, iovcnt); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s64 PS4_SYSV_ABI posix_lseek(s32 fd, s64 offset, s32 whence) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->lseek(offset, whence); + s64 result = file->device->lseek(offset, whence); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } Common::FS::SeekOrigin origin{}; @@ -308,53 +365,82 @@ s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) { origin = Common::FS::SeekOrigin::CurrentPosition; } else if (whence == 2) { origin = Common::FS::SeekOrigin::End; + } else if (whence == 3) { + origin = Common::FS::SeekOrigin::SeekHole; + } else if (whence == 4) { + origin = Common::FS::SeekOrigin::SeekData; + } else { + // whence parameter is invalid + *__Error() = POSIX_EINVAL; + return -1; } if (!file->f.Seek(offset, origin)) { - LOG_CRITICAL(Kernel_Fs, "sceKernelLseek: failed to seek"); - return ORBIS_KERNEL_ERROR_EINVAL; + if (errno != 0) { + // Seek failed in platform-specific code, errno needs to be converted. + SetPosixErrno(errno); + return -1; + } + // Shouldn't be possible, but just in case. + return -1; } - return file->f.Tell(); -} -s64 PS4_SYSV_ABI posix_lseek(int d, s64 offset, int whence) { - s64 result = sceKernelLseek(d, offset, whence); + s64 result = file->f.Tell(); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_lseek: error = {}", result); - ErrSceToPosix(result); + // Tell failed in platform-specific code, errno needs to be converted. + SetPosixErrno(errno); return -1; } return result; } -s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes) { +s64 PS4_SYSV_ABI sceKernelLseek(s32 fd, s64 offset, s32 whence) { + s64 result = posix_lseek(fd, offset, whence); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s64 PS4_SYSV_ABI read(s32 fd, void* buf, size_t nbytes) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->read(buf, nbytes); + s64 result = file->device->read(buf, nbytes); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } return ReadFile(file->f, buf, nbytes); } -int PS4_SYSV_ABI posix_read(int d, void* buf, size_t nbytes) { - int result = sceKernelRead(d, buf, nbytes); +s64 PS4_SYSV_ABI posix_read(s32 fd, void* buf, size_t nbytes) { + return read(fd, buf, nbytes); +} + +s64 PS4_SYSV_ABI sceKernelRead(s32 fd, void* buf, size_t nbytes) { + s64 result = read(fd, buf, nbytes); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_read: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { +s32 PS4_SYSV_ABI posix_mkdir(const char* path, u16 mode) { LOG_INFO(Kernel_Fs, "path = {} mode = {}", path, mode); if (path == nullptr) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_ENOTDIR; + return -1; } auto* mnt = Common::Singleton::Instance(); @@ -362,88 +448,79 @@ int PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { const auto dir_name = mnt->GetHostPath(path, &ro); if (std::filesystem::exists(dir_name)) { - return ORBIS_KERNEL_ERROR_EEXIST; + *__Error() = POSIX_EEXIST; + return -1; } if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; + *__Error() = POSIX_EROFS; + return -1; } // CUSA02456: path = /aotl after sceSaveDataMount(mode = 1) std::error_code ec; if (dir_name.empty() || !std::filesystem::create_directory(dir_name, ec)) { - return ORBIS_KERNEL_ERROR_EIO; + *__Error() = POSIX_EIO; + return -1; } if (!std::filesystem::exists(dir_name)) { - return ORBIS_KERNEL_ERROR_ENOENT; + *__Error() = POSIX_ENOENT; + return -1; } return ORBIS_OK; } -int PS4_SYSV_ABI posix_mkdir(const char* path, u16 mode) { - int result = sceKernelMkdir(path, mode); +s32 PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { + s32 result = posix_mkdir(path, mode); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_mkdir: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelRmdir(const char* path) { +s32 PS4_SYSV_ABI posix_rmdir(const char* path) { auto* mnt = Common::Singleton::Instance(); bool ro = false; const std::filesystem::path dir_name = mnt->GetHostPath(path, &ro); - if (dir_name.empty()) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, permission denied", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_EACCES; + if (dir_name.empty() || !std::filesystem::is_directory(dir_name)) { + *__Error() = POSIX_ENOTDIR; + return -1; } if (ro) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, directory is read only", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_EROFS; - } - - if (!std::filesystem::is_directory(dir_name)) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, path is not a directory", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_ENOTDIR; + *__Error() = POSIX_EROFS; + return -1; } if (!std::filesystem::exists(dir_name)) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, no such file or directory", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_ENOENT; + *__Error() = POSIX_ENOENT; + return -1; } std::error_code ec; - int result = std::filesystem::remove_all(dir_name, ec); + s32 result = std::filesystem::remove_all(dir_name, ec); - if (!ec) { - LOG_INFO(Kernel_Fs, "Removed directory: {}", fmt::UTF(dir_name.u8string())); - return ORBIS_OK; + if (ec) { + *__Error() = POSIX_EIO; + return -1; } - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, error_code={}", - fmt::UTF(dir_name.u8string()), ec.message()); - return ErrnoToSceKernelError(ec.value()); + return ORBIS_OK; } -int PS4_SYSV_ABI posix_rmdir(const char* path) { - int result = sceKernelRmdir(path); +s32 PS4_SYSV_ABI sceKernelRmdir(const char* path) { + s32 result = posix_rmdir(path); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_rmdir: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { +s32 PS4_SYSV_ABI posix_stat(const char* path, OrbisKernelStat* sb) { LOG_INFO(Kernel_Fs, "(PARTIAL) path = {}", path); auto* mnt = Common::Singleton::Instance(); bool ro = false; @@ -452,7 +529,8 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { const bool is_dir = std::filesystem::is_directory(path_name); const bool is_file = std::filesystem::is_regular_file(path_name); if (!is_dir && !is_file) { - return ORBIS_KERNEL_ERROR_ENOENT; + *__Error() = POSIX_ENOENT; + return -1; } if (std::filesystem::is_directory(path_name)) { sb->st_mode = 0000777u | 0040000u; @@ -462,7 +540,7 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { // TODO incomplete } else { sb->st_mode = 0000777u | 0100000u; - sb->st_size = static_cast(std::filesystem::file_size(path_name)); + sb->st_size = static_cast(std::filesystem::file_size(path_name)); sb->st_blksize = 512; sb->st_blocks = (sb->st_size + 511) / 512; // TODO incomplete @@ -474,17 +552,16 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { return ORBIS_OK; } -int PS4_SYSV_ABI posix_stat(const char* path, OrbisKernelStat* sb) { - int result = sceKernelStat(path, sb); +s32 PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { + s32 result = posix_stat(path, sb); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_stat: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { +s32 PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { auto* mnt = Common::Singleton::Instance(); std::string_view guest_path{path}; for (const auto& prefix : available_device | std::views::keys) { @@ -499,23 +576,165 @@ int PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { return ORBIS_OK; } -s64 PS4_SYSV_ABI sceKernelPreadv(int d, SceKernelIovec* iov, int iovcnt, s64 offset) { - if (d < 3) { - return ORBIS_KERNEL_ERROR_EPERM; +s32 PS4_SYSV_ABI fstat(s32 fd, OrbisKernelStat* sb) { + LOG_INFO(Kernel_Fs, "(PARTIAL) fd = {}", fd); + if (sb == nullptr) { + *__Error() = POSIX_EFAULT; + return -1; } + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(fd); + if (file == nullptr) { + *__Error() = POSIX_EBADF; + return -1; + } + std::memset(sb, 0, sizeof(OrbisKernelStat)); + + switch (file->type) { + case Core::FileSys::FileType::Device: { + s32 result = file->device->fstat(sb); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; + } + case Core::FileSys::FileType::Regular: { + sb->st_mode = 0000777u | 0100000u; + sb->st_size = file->f.GetSize(); + sb->st_blksize = 512; + sb->st_blocks = (sb->st_size + 511) / 512; + // TODO incomplete + break; + } + case Core::FileSys::FileType::Directory: { + sb->st_mode = 0000777u | 0040000u; + sb->st_size = 0; + sb->st_blksize = 512; + sb->st_blocks = 0; + // TODO incomplete + break; + } + default: + UNREACHABLE(); + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI posix_fstat(s32 fd, OrbisKernelStat* sb) { + return fstat(fd, sb); +} + +s32 PS4_SYSV_ABI sceKernelFstat(s32 fd, OrbisKernelStat* sb) { + s32 result = fstat(fd, sb); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI posix_ftruncate(s32 fd, s64 length) { + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(fd); + + if (file == nullptr) { + *__Error() = POSIX_EBADF; + return -1; + } + + if (file->type == Core::FileSys::FileType::Device) { + s32 result = file->device->ftruncate(length); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; + } + + if (file->m_host_name.empty()) { + *__Error() = POSIX_EACCES; + return -1; + } + + file->f.SetSize(length); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelFtruncate(s32 fd, s64 length) { + s32 result = posix_ftruncate(fd, length); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI posix_rename(const char* from, const char* to) { + auto* mnt = Common::Singleton::Instance(); + bool ro = false; + const auto src_path = mnt->GetHostPath(from, &ro); + if (!std::filesystem::exists(src_path)) { + *__Error() = POSIX_ENOENT; + return -1; + } + if (ro) { + *__Error() = POSIX_EROFS; + return -1; + } + const auto dst_path = mnt->GetHostPath(to, &ro); + if (ro) { + *__Error() = POSIX_EROFS; + return -1; + } + const bool src_is_dir = std::filesystem::is_directory(src_path); + const bool dst_is_dir = std::filesystem::is_directory(dst_path); + if (src_is_dir && !dst_is_dir) { + *__Error() = POSIX_ENOTDIR; + return -1; + } + if (!src_is_dir && dst_is_dir) { + *__Error() = POSIX_EISDIR; + return -1; + } + if (dst_is_dir && !std::filesystem::is_empty(dst_path)) { + *__Error() = POSIX_ENOTEMPTY; + return -1; + } + std::filesystem::copy(src_path, dst_path, std::filesystem::copy_options::overwrite_existing); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelRename(const char* from, const char* to) { + s32 result = posix_rename(from, to); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s64 PS4_SYSV_ABI posix_preadv(s32 fd, SceKernelIovec* iov, s32 iovcnt, s64 offset) { if (offset < 0) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EINVAL; + return -1; } auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->preadv(iov, iovcnt, offset); + s64 result = file->device->preadv(iov, iovcnt, offset); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } const s64 pos = file->f.Tell(); @@ -523,8 +742,8 @@ s64 PS4_SYSV_ABI sceKernelPreadv(int d, SceKernelIovec* iov, int iovcnt, s64 off file->f.Seek(pos); }; if (!file->f.Seek(offset)) { - LOG_CRITICAL(Kernel_Fs, "failed to seek"); - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EIO; + return -1; } size_t total_read = 0; for (int i = 0; i < iovcnt; i++) { @@ -533,118 +752,72 @@ s64 PS4_SYSV_ABI sceKernelPreadv(int d, SceKernelIovec* iov, int iovcnt, s64 off return total_read; } -s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset) { - SceKernelIovec iovec{buf, nbytes}; - return sceKernelPreadv(d, &iovec, 1, offset); -} - -int PS4_SYSV_ABI sceKernelFStat(int fd, OrbisKernelStat* sb) { - LOG_INFO(Kernel_Fs, "(PARTIAL) fd = {}", fd); - if (fd < 3) { - return ORBIS_KERNEL_ERROR_EPERM; - } - if (sb == nullptr) { - return ORBIS_KERNEL_ERROR_EFAULT; - } - auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(fd); - if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; - } - std::memset(sb, 0, sizeof(OrbisKernelStat)); - - switch (file->type) { - case Core::FileSys::FileType::Device: - return file->device->fstat(sb); - case Core::FileSys::FileType::Regular: - sb->st_mode = 0000777u | 0100000u; - sb->st_size = file->f.GetSize(); - sb->st_blksize = 512; - sb->st_blocks = (sb->st_size + 511) / 512; - // TODO incomplete - break; - case Core::FileSys::FileType::Directory: - sb->st_mode = 0000777u | 0040000u; - sb->st_size = 0; - sb->st_blksize = 512; - sb->st_blocks = 0; - // TODO incomplete - break; - default: - UNREACHABLE(); - } - return ORBIS_OK; -} - -int PS4_SYSV_ABI posix_fstat(int fd, OrbisKernelStat* sb) { - int result = sceKernelFStat(fd, sb); +s64 PS4_SYSV_ABI sceKernelPreadv(s32 fd, SceKernelIovec* iov, s32 iovcnt, s64 offset) { + s64 result = posix_preadv(fd, iov, iovcnt, offset); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_fstat: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -s32 PS4_SYSV_ABI sceKernelFsync(int fd) { +s64 PS4_SYSV_ABI posix_pread(s32 fd, void* buf, size_t nbytes, s64 offset) { + SceKernelIovec iovec{buf, nbytes}; + return posix_preadv(fd, &iovec, 1, offset); +} + +s64 PS4_SYSV_ABI sceKernelPread(s32 fd, void* buf, size_t nbytes, s64 offset) { + SceKernelIovec iovec{buf, nbytes}; + return sceKernelPreadv(fd, &iovec, 1, offset); +} + +s32 PS4_SYSV_ABI posix_fsync(s32 fd) { auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } if (file->type == Core::FileSys::FileType::Device) { - return file->device->fsync(); + s32 result = file->device->fsync(); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } file->f.Flush(); return ORBIS_OK; } -s32 PS4_SYSV_ABI posix_fsync(int fd) { - s32 result = sceKernelFsync(fd); +s32 PS4_SYSV_ABI sceKernelFsync(s32 fd) { + s32 result = posix_fsync(fd); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_fsync: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelFtruncate(int fd, s64 length) { - auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(fd); - - if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; - } - - if (file->type == Core::FileSys::FileType::Device) { - return file->device->ftruncate(length); - } - - if (file->m_host_name.empty()) { - return ORBIS_KERNEL_ERROR_EACCES; - } - - file->f.SetSize(length); - return ORBIS_OK; -} - -static int GetDents(int fd, char* buf, int nbytes, s64* basep) { - if (fd < 3) { - return ORBIS_KERNEL_ERROR_EBADF; - } - +static s32 GetDents(s32 fd, char* buf, s32 nbytes, s64* basep) { if (buf == nullptr) { - return ORBIS_KERNEL_ERROR_EFAULT; + *__Error() = POSIX_EFAULT; + return -1; } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } if (file->type == Core::FileSys::FileType::Device) { - return file->device->getdents(buf, nbytes, basep); + s32 result = file->device->getdents(buf, nbytes, basep); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } if (file->dirents_index == file->dirents.size()) { @@ -652,7 +825,8 @@ static int GetDents(int fd, char* buf, int nbytes, s64* basep) { } if (file->type != Core::FileSys::FileType::Directory || nbytes < 512 || file->dirents_index > file->dirents.size()) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EINVAL; + return -1; } const auto& entry = file->dirents.at(file->dirents_index++); auto str = entry.name; @@ -673,118 +847,178 @@ static int GetDents(int fd, char* buf, int nbytes, s64* basep) { return sizeof(OrbisKernelDirent); } -int PS4_SYSV_ABI sceKernelGetdents(int fd, char* buf, int nbytes) { +s32 PS4_SYSV_ABI posix_getdents(s32 fd, char* buf, s32 nbytes) { return GetDents(fd, buf, nbytes, nullptr); } -int PS4_SYSV_ABI sceKernelGetdirentries(int fd, char* buf, int nbytes, s64* basep) { +s32 PS4_SYSV_ABI sceKernelGetdents(s32 fd, char* buf, s32 nbytes) { + s32 result = GetDents(fd, buf, nbytes, nullptr); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI getdirentries(s32 fd, char* buf, s32 nbytes, s64* basep) { return GetDents(fd, buf, nbytes, basep); } -s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset) { - if (d < 3) { - return ORBIS_KERNEL_ERROR_EPERM; +s32 PS4_SYSV_ABI posix_getdirentries(s32 fd, char* buf, s32 nbytes, s64* basep) { + return GetDents(fd, buf, nbytes, basep); +} + +s32 PS4_SYSV_ABI sceKernelGetdirentries(s32 fd, char* buf, s32 nbytes, s64* basep) { + s32 result = GetDents(fd, buf, nbytes, basep); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } + return result; +} + +s64 PS4_SYSV_ABI posix_pwrite(s32 fd, void* buf, size_t nbytes, s64 offset) { if (offset < 0) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EINVAL; + return -1; } auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->pwrite(buf, nbytes, offset); + s64 result = file->device->pwrite(buf, nbytes, offset); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } const s64 pos = file->f.Tell(); SCOPE_EXIT { file->f.Seek(pos); }; if (!file->f.Seek(offset)) { - LOG_CRITICAL(Kernel_Fs, "sceKernelPwrite: failed to seek"); - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EIO; + return -1; } return file->f.WriteRaw(buf, nbytes); } -s32 PS4_SYSV_ABI sceKernelRename(const char* from, const char* to) { +s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset) { + s64 result = posix_pwrite(fd, buf, nbytes, offset); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI posix_unlink(const char* path) { + if (path == nullptr) { + *__Error() = POSIX_EINVAL; + return -1; + } + + auto* h = Common::Singleton::Instance(); auto* mnt = Common::Singleton::Instance(); + bool ro = false; - const auto src_path = mnt->GetHostPath(from, &ro); - if (!std::filesystem::exists(src_path)) { - return ORBIS_KERNEL_ERROR_ENOENT; + const auto host_path = mnt->GetHostPath(path, &ro); + if (host_path.empty()) { + *__Error() = POSIX_ENOENT; + return -1; } + if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; + *__Error() = POSIX_EROFS; + return -1; } - const auto dst_path = mnt->GetHostPath(to, &ro); - if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; + + if (std::filesystem::is_directory(host_path)) { + *__Error() = POSIX_EPERM; + return -1; } - const bool src_is_dir = std::filesystem::is_directory(src_path); - const bool dst_is_dir = std::filesystem::is_directory(dst_path); - if (src_is_dir && !dst_is_dir) { - return ORBIS_KERNEL_ERROR_ENOTDIR; + + auto* file = h->GetFile(host_path); + if (file == nullptr) { + // File to unlink hasn't been opened, manually open and unlink it. + Common::FS::IOFile file(host_path, Common::FS::FileAccessMode::ReadWrite); + file.Unlink(); + } else { + file->f.Unlink(); } - if (!src_is_dir && dst_is_dir) { - return ORBIS_KERNEL_ERROR_EISDIR; - } - if (dst_is_dir && !std::filesystem::is_empty(dst_path)) { - return ORBIS_KERNEL_ERROR_ENOTEMPTY; - } - std::filesystem::copy(src_path, dst_path, std::filesystem::copy_options::overwrite_existing); + + LOG_INFO(Kernel_Fs, "Unlinked {}", path); return ORBIS_OK; } -void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); - LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); - LIB_FUNCTION("wuCroIGjt2g", "libkernel", 1, "libkernel", 1, 1, open); - LIB_FUNCTION("UK2Tl2DWUns", "libkernel", 1, "libkernel", 1, 1, sceKernelClose); - LIB_FUNCTION("bY-PO6JhzhQ", "libkernel", 1, "libkernel", 1, 1, posix_close); - LIB_FUNCTION("bY-PO6JhzhQ", "libScePosix", 1, "libkernel", 1, 1, posix_close); - LIB_FUNCTION("4wSze92BhLI", "libkernel", 1, "libkernel", 1, 1, sceKernelWrite); +s32 PS4_SYSV_ABI sceKernelUnlink(const char* path) { + s32 result = posix_unlink(path); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} - LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, _readv); - LIB_FUNCTION("YSHRBRLn2pI", "libkernel", 1, "libkernel", 1, 1, _writev); - LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, posix_lseek); +void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1, open); + LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); + LIB_FUNCTION("wuCroIGjt2g", "libkernel", 1, "libkernel", 1, 1, posix_open); + LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); + LIB_FUNCTION("NNtFaKJbPt0", "libkernel", 1, "libkernel", 1, 1, close); + LIB_FUNCTION("bY-PO6JhzhQ", "libScePosix", 1, "libkernel", 1, 1, posix_close); + LIB_FUNCTION("bY-PO6JhzhQ", "libkernel", 1, "libkernel", 1, 1, posix_close); + LIB_FUNCTION("UK2Tl2DWUns", "libkernel", 1, "libkernel", 1, 1, sceKernelClose); + LIB_FUNCTION("FxVZqBAA7ks", "libkernel", 1, "libkernel", 1, 1, write); + LIB_FUNCTION("FN4gaPmuFV8", "libScePosix", 1, "libkernel", 1, 1, posix_write); + LIB_FUNCTION("FN4gaPmuFV8", "libkernel", 1, "libkernel", 1, 1, posix_write); + LIB_FUNCTION("4wSze92BhLI", "libkernel", 1, "libkernel", 1, 1, sceKernelWrite); + LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, readv); + LIB_FUNCTION("YSHRBRLn2pI", "libkernel", 1, "libkernel", 1, 1, writev); LIB_FUNCTION("Oy6IpwgtYOk", "libScePosix", 1, "libkernel", 1, 1, posix_lseek); + LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, posix_lseek); LIB_FUNCTION("oib76F-12fk", "libkernel", 1, "libkernel", 1, 1, sceKernelLseek); - LIB_FUNCTION("Cg4srZ6TKbU", "libkernel", 1, "libkernel", 1, 1, sceKernelRead); + LIB_FUNCTION("DRuBt2pvICk", "libkernel", 1, "libkernel", 1, 1, read); LIB_FUNCTION("AqBioC2vF3I", "libScePosix", 1, "libkernel", 1, 1, posix_read); - LIB_FUNCTION("1-LFLmRFxxM", "libkernel", 1, "libkernel", 1, 1, sceKernelMkdir); + LIB_FUNCTION("AqBioC2vF3I", "libkernel", 1, "libkernel", 1, 1, posix_read); + LIB_FUNCTION("Cg4srZ6TKbU", "libkernel", 1, "libkernel", 1, 1, sceKernelRead); LIB_FUNCTION("JGMio+21L4c", "libScePosix", 1, "libkernel", 1, 1, posix_mkdir); LIB_FUNCTION("JGMio+21L4c", "libkernel", 1, "libkernel", 1, 1, posix_mkdir); - LIB_FUNCTION("naInUjYt3so", "libkernel", 1, "libkernel", 1, 1, sceKernelRmdir); + LIB_FUNCTION("1-LFLmRFxxM", "libkernel", 1, "libkernel", 1, 1, sceKernelMkdir); LIB_FUNCTION("c7ZnT7V1B98", "libScePosix", 1, "libkernel", 1, 1, posix_rmdir); LIB_FUNCTION("c7ZnT7V1B98", "libkernel", 1, "libkernel", 1, 1, posix_rmdir); - LIB_FUNCTION("eV9wAD2riIA", "libkernel", 1, "libkernel", 1, 1, sceKernelStat); - LIB_FUNCTION("kBwCPsYX-m4", "libkernel", 1, "libkernel", 1, 1, sceKernelFStat); - LIB_FUNCTION("mqQMh1zPPT8", "libScePosix", 1, "libkernel", 1, 1, posix_fstat); - LIB_FUNCTION("mqQMh1zPPT8", "libkernel", 1, "libkernel", 1, 1, posix_fstat); - LIB_FUNCTION("VW3TVZiM4-E", "libkernel", 1, "libkernel", 1, 1, sceKernelFtruncate); - LIB_FUNCTION("52NcYU9+lEo", "libkernel", 1, "libkernel", 1, 1, sceKernelRename); - + LIB_FUNCTION("naInUjYt3so", "libkernel", 1, "libkernel", 1, 1, sceKernelRmdir); LIB_FUNCTION("E6ao34wPw+U", "libScePosix", 1, "libkernel", 1, 1, posix_stat); LIB_FUNCTION("E6ao34wPw+U", "libkernel", 1, "libkernel", 1, 1, posix_stat); - LIB_FUNCTION("+r3rMFwItV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPread); - LIB_FUNCTION("yTj62I7kw4s", "libkernel", 1, "libkernel", 1, 1, sceKernelPreadv); + LIB_FUNCTION("eV9wAD2riIA", "libkernel", 1, "libkernel", 1, 1, sceKernelStat); LIB_FUNCTION("uWyW3v98sU4", "libkernel", 1, "libkernel", 1, 1, sceKernelCheckReachability); - LIB_FUNCTION("fTx66l5iWIA", "libkernel", 1, "libkernel", 1, 1, sceKernelFsync); - LIB_FUNCTION("juWbTNM+8hw", "libkernel", 1, "libkernel", 1, 1, posix_fsync); + LIB_FUNCTION("mqQMh1zPPT8", "libScePosix", 1, "libkernel", 1, 1, posix_fstat); + LIB_FUNCTION("mqQMh1zPPT8", "libkernel", 1, "libkernel", 1, 1, posix_fstat); + LIB_FUNCTION("kBwCPsYX-m4", "libkernel", 1, "libkernel", 1, 1, sceKernelFstat); + LIB_FUNCTION("ih4CD9-gghM", "libkernel", 1, "libkernel", 1, 1, posix_ftruncate); + LIB_FUNCTION("VW3TVZiM4-E", "libkernel", 1, "libkernel", 1, 1, sceKernelFtruncate); + LIB_FUNCTION("52NcYU9+lEo", "libkernel", 1, "libkernel", 1, 1, sceKernelRename); + LIB_FUNCTION("yTj62I7kw4s", "libkernel", 1, "libkernel", 1, 1, sceKernelPreadv); + LIB_FUNCTION("ezv-RSBNKqI", "libScePosix", 1, "libkernel", 1, 1, posix_pread); + LIB_FUNCTION("ezv-RSBNKqI", "libkernel", 1, "libkernel", 1, 1, posix_pread); + LIB_FUNCTION("+r3rMFwItV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPread); LIB_FUNCTION("juWbTNM+8hw", "libScePosix", 1, "libkernel", 1, 1, posix_fsync); + LIB_FUNCTION("juWbTNM+8hw", "libkernel", 1, "libkernel", 1, 1, posix_fsync); + LIB_FUNCTION("fTx66l5iWIA", "libkernel", 1, "libkernel", 1, 1, sceKernelFsync); LIB_FUNCTION("j2AIqSqJP0w", "libkernel", 1, "libkernel", 1, 1, sceKernelGetdents); + LIB_FUNCTION("sfKygSjIbI8", "libkernel", 1, "libkernel", 1, 1, getdirentries); LIB_FUNCTION("taRWhTJFTgE", "libkernel", 1, "libkernel", 1, 1, sceKernelGetdirentries); + LIB_FUNCTION("C2kJ-byS5rM", "libkernel", 1, "libkernel", 1, 1, posix_pwrite); LIB_FUNCTION("nKWi-N2HBV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPwrite); LIB_FUNCTION("AUXVxWeJU-A", "libkernel", 1, "libkernel", 1, 1, sceKernelUnlink); - - // openOrbis (to check if it is valid out of OpenOrbis - LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1, - posix_open); // _open should be equal to open function } } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/file_system.h b/src/core/libraries/kernel/file_system.h index 1838df2fe..77ce3ec3d 100644 --- a/src/core/libraries/kernel/file_system.h +++ b/src/core/libraries/kernel/file_system.h @@ -65,10 +65,10 @@ constexpr int ORBIS_KERNEL_O_DSYNC = 0x1000; constexpr int ORBIS_KERNEL_O_DIRECT = 0x00010000; constexpr int ORBIS_KERNEL_O_DIRECTORY = 0x00020000; -s64 PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes); -s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes); -s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset); -s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset); +s64 PS4_SYSV_ABI sceKernelWrite(s32 fd, const void* buf, size_t nbytes); +s64 PS4_SYSV_ABI sceKernelRead(s32 fd, void* buf, size_t nbytes); +s64 PS4_SYSV_ABI sceKernelPread(s32 fd, void* buf, size_t nbytes, s64 offset); +s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset); void RegisterFileSystem(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/kernel.cpp b/src/core/libraries/kernel/kernel.cpp index 2b7735219..9227cf45a 100644 --- a/src/core/libraries/kernel/kernel.cpp +++ b/src/core/libraries/kernel/kernel.cpp @@ -85,17 +85,23 @@ int ErrnoToSceKernelError(int error) { } void SetPosixErrno(int e) { - // Some error numbers are different between supported OSes or the PS4 + // Some error numbers are different between supported OSes switch (e) { case EPERM: g_posix_errno = POSIX_EPERM; break; - case EAGAIN: - g_posix_errno = POSIX_EAGAIN; + case ENOENT: + g_posix_errno = POSIX_ENOENT; + break; + case EDEADLK: + g_posix_errno = POSIX_EDEADLK; break; case ENOMEM: g_posix_errno = POSIX_ENOMEM; break; + case EACCES: + g_posix_errno = POSIX_EACCES; + break; case EINVAL: g_posix_errno = POSIX_EINVAL; break; @@ -105,13 +111,14 @@ void SetPosixErrno(int e) { case ERANGE: g_posix_errno = POSIX_ERANGE; break; - case EDEADLK: - g_posix_errno = POSIX_EDEADLK; + case EAGAIN: + g_posix_errno = POSIX_EAGAIN; break; case ETIMEDOUT: g_posix_errno = POSIX_ETIMEDOUT; break; default: + LOG_WARNING(Kernel, "Unhandled errno {}", e); g_posix_errno = e; } } @@ -133,14 +140,6 @@ void PS4_SYSV_ABI sceLibcHeapGetTraceInfo(HeapInfoInfo* info) { info->getSegmentInfo = 0; } -s64 PS4_SYSV_ABI ps4__write(int d, const char* buf, std::size_t nbytes) { - return sceKernelWrite(d, buf, nbytes); -} - -s64 PS4_SYSV_ABI ps4__read(int d, void* buf, u64 nbytes) { - return sceKernelRead(d, buf, nbytes); -} - struct OrbisKernelUuid { u32 timeLow; u16 timeMid; @@ -229,13 +228,10 @@ void RegisterKernel(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("Xjoosiw+XPI", "libkernel", 1, "libkernel", 1, 1, sceKernelUuidCreate); LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail); LIB_FUNCTION("9BcDykPmo1I", "libkernel", 1, "libkernel", 1, 1, __Error); - LIB_FUNCTION("DRuBt2pvICk", "libkernel", 1, "libkernel", 1, 1, ps4__read); LIB_FUNCTION("k+AXqu2-eBc", "libkernel", 1, "libkernel", 1, 1, posix_getpagesize); LIB_FUNCTION("k+AXqu2-eBc", "libScePosix", 1, "libkernel", 1, 1, posix_getpagesize); LIB_FUNCTION("NWtTN10cJzE", "libSceLibcInternalExt", 1, "libSceLibcInternal", 1, 1, sceLibcHeapGetTraceInfo); - LIB_FUNCTION("FxVZqBAA7ks", "libkernel", 1, "libkernel", 1, 1, ps4__write); - LIB_FUNCTION("FN4gaPmuFV8", "libScePosix", 1, "libkernel", 1, 1, ps4__write); } } // namespace Libraries::Kernel From 69cb4d5787a25c98ec7e89a6c17f0c2acef1b1c8 Mon Sep 17 00:00:00 2001 From: Ked <58560148+k3dr1@users.noreply.github.com> Date: Thu, 27 Mar 2025 00:04:05 +0800 Subject: [PATCH 05/22] Show a dialog only if no game directories are set (#2690) * Slightly changed how allInstallDirsDisabled is determined * Show a dialog only if no game directories are set * Changed a comment * Fixed formatting --- src/qt_gui/main.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 34e429368..bd9dca6ce 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -157,12 +157,8 @@ int main(int argc, char* argv[]) { } } - bool allInstallDirsDisabled = - std::ranges::all_of(Config::getGameInstallDirsEnabled(), [](bool val) { return !val; }); - - // If no game directory is set and no command line argument, prompt for it - if (Config::getGameInstallDirs().empty() && allInstallDirsDisabled && - !has_command_line_argument) { + // If no game directories are set and no command line argument, prompt for it + if (Config::getGameInstallDirsEnabled().empty() && !has_command_line_argument) { GameInstallDialog dlg; dlg.exec(); } From 90b949b8ceded997d3066201fe07d6e04fd439fb Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 26 Mar 2025 18:04:49 +0200 Subject: [PATCH 06/22] New Crowdin updates (#2679) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Russian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Swedish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Arabic) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Arabic) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Albanian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Arabic) * New translations en_us.ts (Polish) * New translations en_us.ts (Polish) * New translations en_us.ts (Arabic) --- src/qt_gui/translations/ar_SA.ts | 382 ++++++++++++++++--------------- src/qt_gui/translations/da_DK.ts | 12 + src/qt_gui/translations/de_DE.ts | 12 + src/qt_gui/translations/el_GR.ts | 12 + src/qt_gui/translations/es_ES.ts | 12 + src/qt_gui/translations/fa_IR.ts | 12 + src/qt_gui/translations/fi_FI.ts | 12 + src/qt_gui/translations/fr_FR.ts | 12 + src/qt_gui/translations/hu_HU.ts | 12 + src/qt_gui/translations/id_ID.ts | 12 + src/qt_gui/translations/it_IT.ts | 12 + src/qt_gui/translations/ja_JP.ts | 12 + src/qt_gui/translations/ko_KR.ts | 12 + src/qt_gui/translations/lt_LT.ts | 34 ++- src/qt_gui/translations/nb_NO.ts | 12 + src/qt_gui/translations/nl_NL.ts | 12 + src/qt_gui/translations/pl_PL.ts | 166 +++++++------- src/qt_gui/translations/pt_BR.ts | 12 + src/qt_gui/translations/pt_PT.ts | 98 ++++---- src/qt_gui/translations/ro_RO.ts | 12 + src/qt_gui/translations/ru_RU.ts | 12 + src/qt_gui/translations/sq_AL.ts | 12 + src/qt_gui/translations/sv_SE.ts | 12 + src/qt_gui/translations/tr_TR.ts | 12 + src/qt_gui/translations/uk_UA.ts | 12 + src/qt_gui/translations/vi_VN.ts | 12 + src/qt_gui/translations/zh_CN.ts | 12 + src/qt_gui/translations/zh_TW.ts | 12 + 28 files changed, 652 insertions(+), 316 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 090cd4c26..ac6920ea0 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -22,7 +22,7 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + الغِشّ / التصحيحات Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -407,194 +407,194 @@ ControlSettings Configure Controls - Configure Controls + تعديل عناصر التحكم D-Pad - D-Pad + الأسهم+عصا التحكم Up - Up + فوق Left - Left + يسار Right - Right + يمين Down - Down + تحت Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + مدى تسجيل الإدخال للعصا اليسرى (التلقائي:2 حد أقصى:127) Left Deadzone - Left Deadzone + إعدادات مدى تسجيل الإدخال لعصا التحكم اليسرى Left Stick - Left Stick + عصا التحكم اليسرى Config Selection - Config Selection + تحديد الإعدادات Common Config - Common Config + إعدادات عامة Use per-game configs - Use per-game configs + استخدام إعدادات كل لُعْبَة L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT Back - Back + رجوع R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + الخيارات / البَدْء R3 - R3 + R3 Face Buttons - Face Buttons + الأزرار Triangle / Y - Triangle / Y + مثلث / Y Square / X - Square / X + مربع / X Circle / B - Circle / B + دائرة / B Cross / A - Cross / A + إكس / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + مدى تسجيل الإدخال للعصا اليمنى (التلقائي:2 حد أقصى:127) Right Deadzone - Right Deadzone + إعدادات مدى تسجيل الإدخال لعصا التحكم اليمنى Right Stick - Right Stick + عصا التحكم اليمنى Color Adjustment - Color Adjustment + تعديل الألوان R: - R: + أحمر: G: - G: + أخضر: B: - B: + أزرق: Override Lightbar Color - Override Lightbar Color + تجاوز لون شريط الإضاءة Override Color - Override Color + تجاوز اللون Unable to Save - Unable to Save + غير قادر على الحفظ Cannot bind axis values more than once - Cannot bind axis values more than once + لا يمكن ربط قيم المحور أكثر من مرة Save - Save + حفظ Apply - Apply + تطبيق Restore Defaults - Restore Defaults + استعادة الإعدادات الافتراضية Cancel - Cancel + إلغاء EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + تحرير أزرار الإدخال للوحة المفاتيح و الفأرة ووحدة التحكم Use Per-Game configs - Use Per-Game configs + استخدام إعدادات كل لُعْبَة Error - Error + خطأ Could not open the file for reading - Could not open the file for reading + تعذر فتح المِلَفّ للقراءة Could not open the file for writing - Could not open the file for writing + تعذر فتح المِلَفّ للكتابة Save Changes - Save Changes + حفظ التغييرات Do you want to save changes? - Do you want to save changes? + هل تريد حفظ التغييرات؟ Help @@ -602,15 +602,15 @@ Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + هل تريد إعادة تعيين الإعدادات الافتراضية المخصصة الخاصة بك إلى الإعدادات الافتراضية الأصلية؟ Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + هل تريد إعادة تعيين هذا الإعداد إلى الإعداد الافتراضي المخصص لك؟ Reset to Default - Reset to Default + إعادة تعيين إلى الافتراضي @@ -702,43 +702,43 @@ Never Played - Never Played + لم تلعب أبداً h - h + ا m - m + ة s - s + ثانية/ثواني Compatibility is untested - Compatibility is untested + التوافق غير مختبر Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + اللعبة لا تهيئ بشكل صحيح / تعطل المحاكي Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + اللعبة تبدأ بالعمل، ولكن فقط تعرض شاشة فارغة Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + اللعبة تعرض صورة ولكن لا تتجاوز القائمة Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + اللعبة بها قلتشات أو أداء غير قابل للتشغيل Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + يمكن الانتهاء من اللعبة مع الأداء القابل للتشغيل و لا توجد قلتشات كبيرة Click to see details on github @@ -753,23 +753,23 @@ GameListUtils B - B + بايت KB - KB + كيلو بايت MB - MB + ميغابايت GB - GB + جيجابايت TB - TB + تيرابايت @@ -820,11 +820,11 @@ Copy Version - Copy Version + إصدار النسخة Copy Size - Copy Size + حجم النسخة Copy All @@ -832,39 +832,39 @@ Delete... - Delete... + حذف... Delete Game - Delete Game + حذف اللعبة Delete Update - Delete Update + حذف التحديث Delete DLC - Delete DLC + حذف DLC Delete Trophy - Delete Trophy + حذف الكؤوس Compatibility... - Compatibility... + التوافق... Update database - Update database + تحديث قاعدة البيانات View report - View report + عرض التقرير Submit a report - Submit a report + إرسال بلاغ Shortcut creation @@ -888,94 +888,94 @@ Game - Game + اللعبة This game has no update to delete! - This game has no update to delete! + لا تحتوي اللعبة على تحديث لحذفه! Update - Update + تحديث This game has no DLC to delete! - This game has no DLC to delete! + لا تحتوي اللعبة على DLC لحذفه! DLC - DLC + DLC Delete %1 - Delete %1 + حذف %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + هل أنت متأكد من أنك تريد حذف دليل %1's %2؟ Open Update Folder - Open Update Folder + فتح مجلد التحديث Delete Save Data - Delete Save Data + حذف التخزينه This game has no update folder to open! - This game has no update folder to open! + لا تحتوي اللعبة على تحديث لفتحه! No log file found for this game! - No log file found for this game! + لم يتم العثور على ملف سجل لهذه اللعبة! Failed to convert icon. - Failed to convert icon. + فشل تحويل الأيقونة. This game has no save data to delete! - This game has no save data to delete! + هذه اللعبة لا تحتوي على أي تخزينات لحذفها! This game has no saved trophies to delete! - This game has no saved trophies to delete! + هذه اللعبة ليس لديها كؤوس محفوظة للحذف! Save Data - Save Data + حفظ البيانات Trophy - Trophy + الكؤوس SFO Viewer for - SFO Viewer for + عارض SFO لـ HelpDialog Quickstart - Quickstart + التشغيل السريع FAQ - FAQ + الأسئلة الأكثر شيوعاً Syntax - Syntax + الصّيغة Special Bindings - Special Bindings + إدخالات خاصة Keybindings - Keybindings + أزرار التحكم @@ -986,178 +986,178 @@ Select which directory you want to install to. - Select which directory you want to install to. + حدد الدليل الذي تريد تثبيت إليه. Install All Queued to Selected Folder - Install All Queued to Selected Folder + تثبيت كل قائمة الانتظار إلى المجلد المحدد Delete PKG File on Install - Delete PKG File on Install + حذف مِلَفّ PKG عند التثبيت KBMSettings Configure Controls - Configure Controls + تعديل عناصر التحكم D-Pad - D-Pad + الأسهم+عصا التحكم Up - Up + أعلى unmapped - unmapped + غير معين Left - Left + يسار Right - Right + يمين Down - Down + أسفل Left Analog Halfmode - Left Analog Halfmode + تقليل سرعة عصا التحكم اليسرى للنصف hold to move left stick at half-speed - hold to move left stick at half-speed + الاستمرار للتحرك إلى اليسار بنصف السرعة Left Stick - Left Stick + عصا التحكم اليسرى Config Selection - Config Selection + تحديد الإعدادات Common Config - Common Config + إعدادات عامة Use per-game configs - Use per-game configs + استخدام إعدادات كل لُعْبَة L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + محرر النص Help - Help + المساعدة R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + النقر على لوحة اللمس Mouse to Joystick - Mouse to Joystick + الفأرة إلى عصا التحكم *press F7 ingame to activate - *press F7 ingame to activate + * اضغط على F7 للتفعيل R3 - R3 + R3 Options - Options + الخيارات Mouse Movement Parameters - Mouse Movement Parameters + معطيات حركة الفأرة note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + ملاحظة: انقر فوق زر المساعدة/روابط المفاتيح الخاصة للحصول على مزيد من المعلومات Face Buttons - Face Buttons + أزرار الوجه Triangle - Triangle + مثلث Square - Square + مربع Circle - Circle + دائرة Cross - Cross + اكس Right Analog Halfmode - Right Analog Halfmode + تقليل سرعة عصا التحكم اليمنى للنصف hold to move right stick at half-speed - hold to move right stick at half-speed + الضغط باستمرار لتحريك العصا اليمنى بنصف السرعة Right Stick - Right Stick + عصا التحكم اليمنى Speed Offset (def 0.125): - Speed Offset (def 0.125): + إزاحة السرعة (تلقائي 0.125): Copy from Common Config - Copy from Common Config + نسخ من الإعدادات الشائعة Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + معدل مضاعفة السرعة (التلقائي 1.0): Common Config Selected - Common Config Selected + الإعدادات الشائعة محدده This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. @@ -1165,7 +1165,7 @@ Copy values from Common Config - Copy values from Common Config + نسخ من الإعدادات الشائعة Do you want to overwrite existing mappings with the mappings from the Common Config? @@ -1173,39 +1173,39 @@ Unable to Save - Unable to Save + غير قادر على الحفظ Cannot bind any unique input more than once - Cannot bind any unique input more than once + لا يمكن ربط أي إدخال فريد أكثر من مرة Press a key - Press a key + اضغط على مفتاح Cannot set mapping - Cannot set mapping + لا يمكن تعيين الأزرار Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + عجلة الفأرة لا يمكن تعيينها لعصا التحكم Save - Save + حفظ Apply - Apply + تطبيق Restore Defaults - Restore Defaults + استعادة الإعدادات الافتراضية Cancel - Cancel + إلغاء @@ -1244,7 +1244,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + فتح مجلد shadPS4 Exit @@ -1306,6 +1306,14 @@ Dump Game List تفريغ قائمة الألعاب + + Trophy Viewer + عارض الجوائز + + + No games found. Please add your games to your library first. + لم يتم العثور على ألعاب. الرجاء إضافة ألعابك إلى مكتبتك أولاً. + PKG Viewer عارض PKG @@ -1484,27 +1492,27 @@ Run Game - Run Game + تشغيل اللعبة Eboot.bin file not found - Eboot.bin file not found + لم يتم العثور على ملف Eboot.bin PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + ملف PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG هو تصحيح أو DLC، يرجى تثبيت اللعبة أولاً! Game is already running! - Game is already running! + اللعبة قيد التشغيل بالفعل! shadPS4 - shadPS4 + shadPS4 @@ -1527,7 +1535,7 @@ Installed - Installed + مثبت Size @@ -1535,15 +1543,15 @@ Category - Category + الفئة Type - Type + النوع App Ver - App Ver + إصدار FW @@ -1630,7 +1638,7 @@ Trophy - Trophy + الكؤوس Open the custom trophy images/sounds folder @@ -2094,23 +2102,23 @@ Display Mode - Display Mode + طريقة العرض Windowed - Windowed + نافذة Fullscreen - Fullscreen + شاشة كاملة Fullscreen (Borderless) - Fullscreen (Borderless) + شاشة كاملة (دون حدود) Window Size - Window Size + حجم النافذة W: @@ -2122,7 +2130,7 @@ Separate Log Files - Separate Log Files + ملفات السجل المنفصل Separate Log Files:\nWrites a separate logfile for each game. @@ -2130,35 +2138,35 @@ Trophy Notification Position - Trophy Notification Position + موقع إشعار الكأس Left - Left + يسار Right - Right + يمين Top - Top + في الأعلى Bottom - Bottom + الأسفل Notification Duration - Notification Duration + مدة الإشعار Portable User Folder - Portable User Folder + مجلد المستخدم المتنقل Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + إنشاء مجلد مستخدم المتنقل من مجلد المستخدم الشائع Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. @@ -2166,11 +2174,11 @@ Cannot create portable user folder - Cannot create portable user folder + لا يمكن إنشاء مجلد المستخدم المتنقل %1 already exists - %1 already exists + %1 موجود مسبقاً Portable user folder created @@ -2178,7 +2186,7 @@ %1 successfully created. - %1 successfully created. + تم إنشاء %1 بنجاح. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. @@ -2191,21 +2199,25 @@ Trophy Viewer عارض الجوائز + + Select Game: + اختر الُعْبَه: + Progress - Progress + مقدار التقدُّم Show Earned Trophies - Show Earned Trophies + عرض الكؤوس المكتسبة Show Not Earned Trophies - Show Not Earned Trophies + عرض الكؤوس غير المكتسبة Show Hidden Trophies - Show Hidden Trophies + عرض الكؤوس المخفية diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 113d13019..1835ba84c 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 7f395c1c8..6717a93ef 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -1306,6 +1306,14 @@ Dump Game List Spielliste ausgeben + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG-Anschauer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophäenansicht + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index a61d84022..6e1adaac9 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index be3c701a9..24844d0a2 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1306,6 +1306,14 @@ Dump Game List Volcar Lista de Juegos + + Trophy Viewer + Expositor de Trofeos + + + No games found. Please add your games to your library first. + No se encontraron juegos. Por favor, añade tus juegos a tu biblioteca primero. + PKG Viewer Vista PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Expositor de Trofeos + + Select Game: + Selecciona un Juego: + Progress Progreso diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 6984b29f8..6b7af042e 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1306,6 +1306,14 @@ Dump Game List استخراج لیست بازی ها + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG مشاهده گر @@ -2191,6 +2199,10 @@ Trophy Viewer مشاهده جوایز + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 81274ae80..324cb6c49 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -1306,6 +1306,14 @@ Dump Game List Kirjoita Pelilista Tiedostoon + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Selain @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Selain + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index ff1646f9e..ec3f9f8b5 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1306,6 +1306,14 @@ Dump Game List Dumper la liste des jeux + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer Visionneuse PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Visionneuse de trophées + + Select Game: + Select Game: + Progress Progression diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index c22d74257..6672337a6 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1306,6 +1306,14 @@ Dump Game List Játéklista Dumpolása + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Nézegető @@ -2191,6 +2199,10 @@ Trophy Viewer Trófeák Megtekintése + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 1a8b085cf..e43d31976 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 5f57efca3..e63da05b8 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1306,6 +1306,14 @@ Dump Game List Scarica Lista Giochi + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer Visualizzatore PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Visualizzatore Trofei + + Select Game: + Select Game: + Progress Progresso diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index d93e36770..7cf9fc5c2 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1306,6 +1306,14 @@ Dump Game List ゲームリストをダンプ + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKGビューアー @@ -2191,6 +2199,10 @@ Trophy Viewer トロフィービューアー + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index dc5b61038..d5289ace9 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 2f4b6e59b..17133da35 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -7,7 +7,7 @@ AboutDialog About shadPS4 - About shadPS4 + Apie shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -15,7 +15,7 @@ This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Ši programa neturėtų būti naudojama žaidimams kurių neturite legaliai įsigiję. @@ -463,7 +463,7 @@ Back - Back + Atgal R1 / RB @@ -519,7 +519,7 @@ Color Adjustment - Color Adjustment + Spalvų Reguliavimas R: @@ -543,7 +543,7 @@ Unable to Save - Unable to Save + Nepavyko Išsaugoti Cannot bind axis values more than once @@ -563,7 +563,7 @@ Cancel - Cancel + Atšaukti @@ -590,15 +590,15 @@ Save Changes - Save Changes + Išsaugoti Pakeitimus Do you want to save changes? - Do you want to save changes? + Ar norite išsaugoti pakeitimus? Help - Help + Pagalba Do you want to reset your custom default config to the original default config? @@ -876,7 +876,7 @@ Error - Error + Klaida Error creating shortcut! @@ -888,7 +888,7 @@ Game - Game + Žaidimas This game has no update to delete! @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index b257b548b..e8ce99f90 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump spilliste + + Trophy Viewer + Troféviser + + + No games found. Please add your games to your library first. + Fant ingen spill. Legg til spillene dine i biblioteket først. + PKG Viewer PKG-viser @@ -2191,6 +2199,10 @@ Trophy Viewer Troféviser + + Select Game: + Velg spill: + Progress Fremdrift diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index f6c062da3..5c1725bd5 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 4c4a33ec2..033412efa 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -543,38 +543,38 @@ Unable to Save - Unable to Save + Zapisywanie nie powiodło się Cannot bind axis values more than once - Cannot bind axis values more than once + Nie można powiązać wartości osi więcej niż raz Save - Save + Zapisz Apply - Apply + Zastosuj Restore Defaults - Restore Defaults + Przywróć ustawienia domyślne Cancel - Cancel + Anuluj EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Edytuj przypisanie klawiszy klawiatury + myszy oraz kontrolera Use Per-Game configs - Use Per-Game configs + Użyj osobnej konfiguracji dla każdej gry Error @@ -582,11 +582,11 @@ Could not open the file for reading - Could not open the file for reading + Nie można otworzyć pliku do odczytu Could not open the file for writing - Could not open the file for writing + Nie można otworzyć pliku do zapisu Save Changes @@ -602,11 +602,11 @@ Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Czy chcesz zresetować Twoją domyślną konfigurację do oryginalnej domyślnej konfiguracji? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Czy chcesz zresetować tę konfigurację do Twojej domyślnej konfiguracji? Reset to Default @@ -959,23 +959,23 @@ HelpDialog Quickstart - Quickstart + Szybki start FAQ - FAQ + Najczęściej zadawane pytania Syntax - Syntax + Składnia Special Bindings - Special Bindings + Specjalne wiązania Keybindings - Keybindings + Przypisanie klawiszy @@ -1001,211 +1001,211 @@ KBMSettings Configure Controls - Configure Controls + Skonfiguruj sterowanie D-Pad - D-Pad + Krzyżak Up - Up + Strzałka w górę unmapped - unmapped + nieprzypisane Left - Left + Strzałka w lewo Right - Right + Strzałka w prawo Down - Down + Strzałka w dół Left Analog Halfmode - Left Analog Halfmode + Połowiczny tryb lewego drążka hold to move left stick at half-speed - hold to move left stick at half-speed + przytrzymaj, aby przesuwać lewy drążek dwa razy wolniej Left Stick - Left Stick + Lewy drążek Config Selection - Config Selection + Wybór konfiguracji Common Config - Common Config + Typowa konfiguracja Use per-game configs - Use per-game configs + Użyj osobnej konfiguracji dla każdej gry L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Edytor tekstu Help - Help + Pomoc R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Kliknięcie Touchpada Mouse to Joystick - Mouse to Joystick + Mysz na Joystick *press F7 ingame to activate - *press F7 ingame to activate + *naciśnij F7 w grze aby aktywować R3 - R3 + R3 Options - Options + Opcje Mouse Movement Parameters - Mouse Movement Parameters + Parametry ruchu myszy note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + uwaga: kliknij przycisk Pomoc/Specjalne skróty klawiszowe, aby uzyskać więcej informacji Face Buttons - Face Buttons + Przednie przyciski Triangle - Triangle + Trójkąt Square - Square + Kwadrat Circle - Circle + Kółko Cross - Cross + Krzyżyk Right Analog Halfmode - Right Analog Halfmode + Połowiczny tryb prawego drążka hold to move right stick at half-speed - hold to move right stick at half-speed + przytrzymaj, aby przesuwać prawy drążek dwa razy wolniej Right Stick - Right Stick + Prawy drążek Speed Offset (def 0.125): - Speed Offset (def 0.125): + Offset prędkości (def 0,125): Copy from Common Config - Copy from Common Config + Kopiuj z typowej konfiguracji Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Offset martwych stref (def 0,50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Mnożnik prędkości (def1.0): Common Config Selected - Common Config Selected + Wybrano typową konfigurację This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Przycisk ten kopiuje mapowanie z typowej konfiguracji do aktualnie wybranego profilu, i nie może być użyty, gdy aktualnie wybranym profilem jest typowa konfiguracja. Copy values from Common Config - Copy values from Common Config + Kopiuj z typowej konfiguracji Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Czy chcesz nadpisać istniejące mapowania mapowaniem z typowej konfiguracji? Unable to Save - Unable to Save + Zapisywanie nie powiodło się Cannot bind any unique input more than once - Cannot bind any unique input more than once + Nie można powiązać żadnych unikalnych danych wejściowych więcej niż raz Press a key - Press a key + Naciśnij klawisz Cannot set mapping - Cannot set mapping + Nie można ustawić mapowania Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Kółko myszy nie może być przypisane do sterowania drążkiem Save - Save + Zapisz Apply - Apply + Zastosuj Restore Defaults - Restore Defaults + Przywróć ustawienia domyślne Cancel - Cancel + Anuluj @@ -1306,6 +1306,14 @@ Dump Game List Zgraj listę gier + + Trophy Viewer + Menedżer trofeów + + + No games found. Please add your games to your library first. + Nie znaleziono gier. Najpierw dodaj swoje gry do swojej biblioteki. + PKG Viewer Menedżer plików PKG @@ -2154,35 +2162,35 @@ Portable User Folder - Portable User Folder + Przenośny folder użytkownika Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Utwórz przenośny folder użytkownika ze zwykłego folderu użytkownika Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Przenośny folder użytkownika:\nPrzechowuje ustawienia shadPS4 i dane, które zostaną zastosowane tylko do kompilacji shadPS4 znajdującej się w bieżącym folderze. Uruchom ponownie aplikację po utworzeniu przenośnego folderu użytkownika, aby zacząć z niego korzystać. Cannot create portable user folder - Cannot create portable user folder + Nie można utworzyć przenośnego folderu użytkownika %1 already exists - %1 already exists + %1 już istnieje Portable user folder created - Portable user folder created + Utworzono przenośny folder użytkownika %1 successfully created. - %1 successfully created. + %1 prawidłowo utworzony. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Otwórz niestandardowy folder obrazów/dźwięków:\nMożesz dodać własne obrazy dla trofeów i ich dźwięki.\nDodaj pliki do custom_trophy o następujących nazwach:\ntrophy.wav LUB trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nUwaga: Dźwięki działają tylko w wersji QT. @@ -2191,6 +2199,10 @@ Trophy Viewer Menedżer trofeów + + Select Game: + Wybierz grę: + Progress Postęp diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index e37a3fe96..d44efce5d 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1306,6 +1306,14 @@ Dump Game List Exportar Lista de Jogos + + Trophy Viewer + Visualizador de Troféus + + + No games found. Please add your games to your library first. + Nenhum jogo encontrado. Adicione seus jogos à sua biblioteca primeiro. + PKG Viewer Visualizador de PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Visualizador de Troféus + + Select Game: + Selecionar Jogo: + Progress Progresso diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index dc0059b86..455955fad 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -543,74 +543,74 @@ Unable to Save - Unable to Save + Não é possível salvar Cannot bind axis values more than once - Cannot bind axis values more than once + Não foi possível atribuir os valores do eixo X ou Y mais de uma vez Save - Save + Salvar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar o Padrão Cancel - Cancel + Cancelar EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Editar comandos do Teclado + Mouse e do Controle Use Per-Game configs - Use Per-Game configs + Use uma configuração para cada jogo Error - Error + Erro Could not open the file for reading - Could not open the file for reading + Não foi possível abrir o arquivo para ler Could not open the file for writing - Could not open the file for writing + Não foi possível abrir o arquivo para escrever Save Changes - Save Changes + Salvar mudanças Do you want to save changes? - Do you want to save changes? + Salvar as mudanças? Help - Help + Ajuda Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Restaurar a configuração customizada padrão para a configuração original padrão? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Deseja redefinir esta configuração para a configuração padrão personalizada? Reset to Default - Reset to Default + Resetar ao Padrão @@ -959,23 +959,23 @@ HelpDialog Quickstart - Quickstart + Início Rápido FAQ - FAQ + Perguntas Frequentes Syntax - Syntax + Sintaxe Special Bindings - Special Bindings + Atalhos Especiais Keybindings - Keybindings + Combinações de Teclas @@ -1145,67 +1145,67 @@ Copy from Common Config - Copy from Common Config + Copiar da Configuração Comum Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Deslocamento da Zona Morta (def 0,50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Multiplicador de Velocidade (def 1,0): Common Config Selected - Common Config Selected + Configuração Comum Selecionada This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Este botão copia mapeamentos da Configuração Comum para o perfil atualmente selecionado, e não pode ser usado quando o perfil atualmente selecionado é a Configuração Comum. Copy values from Common Config - Copy values from Common Config + Copiar valores da Configuração Comum Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Substituir mapeamentos existentes com os mapeamentos da Configuração Comum? Unable to Save - Unable to Save + Não é possível salvar Cannot bind any unique input more than once - Cannot bind any unique input more than once + Não é possível vincular qualquer entrada única mais de uma vez Press a key - Press a key + Pressione uma tecla Cannot set mapping - Cannot set mapping + Não é possível definir o mapeamento Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Roda do rato não pode ser mapeada para saídas empates Save - Save + Salvar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar Definições Cancel - Cancel + Cancelar @@ -1306,6 +1306,14 @@ Dump Game List Exportar Lista de Jogos + + Trophy Viewer + Visualizador de Troféus + + + No games found. Please add your games to your library first. + Nenhum jogo encontrado. Por favor, adicione os seus jogos à sua biblioteca primeiro. + PKG Viewer Visualizador PKG @@ -2166,23 +2174,23 @@ Cannot create portable user folder - Cannot create portable user folder + Não é possível criar pasta de utilizador portátil %1 already exists - %1 already exists + %1 já existe Portable user folder created - Portable user folder created + Pasta de utilizador portátil criada %1 successfully created. - %1 successfully created. + %1 criado com sucesso. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Abra a pasta de imagens/sons de troféus personalizados:\nPoderá adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os arquivos na pasta custom_trophy com os seguintes nomes:\ntrophy.mp3 ou trophy.wav, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas nas versões Qt. @@ -2191,6 +2199,10 @@ Trophy Viewer Visualizador de Troféus + + Select Game: + Escolha o Jogo: + Progress Progresso diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 4261bf9e2..9c7720e17 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 6ca16121f..68eaabc34 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1306,6 +1306,14 @@ Dump Game List Дамп списка игр + + Trophy Viewer + Просмотр трофеев + + + No games found. Please add your games to your library first. + Не найдено ни одной игры. Пожалуйста, сначала добавьте игры в библиотеку. + PKG Viewer Просмотр PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Просмотр трофеев + + Select Game: + Выберите игру: + Progress Прогресс diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index bf58dc60d..657f78d0d 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1306,6 +1306,14 @@ Dump Game List Zbraz Listën e Lojërave + + Trophy Viewer + Shikuesi i Trofeve + + + No games found. Please add your games to your library first. + Nuk u gjetën lojëra. Shto lojërat në librarinë tënde fillimisht. + PKG Viewer Shikuesi i PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Shikuesi i Trofeve + + Select Game: + Zgjidh Lojën: + Progress Ecuria diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index d631859d4..a002b150a 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1306,6 +1306,14 @@ Dump Game List Dumpa spellista + + Trophy Viewer + Trofévisare + + + No games found. Please add your games to your library first. + Inga spel hittades. Lägg till dina spel till biblioteket först. + PKG Viewer PKG-visare @@ -2191,6 +2199,10 @@ Trophy Viewer Trofé-visare + + Select Game: + Välj spel: + Progress Förlopp diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 394704274..48ce4254d 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1306,6 +1306,14 @@ Dump Game List Oyun Listesini Kaydet + + Trophy Viewer + Kupa Görüntüleyici + + + No games found. Please add your games to your library first. + Oyun bulunamadı. Oyunlarınızı lütfen önce kütüphanenize ekleyin. + PKG Viewer PKG Görüntüleyici @@ -2191,6 +2199,10 @@ Trophy Viewer Kupa Görüntüleyici + + Select Game: + Oyun Seç: + Progress İlerleme diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 6083577fa..06c88428b 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1306,6 +1306,14 @@ Dump Game List Дамп списку ігор + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer Перегляд PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Трофеї + + Select Game: + Select Game: + Progress Прогрес diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 8fa0889bc..c16604b85 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trình xem chiến tích + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 6e1fcdc95..6364ae1d6 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1306,6 +1306,14 @@ Dump Game List 导出游戏列表 + + Trophy Viewer + 奖杯查看器 + + + No games found. Please add your games to your library first. + 未找到游戏。请先将您的游戏添加到您的资料库。 + PKG Viewer PKG 查看器 @@ -2191,6 +2199,10 @@ Trophy Viewer 奖杯查看器 + + Select Game: + 选择游戏: + Progress 进度 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 2950f541f..bd546380a 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress From 3abe5b0d5774e2d7b959d85f51657144b3d822c7 Mon Sep 17 00:00:00 2001 From: Lizardy <6063922+lzardy@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:42:49 +0000 Subject: [PATCH 07/22] [Libs] Ngs2 (#1604) * [libSceNgs2] Logging & Structs * clang * clang * stdarg incl * proper logs * ngs2 latest * [libSceNgs2] Logging & Structs * clang * latest * fix includes * clang * clang --------- Co-authored-by: microsoftv <6063922+microsoftv@users.noreply.github.com> --- CMakeLists.txt | 18 + src/core/libraries/ngs2/ngs2.cpp | 682 ++++++++++++++------- src/core/libraries/ngs2/ngs2.h | 283 +++++++-- src/core/libraries/ngs2/ngs2_custom.cpp | 12 + src/core/libraries/ngs2/ngs2_custom.h | 444 ++++++++++++++ src/core/libraries/ngs2/ngs2_eq.cpp | 12 + src/core/libraries/ngs2/ngs2_eq.h | 41 ++ src/core/libraries/ngs2/ngs2_geom.cpp | 12 + src/core/libraries/ngs2/ngs2_geom.h | 80 +++ src/core/libraries/ngs2/ngs2_impl.cpp | 208 ++++--- src/core/libraries/ngs2/ngs2_impl.h | 179 +++++- src/core/libraries/ngs2/ngs2_mastering.cpp | 12 + src/core/libraries/ngs2/ngs2_mastering.h | 81 +++ src/core/libraries/ngs2/ngs2_pan.cpp | 12 + src/core/libraries/ngs2/ngs2_pan.h | 25 + src/core/libraries/ngs2/ngs2_report.cpp | 12 + src/core/libraries/ngs2/ngs2_report.h | 78 +++ src/core/libraries/ngs2/ngs2_reverb.cpp | 12 + src/core/libraries/ngs2/ngs2_reverb.h | 61 ++ src/core/libraries/ngs2/ngs2_sampler.cpp | 12 + src/core/libraries/ngs2/ngs2_sampler.h | 162 +++++ src/core/libraries/ngs2/ngs2_submixer.cpp | 12 + src/core/libraries/ngs2/ngs2_submixer.h | 126 ++++ 23 files changed, 2206 insertions(+), 370 deletions(-) create mode 100644 src/core/libraries/ngs2/ngs2_custom.cpp create mode 100644 src/core/libraries/ngs2/ngs2_custom.h create mode 100644 src/core/libraries/ngs2/ngs2_eq.cpp create mode 100644 src/core/libraries/ngs2/ngs2_eq.h create mode 100644 src/core/libraries/ngs2/ngs2_geom.cpp create mode 100644 src/core/libraries/ngs2/ngs2_geom.h create mode 100644 src/core/libraries/ngs2/ngs2_mastering.cpp create mode 100644 src/core/libraries/ngs2/ngs2_mastering.h create mode 100644 src/core/libraries/ngs2/ngs2_pan.cpp create mode 100644 src/core/libraries/ngs2/ngs2_pan.h create mode 100644 src/core/libraries/ngs2/ngs2_report.cpp create mode 100644 src/core/libraries/ngs2/ngs2_report.h create mode 100644 src/core/libraries/ngs2/ngs2_reverb.cpp create mode 100644 src/core/libraries/ngs2/ngs2_reverb.h create mode 100644 src/core/libraries/ngs2/ngs2_sampler.cpp create mode 100644 src/core/libraries/ngs2/ngs2_sampler.h create mode 100644 src/core/libraries/ngs2/ngs2_submixer.cpp create mode 100644 src/core/libraries/ngs2/ngs2_submixer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 185205221..1c0932b5c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -378,6 +378,24 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp src/core/libraries/ngs2/ngs2_error.h src/core/libraries/ngs2/ngs2_impl.cpp src/core/libraries/ngs2/ngs2_impl.h + src/core/libraries/ngs2/ngs2_custom.cpp + src/core/libraries/ngs2/ngs2_custom.h + src/core/libraries/ngs2/ngs2_reverb.cpp + src/core/libraries/ngs2/ngs2_reverb.h + src/core/libraries/ngs2/ngs2_geom.cpp + src/core/libraries/ngs2/ngs2_geom.h + src/core/libraries/ngs2/ngs2_pan.cpp + src/core/libraries/ngs2/ngs2_pan.h + src/core/libraries/ngs2/ngs2_report.cpp + src/core/libraries/ngs2/ngs2_report.h + src/core/libraries/ngs2/ngs2_eq.cpp + src/core/libraries/ngs2/ngs2_eq.h + src/core/libraries/ngs2/ngs2_mastering.cpp + src/core/libraries/ngs2/ngs2_mastering.h + src/core/libraries/ngs2/ngs2_sampler.cpp + src/core/libraries/ngs2/ngs2_sampler.h + src/core/libraries/ngs2/ngs2_submixer.cpp + src/core/libraries/ngs2/ngs2_submixer.h src/core/libraries/ajm/ajm_error.h src/core/libraries/audio3d/audio3d.cpp src/core/libraries/audio3d/audio3d.h diff --git a/src/core/libraries/ngs2/ngs2.cpp b/src/core/libraries/ngs2/ngs2.cpp index 7eb663413..0b42e2471 100644 --- a/src/core/libraries/ngs2/ngs2.cpp +++ b/src/core/libraries/ngs2/ngs2.cpp @@ -5,21 +5,480 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/ngs2/ngs2.h" +#include "core/libraries/ngs2/ngs2_custom.h" #include "core/libraries/ngs2/ngs2_error.h" +#include "core/libraries/ngs2/ngs2_geom.h" #include "core/libraries/ngs2/ngs2_impl.h" +#include "core/libraries/ngs2/ngs2_pan.h" +#include "core/libraries/ngs2/ngs2_report.h" namespace Libraries::Ngs2 { -int PS4_SYSV_ABI sceNgs2CalcWaveformBlock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); +// Ngs2 + +s32 PS4_SYSV_ABI sceNgs2CalcWaveformBlock(const OrbisNgs2WaveformFormat* format, u32 samplePos, + u32 numSamples, OrbisNgs2WaveformBlock* outBlock) { + LOG_INFO(Lib_Ngs2, "samplePos = {}, numSamples = {}", samplePos, numSamples); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2CustomRackGetModuleInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceNgs2GetWaveformFrameInfo(const OrbisNgs2WaveformFormat* format, + u32* outFrameSize, u32* outNumFrameSamples, + u32* outUnitsPerFrame, u32* outNumDelaySamples) { + LOG_INFO(Lib_Ngs2, "called"); return ORBIS_OK; } +s32 PS4_SYSV_ABI sceNgs2ParseWaveformData(const void* data, size_t dataSize, + OrbisNgs2WaveformInfo* outInfo) { + LOG_INFO(Lib_Ngs2, "dataSize = {}", dataSize); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2ParseWaveformFile(const char* path, u64 offset, + OrbisNgs2WaveformInfo* outInfo) { + LOG_INFO(Lib_Ngs2, "path = {}, offset = {}", path, offset); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2ParseWaveformUser(OrbisNgs2ParseReadHandler handler, uintptr_t userData, + OrbisNgs2WaveformInfo* outInfo) { + LOG_INFO(Lib_Ngs2, "userData = {}", userData); + if (!handler) { + LOG_ERROR(Lib_Ngs2, "handler is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackCreate(OrbisNgs2Handle systemHandle, u32 rackId, + const OrbisNgs2RackOption* option, + const OrbisNgs2ContextBufferInfo* bufferInfo, + OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "rackId = {}", rackId); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackCreateWithAllocator(OrbisNgs2Handle systemHandle, u32 rackId, + const OrbisNgs2RackOption* option, + const OrbisNgs2BufferAllocator* allocator, + OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "rackId = {}", rackId); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackDestroy(OrbisNgs2Handle rackHandle, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackGetInfo(OrbisNgs2Handle rackHandle, OrbisNgs2RackInfo* outInfo, + size_t infoSize) { + LOG_INFO(Lib_Ngs2, "infoSize = {}", infoSize); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackGetUserData(OrbisNgs2Handle rackHandle, uintptr_t* outUserData) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackGetVoiceHandle(OrbisNgs2Handle rackHandle, u32 voiceIndex, + OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "voiceIndex = {}", voiceIndex); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackLock(OrbisNgs2Handle rackHandle) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackQueryBufferSize(u32 rackId, const OrbisNgs2RackOption* option, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + LOG_INFO(Lib_Ngs2, "rackId = {}", rackId); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackSetUserData(OrbisNgs2Handle rackHandle, uintptr_t userData) { + LOG_INFO(Lib_Ngs2, "userData = {}", userData); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackUnlock(OrbisNgs2Handle rackHandle) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemCreate(const OrbisNgs2SystemOption* option, + const OrbisNgs2ContextBufferInfo* bufferInfo, + OrbisNgs2Handle* outHandle) { + s32 result; + OrbisNgs2ContextBufferInfo localInfo; + if (!bufferInfo || !outHandle) { + if (!bufferInfo) { + result = ORBIS_NGS2_ERROR_INVALID_BUFFER_INFO; + LOG_ERROR(Lib_Ngs2, "Invalid system buffer info {}", (void*)bufferInfo); + } else { + result = ORBIS_NGS2_ERROR_INVALID_OUT_ADDRESS; + LOG_ERROR(Lib_Ngs2, "Invalid system handle address {}", (void*)outHandle); + } + + // TODO: Report errors? + } else { + // Make bufferInfo copy + localInfo.hostBuffer = bufferInfo->hostBuffer; + localInfo.hostBufferSize = bufferInfo->hostBufferSize; + for (int i = 0; i < 5; i++) { + localInfo.reserved[i] = bufferInfo->reserved[i]; + } + localInfo.userData = bufferInfo->userData; + + result = SystemSetup(option, &localInfo, 0, outHandle); + } + + // TODO: API reporting? + + LOG_INFO(Lib_Ngs2, "called"); + return result; +} + +s32 PS4_SYSV_ABI sceNgs2SystemCreateWithAllocator(const OrbisNgs2SystemOption* option, + const OrbisNgs2BufferAllocator* allocator, + OrbisNgs2Handle* outHandle) { + s32 result; + if (allocator && allocator->allocHandler != 0) { + OrbisNgs2BufferAllocHandler hostAlloc = allocator->allocHandler; + if (outHandle) { + OrbisNgs2BufferFreeHandler hostFree = allocator->freeHandler; + OrbisNgs2ContextBufferInfo* bufferInfo = 0; + result = SystemSetup(option, bufferInfo, 0, 0); + if (result >= 0) { + uintptr_t sysUserData = allocator->userData; + result = hostAlloc(bufferInfo); + if (result >= 0) { + OrbisNgs2Handle* handleCopy = outHandle; + result = SystemSetup(option, bufferInfo, hostFree, handleCopy); + if (result < 0) { + if (hostFree) { + hostFree(bufferInfo); + } + } + } + } + } else { + result = ORBIS_NGS2_ERROR_INVALID_OUT_ADDRESS; + LOG_ERROR(Lib_Ngs2, "Invalid system handle address {}", (void*)outHandle); + } + } else { + result = ORBIS_NGS2_ERROR_INVALID_BUFFER_ALLOCATOR; + LOG_ERROR(Lib_Ngs2, "Invalid system buffer allocator {}", (void*)allocator); + } + LOG_INFO(Lib_Ngs2, "called"); + return result; +} + +s32 PS4_SYSV_ABI sceNgs2SystemDestroy(OrbisNgs2Handle systemHandle, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemEnumHandles(OrbisNgs2Handle* aOutHandle, u32 maxHandles) { + LOG_INFO(Lib_Ngs2, "maxHandles = {}", maxHandles); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemEnumRackHandles(OrbisNgs2Handle systemHandle, + OrbisNgs2Handle* aOutHandle, u32 maxHandles) { + LOG_INFO(Lib_Ngs2, "maxHandles = {}", maxHandles); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemGetInfo(OrbisNgs2Handle rackHandle, OrbisNgs2SystemInfo* outInfo, + size_t infoSize) { + LOG_INFO(Lib_Ngs2, "infoSize = {}", infoSize); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemGetUserData(OrbisNgs2Handle systemHandle, uintptr_t* outUserData) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemLock(OrbisNgs2Handle systemHandle) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemQueryBufferSize(const OrbisNgs2SystemOption* option, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + s32 result; + if (outBufferInfo) { + result = SystemSetup(option, outBufferInfo, 0, 0); + LOG_INFO(Lib_Ngs2, "called"); + } else { + result = ORBIS_NGS2_ERROR_INVALID_OUT_ADDRESS; + LOG_ERROR(Lib_Ngs2, "Invalid system buffer info {}", (void*)outBufferInfo); + } + + return result; +} + +s32 PS4_SYSV_ABI sceNgs2SystemRender(OrbisNgs2Handle systemHandle, + const OrbisNgs2RenderBufferInfo* aBufferInfo, + u32 numBufferInfo) { + LOG_INFO(Lib_Ngs2, "numBufferInfo = {}", numBufferInfo); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +static s32 PS4_SYSV_ABI sceNgs2SystemResetOption(OrbisNgs2SystemOption* outOption) { + static const OrbisNgs2SystemOption option = { + sizeof(OrbisNgs2SystemOption), "", 0, 512, 256, 48000, {0}}; + + if (!outOption) { + LOG_ERROR(Lib_Ngs2, "Invalid system option address {}", (void*)outOption); + return ORBIS_NGS2_ERROR_INVALID_OPTION_ADDRESS; + } + *outOption = option; + + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemSetGrainSamples(OrbisNgs2Handle systemHandle, u32 numSamples) { + LOG_INFO(Lib_Ngs2, "numSamples = {}", numSamples); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemSetSampleRate(OrbisNgs2Handle systemHandle, u32 sampleRate) { + LOG_INFO(Lib_Ngs2, "sampleRate = {}", sampleRate); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemSetUserData(OrbisNgs2Handle systemHandle, uintptr_t userData) { + LOG_INFO(Lib_Ngs2, "userData = {}", userData); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemUnlock(OrbisNgs2Handle systemHandle) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceControl(OrbisNgs2Handle voiceHandle, + const OrbisNgs2VoiceParamHeader* paramList) { + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetMatrixInfo(OrbisNgs2Handle voiceHandle, u32 matrixId, + OrbisNgs2VoiceMatrixInfo* outInfo, size_t outInfoSize) { + LOG_INFO(Lib_Ngs2, "matrixId = {}, outInfoSize = {}", matrixId, outInfoSize); + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetOwner(OrbisNgs2Handle voiceHandle, OrbisNgs2Handle* outRackHandle, + u32* outVoiceId) { + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetPortInfo(OrbisNgs2Handle voiceHandle, u32 port, + OrbisNgs2VoicePortInfo* outInfo, size_t outInfoSize) { + LOG_INFO(Lib_Ngs2, "port = {}, outInfoSize = {}", port, outInfoSize); + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetState(OrbisNgs2Handle voiceHandle, OrbisNgs2VoiceState* outState, + size_t stateSize) { + LOG_INFO(Lib_Ngs2, "stateSize = {}", stateSize); + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetStateFlags(OrbisNgs2Handle voiceHandle, u32* outStateFlags) { + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +// Ngs2Custom + +s32 PS4_SYSV_ABI sceNgs2CustomRackGetModuleInfo(OrbisNgs2Handle rackHandle, u32 moduleIndex, + OrbisNgs2CustomModuleInfo* outInfo, + size_t infoSize) { + LOG_INFO(Lib_Ngs2, "moduleIndex = {}, infoSize = {}", moduleIndex, infoSize); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +// Ngs2Geom + +s32 PS4_SYSV_ABI sceNgs2GeomResetListenerParam(OrbisNgs2GeomListenerParam* outListenerParam) { + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2GeomResetSourceParam(OrbisNgs2GeomSourceParam* outSourceParam) { + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2GeomCalcListener(const OrbisNgs2GeomListenerParam* param, + OrbisNgs2GeomListenerWork* outWork, u32 flags) { + LOG_INFO(Lib_Ngs2, "flags = {}", flags); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2GeomApply(const OrbisNgs2GeomListenerWork* listener, + const OrbisNgs2GeomSourceParam* source, + OrbisNgs2GeomAttribute* outAttrib, u32 flags) { + LOG_INFO(Lib_Ngs2, "flags = {}", flags); + return ORBIS_OK; +} + +// Ngs2Pan + +s32 PS4_SYSV_ABI sceNgs2PanInit(OrbisNgs2PanWork* work, const float* aSpeakerAngle, float unitAngle, + u32 numSpeakers) { + LOG_INFO(Lib_Ngs2, "aSpeakerAngle = {}, unitAngle = {}, numSpeakers = {}", *aSpeakerAngle, + unitAngle, numSpeakers); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2PanGetVolumeMatrix(OrbisNgs2PanWork* work, const OrbisNgs2PanParam* aParam, + u32 numParams, u32 matrixFormat, + float* outVolumeMatrix) { + LOG_INFO(Lib_Ngs2, "numParams = {}, matrixFormat = {}", numParams, matrixFormat); + return ORBIS_OK; +} + +// Ngs2Report + +s32 PS4_SYSV_ABI sceNgs2ReportRegisterHandler(u32 reportType, OrbisNgs2ReportHandler handler, + uintptr_t userData, OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "reportType = {}, userData = {}", reportType, userData); + if (!handler) { + LOG_ERROR(Lib_Ngs2, "handler is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2ReportUnregisterHandler(OrbisNgs2Handle reportHandle) { + if (!reportHandle) { + LOG_ERROR(Lib_Ngs2, "reportHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +// Unknown + int PS4_SYSV_ABI sceNgs2FftInit() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -35,31 +494,6 @@ int PS4_SYSV_ABI sceNgs2FftQuerySize() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2GeomApply() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GeomCalcListener() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GeomResetListenerParam() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GeomResetSourceParam() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GetWaveformFrameInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2JobSchedulerResetOption() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -80,71 +514,6 @@ int PS4_SYSV_ABI sceNgs2ModuleQueueEnumItems() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2PanGetVolumeMatrix() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2PanInit() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ParseWaveformData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ParseWaveformFile() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ParseWaveformUser() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackCreate() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackCreateWithAllocator() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackDestroy() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackGetInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackGetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackGetVoiceHandle() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackLock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackQueryBufferSize() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2RackQueryInfo() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -155,116 +524,21 @@ int PS4_SYSV_ABI sceNgs2RackRunCommands() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2RackSetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackUnlock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ReportRegisterHandler() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ReportUnregisterHandler() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemCreate() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemCreateWithAllocator() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemDestroy() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemEnumHandles() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemEnumRackHandles() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemGetInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemGetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemLock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemQueryBufferSize() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2SystemQueryInfo() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2SystemRender() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemResetOption() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2SystemRunCommands() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2SystemSetGrainSamples() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2SystemSetLoudThreshold() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2SystemSetSampleRate() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemSetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemUnlock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2StreamCreate() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -300,36 +574,6 @@ int PS4_SYSV_ABI sceNgs2StreamRunCommands() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2VoiceControl() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetMatrixInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetOwner() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetPortInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetState() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetStateFlags() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2VoiceQueryInfo() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; diff --git a/src/core/libraries/ngs2/ngs2.h b/src/core/libraries/ngs2/ngs2.h index a5f1f52a6..a34bf21d4 100644 --- a/src/core/libraries/ngs2/ngs2.h +++ b/src/core/libraries/ngs2/ngs2.h @@ -3,7 +3,11 @@ #pragma once +#include "core/libraries/ngs2/ngs2_impl.h" + #include +#include +#include #include "common/types.h" namespace Core::Loader { @@ -12,60 +16,253 @@ class SymbolsResolver; namespace Libraries::Ngs2 { -class Ngs2; +typedef s32 (*OrbisNgs2ParseReadHandler)(uintptr_t userData, u32 offset, void* data, size_t size); -using SceNgs2Handle = Ngs2*; - -enum class SceNgs2HandleType : u32 { - System = 0, +enum class OrbisNgs2HandleType : u32 { + Invalid = 0, + System = 1, + Rack = 2, + Voice = 3, + VoiceControl = 6 }; -struct Ngs2Handle { - void* selfPointer; - void* dataPointer; - std::atomic* atomicPtr; - u32 handleType; - u32 flags_unk; +static const int ORBIS_NGS2_MAX_VOICE_CHANNELS = 8; +static const int ORBIS_NGS2_WAVEFORM_INFO_MAX_BLOCKS = 4; +static const int ORBIS_NGS2_MAX_MATRIX_LEVELS = + (ORBIS_NGS2_MAX_VOICE_CHANNELS * ORBIS_NGS2_MAX_VOICE_CHANNELS); - u32 uid; - u16 maxGrainSamples; - u16 minGrainSamples; - u16 currentGrainSamples; - u16 numGrainSamples; - u16 unknown2; +struct OrbisNgs2WaveformFormat { + u32 waveformType; + u32 numChannels; u32 sampleRate; - u32 unknown3; - - void* flushMutex; - u32 flushMutexInitialized; - void* processMutex; - u32 processMutexInitialized; - - // Linked list pointers for system list - Ngs2Handle* prev; - Ngs2Handle* next; + u32 configData; + u32 frameOffset; + u32 frameMargin; }; -struct SystemOptions { - char padding[6]; - s32 maxGrainSamples; - s32 numGrainSamples; - s32 sampleRate; +struct OrbisNgs2WaveformBlock { + u32 dataOffset; + u32 dataSize; + u32 numRepeats; + u32 numSkipSamples; + u32 numSamples; + u32 reserved; + uintptr_t userData; }; -struct SystemState { - // TODO +struct OrbisNgs2WaveformInfo { + OrbisNgs2WaveformFormat format; + + u32 dataOffset; + u32 dataSize; + + u32 loopBeginPosition; + u32 loopEndPosition; + u32 numSamples; + + u32 audioUnitSize; + u32 numAudioUnitSamples; + u32 numAudioUnitPerFrame; + + u32 audioFrameSize; + u32 numAudioFrameSamples; + + u32 numDelaySamples; + + u32 numBlocks; + OrbisNgs2WaveformBlock aBlock[ORBIS_NGS2_WAVEFORM_INFO_MAX_BLOCKS]; }; -struct StackBuffer { - void** top; - void* base; - void* curr; - size_t usedSize; - size_t totalSize; - size_t alignment; - char isVerifyEnabled; - char padding[7]; +struct OrbisNgs2EnvelopePoint { + u32 curve; + u32 duration; + float height; +}; + +struct OrbisNgs2UserFxProcessContext { + float** aChannelData; + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; + u32 flags; + u32 numChannels; + u32 numGrainSamples; + u32 sampleRate; +}; + +typedef s32 (*OrbisNgs2UserFxProcessHandler)(OrbisNgs2UserFxProcessContext* context); + +struct OrbisNgs2UserFx2SetupContext { + void* common; + void* param; + void* work; + uintptr_t userData; + u32 maxVoices; + u32 voiceIndex; + u64 reserved[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2SetupHandler)(OrbisNgs2UserFx2SetupContext* context); + +struct OrbisNgs2UserFx2CleanupContext { + void* common; + void* param; + void* work; + uintptr_t userData; + u32 maxVoices; + u32 voiceIndex; + u64 reserved[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2CleanupHandler)(OrbisNgs2UserFx2CleanupContext* context); + +struct OrbisNgs2UserFx2ControlContext { + const void* data; + size_t dataSize; + void* common; + void* param; + uintptr_t userData; + u64 reserved[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2ControlHandler)(OrbisNgs2UserFx2ControlContext* context); + +struct OrbisNgs2UserFx2ProcessContext { + float** aChannelData; + void* common; + const void* param; + void* work; + void* state; + uintptr_t userData; + u32 flags; + u32 numInputChannels; + u32 numOutputChannels; + u32 numGrainSamples; + u32 sampleRate; + u32 reserved; + u64 reserved2[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2ProcessHandler)(OrbisNgs2UserFx2ProcessContext* context); + +struct OrbisNgs2BufferAllocator { + OrbisNgs2BufferAllocHandler allocHandler; + OrbisNgs2BufferFreeHandler freeHandler; + uintptr_t userData; +}; + +struct OrbisNgs2RenderBufferInfo { + void* buffer; + size_t bufferSize; + u32 waveformType; + u32 numChannels; +}; + +struct OrbisNgs2RackOption { + size_t size; + char name[ORBIS_NGS2_RACK_NAME_LENGTH]; + + u32 flags; + u32 maxGrainSamples; + u32 maxVoices; + u32 maxInputDelayBlocks; + u32 maxMatrices; + u32 maxPorts; + u32 aReserved[20]; +}; + +struct OrbisNgs2VoiceParamHeader { + u16 size; + s16 next; + u32 id; +}; + +struct OrbisNgs2VoiceMatrixLevelsParam { + OrbisNgs2VoiceParamHeader header; + + u32 matrixId; + u32 numLevels; + const float* aLevel; +}; + +struct OrbisNgs2VoicePortMatrixParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + s32 matrixId; +}; + +struct OrbisNgs2VoicePortVolumeParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + float level; +}; + +struct OrbisNgs2VoicePortDelayParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + u32 numSamples; +}; + +struct OrbisNgs2VoicePatchParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + u32 destInputId; + OrbisNgs2Handle destHandle; +}; + +struct OrbisNgs2VoiceEventParam { + OrbisNgs2VoiceParamHeader header; + + u32 eventId; +}; + +struct OrbisNgs2VoiceCallbackInfo { + uintptr_t callbackData; + OrbisNgs2Handle voiceHandle; + u32 flag; + u32 reserved; + union { + struct { + uintptr_t userData; + const void* data; + u32 dataSize; + u32 repeatedCount; + u32 attributeFlags; + u32 reserved2; + } waveformBlock; + } param; +}; + +typedef void (*OrbisNgs2VoiceCallbackHandler)(const OrbisNgs2VoiceCallbackInfo* info); + +struct OrbisNgs2VoiceCallbackParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2VoiceCallbackHandler callbackHandler; + + uintptr_t callbackData; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2VoicePortInfo { + s32 matrixId; + float volume; + u32 numDelaySamples; + u32 destInputId; + OrbisNgs2Handle destHandle; +}; + +struct OrbisNgs2VoiceMatrixInfo { + u32 numLevels; + float aLevel[ORBIS_NGS2_MAX_MATRIX_LEVELS]; +}; + +struct OrbisNgs2VoiceState { + u32 stateFlags; }; void RegisterlibSceNgs2(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/ngs2/ngs2_custom.cpp b/src/core/libraries/ngs2/ngs2_custom.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_custom.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_custom.h b/src/core/libraries/ngs2/ngs2_custom.h new file mode 100644 index 000000000..0c45a5d81 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_custom.h @@ -0,0 +1,444 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" +#include "ngs2_reverb.h" + +namespace Libraries::Ngs2 { + +class Ngs2Custom; + +static const int ORBIS_NGS2_CUSTOM_MAX_MODULES = 24; +static const int ORBIS_NGS2_CUSTOM_MAX_PORTS = 16; +static const int ORBIS_NGS2_CUSTOM_DELAY_MAX_TAPS = 8; + +struct OrbisNgs2CustomModuleOption { + u32 size; +}; + +struct OrbisNgs2CustomEnvelopeModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 maxPoints; + u32 reserved; +}; + +struct OrbisNgs2CustomReverbModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 reverbSize; + u32 reserved; +}; + +struct OrbisNgs2CustomChorusModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 maxPhases; + u32 reserved; +} OrbisNgs2CustomChorusModuleOption; + +struct OrbisNgs2CustomPeakMeterModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + u32 numBlocks; + u32 reserved; +}; + +struct OrbisNgs2CustomDelayModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 type; + u32 maxTaps; + float maxLength; + u32 reserved; +}; + +struct OrbisNgs2CustomPitchShiftModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 quality; +}; + +struct OrbisNgs2CustomUserFx2ModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + OrbisNgs2UserFx2SetupHandler setupHandler; + OrbisNgs2UserFx2CleanupHandler cleanupHandler; + OrbisNgs2UserFx2ControlHandler controlHandler; + OrbisNgs2UserFx2ProcessHandler processHandler; + + size_t commonSize; + size_t paramSize; + size_t workSize; + uintptr_t userData; +}; + +struct OrbisNgs2CustomRackModuleInfo { + const OrbisNgs2CustomModuleOption* option; + + u32 moduleId; + u32 sourceBufferId; + u32 extraBufferId; + u32 destBufferId; + u32 stateOffset; + u32 stateSize; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomRackPortInfo { + u32 sourceBufferId; + u32 reserved; +}; + +struct OrbisNgs2CustomRackOption { + OrbisNgs2RackOption rackOption; + u32 stateSize; + u32 numBuffers; + u32 numModules; + u32 reserved; + OrbisNgs2CustomRackModuleInfo aModule[ORBIS_NGS2_CUSTOM_MAX_MODULES]; + OrbisNgs2CustomRackPortInfo aPort[ORBIS_NGS2_CUSTOM_MAX_PORTS]; +}; + +struct OrbisNgs2CustomSamplerRackOption { + OrbisNgs2CustomRackOption customRackOption; + + u32 maxChannelWorks; + u32 maxWaveformBlocks; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; + u32 maxCodecCaches; +}; + +struct OrbisNgs2CustomSubmixerRackOption { + OrbisNgs2CustomRackOption customRackOption; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomMasteringRackOption { + OrbisNgs2CustomRackOption customRackOption; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomSamplerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2WaveformFormat format; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2CustomSamplerVoiceWaveformBlocksParam { + OrbisNgs2VoiceParamHeader header; + const void* data; + u32 flags; + u32 numBlocks; + const OrbisNgs2WaveformBlock* aBlock; +}; + +struct OrbisNgs2CustomSamplerVoiceWaveformAddressParam { + OrbisNgs2VoiceParamHeader header; + const void* from; + const void* to; +}; + +struct OrbisNgs2CustomSamplerVoiceWaveformFrameOffsetParam { + OrbisNgs2VoiceParamHeader header; + u32 frameOffset; + u32 reserved; +}; + +struct OrbisNgs2CustomSamplerVoiceExitLoopParam { + OrbisNgs2VoiceParamHeader header; +}; + +struct OrbisNgs2CustomSamplerVoicePitchParam { + OrbisNgs2VoiceParamHeader header; + float ratio; + u32 reserved; +}; + +struct OrbisNgs2CustomSamplerVoiceState { + OrbisNgs2VoiceState voiceState; + char padding[32]; + const void* waveformData; + u64 numDecodedSamples; + u64 decodedDataSize; + u64 userData; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomSubmixerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + u32 numInputChannels; + u32 numOutputChannels; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2CustomSubmixerVoiceState { + OrbisNgs2VoiceState voiceState; // Voice state + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomMasteringVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + u32 numInputChannels; + u32 flags; +}; + +struct OrbisNgs2CustomMasteringVoiceOutputParam { + OrbisNgs2VoiceParamHeader header; + u32 outputId; + u32 reserved; +}; + +struct OrbisNgs2CustomMasteringVoiceState { + OrbisNgs2VoiceState voiceState; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomVoiceEnvelopeParam { + OrbisNgs2VoiceParamHeader header; + u32 numForwardPoints; + u32 numReleasePoints; + const OrbisNgs2EnvelopePoint* aPoint; +}; + +struct OrbisNgs2CustomVoiceDistortionParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + float a; + float b; + float clip; + float gate; + float wetLevel; + float dryLevel; + u32 reserved; +}; + +struct OrbisNgs2CustomVoiceCompressorParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + float threshold; + float ratio; + float knee; + float attackTime; + float releaseTime; + float level; + u32 reserved; +}; + +struct OrbisNgs2CustomVoiceFilterParam { + OrbisNgs2VoiceParamHeader header; + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; + u32 reserved3; +}; + +struct OrbisNgs2CustomVoiceLfeFilterParam { + OrbisNgs2VoiceParamHeader header; + u32 enableFlag; + u32 fc; +}; + +struct OrbisNgs2CustomVoiceGainParam { + OrbisNgs2VoiceParamHeader header; + float aLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2CustomVoiceMixerParam { + OrbisNgs2VoiceParamHeader header; + float aSourceLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + float aDestLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2CustomVoiceChannelMixerParam { + OrbisNgs2VoiceParamHeader header; + float aLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS][ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2CustomVoiceUserFxParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2UserFxProcessHandler handler; + + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; +}; + +struct OrbisNgs2CustomVoiceUserFx2Param { + OrbisNgs2VoiceParamHeader header; + const void* data; + size_t dataSize; +}; + +struct OrbisNgs2CustomVoiceOutputParam { + OrbisNgs2VoiceParamHeader header; + u32 outputId; + u32 reserved; +}; + +struct OrbisNgs2CustomVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + u32 enableFlag; + u32 reserved; +} OrbisNgs2CustomVoicePeakMeterParam; + +struct OrbisNgs2CustomVoiceReverbParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2ReverbI3DL2Param i3dl2; +}; + +struct OrbisNgs2CustomVoiceChorusParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + u32 numPhases; + u32 channelMask; + float inputLevel; + float delayTime; + float modulationRatio; + float modulationDepth; + float feedbackLevel; + float wetLevel; + float dryLevel; +}; + +struct OrbisNgs2DelayTapInfo { + float tapLevel; + float delayTime; +}; + +struct OrbisNgs2CustomVoiceDelayParam { + OrbisNgs2VoiceParamHeader header; + float dryLevel; + float wetLevel; + float inputLevel; + float feedbackLevel; + float lowpassFc; + u32 numTaps; + OrbisNgs2DelayTapInfo aTap[ORBIS_NGS2_CUSTOM_DELAY_MAX_TAPS]; + float aInputMixLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + u32 channelMask; + u32 flags; +}; + +struct OrbisNgs2CustomVoiceNoiseGateParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + float threshold; + float attackTime; + float releaseTime; +}; + +struct OrbisNgs2CustomVoicePitchShiftParam { + OrbisNgs2VoiceParamHeader header; + s32 cent; +}; + +struct OrbisNgs2CustomEnvelopeModuleState { + float height; + u32 reserved; +}; + +struct OrbisNgs2CustomCompressorModuleState { + float peakHeight; + float compressorHeight; +}; + +struct OrbisNgs2CustomPeakMeterModuleState { + float peak; + float aChannelPeak[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + u32 reserved; +}; + +struct OrbisNgs2CustomNoiseGateModuleState { + float gateHeight; +}; + +struct OrbisNgs2CustomRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 stateSize; + u32 numBuffers; + u32 numModules; + u32 reserved; + OrbisNgs2CustomRackModuleInfo aModule[ORBIS_NGS2_CUSTOM_MAX_MODULES]; + OrbisNgs2CustomRackPortInfo aPort[ORBIS_NGS2_CUSTOM_MAX_PORTS]; +}; + +struct OrbisNgs2CustomSamplerRackInfo { + OrbisNgs2CustomRackInfo customRackInfo; + + u32 maxChannelWorks; + u32 maxWaveformBlocks; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; + u32 maxCodecCaches; +}; + +struct OrbisNgs2CustomSubmixerRackInfo { + OrbisNgs2CustomRackInfo customRackInfo; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomMasteringRackInfo { + OrbisNgs2CustomRackInfo customRackInfo; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomModuleInfo { + u32 moduleId; + u32 sourceBufferId; + u32 extraBufferId; + u32 destBufferId; + u32 stateOffset; + u32 stateSize; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomEnvelopeModuleInfo { + OrbisNgs2CustomModuleInfo moduleInfo; + + u32 maxPoints; + u32 reserved; +}; + +struct OrbisNgs2CustomReverbModuleInfo { + OrbisNgs2CustomModuleInfo moduleInfo; + + u32 reverbSize; + u32 reserved; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_eq.cpp b/src/core/libraries/ngs2/ngs2_eq.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_eq.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_eq.h b/src/core/libraries/ngs2/ngs2_eq.h new file mode 100644 index 000000000..99688f24e --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_eq.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Eq; + +struct OrbisNgs2EqVoiceSetupParam { + u32 numChannels; +}; + +struct OrbisNgs2EqVoiceFilterParam { + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; +}; + +struct OrbisNgs2EqVoiceState { + u32 stateFlags; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_geom.cpp b/src/core/libraries/ngs2/ngs2_geom.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_geom.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_geom.h b/src/core/libraries/ngs2/ngs2_geom.h new file mode 100644 index 000000000..93af99d8d --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_geom.h @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Geom; + +struct OrbisNgs2GeomVector { + float x; + float y; + float z; +}; + +struct OrbisNgs2GeomCone { + float innerLevel; + float innerAngle; + float outerLevel; + float outerAngle; +}; + +struct OrbisNgs2GeomRolloff { + u32 model; + float maxDistance; + float rolloffFactor; + float referenceDistance; +}; + +struct OrbisNgs2GeomListenerParam { + OrbisNgs2GeomVector position; + OrbisNgs2GeomVector orientFront; + OrbisNgs2GeomVector orientUp; + OrbisNgs2GeomVector velocity; + float soundSpeed; + u32 reserved[2]; +}; + +struct OrbisNgs2GeomListenerWork { + float matrix[4][4]; + OrbisNgs2GeomVector velocity; + float soundSpeed; + u32 coordinate; + u32 reserved[3]; +}; + +struct OrbisNgs2GeomSourceParam { + OrbisNgs2GeomVector position; + OrbisNgs2GeomVector velocity; + OrbisNgs2GeomVector direction; + OrbisNgs2GeomCone cone; + OrbisNgs2GeomRolloff rolloff; + float dopplerFactor; + float fbwLevel; + float lfeLevel; + float maxLevel; + float minLevel; + float radius; + u32 numSpeakers; + u32 matrixFormat; + u32 reserved[2]; +}; + +struct OrbisNgs2GeomA3dAttribute { + OrbisNgs2GeomVector position; + float volume; + u32 reserved[4]; +}; + +struct OrbisNgs2GeomAttribute { + float pitchRatio; + float aLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS * ORBIS_NGS2_MAX_VOICE_CHANNELS]; + + OrbisNgs2GeomA3dAttribute a3dAttrib; + u32 reserved[4]; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_impl.cpp b/src/core/libraries/ngs2/ngs2_impl.cpp index b358a05f7..1248f76d7 100644 --- a/src/core/libraries/ngs2/ngs2_impl.cpp +++ b/src/core/libraries/ngs2/ngs2_impl.cpp @@ -12,153 +12,171 @@ using namespace Libraries::Kernel; namespace Libraries::Ngs2 { -s32 Ngs2::ReportInvalid(Ngs2Handle* handle, u32 handle_type) const { - uintptr_t hAddress = reinterpret_cast(handle); - switch (handle_type) { +s32 HandleReportInvalid(OrbisNgs2Handle handle, u32 handleType) { + switch (handleType) { case 1: - LOG_ERROR(Lib_Ngs2, "Invalid system handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid system handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; case 2: - LOG_ERROR(Lib_Ngs2, "Invalid rack handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid rack handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; case 4: - LOG_ERROR(Lib_Ngs2, "Invalid voice handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid voice handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; case 8: - LOG_ERROR(Lib_Ngs2, "Invalid report handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid report handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE; default: - LOG_ERROR(Lib_Ngs2, "Invalid handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_HANDLE; } } -s32 Ngs2::HandleSetup(Ngs2Handle* handle, void* data, std::atomic* atomic, u32 type, - u32 flags) { - handle->dataPointer = data; - handle->atomicPtr = atomic; - handle->handleType = type; - handle->flags_unk = flags; - return ORBIS_OK; +void* MemoryClear(void* buffer, size_t size) { + return memset(buffer, 0, size); } -s32 Ngs2::HandleCleanup(Ngs2Handle* handle, u32 hType, void* dataOut) { - if (handle && handle->selfPointer == handle) { - std::atomic* tmp_atomic = handle->atomicPtr; - if (tmp_atomic && handle->handleType == hType) { - while (tmp_atomic->load() != 0) { - u32 expected = 1; - if (tmp_atomic->compare_exchange_strong(expected, 0)) { - if (dataOut) { - dataOut = handle->dataPointer; - } - // sceNgs2MemoryClear(handle, 32); - return ORBIS_OK; - } - tmp_atomic = handle->atomicPtr; - } - } - } - return this->ReportInvalid(handle, hType); -} - -s32 Ngs2::HandleEnter(Ngs2Handle* handle, u32 hType, Ngs2Handle* handleOut) { - if (!handle) { - return this->ReportInvalid(handle, 0); - } - - if (handle->selfPointer != handle || !handle->atomicPtr || !handle->dataPointer || - (~hType & handle->handleType)) { - return this->ReportInvalid(handle, handle->handleType); - } - - std::atomic* atomic = handle->atomicPtr; - while (true) { - u32 i = atomic->load(); - if (i == 0) { - return this->ReportInvalid(handle, handle->handleType); - } - if (atomic->compare_exchange_strong(i, i + 1)) { - break; - } - } - - if (handleOut) { - handleOut = handle; +s32 StackBufferClose(StackBuffer* stackBuffer, size_t* outTotalSize) { + if (outTotalSize) { + *outTotalSize = stackBuffer->usedSize + stackBuffer->alignment; } return ORBIS_OK; } -s32 Ngs2::HandleLeave(Ngs2Handle* handle) { - std::atomic* tmp_atomic; - u32 i; - do { - tmp_atomic = handle->atomicPtr; - i = tmp_atomic->load(); - } while (!tmp_atomic->compare_exchange_strong(i, i - 1)); - return ORBIS_OK; -} +s32 StackBufferOpen(StackBuffer* stackBuffer, void* bufferStart, size_t bufferSize, + void** outBuffer, u8 flags) { + stackBuffer->top = outBuffer; + stackBuffer->base = bufferStart; + stackBuffer->size = (size_t)bufferStart; + stackBuffer->currentOffset = (size_t)bufferStart; + stackBuffer->usedSize = 0; + stackBuffer->totalSize = bufferSize; + stackBuffer->alignment = 8; // this is a fixed value + stackBuffer->flags = flags; -s32 Ngs2::StackBufferOpen(StackBuffer* buf, void* base_addr, size_t size, void** stackTop, - bool verify) { - buf->top = stackTop; - buf->base = base_addr; - buf->curr = base_addr; - buf->usedSize = 0; - buf->totalSize = size; - buf->alignment = 8; - buf->isVerifyEnabled = verify; - - if (stackTop) { - *stackTop = nullptr; + if (outBuffer != NULL) { + *outBuffer = NULL; } return ORBIS_OK; } -s32 Ngs2::StackBufferClose(StackBuffer* buf, size_t* usedSize) { - if (usedSize) { - *usedSize = buf->usedSize + buf->alignment; +s32 SystemCleanup(OrbisNgs2Handle systemHandle, OrbisNgs2ContextBufferInfo* outInfo) { + if (!systemHandle) { + return ORBIS_NGS2_ERROR_INVALID_HANDLE; } + // TODO + return ORBIS_OK; } -s32 Ngs2::SystemSetupCore(StackBuffer* buf, SystemOptions* options, Ngs2Handle** sysOut) { +s32 SystemSetupCore(StackBuffer* stackBuffer, const OrbisNgs2SystemOption* option, + SystemInternal* outSystem) { u32 maxGrainSamples = 512; u32 numGrainSamples = 256; u32 sampleRate = 48000; - if (options) { - maxGrainSamples = options->maxGrainSamples; - numGrainSamples = options->numGrainSamples; - sampleRate = options->sampleRate; + if (option) { + sampleRate = option->sampleRate; + maxGrainSamples = option->maxGrainSamples; + numGrainSamples = option->numGrainSamples; } - // Validate maxGrainSamples - if (maxGrainSamples < 64 || maxGrainSamples > 1024 || (maxGrainSamples & 0x3F) != 0) { + if (maxGrainSamples < 64 || maxGrainSamples > 1024 || (maxGrainSamples & 63) != 0) { LOG_ERROR(Lib_Ngs2, "Invalid system option (maxGrainSamples={},x64)", maxGrainSamples); return ORBIS_NGS2_ERROR_INVALID_MAX_GRAIN_SAMPLES; } - // Validate numGrainSamples - if (numGrainSamples < 64 || numGrainSamples > 1024 || (numGrainSamples & 0x3F) != 0) { + if (numGrainSamples < 64 || numGrainSamples > 1024 || (numGrainSamples & 63) != 0) { LOG_ERROR(Lib_Ngs2, "Invalid system option (numGrainSamples={},x64)", numGrainSamples); return ORBIS_NGS2_ERROR_INVALID_NUM_GRAIN_SAMPLES; } - // Validate sampleRate if (sampleRate != 11025 && sampleRate != 12000 && sampleRate != 22050 && sampleRate != 24000 && - sampleRate != 44100 && sampleRate != 48000 && sampleRate != 88200 && sampleRate != 96000) { + sampleRate != 44100 && sampleRate != 48000 && sampleRate != 88200 && sampleRate != 96000 && + sampleRate != 176400 && sampleRate != 192000) { LOG_ERROR(Lib_Ngs2, "Invalid system option(sampleRate={}:44.1/48kHz series)", sampleRate); return ORBIS_NGS2_ERROR_INVALID_SAMPLE_RATE; } - int result = ORBIS_OK; + return ORBIS_OK; +} +s32 SystemSetup(const OrbisNgs2SystemOption* option, OrbisNgs2ContextBufferInfo* hostBufferInfo, + OrbisNgs2BufferFreeHandler hostFree, OrbisNgs2Handle* outHandle) { + u8 optionFlags = 0; + StackBuffer stackBuffer; + SystemInternal setupResult; + void* systemList = NULL; + size_t requiredBufferSize = 0; + u32 result = ORBIS_NGS2_ERROR_INVALID_BUFFER_SIZE; + + if (option) { + if (option->size != 64) { + LOG_ERROR(Lib_Ngs2, "Invalid system option size ({})", option->size); + return ORBIS_NGS2_ERROR_INVALID_OPTION_SIZE; + } + optionFlags = option->flags >> 31; + } + + // Init + StackBufferOpen(&stackBuffer, NULL, 0, NULL, optionFlags); + result = SystemSetupCore(&stackBuffer, option, 0); + + if (result < 0) { + return result; + } + + StackBufferClose(&stackBuffer, &requiredBufferSize); + + // outHandle unprovided + if (!outHandle) { + hostBufferInfo->hostBuffer = NULL; + hostBufferInfo->hostBufferSize = requiredBufferSize; + MemoryClear(&hostBufferInfo->reserved, sizeof(hostBufferInfo->reserved)); + return ORBIS_OK; + } + + if (!hostBufferInfo->hostBuffer) { + LOG_ERROR(Lib_Ngs2, "Invalid system buffer address ({})", hostBufferInfo->hostBuffer); + return ORBIS_NGS2_ERROR_INVALID_BUFFER_ADDRESS; + } + + if (hostBufferInfo->hostBufferSize < requiredBufferSize) { + LOG_ERROR(Lib_Ngs2, "Invalid system buffer size ({}<{}[byte])", + hostBufferInfo->hostBufferSize, requiredBufferSize); + return ORBIS_NGS2_ERROR_INVALID_BUFFER_SIZE; + } + + // Setup + StackBufferOpen(&stackBuffer, hostBufferInfo->hostBuffer, hostBufferInfo->hostBufferSize, + &systemList, optionFlags); + result = SystemSetupCore(&stackBuffer, option, &setupResult); + + if (result < 0) { + return result; + } + + StackBufferClose(&stackBuffer, &requiredBufferSize); + + // Copy buffer results + setupResult.bufferInfo = *hostBufferInfo; + setupResult.hostFree = hostFree; // TODO + // setupResult.systemList = systemList; - return result; // Success + OrbisNgs2Handle systemHandle = setupResult.systemHandle; + if (hostBufferInfo->hostBufferSize >= requiredBufferSize) { + *outHandle = systemHandle; + return ORBIS_OK; + } + + SystemCleanup(systemHandle, 0); + + LOG_ERROR(Lib_Ngs2, "Invalid system buffer size ({}<{}[byte])", hostBufferInfo->hostBufferSize, + requiredBufferSize); + return ORBIS_NGS2_ERROR_INVALID_BUFFER_SIZE; } } // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_impl.h b/src/core/libraries/ngs2/ngs2_impl.h index fea87c51c..7be0f89cc 100644 --- a/src/core/libraries/ngs2/ngs2_impl.h +++ b/src/core/libraries/ngs2/ngs2_impl.h @@ -3,23 +3,176 @@ #pragma once -#include "ngs2.h" +#include "core/libraries/kernel/threads/pthread.h" namespace Libraries::Ngs2 { -class Ngs2 { -public: - s32 ReportInvalid(Ngs2Handle* handle, u32 handle_type) const; - s32 HandleSetup(Ngs2Handle* handle, void* data, std::atomic* atomic, u32 type, u32 flags); - s32 HandleCleanup(Ngs2Handle* handle, u32 hType, void* dataOut); - s32 HandleEnter(Ngs2Handle* handle, u32 hType, Ngs2Handle* handleOut); - s32 HandleLeave(Ngs2Handle* handle); - s32 StackBufferOpen(StackBuffer* buf, void* base_addr, size_t size, void** stackTop, - bool verify); - s32 StackBufferClose(StackBuffer* buf, size_t* usedSize); - s32 SystemSetupCore(StackBuffer* buf, SystemOptions* options, Ngs2Handle** sysOut); +static const int ORBIS_NGS2_SYSTEM_NAME_LENGTH = 16; +static const int ORBIS_NGS2_RACK_NAME_LENGTH = 16; -private: +typedef uintptr_t OrbisNgs2Handle; + +struct OrbisNgs2ContextBufferInfo { + void* hostBuffer; + size_t hostBufferSize; + uintptr_t reserved[5]; + uintptr_t userData; }; +struct OrbisNgs2SystemOption { + size_t size; + char name[ORBIS_NGS2_SYSTEM_NAME_LENGTH]; + + u32 flags; + u32 maxGrainSamples; + u32 numGrainSamples; + u32 sampleRate; + u32 aReserved[6]; +}; + +typedef s32 (*OrbisNgs2BufferAllocHandler)(OrbisNgs2ContextBufferInfo* ioBufferInfo); +typedef s32 (*OrbisNgs2BufferFreeHandler)(OrbisNgs2ContextBufferInfo* ioBufferInfo); + +struct OrbisNgs2SystemInfo { + char name[ORBIS_NGS2_SYSTEM_NAME_LENGTH]; // 0 + + OrbisNgs2Handle systemHandle; // 16 + OrbisNgs2ContextBufferInfo bufferInfo; // 24 + + u32 uid; // 88 + u32 minGrainSamples; // 92 + u32 maxGrainSamples; // 96 + + u32 stateFlags; // 100 + u32 rackCount; // 104 + float lastRenderRatio; // 108 + s64 lastRenderTick; // 112 + s64 renderCount; // 120 + u32 sampleRate; // 128 + u32 numGrainSamples; // 132 +}; + +struct OrbisNgs2RackInfo { + char name[ORBIS_NGS2_RACK_NAME_LENGTH]; // 0 + + OrbisNgs2Handle rackHandle; // 16 + OrbisNgs2ContextBufferInfo bufferInfo; // 24 + + OrbisNgs2Handle ownerSystemHandle; // 88 + + u32 type; // 96 + u32 rackId; // 100 + u32 uid; // 104 + u32 minGrainSamples; // 108 + u32 maxGrainSamples; // 112 + u32 maxVoices; // 116 + u32 maxChannelWorks; // 120 + u32 maxInputs; // 124 + u32 maxMatrices; // 128 + u32 maxPorts; // 132 + + u32 stateFlags; // 136 + float lastProcessRatio; // 140 + u64 lastProcessTick; // 144 + u64 renderCount; // 152 + u32 activeVoiceCount; // 160 + u32 activeChannelWorkCount; // 164 +}; + +struct StackBuffer { + void** top; + void* base; + size_t size; + size_t currentOffset; + size_t usedSize; + size_t totalSize; + size_t alignment; + u8 flags; + char padding[7]; +}; + +struct SystemInternal { + // setup init + char name[ORBIS_NGS2_SYSTEM_NAME_LENGTH]; // 0 + OrbisNgs2ContextBufferInfo bufferInfo; // 16 + OrbisNgs2BufferFreeHandler hostFree; // 80 + OrbisNgs2Handle systemHandle; // 88 + void* unknown1; // 96 + void* unknown2; // 104 + OrbisNgs2Handle rackHandle; // 112 + uintptr_t* userData; // 120 + SystemInternal* systemList; // 128 + StackBuffer* stackBuffer; // 136 + OrbisNgs2SystemInfo ownerSystemInfo; // 144 + + struct rackList { + void* prev; + void* next; + void* unknown; + }; + + rackList rackListPreset; // 152 + rackList rackListNormal; // 176 + rackList rackListMaster; // 200 + + void* unknown3; // 208 + void* systemListPrev; // 216 + void* unknown4; // 224 + void* systemListNext; // 232 + void* rackFunction; // 240 + + Kernel::PthreadMutex processLock; // 248 + u32 hasProcessMutex; // 256 + u32 unknown5; // 260 + Kernel::PthreadMutex flushLock; // 264 + u32 hasFlushMutex; // 272 + u32 unknown6; // 276 + + // info + u64 lastRenderTick; // 280 + u64 renderCount; // 288 + u32 isActive; // 296 + std::atomic lockCount; // 300 + u32 uid; // 304 + u32 systemType; // 308 + + struct { + u8 isBufferValid : 1; + u8 isRendering : 1; + u8 isSorted : 1; + u8 isFlushReady : 1; + } flags; // 312 + + u16 currentMaxGrainSamples; // 316 + u16 minGrainSamples; // 318 + u16 maxGrainSamples; // 320 + u16 numGrainSamples; // 322 + u32 currentNumGrainSamples; // 324 + u32 sampleRate; // 328 + u32 currentSampleRate; // 332 + u32 rackCount; // 336 + float lastRenderRatio; // 340 + float cpuLoad; // 344 +}; + +struct HandleInternal { + HandleInternal* selfPtr; // 0 + SystemInternal* systemData; // 8 + std::atomic refCount; // 16 + u32 handleType; // 24 + u32 handleID; // 28 +}; + +s32 StackBufferClose(StackBuffer* stackBuffer, size_t* outTotalSize); +s32 StackBufferOpen(StackBuffer* stackBuffer, void* buffer, size_t bufferSize, void** outBuffer, + u8 flags); +s32 SystemSetupCore(StackBuffer* stackBuffer, const OrbisNgs2SystemOption* option, + SystemInternal* outSystem); + +s32 HandleReportInvalid(OrbisNgs2Handle handle, u32 handleType); +void* MemoryClear(void* buffer, size_t size); +s32 SystemCleanup(OrbisNgs2Handle systemHandle, OrbisNgs2ContextBufferInfo* outInfo); +s32 SystemSetup(const OrbisNgs2SystemOption* option, OrbisNgs2ContextBufferInfo* hostBufferInfo, + OrbisNgs2BufferFreeHandler hostFree, OrbisNgs2Handle* outHandle); + } // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_mastering.cpp b/src/core/libraries/ngs2/ngs2_mastering.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_mastering.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_mastering.h b/src/core/libraries/ngs2/ngs2_mastering.h new file mode 100644 index 000000000..e0ba478c3 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_mastering.h @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Mastering; + +struct OrbisNgs2MasteringRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannels; + u32 numPeakMeterBlocks; +}; + +struct OrbisNgs2MasteringVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + + u32 numInputChannels; + u32 flags; +}; + +struct OrbisNgs2MasteringVoiceMatrixParam { + OrbisNgs2VoiceParamHeader header; + + u32 type; + u32 numLevels; + const float* aLevel; +}; + +struct OrbisNgs2MasteringVoiceLfeParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + u32 fc; +}; + +struct OrbisNgs2MasteringVoiceLimiterParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + float threshold; +}; + +struct OrbisNgs2MasteringVoiceGainParam { + OrbisNgs2VoiceParamHeader header; + + float fbwLevel; + float lfeLevel; +}; + +struct OrbisNgs2MasteringVoiceOutputParam { + OrbisNgs2VoiceParamHeader header; + + u32 outputId; + u32 reserved; +}; + +struct OrbisNgs2MasteringVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + u32 enableFlag; + u32 reserved; +}; + +struct OrbisNgs2MasteringVoiceState { + OrbisNgs2VoiceState voiceState; + float limiterPeakLevel; + float limiterPressLevel; + float aInputPeakHeight[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + float aOutputPeakHeight[ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2MasteringRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannels; + u32 reserved; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_pan.cpp b/src/core/libraries/ngs2/ngs2_pan.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_pan.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_pan.h b/src/core/libraries/ngs2/ngs2_pan.h new file mode 100644 index 000000000..d39ec67cd --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_pan.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Pan; + +struct OrbisNgs2PanParam { + float angle; + float distance; + float fbwLevel; + float lfeLevel; +}; + +struct OrbisNgs2PanWork { + float aSpeakerAngle[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + float unitAngle; + u32 numSpeakers; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_report.cpp b/src/core/libraries/ngs2/ngs2_report.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_report.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_report.h b/src/core/libraries/ngs2/ngs2_report.h new file mode 100644 index 000000000..88f6d1df0 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_report.h @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +#include // va_list + +namespace Libraries::Ngs2 { + +class Ngs2Report; + +struct OrbisNgs2ReportDataHeader { + size_t size; + OrbisNgs2Handle handle; + u32 type; + s32 result; +}; + +typedef void (*OrbisNgs2ReportHandler)(const OrbisNgs2ReportDataHeader* data, uintptr_t userData); + +struct OrbisNgs2ReportMessageData { + OrbisNgs2ReportDataHeader header; + const char* message; +}; + +struct OrbisNgs2ReportApiData { + OrbisNgs2ReportDataHeader header; + const char* functionName; + const char* format; + va_list argument; +}; + +struct OrbisNgs2ReportControlData { + OrbisNgs2ReportDataHeader header; + const OrbisNgs2VoiceParamHeader* param; +}; + +struct OrbisNgs2ReportOutputData { + OrbisNgs2ReportDataHeader header; + const OrbisNgs2RenderBufferInfo* bufferInfo; + + u32 bufferIndex; + u32 sampleRate; + u32 numGrainSamples; + u32 reserved; +}; + +struct OrbisNgs2ReportCpuLoadData { + OrbisNgs2ReportDataHeader header; + float totalRatio; + float flushRatio; + float processRatio; + float feedbackRatio; +}; + +struct OrbisNgs2ReportRenderStateData { + OrbisNgs2ReportDataHeader header; + u32 state; + u32 reserved; +}; + +struct OrbisNgs2ReportVoiceWaveformData { + OrbisNgs2ReportDataHeader header; + u32 location; + u32 waveformType; + u32 numChannels; + u32 sampleRate; + u32 numGrainSamples; + u32 reserved; + void* const* aData; +}; + +s32 PS4_SYSV_ABI sceNgs2ReportRegisterHandler(u32 reportType, OrbisNgs2ReportHandler handler, + uintptr_t userData, OrbisNgs2Handle* outHandle); + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_reverb.cpp b/src/core/libraries/ngs2/ngs2_reverb.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_reverb.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_reverb.h b/src/core/libraries/ngs2/ngs2_reverb.h new file mode 100644 index 000000000..715d7480a --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_reverb.h @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Reverb; + +struct OrbisNgs2ReverbRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannels; + u32 reverbSize; +}; + +struct OrbisNgs2ReverbI3DL2Param { + float wet; + float dry; + s32 room; + s32 roomHF; + u32 reflectionPattern; + float decayTime; + float decayHFRatio; + s32 reflections; + float reflectionsDelay; + s32 reverb; + float reverbDelay; + float diffusion; + float density; + float HFReference; + u32 reserve[8]; +}; + +struct OrbisNgs2ReverbVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + + u32 numInputChannels; + u32 numOutputChannels; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2ReverbVoiceI3DL2Param { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2ReverbI3DL2Param i3dl2; +}; + +struct OrbisNgs2ReverbVoiceState { + OrbisNgs2VoiceState voiceState; +}; + +struct OrbisNgs2ReverbRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannels; + u32 reverbSize; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_sampler.cpp b/src/core/libraries/ngs2/ngs2_sampler.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_sampler.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_sampler.h b/src/core/libraries/ngs2/ngs2_sampler.h new file mode 100644 index 000000000..0842b9cb2 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_sampler.h @@ -0,0 +1,162 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Sampler; + +struct OrbisNgs2SamplerRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannelWorks; + u32 maxCodecCaches; + u32 maxWaveformBlocks; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; + u32 numPeakMeterBlocks; +}; + +struct OrbisNgs2SamplerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2WaveformFormat format; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceWaveformBlocksParam { + OrbisNgs2VoiceParamHeader header; + + const void* data; + u32 flags; + u32 numBlocks; + const OrbisNgs2WaveformBlock* aBlock; + // Blocks +}; + +struct OrbisNgs2SamplerVoiceWaveformAddressParam { + OrbisNgs2VoiceParamHeader header; + + const void* from; + const void* to; +}; + +struct OrbisNgs2SamplerVoiceWaveformFrameOffsetParam { + OrbisNgs2VoiceParamHeader header; + + u32 frameOffset; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceExitLoopParam { + OrbisNgs2VoiceParamHeader header; +}; + +struct OrbisNgs2SamplerVoicePitchParam { + OrbisNgs2VoiceParamHeader header; + + float ratio; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceEnvelopeParam { + OrbisNgs2VoiceParamHeader header; + + u32 numForwardPoints; + u32 numReleasePoints; + const OrbisNgs2EnvelopePoint* aPoint; +}; + +struct OrbisNgs2SamplerVoiceDistortionParam { + OrbisNgs2VoiceParamHeader header; + + u32 flags; + float a; + float b; + float clip; + float gate; + float wetLevel; + float dryLevel; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceUserFxParam { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2UserFxProcessHandler handler; + + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; +}; + +struct OrbisNgs2SamplerVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceFilterParam { + OrbisNgs2VoiceParamHeader header; + + u32 index; + u32 location; + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; + u32 reserved3; +}; + +struct OrbisNgs2SamplerVoiceNumFilters { + OrbisNgs2VoiceParamHeader header; + + u32 numFilters; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceState { + OrbisNgs2VoiceState voiceState; + float envelopeHeight; + float peakHeight; + u32 reserved; + u64 numDecodedSamples; + u64 decodedDataSize; + u64 userData; + const void* waveformData; +}; + +struct OrbisNgs2SamplerRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannelWorks; + u32 maxCodecCaches; + u32 maxWaveformBlocks; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_submixer.cpp b/src/core/libraries/ngs2/ngs2_submixer.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_submixer.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_submixer.h b/src/core/libraries/ngs2/ngs2_submixer.h new file mode 100644 index 000000000..df2d8a835 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_submixer.h @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Submixer; + +struct OrbisNgs2SubmixerRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannels; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxInputs; + u32 numPeakMeterBlocks; +}; + +struct OrbisNgs2SubmixerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + u32 numIoChannels; + u32 flags; +}; + +struct OrbisNgs2SubmixerVoiceEnvelopeParam { + OrbisNgs2VoiceParamHeader header; + + u32 numForwardPoints; + u32 numReleasePoints; + const OrbisNgs2EnvelopePoint* aPoint; +}; + +struct OrbisNgs2SubmixerVoiceCompressorParam { + OrbisNgs2VoiceParamHeader header; + + u32 flags; + float threshold; + float ratio; + float knee; + float attackTime; + float releaseTime; + float level; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceDistortionParam { + OrbisNgs2VoiceParamHeader header; + + u32 flags; + float a; + float b; + float clip; + float gate; + float wetLevel; + float dryLevel; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceUserFxParam { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2UserFxProcessHandler handler; + + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; +}; + +struct OrbisNgs2SubmixerVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceFilterParam { + OrbisNgs2VoiceParamHeader header; + + u32 index; + u32 location; + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; + u32 reserved3; +}; + +struct OrbisNgs2SubmixerVoiceNumFilters { + OrbisNgs2VoiceParamHeader header; + + u32 numFilters; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceState { + OrbisNgs2VoiceState voiceState; + float envelopeHeight; + float peakHeight; + float compressorHeight; +}; + +struct OrbisNgs2SubmixerRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannels; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxInputs; +}; + +} // namespace Libraries::Ngs2 From 9c37aa039bff93a2dd11f1aeb500cc047bc6d817 Mon Sep 17 00:00:00 2001 From: illusion0001 <37698908+illusion0001@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:50:21 +1300 Subject: [PATCH 08/22] Add isDevKit bool (#2685) --- src/common/config.cpp | 8 ++++++++ src/common/config.h | 1 + src/core/memory.cpp | 10 ++++++++++ 3 files changed, 19 insertions(+) diff --git a/src/common/config.cpp b/src/common/config.cpp index e0a348fbe..16d9e5724 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -32,6 +32,7 @@ std::filesystem::path find_fs_path_or(const basic_value& v, const K& ky, namespace Config { static bool isNeo = false; +static bool isDevKit = false; static bool playBGM = false; static bool isTrophyPopupDisabled = false; static int BGMvolume = 50; @@ -167,6 +168,10 @@ bool isNeoModeConsole() { return isNeo; } +bool isDevKitConsole() { + return isDevKit; +} + bool getIsFullscreen() { return isFullscreen; } @@ -755,6 +760,7 @@ void load(const std::filesystem::path& path) { const toml::value& general = data.at("General"); isNeo = toml::find_or(general, "isPS4Pro", false); + isDevKit = toml::find_or(general, "isDevKit", false); playBGM = toml::find_or(general, "playBGM", false); isTrophyPopupDisabled = toml::find_or(general, "isTrophyPopupDisabled", false); trophyNotificationDuration = @@ -955,6 +961,7 @@ void save(const std::filesystem::path& path) { } data["General"]["isPS4Pro"] = isNeo; + data["General"]["isDevKit"] = isDevKit; data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled; data["General"]["trophyNotificationDuration"] = trophyNotificationDuration; data["General"]["playBGM"] = playBGM; @@ -1101,6 +1108,7 @@ void saveMainWindow(const std::filesystem::path& path) { void setDefaultValues() { isHDRAllowed = false; isNeo = false; + isDevKit = false; isFullscreen = false; isTrophyPopupDisabled = false; playBGM = false; diff --git a/src/common/config.h b/src/common/config.h index 4202da88a..1025e9956 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -28,6 +28,7 @@ void setLoadGameSizeEnabled(bool enable); bool getIsFullscreen(); std::string getFullscreenMode(); bool isNeoModeConsole(); +bool isDevKitConsole(); bool getPlayBGM(); int getBGMvolume(); bool getisTrophyPopupDisabled(); diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 98d587e00..8b108a654 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -38,6 +38,16 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1 bool use_extended_mem2) { const bool is_neo = ::Libraries::Kernel::sceKernelIsNeoMode(); auto total_size = is_neo ? SCE_KERNEL_TOTAL_MEM_PRO : SCE_KERNEL_TOTAL_MEM; + if (Config::isDevKitConsole()) { + const auto old_size = total_size; + // Assuming 2gb is neo for now, will need to link it with sceKernelIsDevKit + total_size += is_neo ? 2_GB : 768_MB; + LOG_WARNING(Kernel_Vmm, + "Config::isDevKitConsole is enabled! Added additional {:s} of direct memory.", + is_neo ? "2 GB" : "768 MB"); + LOG_WARNING(Kernel_Vmm, "Old Direct Size: {:#x} -> New Direct Size: {:#x}", old_size, + total_size); + } if (!use_extended_mem1 && is_neo) { total_size -= 256_MB; } From 5caab76a4557b2721898e1257356ad3b3356dd2f Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 26 Mar 2025 22:03:50 +0100 Subject: [PATCH 09/22] Implement DmaDataSrc::MemoryUsingL2 and DmaDataDst::MemoryUsingL2 (#2680) * Implement DmaDataSrc::MemoryUsingL2 and DmaDataDst::MemoryUsingL2 * Add L2 handling to the other place it's used --- src/video_core/amdgpu/liverpool.cpp | 30 +++++++++++++++++++---------- src/video_core/amdgpu/pm4_cmds.h | 2 ++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index bfe99c754..967b952c6 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -602,20 +602,25 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spansrc_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32), true); - } else if (dma_data->src_sel == DmaDataSrc::Memory && + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress(), dma_data->NumBytes(), true); } else if (dma_data->src_sel == DmaDataSrc::Data && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), &dma_data->data, sizeof(u32), false); } else if (dma_data->src_sel == DmaDataSrc::Gds && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { // LOG_WARNING(Render_Vulkan, "GDS memory read"); - } else if (dma_data->src_sel == DmaDataSrc::Memory && - dma_data->dst_sel == DmaDataDst::Memory) { + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), dma_data->SrcAddress(), dma_data->NumBytes(), false); @@ -785,19 +790,24 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq } if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32), true); - } else if (dma_data->src_sel == DmaDataSrc::Memory && + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress(), dma_data->NumBytes(), true); } else if (dma_data->src_sel == DmaDataSrc::Data && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), &dma_data->data, sizeof(u32), false); } else if (dma_data->src_sel == DmaDataSrc::Gds && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { // LOG_WARNING(Render_Vulkan, "GDS memory read"); - } else if (dma_data->src_sel == DmaDataSrc::Memory && - dma_data->dst_sel == DmaDataDst::Memory) { + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), dma_data->SrcAddress(), dma_data->NumBytes(), false); diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index e92ba17fa..ae1d32e00 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -377,12 +377,14 @@ struct PM4CmdAcquireMem { enum class DmaDataDst : u32 { Memory = 0, Gds = 1, + MemoryUsingL2 = 3, }; enum class DmaDataSrc : u32 { Memory = 0, Gds = 1, Data = 2, + MemoryUsingL2 = 3, }; struct PM4DmaData { From ae2c9a745e43a1156405ba84ebf646882a744d71 Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:50:52 -0600 Subject: [PATCH 10/22] Gui: Adding Pause button working, full screen button and labels to buttons on main window gui (#2634) * Adding names to gui buttoms and adjusting spacing. * moving refresh button to last slot. * Changing the implementation to tooltips for hover over them - qstring to detect background color. * Fixing some themes with inverted tooltip base * Suggestions / Fixes - Pause and FullScreen Buttons * Update REUSE.toml * cleaning up * Icons stuff * clang * Buttons toggle - Cleaning code - Fixing Icons * cleaning boolean * Toggle pause and play icons and label to "Resume" when paused. * Simplifying the toggles. * New icons and final Push to review * Reuse * Icon rename, adding f9 press for pause game when no gui is on without needed of debug menu * clang + reuse * clang dosent work on this part * again Clang * Last fix for review. Light theme white resume icon fix. * Proper fix for Resume icon * New Rebase * Fixed Orientation with docking issues and cleaning boxlayout code * Adding spacer to separate actions, sizeslider on top of search bar. And adding margins * Fixed Background not showing on OLED Theme * Fixing check marks * Adding all Daniel Suggestions and fixed F9 not working with debug menu open. * Clang * reverting all OLED theme changes * Final suggestions --- REUSE.toml | 4 +- src/common/config.cpp | 12 +++ src/common/config.h | 2 + src/core/devtools/layer.cpp | 43 +++++--- src/core/devtools/layer.h | 1 + src/images/controller_icon.png | Bin 9102 -> 4142 bytes src/images/fullscreen_icon.png | Bin 0 -> 2590 bytes src/images/pause_icon.png | Bin 965 -> 1972 bytes src/images/play_icon.png | Bin 1150 -> 2875 bytes src/images/refresh_icon.png | Bin 3381 -> 0 bytes src/images/refreshlist_icon.png | Bin 0 -> 3247 bytes src/images/restart_game_icon.png | Bin 0 -> 3935 bytes src/images/settings_icon.png | Bin 2219 -> 4543 bytes src/images/stop_icon.png | Bin 658 -> 1601 bytes src/qt_gui/main_window.cpp | 168 ++++++++++++++++++++++++++++-- src/qt_gui/main_window.h | 12 +++ src/qt_gui/main_window_themes.cpp | 45 ++++---- src/qt_gui/main_window_ui.h | 32 ++++-- src/sdl_window.cpp | 20 ++++ src/sdl_window.h | 2 + src/shadps4.qrc | 74 ++++++------- 21 files changed, 324 insertions(+), 91 deletions(-) create mode 100644 src/images/fullscreen_icon.png delete mode 100644 src/images/refresh_icon.png create mode 100644 src/images/refreshlist_icon.png create mode 100644 src/images/restart_game_icon.png diff --git a/REUSE.toml b/REUSE.toml index 793990bd8..ad2bc3678 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -49,8 +49,10 @@ path = [ "src/images/pause_icon.png", "src/images/play_icon.png", "src/images/ps4_controller.png", - "src/images/refresh_icon.png", + "src/images/restart_game_icon.png", + "src/images/refreshlist_icon.png", "src/images/settings_icon.png", + "src/images/fullscreen_icon.png", "src/images/stop_icon.png", "src/images/utils_icon.png", "src/images/shadPS4.icns", diff --git a/src/common/config.cpp b/src/common/config.cpp index 16d9e5724..09236f30c 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -107,6 +107,7 @@ static bool showBackgroundImage = true; static bool isFullscreen = false; static std::string fullscreenMode = "Windowed"; static bool isHDRAllowed = false; +static bool showLabelsUnderIcons = true; // Language u32 m_language = 1; // english @@ -176,6 +177,14 @@ bool getIsFullscreen() { return isFullscreen; } +bool getShowLabelsUnderIcons() { + return showLabelsUnderIcons; +} + +bool setShowLabelsUnderIcons() { + return false; +} + std::string getFullscreenMode() { return fullscreenMode; } @@ -427,6 +436,9 @@ void setVblankDiv(u32 value) { void setIsFullscreen(bool enable) { isFullscreen = enable; } +static void setShowLabelsUnderIcons(bool enable) { + showLabelsUnderIcons = enable; +} void setFullscreenMode(std::string mode) { fullscreenMode = mode; diff --git a/src/common/config.h b/src/common/config.h index 1025e9956..3a0bf252c 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -26,6 +26,8 @@ bool GetLoadGameSizeEnabled(); std::filesystem::path GetSaveDataPath(); void setLoadGameSizeEnabled(bool enable); bool getIsFullscreen(); +bool getShowLabelsUnderIcons(); +bool setShowLabelsUnderIcons(); std::string getFullscreenMode(); bool isNeoModeConsole(); bool isDevKitConsole(); diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 87fd9ffb3..94b39e801 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "SDL3/SDL_log.h" #include "layer.h" #include @@ -117,22 +118,6 @@ void L::DrawMenuBar() { EndMainMenuBar(); } - - if (IsKeyPressed(ImGuiKey_F9, false)) { - if (io.KeyCtrl && io.KeyAlt) { - if (!DebugState.ShouldPauseInSubmit()) { - DebugState.RequestFrameDump(dump_frame_count); - } - } - if (!io.KeyCtrl && !io.KeyAlt) { - if (isSystemPaused) { - DebugState.ResumeGuestThreads(); - } else { - DebugState.PauseGuestThreads(); - } - } - } - if (open_popup_options) { OpenPopup("GPU Tools Options"); just_opened_options = true; @@ -381,6 +366,32 @@ void L::Draw() { visibility_toggled = true; } + if (IsKeyPressed(ImGuiKey_F9, false)) { + if (io.KeyCtrl && io.KeyAlt) { + if (!DebugState.ShouldPauseInSubmit()) { + DebugState.RequestFrameDump(dump_frame_count); + } + } else { + if (DebugState.IsGuestThreadsPaused()) { + DebugState.ResumeGuestThreads(); + SDL_Log("Game resumed from Keyboard"); + show_pause_status = false; + } else { + DebugState.PauseGuestThreads(); + SDL_Log("Game paused from Keyboard"); + show_pause_status = true; + } + visibility_toggled = true; + } + } + + if (show_pause_status) { + ImVec2 pos = ImVec2(10, 10); + ImU32 color = IM_COL32(255, 255, 255, 255); + + ImGui::GetForegroundDrawList()->AddText(pos, color, "Game Paused Press F9 to Resume"); + } + if (show_simple_fps) { if (Begin("Video Info", nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration | diff --git a/src/core/devtools/layer.h b/src/core/devtools/layer.h index 5bb53fbdb..9e949c8e9 100644 --- a/src/core/devtools/layer.h +++ b/src/core/devtools/layer.h @@ -19,6 +19,7 @@ public: static void SetupSettings(); void Draw() override; + bool show_pause_status = false; }; } // namespace Core::Devtools diff --git a/src/images/controller_icon.png b/src/images/controller_icon.png index 40c92a89bc53a9447d223c3c45286afe3b3d1673..0d5556329e55f8b1854821536a58a1ecd4d4528b 100644 GIT binary patch literal 4142 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 literal 9102 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 Vg{rUqYX$}e22WQ%mvv4FO#qyyIb{F< diff --git a/src/images/fullscreen_icon.png b/src/images/fullscreen_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..719ffe4a19b842f711a4cd6be61fcbfb668b6ef1 GIT binary patch literal 2590 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 diff --git a/src/images/play_icon.png b/src/images/play_icon.png index 2815be39d8594b213fad22e68c7e8ac16872d639..d50d404b79bc4b5f5e7122e2f30cb5663ad3c4ad 100644 GIT binary patch delta 2848 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 UBOv-_9jI04>FVdQ&MBb@04J*$4FCWD delta 1112 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 TH1#3_0|SGntDnm{r-UW|_p(8M diff --git a/src/images/refreshlist_icon.png b/src/images/refreshlist_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7de6685b27e195b1517d5058f11e48b079f4ee08 GIT binary patch literal 3247 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 W9BozL&C3lMr|@+3b6Mw<&;$T-^fr(H delta 2190 zcmdn5yjpOA%0x$zdX8967srr_IdA7i=7hP59RL4U>r~v44Kq%BTcE1J$bUydq zcjes7oyFE~FP8XXh_I9NcGLZNJZLlDDf#t?=I?gK## zuPt?--Vgooe@fB324yzJ3gH9k40X&G(q?MB=VQockdSaY-Y3ZLufvdIl}jogf3wis zTsb!7+1uI}JI`_UGdrcSD;4lIg!MCDI#tTTBbjtz<#C1@-UU(zviz?8*`3Vxb7fzH zqHt^9lKoR9rUWJh_#K!~e_Uj4#id2;q1Ia?6HU%UE_rd}uh`rlix=rw*|70ME`4#t zs#|VN@RY4aJ#CV%41C&FA7i`yVisw3T~T=IO{JWl%w?Np+vB)lYPSA%-%Wnsoa7>w->kf_u5$`}uiZO*PVoLFotumnhc?+Qw)k(e^ks7)=Qif~+)XuIhZ1*R;J2PEYWeVUwd zm#nydnR^M>gzbx3@xybzD6?ss zFxckoa1Fg_=dt#Ex8I?eZ>A{wHgB9e`%<=@){*)?uGz^vF2A>Q^0(Pl#ICsB{kN`t zk+Bhd>=r&2Qfr+lT3s``FC zH}Ol@6hGz}k2C6LS&1Cvb7bG(=2uT6Q}}>F*TX@WN={Ur$sk7IeH1e<5}A*xba;S8HxKeDt_3B5;r| z?!9B|yocOQyXrC?{??8ATD-Jvdio+e(WA50zSTRexy&V5*goUqhx$E97yhZeTkZ1V zaJ!zTg4G`0?to`LXJ-qh@6*4yM>FusUu7P?Wn24rv)wLa|Bz|mZb~rav*DSo>=&$+ zC%P>9l|%3n_K!^8JtwKP{4ZR;;q-#qpS^9nR(f+vRBN%Cc6YwZUQuw(;%x0iu4f$n zyl>By_=tY$FVuK$v2fn+$%2lGF#Rs z-Wt5IPn0w2Zkgt*sJsc`TX!#E*D75R({y5g_;EJZdt2q6gsfFAS$Cl@ZsK>v7&m4o zzLVRSgJv$+?lXsR;kM;{2B}MXYP*)VU-@RGB~sbHJSXt}$`jtwvqC<)_=uhoQLO(T z(O%Tozw>SF&5x-{`aWVgs=96Lhu<}&KaOhOv`*ab#$BGba;usjO1|sf^DwG3NSkNX zOJ1GMz@}F!U32Cy2`o)o6thJA-!qQXY22w-rP;UxE_U+1ZFG`jBj$_}iJYie5)%OQ+77#5VI1vsh7D z3v*f$n^tD~#M#r1m^{og%1BYw<_cB2^KnnZYdN`3Wm}fc*!%2r+9A`zqJoWIU!M%K zncOxn;cm#ala0%^-sk;%&3c!>6mxac0~56N_bGw;xCT=WmgMLB|_)D(`~XX5-L@Fd#dlSZ0LNp1vt1^V<1pMpx5=$voBVSES+;_8w6GAjuiy9xkIlP>4 zH(s7Qb%1Nzm)r+i=4{>eUGmkkmtA=x5vw->+*jtUv#RX z-FW`>?leVz?c;YhrLJ)lIHN1mnYH$4`= zy}VfN$-bnS8ahWFE>6(=n-iz3{cGFi*Y&TY{#C9|%vkPZw8Zk`qYP6U)!R!xBzkiD zRme>E@G_KpTb0ZNi}=@?5pAE_Rbu&%o$LtgVzT5(5I?(XhM|OXv0cG@tF>>Q`sDwc z#mK5xH+8OXSW(1*vwuDt{kzTdFaDG;q^cL-U}0h`IkSIZ^H00w-`{F8FfcH9y85}W JtaD0e0ssNo0Nwxq diff --git a/src/images/stop_icon.png b/src/images/stop_icon.png index 74c615f65a54bd8380a3e67f689d86038019edc6..55b6b01c7c4c20ce586a0145ccbbfe7db38cfc43 100644 GIT binary patch literal 1601 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_ts7>k44ofy`glX=O&z`&C3 z=3utn7}H7EG-zA7@)cg4GcgEzO6gFMdG?rKLZ2H2TvEr zkczmsbG=uDrb@Jxhi{&Jt2IDTOM9+`rj&?KY{7#Ao%3dy@v`$aE$Ud4F-7=bqlvbb zdyul?rqe4zCd^`SlJ%P|taizD*Zr&Ce}0eb-unIL|Gn4mJ?F8Dde6+iuGHdr&Y!sd z|Nmc;`th~LP!mMM|4;6Jvi{SSIaBAKI6P^6|59It@RMhYy6>pHpTv@Q%-P`h)7zh% zf4)3)eOcPl8jpSYk(0`*?oT$JG|TVk(NC;Dr=F>8m>ZMzbI+1(kzUpIns&PK6U{%e zZq`{d&HQxsQ$tT-1F>^F+g9qQ>ZR^3d9Hf<`qZL^I}7XjYXa>iygTNc{eAnB=3Tdb zh1GxeR=t}cZ4q2{dhyG=#)nLwPRmW!U%K09OM(5#_bR_1o&OYn^QnV{__}F1p4U%? zPI7Mww9)*2a+j){-h;BAJND?`efse5{VDpVl_%ZXeR}ocMXMMOZa8hDRemb4M&bJ@ z=a+iSvJACG`)!^_{_MGFG*Vz@ZoLPQvh0i)%J9YZ^^hk>X zmc~(E_nKdC+W{pDD>IOmU(%r5e@v`@X1Z0p^Z*TsCths|_x*;4cUSN_cU_cTF4 zCDdv~X6E!SL2DidSZB>>o^_qSG6_XYuCRy z8%2&?UAL~*SU{M8U5IC>p`J8_wg1`cjSbhT`SE+rdQUPOqen2`sMCfjeivWzlhgs+L*_qspn^D<{BY;Wu3{Ssk8py*e}EL zWXhkt^)sJVon-NDQ=3&5uv&Lg;2PB%GxxoX=VLQc_y4ZH+2Hon!bNAQOyBNs4KmIO zZ<-bS+r?O5+PUYOOnQ4Acb_S%jW9ZRNqZ^J)|)Dl&HJ3EwTT#4O`UaJ`D+{d9pkq@ z+$^(1@90amoY>&9&C<#BoOoS)_}VN7iSMVDKhd-7>VFblWOldnVOWofK__}lz4&ql{Q%KVv3nWaD&hqKac zz8&^D^Cus_beH4B%ygCJ(w_>u|D5waC$?-g-+_DPJg3_YexyyipOrbSfBnK=wr0(YHj$lY4dX5TTjZ(dLkJdr6{^)O8yhh zpEIBQu1xxF>|tGTE@Ami{rJge7VGbw=jC%r^x~o1spThbt4{u8neHLO*B;GBAM z$N8^IWF+s@q*@(%z4{|-jm^VF_f&aRZMWp`EZ_6pP5jsCBS-gm-I`{y`r9k7TN6#Z z&K#}`7QgKIXA7^PSZLo;mnqAaU7Pgv$aWomj zeY-xMtnfZ_IC8T1mD!I@v=zp@k&7~uTW+&1DUR2AMnRxze{Jf4iSEBlkHwxleDDxs z#2n|P?6Gj&cTvnKevH-UY3`s@)|967h8Pb6Mw<&;$Um{2wF$ diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 27551e997..3420e933e 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -1,6 +1,8 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "SDL3/SDL_events.h" + #include #include #include @@ -132,23 +134,160 @@ void MainWindow::CreateActions() { m_theme_act_group->addAction(ui->setThemeOled); } +void MainWindow::PauseGame() { + SDL_Event event; + SDL_memset(&event, 0, sizeof(event)); + event.type = SDL_EVENT_TOGGLE_PAUSE; + is_paused = !is_paused; + UpdateToolbarButtons(); + SDL_PushEvent(&event); +} + +void MainWindow::toggleLabelsUnderIcons() { + bool showLabels = ui->toggleLabelsAct->isChecked(); + Config::setShowLabelsUnderIcons(); + UpdateToolbarLabels(); + if (isGameRunning) { + UpdateToolbarButtons(); + } +} + +void MainWindow::toggleFullscreen() { + SDL_Event event; + SDL_memset(&event, 0, sizeof(event)); + event.type = SDL_EVENT_TOGGLE_FULLSCREEN; + SDL_PushEvent(&event); +} + +QWidget* MainWindow::createButtonWithLabel(QPushButton* button, const QString& labelText, + bool showLabel) { + QWidget* container = new QWidget(this); + QVBoxLayout* layout = new QVBoxLayout(container); + layout->setAlignment(Qt::AlignCenter | Qt::AlignBottom); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(button); + + QLabel* label = nullptr; + if (showLabel && ui->toggleLabelsAct->isChecked()) { + label = new QLabel(labelText, this); + label->setAlignment(Qt::AlignCenter | Qt::AlignBottom); + layout->addWidget(label); + button->setToolTip(""); + } else { + button->setToolTip(labelText); + } + + container->setLayout(layout); + container->setProperty("buttonLabel", QVariant::fromValue(label)); + return container; +} + +QWidget* createSpacer(QWidget* parent) { + QWidget* spacer = new QWidget(parent); + spacer->setFixedWidth(15); + spacer->setFixedHeight(15); + return spacer; +} + void MainWindow::AddUiWidgets() { // add toolbar widgets QApplication::setStyle("Fusion"); - ui->toolBar->setObjectName("mw_toolbar"); - ui->toolBar->addWidget(ui->playButton); - ui->toolBar->addWidget(ui->pauseButton); - ui->toolBar->addWidget(ui->stopButton); - ui->toolBar->addWidget(ui->refreshButton); - ui->toolBar->addWidget(ui->settingsButton); - ui->toolBar->addWidget(ui->controllerButton); - ui->toolBar->addWidget(ui->keyboardButton); + + bool showLabels = ui->toggleLabelsAct->isChecked(); + ui->toolBar->clear(); + + ui->toolBar->addWidget(createSpacer(this)); + ui->toolBar->addWidget(createButtonWithLabel(ui->playButton, tr("Play"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->pauseButton, tr("Pause"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->stopButton, tr("Stop"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->restartButton, tr("Restart"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); + ui->toolBar->addWidget(createButtonWithLabel(ui->settingsButton, tr("Settings"), showLabels)); + ui->toolBar->addWidget( + createButtonWithLabel(ui->fullscreenButton, tr("Full Screen"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); + ui->toolBar->addWidget( + createButtonWithLabel(ui->controllerButton, tr("Controllers"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->keyboardButton, tr("Keyboard"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); QFrame* line = new QFrame(this); - line->setFrameShape(QFrame::StyledPanel); + line->setFrameShape(QFrame::VLine); line->setFrameShadow(QFrame::Sunken); + line->setMinimumWidth(2); ui->toolBar->addWidget(line); - ui->toolBar->addWidget(ui->sizeSliderContainer); - ui->toolBar->addWidget(ui->mw_searchbar); + ui->toolBar->addWidget(createSpacer(this)); + if (showLabels) { + QLabel* pauseButtonLabel = ui->pauseButton->parentWidget()->findChild(); + if (pauseButtonLabel) { + pauseButtonLabel->setVisible(false); + } + } + ui->toolBar->addWidget( + createButtonWithLabel(ui->refreshButton, tr("Refresh List"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); + + QBoxLayout* toolbarLayout = new QBoxLayout(QBoxLayout::TopToBottom); + toolbarLayout->setSpacing(2); + toolbarLayout->setContentsMargins(2, 2, 2, 2); + ui->sizeSliderContainer->setFixedWidth(150); + + QWidget* searchSliderContainer = new QWidget(this); + QBoxLayout* searchSliderLayout = new QBoxLayout(QBoxLayout::TopToBottom); + searchSliderLayout->setContentsMargins(0, 0, 6, 6); + searchSliderLayout->setSpacing(2); + ui->mw_searchbar->setFixedWidth(150); + + searchSliderLayout->addWidget(ui->sizeSliderContainer); + searchSliderLayout->addWidget(ui->mw_searchbar); + + searchSliderContainer->setLayout(searchSliderLayout); + + ui->toolBar->addWidget(searchSliderContainer); + + if (!showLabels) { + toolbarLayout->addWidget(searchSliderContainer); + } + + ui->playButton->setVisible(true); + ui->pauseButton->setVisible(false); +} + +void MainWindow::UpdateToolbarButtons() { + // add toolbar widgets when game is running + bool showLabels = ui->toggleLabelsAct->isChecked(); + + ui->playButton->setVisible(false); + ui->pauseButton->setVisible(true); + + if (showLabels) { + QLabel* playButtonLabel = ui->playButton->parentWidget()->findChild(); + if (playButtonLabel) + playButtonLabel->setVisible(false); + } + + if (is_paused) { + ui->pauseButton->setIcon(ui->playButton->icon()); + ui->pauseButton->setToolTip(tr("Resume")); + } else { + if (isIconBlack) { + ui->pauseButton->setIcon(QIcon(":images/pause_icon.png")); + } else { + ui->pauseButton->setIcon(RecolorIcon(QIcon(":images/pause_icon.png"), isWhite)); + } + ui->pauseButton->setToolTip(tr("Pause")); + } + + if (showLabels) { + QLabel* pauseButtonLabel = ui->pauseButton->parentWidget()->findChild(); + if (pauseButtonLabel) { + pauseButtonLabel->setText(is_paused ? tr("Resume") : tr("Pause")); + pauseButtonLabel->setVisible(true); + } + } +} + +void MainWindow::UpdateToolbarLabels() { + AddUiWidgets(); } void MainWindow::CreateDockWindows() { @@ -253,6 +392,8 @@ void MainWindow::CreateConnects() { connect(ui->refreshButton, &QPushButton::clicked, this, &MainWindow::RefreshGameTable); connect(ui->showGameListAct, &QAction::triggered, this, &MainWindow::ShowGameList); connect(this, &MainWindow::ExtractionFinished, this, &MainWindow::RefreshGameTable); + connect(ui->toggleLabelsAct, &QAction::toggled, this, &MainWindow::toggleLabelsUnderIcons); + connect(ui->fullscreenButton, &QPushButton::clicked, this, &MainWindow::toggleFullscreen); connect(ui->sizeSlider, &QSlider::valueChanged, this, [this](int value) { if (isTableList) { @@ -276,6 +417,7 @@ void MainWindow::CreateConnects() { }); connect(ui->playButton, &QPushButton::clicked, this, &MainWindow::StartGame); + connect(ui->pauseButton, &QPushButton::clicked, this, &MainWindow::PauseGame); connect(m_game_grid_frame.get(), &QTableWidget::cellDoubleClicked, this, &MainWindow::StartGame); connect(m_game_list_frame.get(), &QTableWidget::cellDoubleClicked, this, @@ -743,6 +885,8 @@ void MainWindow::StartGame() { return; } StartEmulator(path); + + UpdateToolbarButtons(); } } @@ -1217,7 +1361,9 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->pauseButton->setIcon(RecolorIcon(ui->pauseButton->icon(), isWhite)); ui->stopButton->setIcon(RecolorIcon(ui->stopButton->icon(), isWhite)); ui->refreshButton->setIcon(RecolorIcon(ui->refreshButton->icon(), isWhite)); + ui->restartButton->setIcon(RecolorIcon(ui->restartButton->icon(), isWhite)); ui->settingsButton->setIcon(RecolorIcon(ui->settingsButton->icon(), isWhite)); + ui->fullscreenButton->setIcon(RecolorIcon(ui->fullscreenButton->icon(), isWhite)); ui->controllerButton->setIcon(RecolorIcon(ui->controllerButton->icon(), isWhite)); ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite)); ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite)); diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index 5ac56e44c..bcd5e53ba 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -5,6 +5,7 @@ #include #include +#include #include #include "background_music_player.h" @@ -38,6 +39,8 @@ public: void InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg); void InstallDirectory(); void StartGame(); + void PauseGame(); + bool showLabels; private Q_SLOTS: void ConfigureGuiFromSettings(); @@ -47,15 +50,21 @@ private Q_SLOTS: void RefreshGameTable(); void HandleResize(QResizeEvent* event); void OnLanguageChanged(const std::string& locale); + void toggleLabelsUnderIcons(); private: Ui_MainWindow* ui; void AddUiWidgets(); + void UpdateToolbarLabels(); + void UpdateToolbarButtons(); + QWidget* createButtonWithLabel(QPushButton* button, const QString& labelText, bool showLabel); void CreateActions(); + void toggleFullscreen(); void CreateRecentGameActions(); void CreateDockWindows(); void GetPhysicalDevices(); void LoadGameLists(); + #ifdef ENABLE_UPDATER void CheckUpdateMain(bool checkSave); #endif @@ -73,6 +82,9 @@ private: bool isIconBlack = false; bool isTableList = true; bool isGameRunning = false; + bool isWhite = false; + bool is_paused = false; + QActionGroup* m_icon_size_act_group = nullptr; QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_theme_act_group = nullptr; diff --git a/src/qt_gui/main_window_themes.cpp b/src/qt_gui/main_window_themes.cpp index c5574fca9..624673cba 100644 --- a/src/qt_gui/main_window_themes.cpp +++ b/src/qt_gui/main_window_themes.cpp @@ -19,7 +19,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); themePalette.setColor(QPalette::Base, QColor(20, 20, 20)); themePalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53)); - themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipBase, QColor(20, 20, 20)); themePalette.setColor(QPalette::ToolTipText, Qt::white); themePalette.setColor(QPalette::Text, Qt::white); themePalette.setColor(QPalette::Button, QColor(53, 53, 53)); @@ -37,18 +37,18 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { "border-radius: 4px; padding: 5px; }" "QLineEdit:focus {" "border: 1px solid #2A82DA; }"); - themePalette.setColor(QPalette::Window, QColor(240, 240, 240)); // Light gray - themePalette.setColor(QPalette::WindowText, Qt::black); // Black - themePalette.setColor(QPalette::Base, QColor(230, 230, 230, 80)); // Grayish - themePalette.setColor(QPalette::ToolTipBase, Qt::black); // Black - themePalette.setColor(QPalette::ToolTipText, Qt::black); // Black - themePalette.setColor(QPalette::Text, Qt::black); // Black - themePalette.setColor(QPalette::Button, QColor(240, 240, 240)); // Light gray - themePalette.setColor(QPalette::ButtonText, Qt::black); // Black - themePalette.setColor(QPalette::BrightText, Qt::red); // Red - themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); // Blue - themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); // Blue - themePalette.setColor(QPalette::HighlightedText, Qt::white); // White + themePalette.setColor(QPalette::Window, QColor(240, 240, 240)); // Light gray + themePalette.setColor(QPalette::WindowText, Qt::black); // Black + themePalette.setColor(QPalette::Base, QColor(230, 230, 230, 80)); // Grayish + themePalette.setColor(QPalette::ToolTipBase, QColor(230, 230, 230, 80)); // Grayish + themePalette.setColor(QPalette::ToolTipText, Qt::black); // Black + themePalette.setColor(QPalette::Text, Qt::black); // Black + themePalette.setColor(QPalette::Button, QColor(240, 240, 240)); // Light gray + themePalette.setColor(QPalette::ButtonText, Qt::black); // Black + themePalette.setColor(QPalette::BrightText, Qt::red); // Red + themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); // Blue + themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); // Blue + themePalette.setColor(QPalette::HighlightedText, Qt::white); // White qApp->setPalette(themePalette); break; case Theme::Green: @@ -62,8 +62,9 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); // White text themePalette.setColor(QPalette::Base, QColor(25, 40, 25)); // Darker green base themePalette.setColor(QPalette::AlternateBase, - QColor(53, 69, 53)); // Dark green alternate base - themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background + QColor(53, 69, 53)); // Dark green alternate base + themePalette.setColor(QPalette::ToolTipBase, + QColor(25, 40, 25)); // White tooltip background themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text themePalette.setColor(QPalette::Text, Qt::white); // White text themePalette.setColor(QPalette::Button, QColor(53, 69, 53)); // Dark green button @@ -85,8 +86,9 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); // White text themePalette.setColor(QPalette::Base, QColor(20, 40, 60)); // Darker blue base themePalette.setColor(QPalette::AlternateBase, - QColor(40, 60, 90)); // Dark blue alternate base - themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background + QColor(40, 60, 90)); // Dark blue alternate base + themePalette.setColor(QPalette::ToolTipBase, + QColor(20, 40, 60)); // White tooltip background themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text themePalette.setColor(QPalette::Text, Qt::white); // White text themePalette.setColor(QPalette::Button, QColor(40, 60, 90)); // Dark blue button @@ -109,8 +111,9 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); // White text themePalette.setColor(QPalette::Base, QColor(80, 30, 90)); // Darker violet base themePalette.setColor(QPalette::AlternateBase, - QColor(100, 50, 120)); // Violet alternate base - themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background + QColor(100, 50, 120)); // Violet alternate base + themePalette.setColor(QPalette::ToolTipBase, + QColor(80, 30, 90)); // White tooltip background themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text themePalette.setColor(QPalette::Text, Qt::white); // White text themePalette.setColor(QPalette::Button, QColor(100, 50, 120)); // Violet button @@ -133,7 +136,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, QColor(249, 245, 215)); themePalette.setColor(QPalette::Base, QColor(29, 32, 33)); themePalette.setColor(QPalette::AlternateBase, QColor(50, 48, 47)); - themePalette.setColor(QPalette::ToolTipBase, QColor(249, 245, 215)); + themePalette.setColor(QPalette::ToolTipBase, QColor(29, 32, 33)); themePalette.setColor(QPalette::ToolTipText, QColor(249, 245, 215)); themePalette.setColor(QPalette::Text, QColor(249, 245, 215)); themePalette.setColor(QPalette::Button, QColor(40, 40, 40)); @@ -155,7 +158,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, QColor(192, 202, 245)); themePalette.setColor(QPalette::Base, QColor(25, 28, 39)); themePalette.setColor(QPalette::AlternateBase, QColor(36, 40, 59)); - themePalette.setColor(QPalette::ToolTipBase, QColor(192, 202, 245)); + themePalette.setColor(QPalette::ToolTipBase, QColor(25, 28, 39)); themePalette.setColor(QPalette::ToolTipText, QColor(192, 202, 245)); themePalette.setColor(QPalette::Text, QColor(192, 202, 245)); themePalette.setColor(QPalette::Button, QColor(30, 30, 41)); diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 246c2afd6..c4f47b636 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -20,6 +20,7 @@ public: QAction* setIconSizeSmallAct; QAction* setIconSizeMediumAct; QAction* setIconSizeLargeAct; + QAction* toggleLabelsAct; QAction* setlistModeListAct; QAction* setlistModeGridAct; QAction* setlistElfAct; @@ -50,6 +51,8 @@ public: QPushButton* settingsButton; QPushButton* controllerButton; QPushButton* keyboardButton; + QPushButton* fullscreenButton; + QPushButton* restartButton; QWidget* sizeSliderContainer; QHBoxLayout* sizeSliderContainer_layout; @@ -104,7 +107,15 @@ public: showGameListAct->setCheckable(true); refreshGameListAct = new QAction(MainWindow); refreshGameListAct->setObjectName("refreshGameListAct"); - refreshGameListAct->setIcon(QIcon(":images/refresh_icon.png")); + refreshGameListAct->setIcon(QIcon(":images/refreshlist_icon.png")); + + toggleLabelsAct = new QAction(MainWindow); + toggleLabelsAct->setObjectName("toggleLabelsAct"); + toggleLabelsAct->setText( + QCoreApplication::translate("MainWindow", "Show Labels Under Icons")); + toggleLabelsAct->setCheckable(true); + toggleLabelsAct->setChecked(Config::getShowLabelsUnderIcons()); + setIconSizeTinyAct = new QAction(MainWindow); setIconSizeTinyAct->setObjectName("setIconSizeTinyAct"); setIconSizeTinyAct->setCheckable(true); @@ -210,20 +221,28 @@ public: stopButton->setIconSize(QSize(40, 40)); refreshButton = new QPushButton(centralWidget); refreshButton->setFlat(true); - refreshButton->setIcon(QIcon(":images/refresh_icon.png")); - refreshButton->setIconSize(QSize(32, 32)); + refreshButton->setIcon(QIcon(":images/refreshlist_icon.png")); + refreshButton->setIconSize(QSize(40, 40)); + fullscreenButton = new QPushButton(centralWidget); + fullscreenButton->setFlat(true); + fullscreenButton->setIcon(QIcon(":images/fullscreen_icon.png")); + fullscreenButton->setIconSize(QSize(38, 38)); settingsButton = new QPushButton(centralWidget); settingsButton->setFlat(true); settingsButton->setIcon(QIcon(":images/settings_icon.png")); - settingsButton->setIconSize(QSize(44, 44)); + settingsButton->setIconSize(QSize(40, 40)); controllerButton = new QPushButton(centralWidget); controllerButton->setFlat(true); controllerButton->setIcon(QIcon(":images/controller_icon.png")); - controllerButton->setIconSize(QSize(40, 40)); + controllerButton->setIconSize(QSize(55, 48)); keyboardButton = new QPushButton(centralWidget); keyboardButton->setFlat(true); keyboardButton->setIcon(QIcon(":images/keyboard_icon.png")); - keyboardButton->setIconSize(QSize(48, 44)); + keyboardButton->setIconSize(QSize(50, 50)); + restartButton = new QPushButton(centralWidget); + restartButton->setFlat(true); + restartButton->setIcon(QIcon(":images/restart_game_icon.png")); + restartButton->setIconSize(QSize(40, 40)); sizeSliderContainer = new QWidget(centralWidget); sizeSliderContainer->setObjectName("sizeSliderContainer"); @@ -304,6 +323,7 @@ public: menuView->addAction(refreshGameListAct); menuView->addAction(menuGame_List_Mode->menuAction()); menuView->addAction(menuGame_List_Icons->menuAction()); + menuView->addAction(toggleLabelsAct); menuView->addAction(menuThemes->menuAction()); menuThemes->addAction(setThemeDark); menuThemes->addAction(setThemeLight); diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 80d196147..fcdde7240 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -11,6 +11,7 @@ #include "common/config.h" #include "common/elf_info.h" #include "common/version.h" +#include "core/debug_state.h" #include "core/libraries/kernel/time.h" #include "core/libraries/pad/pad.h" #include "imgui/renderer/imgui_core.h" @@ -396,6 +397,25 @@ void WindowSDL::WaitEvent() { case SDL_EVENT_QUIT: is_open = false; break; + case SDL_EVENT_TOGGLE_FULLSCREEN: { + if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) { + SDL_SetWindowFullscreen(window, 0); + } else { + SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN); + } + break; + } + case SDL_EVENT_TOGGLE_PAUSE: + SDL_Log("Received SDL_EVENT_TOGGLE_PAUSE"); + + if (DebugState.IsGuestThreadsPaused()) { + SDL_Log("Game Resumed"); + DebugState.ResumeGuestThreads(); + } else { + SDL_Log("Game Paused"); + DebugState.PauseGuestThreads(); + } + break; default: break; } diff --git a/src/sdl_window.h b/src/sdl_window.h index 03ba0797b..48a9be58c 100644 --- a/src/sdl_window.h +++ b/src/sdl_window.h @@ -7,6 +7,8 @@ #include "core/libraries/pad/pad.h" #include "input/controller.h" #include "string" +#define SDL_EVENT_TOGGLE_FULLSCREEN (SDL_EVENT_USER + 1) +#define SDL_EVENT_TOGGLE_PAUSE (SDL_EVENT_USER + 2) struct SDL_Window; struct SDL_Gamepad; diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 340756f5c..83dea01c4 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -1,38 +1,40 @@ - - images/shadps4.ico - images/about_icon.png - images/dump_icon.png - images/play_icon.png - images/pause_icon.png - images/stop_icon.png - images/utils_icon.png - images/file_icon.png - images/trophy_icon.png - images/folder_icon.png - images/themes_icon.png - images/iconsize_icon.png - images/list_icon.png - images/grid_icon.png - images/exit_icon.png - images/settings_icon.png - images/controller_icon.png - images/refresh_icon.png - images/update_icon.png - images/list_mode_icon.png - images/flag_jp.png - images/flag_eu.png - images/flag_unk.png - images/flag_us.png - images/flag_world.png - images/flag_china.png - images/github.png - images/discord.png - images/ko-fi.png - images/youtube.png - images/website.png - images/ps4_controller.png - images/keyboard_icon.png - images/KBM.png - + + images/shadps4.ico + images/about_icon.png + images/dump_icon.png + images/play_icon.png + images/pause_icon.png + images/stop_icon.png + images/utils_icon.png + images/file_icon.png + images/folder_icon.png + images/themes_icon.png + images/iconsize_icon.png + images/list_icon.png + images/grid_icon.png + images/exit_icon.png + images/settings_icon.png + images/controller_icon.png + images/restart_game_icon.png + images/update_icon.png + images/list_mode_icon.png + images/flag_jp.png + images/flag_eu.png + images/flag_unk.png + images/flag_us.png + images/flag_world.png + images/flag_china.png + images/github.png + images/discord.png + images/ko-fi.png + images/youtube.png + images/website.png + images/ps4_controller.png + images/keyboard_icon.png + images/KBM.png + images/fullscreen_icon.png + images/refreshlist_icon.png + images/trophy_icon.png + From 437af9320104011b32c34c85a6d888a78969b705 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 26 Mar 2025 23:51:17 +0200 Subject: [PATCH 11/22] New translations en_us.ts (Chinese Traditional) (#2691) --- src/qt_gui/translations/zh_TW.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index bd546380a..fb42a43b0 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -407,7 +407,7 @@ ControlSettings Configure Controls - Configure Controls + 操控設定 D-Pad @@ -519,7 +519,7 @@ Color Adjustment - Color Adjustment + 色彩調整 R: @@ -543,7 +543,7 @@ Unable to Save - Unable to Save + 無法保存 Cannot bind axis values more than once @@ -551,11 +551,11 @@ Save - Save + 保存 Apply - Apply + 套用 Restore Defaults @@ -563,7 +563,7 @@ Cancel - Cancel + 取消 @@ -578,7 +578,7 @@ Error - Error + 錯誤 Could not open the file for reading @@ -590,7 +590,7 @@ Save Changes - Save Changes + 儲存變更 Do you want to save changes? From c96853816a7d0897a113352c186ff40b94ea885c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 27 Mar 2025 12:14:09 +0200 Subject: [PATCH 12/22] [ci skip] Qt GUI: Update Translation. (#2692) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 20cba0378..d18609295 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + + + + Pause + + + + Stop + + + + Restart + + + + Full Screen + + + + Controllers + + + + Keyboard + + + + Refresh List + + + + Resume + + + + Show Labels Under Icons + + PKGViewer From 602de0c370467f75d07a7841672e8dacd09faec5 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:40:15 +0100 Subject: [PATCH 13/22] Fork detection: Fix PR actions only showing HEAD as the branch name (#2697) * I'd be very surprised if this works 1st try * More logging and cleanup * Minor fixes --- CMakeLists.txt | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c0932b5c..b3d214ec9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,28 +113,39 @@ git_describe(GIT_DESC --always --long --dirty) git_branch_name(GIT_BRANCH) string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S") +message("start git things") # Try to get the upstream remote and branch +message("check for remote and branch") execute_process( COMMAND git rev-parse --abbrev-ref --symbolic-full-name @{u} OUTPUT_VARIABLE GIT_REMOTE_NAME - RESULT_VARIABLE GIT_BRANCH_RESULT + RESULT_VARIABLE GIT_REMOTE_RESULT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) - # If there's no upstream set or the command failed, check remote.pushDefault -if (GIT_BRANCH_RESULT OR GIT_REMOTE_NAME STREQUAL "") +if (GIT_REMOTE_RESULT OR GIT_REMOTE_NAME STREQUAL "") + message("check default push") execute_process( COMMAND git config --get remote.pushDefault OUTPUT_VARIABLE GIT_REMOTE_NAME - RESULT_VARIABLE GIT_PUSH_DEFAULT_RESULT + RESULT_VARIABLE GIT_REMOTE_RESULT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) - - # If remote.pushDefault is not set or fails, default to origin - if (GIT_PUSH_DEFAULT_RESULT OR GIT_REMOTE_NAME STREQUAL "") - set(GIT_REMOTE_NAME "origin") +endif() +# If running in GitHub Actions and the above fails +if (GIT_REMOTE_RESULT OR GIT_REMOTE_NAME STREQUAL "") + message("check github") + set(GIT_REMOTE_NAME "origin") + + if (DEFINED ENV{GITHUB_HEAD_REF}) # PR branch name + set(GIT_BRANCH "pr-$ENV{GITHUB_HEAD_REF}") + elseif (DEFINED ENV{GITHUB_REF}) # Normal branch name + string(REGEX REPLACE "^refs/[^/]*/" "" GIT_BRANCH "$ENV{GITHUB_REF}") + else() + message("couldn't find branch") + set(GIT_BRANCH "detached-head") endif() else() # Extract remote name if the output contains a remote/branch format @@ -148,6 +159,7 @@ else() endif() # Get remote link +message("getting remote link") execute_process( COMMAND git config --get remote.${GIT_REMOTE_NAME}.url OUTPUT_VARIABLE GIT_REMOTE_URL @@ -156,6 +168,8 @@ execute_process( configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/src/common/scm_rev.cpp" @ONLY) +message("end git things, remote: ${GIT_REMOTE_NAME}, branch: ${GIT_BRANCH}") + find_package(Boost 1.84.0 CONFIG) find_package(FFmpeg 5.1.2 MODULE) find_package(fmt 10.2.0 CONFIG) From d339b3f7d663ba89bb5b3cd572ead77b41b0f0a8 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Thu, 27 Mar 2025 20:40:40 +0000 Subject: [PATCH 14/22] change async to sync (#2698) --- src/common/config.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 09236f30c..b113ac0ef 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -41,7 +41,7 @@ static u32 screenWidth = 1280; static u32 screenHeight = 720; static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select static std::string logFilter; -static std::string logType = "async"; +static std::string logType = "sync"; static std::string userName = "shadPS4"; static std::string updateChannel; static std::string chooseHomeTab; @@ -1129,7 +1129,7 @@ void setDefaultValues() { screenWidth = 1280; screenHeight = 720; logFilter = ""; - logType = "async"; + logType = "sync"; userName = "shadPS4"; if (Common::isRelease) { updateChannel = "Release"; From be22674f8c1ac84e1cff89947ff4a6753070f21b Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:15:31 +0200 Subject: [PATCH 15/22] code: Remove fpkg code Signed-off-by: georgemoralis --- CMakeLists.txt | 9 - src/core/crypto/crypto.cpp | 215 ---------- src/core/crypto/crypto.h | 63 --- src/core/crypto/keys.h | 305 -------------- src/core/file_format/pkg.h | 174 -------- src/core/file_format/pkg_type.cpp | 638 ------------------------------ src/core/file_format/pkg_type.h | 10 - src/core/file_format/trp.cpp | 30 +- src/core/file_format/trp.h | 4 +- src/qt_gui/main_window.cpp | 284 +------------ src/qt_gui/main_window.h | 18 - src/qt_gui/main_window_ui.h | 17 +- src/qt_gui/pkg_viewer.cpp | 217 ---------- src/qt_gui/pkg_viewer.h | 62 --- 14 files changed, 31 insertions(+), 2015 deletions(-) delete mode 100644 src/core/crypto/crypto.cpp delete mode 100644 src/core/crypto/crypto.h delete mode 100644 src/core/crypto/keys.h delete mode 100644 src/core/file_format/pkg.h delete mode 100644 src/core/file_format/pkg_type.cpp delete mode 100644 src/core/file_format/pkg_type.h delete mode 100644 src/qt_gui/pkg_viewer.cpp delete mode 100644 src/qt_gui/pkg_viewer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b3d214ec9..0359246c8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -653,9 +653,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/aerolib/aerolib.h src/core/address_space.cpp src/core/address_space.h - src/core/crypto/crypto.cpp - src/core/crypto/crypto.h - src/core/crypto/keys.h src/core/devices/base_device.cpp src/core/devices/base_device.h src/core/devices/ioccom.h @@ -673,10 +670,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/devices/srandom_device.cpp src/core/devices/srandom_device.h src/core/file_format/pfs.h - src/core/file_format/pkg.cpp - src/core/file_format/pkg.h - src/core/file_format/pkg_type.cpp - src/core/file_format/pkg_type.h src/core/file_format/psf.cpp src/core/file_format/psf.h src/core/file_format/playgo_chunk.cpp @@ -978,8 +971,6 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/game_install_dialog.h src/qt_gui/install_dir_select.cpp src/qt_gui/install_dir_select.h - src/qt_gui/pkg_viewer.cpp - src/qt_gui/pkg_viewer.h src/qt_gui/trophy_viewer.cpp src/qt_gui/trophy_viewer.h src/qt_gui/elf_viewer.cpp diff --git a/src/core/crypto/crypto.cpp b/src/core/crypto/crypto.cpp deleted file mode 100644 index 4020edfd8..000000000 --- a/src/core/crypto/crypto.cpp +++ /dev/null @@ -1,215 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include "crypto.h" - -CryptoPP::RSA::PrivateKey Crypto::key_pkg_derived_key3_keyset_init() { - CryptoPP::InvertibleRSAFunction params; - params.SetPrime1(CryptoPP::Integer(PkgDerivedKey3Keyset::Prime1, 0x80)); - params.SetPrime2(CryptoPP::Integer(PkgDerivedKey3Keyset::Prime2, 0x80)); - - params.SetPublicExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::PublicExponent, 4)); - params.SetPrivateExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::PrivateExponent, 0x100)); - - params.SetModPrime1PrivateExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::Exponent1, 0x80)); - params.SetModPrime2PrivateExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::Exponent2, 0x80)); - - params.SetModulus(CryptoPP::Integer(PkgDerivedKey3Keyset::Modulus, 0x100)); - params.SetMultiplicativeInverseOfPrime2ModPrime1( - CryptoPP::Integer(PkgDerivedKey3Keyset::Coefficient, 0x80)); - - CryptoPP::RSA::PrivateKey privateKey(params); - - return privateKey; -} - -CryptoPP::RSA::PrivateKey Crypto::FakeKeyset_keyset_init() { - CryptoPP::InvertibleRSAFunction params; - params.SetPrime1(CryptoPP::Integer(FakeKeyset::Prime1, 0x80)); - params.SetPrime2(CryptoPP::Integer(FakeKeyset::Prime2, 0x80)); - - params.SetPublicExponent(CryptoPP::Integer(FakeKeyset::PublicExponent, 4)); - params.SetPrivateExponent(CryptoPP::Integer(FakeKeyset::PrivateExponent, 0x100)); - - params.SetModPrime1PrivateExponent(CryptoPP::Integer(FakeKeyset::Exponent1, 0x80)); - params.SetModPrime2PrivateExponent(CryptoPP::Integer(FakeKeyset::Exponent2, 0x80)); - - params.SetModulus(CryptoPP::Integer(FakeKeyset::Modulus, 0x100)); - params.SetMultiplicativeInverseOfPrime2ModPrime1( - CryptoPP::Integer(FakeKeyset::Coefficient, 0x80)); - - CryptoPP::RSA::PrivateKey privateKey(params); - - return privateKey; -} - -CryptoPP::RSA::PrivateKey Crypto::DebugRifKeyset_init() { - CryptoPP::InvertibleRSAFunction params; - params.SetPrime1(CryptoPP::Integer(DebugRifKeyset::Prime1, sizeof(DebugRifKeyset::Prime1))); - params.SetPrime2(CryptoPP::Integer(DebugRifKeyset::Prime2, sizeof(DebugRifKeyset::Prime2))); - - params.SetPublicExponent( - CryptoPP::Integer(DebugRifKeyset::PublicExponent, sizeof(DebugRifKeyset::PublicExponent))); - params.SetPrivateExponent(CryptoPP::Integer(DebugRifKeyset::PrivateExponent, - sizeof(DebugRifKeyset::PrivateExponent))); - - params.SetModPrime1PrivateExponent( - CryptoPP::Integer(DebugRifKeyset::Exponent1, sizeof(DebugRifKeyset::Exponent1))); - params.SetModPrime2PrivateExponent( - CryptoPP::Integer(DebugRifKeyset::Exponent2, sizeof(DebugRifKeyset::Exponent2))); - - params.SetModulus(CryptoPP::Integer(DebugRifKeyset::Modulus, sizeof(DebugRifKeyset::Modulus))); - params.SetMultiplicativeInverseOfPrime2ModPrime1( - CryptoPP::Integer(DebugRifKeyset::Coefficient, sizeof(DebugRifKeyset::Coefficient))); - - CryptoPP::RSA::PrivateKey privateKey(params); - - return privateKey; -} - -void Crypto::RSA2048Decrypt(std::span dec_key, - std::span ciphertext, - bool is_dk3) { // RSAES_PKCS1v15_ - // Create an RSA decryptor - CryptoPP::RSA::PrivateKey privateKey; - if (is_dk3) { - privateKey = key_pkg_derived_key3_keyset_init(); - } else { - privateKey = FakeKeyset_keyset_init(); - } - - CryptoPP::RSAES_PKCS1v15_Decryptor rsaDecryptor(privateKey); - - // Allocate memory for the decrypted data - std::array decrypted; - - // Perform the decryption - CryptoPP::AutoSeededRandomPool rng; - CryptoPP::DecodingResult result = - rsaDecryptor.Decrypt(rng, ciphertext.data(), decrypted.size(), decrypted.data()); - std::copy(decrypted.begin(), decrypted.begin() + dec_key.size(), dec_key.begin()); -} - -void Crypto::ivKeyHASH256(std::span cipher_input, - std::span ivkey_result) { - CryptoPP::SHA256 sha256; - std::array hashResult; - auto array_sink = new CryptoPP::ArraySink(hashResult.data(), CryptoPP::SHA256::DIGESTSIZE); - auto filter = new CryptoPP::HashFilter(sha256, array_sink); - CryptoPP::ArraySource r(cipher_input.data(), cipher_input.size(), true, filter); - std::copy(hashResult.begin(), hashResult.begin() + ivkey_result.size(), ivkey_result.begin()); -} - -void Crypto::aesCbcCfb128Decrypt(std::span ivkey, - std::span ciphertext, - std::span decrypted) { - std::array key; - std::array iv; - - std::copy(ivkey.begin() + 16, ivkey.begin() + 16 + key.size(), key.begin()); - std::copy(ivkey.begin(), ivkey.begin() + iv.size(), iv.begin()); - - CryptoPP::AES::Decryption aesDecryption(key.data(), CryptoPP::AES::DEFAULT_KEYLENGTH); - CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - cbcDecryption.ProcessData(decrypted.data() + i, ciphertext.data() + i, - CryptoPP::AES::BLOCKSIZE); - } -} - -void Crypto::aesCbcCfb128DecryptEntry(std::span ivkey, - std::span ciphertext, - std::span decrypted) { - std::array key; - std::array iv; - - std::copy(ivkey.begin() + 16, ivkey.begin() + 16 + key.size(), key.begin()); - std::copy(ivkey.begin(), ivkey.begin() + iv.size(), iv.begin()); - - CryptoPP::AES::Decryption aesDecryption(key.data(), CryptoPP::AES::DEFAULT_KEYLENGTH); - CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - cbcDecryption.ProcessData(decrypted.data() + i, ciphertext.data() + i, - CryptoPP::AES::BLOCKSIZE); - } -} - -void Crypto::decryptEFSM(std::span trophyKey, - std::span NPcommID, - std::span efsmIv, std::span ciphertext, - std::span decrypted) { - - // step 1: Encrypt NPcommID - CryptoPP::CBC_Mode::Encryption encrypt; - - std::vector trophyIv(16, 0); - std::vector trpKey(16); - - encrypt.SetKeyWithIV(trophyKey.data(), trophyKey.size(), trophyIv.data()); - encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16); - - // step 2: decrypt efsm. - CryptoPP::CBC_Mode::Decryption decrypt; - decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - decrypt.ProcessData(decrypted.data() + i, ciphertext.data() + i, CryptoPP::AES::BLOCKSIZE); - } -} - -void Crypto::PfsGenCryptoKey(std::span ekpfs, - std::span seed, - std::span dataKey, - std::span tweakKey) { - CryptoPP::HMAC hmac(ekpfs.data(), ekpfs.size()); - - CryptoPP::SecByteBlock d(20); // Use Crypto++ SecByteBlock for better memory management - - // Copy the bytes of 'index' to the 'd' array - uint32_t index = 1; - std::memcpy(d, &index, sizeof(uint32_t)); - - // Copy the bytes of 'seed' to the 'd' array starting from index 4 - std::memcpy(d + sizeof(uint32_t), seed.data(), seed.size()); - - // Allocate memory for 'u64' using new - std::vector data_tweak_key(hmac.DigestSize()); - - // Calculate the HMAC - hmac.CalculateDigest(data_tweak_key.data(), d, d.size()); - std::copy(data_tweak_key.begin(), data_tweak_key.begin() + dataKey.size(), tweakKey.begin()); - std::copy(data_tweak_key.begin() + tweakKey.size(), - data_tweak_key.begin() + tweakKey.size() + dataKey.size(), dataKey.begin()); -} - -void Crypto::decryptPFS(std::span dataKey, - std::span tweakKey, std::span src_image, - std::span dst_image, u64 sector) { - // Start at 0x10000 to keep the header when decrypting the whole pfs_image. - for (int i = 0; i < src_image.size(); i += 0x1000) { - const u64 current_sector = sector + (i / 0x1000); - CryptoPP::ECB_Mode::Encryption encrypt(tweakKey.data(), tweakKey.size()); - CryptoPP::ECB_Mode::Decryption decrypt(dataKey.data(), dataKey.size()); - - std::array tweak{}; - std::array encryptedTweak; - std::array xorBuffer; - std::memcpy(tweak.data(), ¤t_sector, sizeof(u64)); - - // Encrypt the tweak for each sector. - encrypt.ProcessData(encryptedTweak.data(), tweak.data(), 16); - - for (int plaintextOffset = 0; plaintextOffset < 0x1000; plaintextOffset += 16) { - xtsXorBlock(xorBuffer.data(), src_image.data() + i + plaintextOffset, - encryptedTweak.data()); // x, c, t - decrypt.ProcessData(xorBuffer.data(), xorBuffer.data(), 16); // x, x - xtsXorBlock(dst_image.data() + i + plaintextOffset, xorBuffer.data(), - encryptedTweak.data()); //(p) c, x , t - xtsMult(encryptedTweak); - } - } -} diff --git a/src/core/crypto/crypto.h b/src/core/crypto/crypto.h deleted file mode 100644 index b5d8104b5..000000000 --- a/src/core/crypto/crypto.h +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common/types.h" -#include "keys.h" - -class Crypto { -public: - CryptoPP::RSA::PrivateKey key_pkg_derived_key3_keyset_init(); - CryptoPP::RSA::PrivateKey FakeKeyset_keyset_init(); - CryptoPP::RSA::PrivateKey DebugRifKeyset_init(); - - void RSA2048Decrypt(std::span dk3, - std::span ciphertext, - bool is_dk3); // RSAES_PKCS1v15_ - void ivKeyHASH256(std::span cipher_input, - std::span ivkey_result); - void aesCbcCfb128Decrypt(std::span ivkey, - std::span ciphertext, - std::span decrypted); - void aesCbcCfb128DecryptEntry(std::span ivkey, - std::span ciphertext, - std::span decrypted); - void decryptEFSM(std::span trophyKey, - std::span NPcommID, std::span efsmIv, - std::span ciphertext, std::span decrypted); - void PfsGenCryptoKey(std::span ekpfs, - std::span seed, - std::span dataKey, - std::span tweakKey); - void decryptPFS(std::span dataKey, - std::span tweakKey, std::span src_image, - std::span dst_image, u64 sector); - - void xtsXorBlock(CryptoPP::byte* x, const CryptoPP::byte* a, const CryptoPP::byte* b) { - for (int i = 0; i < 16; i++) { - x[i] = a[i] ^ b[i]; - } - } - - void xtsMult(std::span encryptedTweak) { - int feedback = 0; - for (int k = 0; k < encryptedTweak.size(); k++) { - const auto tmp = (encryptedTweak[k] >> 7) & 1; - encryptedTweak[k] = ((encryptedTweak[k] << 1) + feedback) & 0xFF; - feedback = tmp; - } - if (feedback != 0) { - encryptedTweak[0] ^= 0x87; - } - } -}; diff --git a/src/core/crypto/keys.h b/src/core/crypto/keys.h deleted file mode 100644 index 441082481..000000000 --- a/src/core/crypto/keys.h +++ /dev/null @@ -1,305 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once -#include - -class FakeKeyset { -public: - // Constructor - static constexpr CryptoPP::byte Exponent1[] = { - 0x6D, 0x48, 0xE0, 0x54, 0x40, 0x25, 0xC8, 0x41, 0x29, 0x52, 0x42, 0x27, 0xEB, 0xD2, 0xC7, - 0xAB, 0x6B, 0x9C, 0x27, 0x0A, 0xB4, 0x1F, 0x94, 0x4E, 0xFA, 0x42, 0x1D, 0xB7, 0xBC, 0xB9, - 0xAE, 0xBC, 0x04, 0x6F, 0x75, 0x8F, 0x10, 0x5F, 0x89, 0xAC, 0xAB, 0x9C, 0xD2, 0xFA, 0xE6, - 0xA4, 0x13, 0x83, 0x68, 0xD4, 0x56, 0x38, 0xFE, 0xE5, 0x2B, 0x78, 0x44, 0x9C, 0x34, 0xE6, - 0x5A, 0xA0, 0xBE, 0x05, 0x70, 0xAD, 0x15, 0xC3, 0x2D, 0x31, 0xAC, 0x97, 0x5D, 0x88, 0xFC, - 0xC1, 0x62, 0x3D, 0xE2, 0xED, 0x11, 0xDB, 0xB6, 0x9E, 0xFC, 0x5A, 0x5A, 0x03, 0xF6, 0xCF, - 0x08, 0xD4, 0x5D, 0x90, 0xC9, 0x2A, 0xB9, 0x9B, 0xCF, 0xC8, 0x1A, 0x65, 0xF3, 0x5B, 0xE8, - 0x7F, 0xCF, 0xA5, 0xA6, 0x4C, 0x5C, 0x2A, 0x12, 0x0F, 0x92, 0xA5, 0xE3, 0xF0, 0x17, 0x1E, - 0x9A, 0x97, 0x45, 0x86, 0xFD, 0xDB, 0x54, 0x25}; - // exponent2 = d mod (q - 1) - static constexpr CryptoPP::byte Exponent2[] = { - 0x2A, 0x51, 0xCE, 0x02, 0x44, 0x28, 0x50, 0xE8, 0x30, 0x20, 0x7C, 0x9C, 0x55, 0xBF, 0x60, - 0x39, 0xBC, 0xD1, 0xF0, 0xE7, 0x68, 0xF8, 0x08, 0x5B, 0x61, 0x1F, 0xA7, 0xBF, 0xD0, 0xE8, - 0x8B, 0xB5, 0xB1, 0xD5, 0xD9, 0x16, 0xAC, 0x75, 0x0C, 0x6D, 0xF2, 0xE0, 0xB5, 0x97, 0x75, - 0xD2, 0x68, 0x16, 0x1F, 0x00, 0x7D, 0x8B, 0x17, 0xE8, 0x78, 0x48, 0x41, 0x71, 0x2B, 0x18, - 0x96, 0x80, 0x11, 0xDB, 0x68, 0x39, 0x9C, 0xD6, 0xE0, 0x72, 0x42, 0x86, 0xF0, 0x1B, 0x16, - 0x0D, 0x3E, 0x12, 0x94, 0x3D, 0x25, 0xA8, 0xA9, 0x30, 0x9E, 0x54, 0x5A, 0xD6, 0x36, 0x6C, - 0xD6, 0x8C, 0x20, 0x62, 0x8F, 0xA1, 0x6B, 0x1F, 0x7C, 0x6D, 0xB2, 0xB1, 0xC1, 0x2E, 0xAD, - 0x36, 0x02, 0x9C, 0x3A, 0xCA, 0x2F, 0x09, 0xD2, 0x45, 0x9E, 0xEB, 0xF2, 0xBC, 0x6C, 0xAA, - 0x3B, 0x3E, 0x90, 0xBC, 0x38, 0x67, 0x35, 0x4D}; - // e - static constexpr CryptoPP::byte PublicExponent[] = {0, 1, 0, 1}; - // (InverseQ)(q) = 1 mod p - static constexpr CryptoPP::byte Coefficient[] = { - 0x0B, 0x67, 0x1C, 0x0D, 0x6C, 0x57, 0xD3, 0xE7, 0x05, 0x65, 0x94, 0x31, 0x56, 0x55, 0xFD, - 0x28, 0x08, 0xFA, 0x05, 0x8A, 0xCC, 0x55, 0x39, 0x61, 0x97, 0x63, 0xA0, 0x16, 0x27, 0x3D, - 0xED, 0xC1, 0x16, 0x40, 0x2A, 0x12, 0xEA, 0x6F, 0xD9, 0xD8, 0x58, 0x56, 0xA8, 0x56, 0x8B, - 0x0D, 0x38, 0x5E, 0x1E, 0x80, 0x3B, 0x5F, 0x40, 0x80, 0x6F, 0x62, 0x4F, 0x28, 0xA2, 0x69, - 0xF3, 0xD3, 0xF7, 0xFD, 0xB2, 0xC3, 0x52, 0x43, 0x20, 0x92, 0x9D, 0x97, 0x8D, 0xA0, 0x15, - 0x07, 0x15, 0x6E, 0xA4, 0x0D, 0x56, 0xD3, 0x37, 0x1A, 0xC4, 0x9E, 0xDF, 0x02, 0x49, 0xB8, - 0x0A, 0x84, 0x62, 0xF5, 0xFA, 0xB9, 0x3F, 0xA4, 0x09, 0x76, 0xCC, 0xAA, 0xB9, 0x9B, 0xA6, - 0x4F, 0xC1, 0x6A, 0x64, 0xCE, 0xD8, 0x77, 0xAB, 0x4B, 0xF9, 0xA0, 0xAE, 0xDA, 0xF1, 0x67, - 0x87, 0x7C, 0x98, 0x5C, 0x7E, 0xB8, 0x73, 0xF5}; - // n = p * q - static constexpr CryptoPP::byte Modulus[] = { - 0xC6, 0xCF, 0x71, 0xE7, 0xE5, 0x9A, 0xF0, 0xD1, 0x2A, 0x2C, 0x45, 0x8B, 0xF9, 0x2A, 0x0E, - 0xC1, 0x43, 0x05, 0x8B, 0xC3, 0x71, 0x17, 0x80, 0x1D, 0xCD, 0x49, 0x7D, 0xDE, 0x35, 0x9D, - 0x25, 0x9B, 0xA0, 0xD7, 0xA0, 0xF2, 0x7D, 0x6C, 0x08, 0x7E, 0xAA, 0x55, 0x02, 0x68, 0x2B, - 0x23, 0xC6, 0x44, 0xB8, 0x44, 0x18, 0xEB, 0x56, 0xCF, 0x16, 0xA2, 0x48, 0x03, 0xC9, 0xE7, - 0x4F, 0x87, 0xEB, 0x3D, 0x30, 0xC3, 0x15, 0x88, 0xBF, 0x20, 0xE7, 0x9D, 0xFF, 0x77, 0x0C, - 0xDE, 0x1D, 0x24, 0x1E, 0x63, 0xA9, 0x4F, 0x8A, 0xBF, 0x5B, 0xBE, 0x60, 0x19, 0x68, 0x33, - 0x3B, 0xFC, 0xED, 0x9F, 0x47, 0x4E, 0x5F, 0xF8, 0xEA, 0xCB, 0x3D, 0x00, 0xBD, 0x67, 0x01, - 0xF9, 0x2C, 0x6D, 0xC6, 0xAC, 0x13, 0x64, 0xE7, 0x67, 0x14, 0xF3, 0xDC, 0x52, 0x69, 0x6A, - 0xB9, 0x83, 0x2C, 0x42, 0x30, 0x13, 0x1B, 0xB2, 0xD8, 0xA5, 0x02, 0x0D, 0x79, 0xED, 0x96, - 0xB1, 0x0D, 0xF8, 0xCC, 0x0C, 0xDF, 0x81, 0x95, 0x4F, 0x03, 0x58, 0x09, 0x57, 0x0E, 0x80, - 0x69, 0x2E, 0xFE, 0xFF, 0x52, 0x77, 0xEA, 0x75, 0x28, 0xA8, 0xFB, 0xC9, 0xBE, 0xBF, 0x9F, - 0xBB, 0xB7, 0x79, 0x8E, 0x18, 0x05, 0xE1, 0x80, 0xBD, 0x50, 0x34, 0x94, 0x81, 0xD3, 0x53, - 0xC2, 0x69, 0xA2, 0xD2, 0x4C, 0xCF, 0x6C, 0xF4, 0x57, 0x2C, 0x10, 0x4A, 0x3F, 0xFB, 0x22, - 0xFD, 0x8B, 0x97, 0xE2, 0xC9, 0x5B, 0xA6, 0x2B, 0xCD, 0xD6, 0x1B, 0x6B, 0xDB, 0x68, 0x7F, - 0x4B, 0xC2, 0xA0, 0x50, 0x34, 0xC0, 0x05, 0xE5, 0x8D, 0xEF, 0x24, 0x67, 0xFF, 0x93, 0x40, - 0xCF, 0x2D, 0x62, 0xA2, 0xA0, 0x50, 0xB1, 0xF1, 0x3A, 0xA8, 0x3D, 0xFD, 0x80, 0xD1, 0xF9, - 0xB8, 0x05, 0x22, 0xAF, 0xC8, 0x35, 0x45, 0x90, 0x58, 0x8E, 0xE3, 0x3A, 0x7C, 0xBD, 0x3E, - 0x27}; - // p - static constexpr CryptoPP::byte Prime1[] = { - 0xFE, 0xF6, 0xBF, 0x1D, 0x69, 0xAB, 0x16, 0x25, 0x08, 0x47, 0x55, 0x6B, 0x86, 0xE4, 0x35, - 0x88, 0x72, 0x2A, 0xB1, 0x3D, 0xF8, 0xB6, 0x44, 0xCA, 0xB3, 0xAB, 0x19, 0xD1, 0x04, 0x24, - 0x28, 0x0A, 0x74, 0x55, 0xB8, 0x15, 0x45, 0x09, 0xCC, 0x13, 0x1C, 0xF2, 0xBA, 0x37, 0xA9, - 0x03, 0x90, 0x8F, 0x02, 0x10, 0xFF, 0x25, 0x79, 0x86, 0xCC, 0x18, 0x50, 0x9A, 0x10, 0x5F, - 0x5B, 0x4C, 0x1C, 0x4E, 0xB0, 0xA7, 0xE3, 0x59, 0xB1, 0x2D, 0xA0, 0xC6, 0xB0, 0x20, 0x2C, - 0x21, 0x33, 0x12, 0xB3, 0xAF, 0x72, 0x34, 0x83, 0xCD, 0x52, 0x2F, 0xAF, 0x0F, 0x20, 0x5A, - 0x1B, 0xC0, 0xE2, 0xA3, 0x76, 0x34, 0x0F, 0xD7, 0xFC, 0xC1, 0x41, 0xC9, 0xF9, 0x79, 0x40, - 0x17, 0x42, 0x21, 0x3E, 0x9D, 0xFD, 0xC7, 0xC1, 0x50, 0xDE, 0x44, 0x5A, 0xC9, 0x31, 0x89, - 0x6A, 0x78, 0x05, 0xBE, 0x65, 0xB4, 0xE8, 0x2D}; - // q - static constexpr CryptoPP::byte Prime2[] = { - 0xC7, 0x9E, 0x47, 0x58, 0x00, 0x7D, 0x62, 0x82, 0xB0, 0xD2, 0x22, 0x81, 0xD4, 0xA8, 0x97, - 0x1B, 0x79, 0x0C, 0x3A, 0xB0, 0xD7, 0xC9, 0x30, 0xE3, 0xC3, 0x53, 0x8E, 0x57, 0xEF, 0xF0, - 0x9B, 0x9F, 0xB3, 0x90, 0x52, 0xC6, 0x94, 0x22, 0x36, 0xAA, 0xE6, 0x4A, 0x5F, 0x72, 0x1D, - 0x70, 0xE8, 0x76, 0x58, 0xC8, 0xB2, 0x91, 0xCE, 0x9C, 0xC3, 0xE9, 0x09, 0x7F, 0x2E, 0x47, - 0x97, 0xCC, 0x90, 0x39, 0x15, 0x35, 0x31, 0xDE, 0x1F, 0x0C, 0x8C, 0x0D, 0xC1, 0xC2, 0x92, - 0xBE, 0x97, 0xBF, 0x2F, 0x91, 0xA1, 0x8C, 0x7D, 0x50, 0xA8, 0x21, 0x2F, 0xD7, 0xA2, 0x9A, - 0x7E, 0xB5, 0xA7, 0x2A, 0x90, 0x02, 0xD9, 0xF3, 0x3D, 0xD1, 0xEB, 0xB8, 0xE0, 0x5A, 0x79, - 0x9E, 0x7D, 0x8D, 0xCA, 0x18, 0x6D, 0xBD, 0x9E, 0xA1, 0x80, 0x28, 0x6B, 0x2A, 0xFE, 0x51, - 0x24, 0x9B, 0x6F, 0x4D, 0x84, 0x77, 0x80, 0x23}; - static constexpr CryptoPP::byte PrivateExponent[] = { - 0x7F, 0x76, 0xCD, 0x0E, 0xE2, 0xD4, 0xDE, 0x05, 0x1C, 0xC6, 0xD9, 0xA8, 0x0E, 0x8D, 0xFA, - 0x7B, 0xCA, 0x1E, 0xAA, 0x27, 0x1A, 0x40, 0xF8, 0xF1, 0x22, 0x87, 0x35, 0xDD, 0xDB, 0xFD, - 0xEE, 0xF8, 0xC2, 0xBC, 0xBD, 0x01, 0xFB, 0x8B, 0xE2, 0x3E, 0x63, 0xB2, 0xB1, 0x22, 0x5C, - 0x56, 0x49, 0x6E, 0x11, 0xBE, 0x07, 0x44, 0x0B, 0x9A, 0x26, 0x66, 0xD1, 0x49, 0x2C, 0x8F, - 0xD3, 0x1B, 0xCF, 0xA4, 0xA1, 0xB8, 0xD1, 0xFB, 0xA4, 0x9E, 0xD2, 0x21, 0x28, 0x83, 0x09, - 0x8A, 0xF6, 0xA0, 0x0B, 0xA3, 0xD6, 0x0F, 0x9B, 0x63, 0x68, 0xCC, 0xBC, 0x0C, 0x4E, 0x14, - 0x5B, 0x27, 0xA4, 0xA9, 0xF4, 0x2B, 0xB9, 0xB8, 0x7B, 0xC0, 0xE6, 0x51, 0xAD, 0x1D, 0x77, - 0xD4, 0x6B, 0xB9, 0xCE, 0x20, 0xD1, 0x26, 0x66, 0x7E, 0x5E, 0x9E, 0xA2, 0xE9, 0x6B, 0x90, - 0xF3, 0x73, 0xB8, 0x52, 0x8F, 0x44, 0x11, 0x03, 0x0C, 0x13, 0x97, 0x39, 0x3D, 0x13, 0x22, - 0x58, 0xD5, 0x43, 0x82, 0x49, 0xDA, 0x6E, 0x7C, 0xA1, 0xC5, 0x8C, 0xA5, 0xB0, 0x09, 0xE0, - 0xCE, 0x3D, 0xDF, 0xF4, 0x9D, 0x3C, 0x97, 0x15, 0xE2, 0x6A, 0xC7, 0x2B, 0x3C, 0x50, 0x93, - 0x23, 0xDB, 0xBA, 0x4A, 0x22, 0x66, 0x44, 0xAC, 0x78, 0xBB, 0x0E, 0x1A, 0x27, 0x43, 0xB5, - 0x71, 0x67, 0xAF, 0xF4, 0xAB, 0x48, 0x46, 0x93, 0x73, 0xD0, 0x42, 0xAB, 0x93, 0x63, 0xE5, - 0x6C, 0x9A, 0xDE, 0x50, 0x24, 0xC0, 0x23, 0x7D, 0x99, 0x79, 0x3F, 0x22, 0x07, 0xE0, 0xC1, - 0x48, 0x56, 0x1B, 0xDF, 0x83, 0x09, 0x12, 0xB4, 0x2D, 0x45, 0x6B, 0xC9, 0xC0, 0x68, 0x85, - 0x99, 0x90, 0x79, 0x96, 0x1A, 0xD7, 0xF5, 0x4D, 0x1F, 0x37, 0x83, 0x40, 0x4A, 0xEC, 0x39, - 0x37, 0xA6, 0x80, 0x92, 0x7D, 0xC5, 0x80, 0xC7, 0xD6, 0x6F, 0xFE, 0x8A, 0x79, 0x89, 0xC6, - 0xB1}; -}; - -class DebugRifKeyset { -public: - // std::uint8_t* PrivateExponent; - static constexpr CryptoPP::byte Exponent1[] = { - 0xCD, 0x9A, 0x61, 0xB0, 0xB8, 0xD5, 0xB4, 0xE4, 0xE4, 0xF6, 0xAB, 0xF7, 0x27, 0xB7, 0x56, - 0x59, 0x6B, 0xB9, 0x11, 0xE7, 0xF4, 0x83, 0xAF, 0xB9, 0x73, 0x99, 0x7F, 0x49, 0xA2, 0x9C, - 0xF0, 0xB5, 0x6D, 0x37, 0x82, 0x14, 0x15, 0xF1, 0x04, 0x8A, 0xD4, 0x8E, 0xEB, 0x2E, 0x1F, - 0xE2, 0x81, 0xA9, 0x62, 0x6E, 0xB1, 0x68, 0x75, 0x62, 0xF3, 0x0F, 0xFE, 0xD4, 0x91, 0x87, - 0x98, 0x78, 0xBF, 0x26, 0xB5, 0x07, 0x58, 0xD0, 0xEE, 0x3F, 0x21, 0xE8, 0xC8, 0x0F, 0x5F, - 0xFA, 0x1C, 0x64, 0x74, 0x49, 0x52, 0xEB, 0xE7, 0xEE, 0xDE, 0xBA, 0x23, 0x26, 0x4A, 0xF6, - 0x9C, 0x1A, 0x09, 0x3F, 0xB9, 0x0B, 0x36, 0x26, 0x1A, 0xBE, 0xA9, 0x76, 0xE6, 0xF2, 0x69, - 0xDE, 0xFF, 0xAF, 0xCC, 0x0C, 0x9A, 0x66, 0x03, 0x86, 0x0A, 0x1F, 0x49, 0xA4, 0x10, 0xB6, - 0xBC, 0xC3, 0x7C, 0x88, 0xE8, 0xCE, 0x4B, 0xD9}; - // exponent2 = d mod (q - 1) - static constexpr CryptoPP::byte Exponent2[] = { - 0xB3, 0x73, 0xA3, 0x59, 0xE6, 0x97, 0xC0, 0xAB, 0x3B, 0x68, 0xFC, 0x39, 0xAC, 0xDB, 0x44, - 0xB1, 0xB4, 0x9E, 0x35, 0x4D, 0xBE, 0xC5, 0x36, 0x69, 0x6C, 0x3D, 0xC5, 0xFC, 0xFE, 0x4B, - 0x2F, 0xDC, 0x86, 0x80, 0x46, 0x96, 0x40, 0x1A, 0x0D, 0x6E, 0xFA, 0x8C, 0xE0, 0x47, 0x91, - 0xAC, 0xAD, 0x95, 0x2B, 0x8E, 0x1F, 0xF2, 0x0A, 0x45, 0xF8, 0x29, 0x95, 0x70, 0xC6, 0x88, - 0x5F, 0x71, 0x03, 0x99, 0x79, 0xBC, 0x84, 0x71, 0xBD, 0xE8, 0x84, 0x8C, 0x0E, 0xD4, 0x7B, - 0x30, 0x74, 0x57, 0x1A, 0x95, 0xE7, 0x90, 0x19, 0x8D, 0xAD, 0x8B, 0x4C, 0x4E, 0xC3, 0xE7, - 0x6B, 0x23, 0x86, 0x01, 0xEE, 0x9B, 0xE0, 0x2F, 0x15, 0xA2, 0x2C, 0x4C, 0x39, 0xD3, 0xDF, - 0x9C, 0x39, 0x01, 0xF1, 0x8C, 0x44, 0x4A, 0x15, 0x44, 0xDC, 0x51, 0xF7, 0x22, 0xD7, 0x7F, - 0x41, 0x7F, 0x68, 0xFA, 0xEE, 0x56, 0xE8, 0x05}; - // e - static constexpr CryptoPP::byte PublicExponent[] = {0x00, 0x01, 0x00, 0x01}; - // (InverseQ)(q) = 1 mod p - static constexpr CryptoPP::byte Coefficient[] = { - 0xC0, 0x32, 0x43, 0xD3, 0x8C, 0x3D, 0xB4, 0xD2, 0x48, 0x8C, 0x42, 0x41, 0x24, 0x94, 0x6C, - 0x80, 0xC9, 0xC1, 0x79, 0x36, 0x7F, 0xAC, 0xC3, 0xFF, 0x6A, 0x25, 0xEB, 0x2C, 0xFB, 0xD4, - 0x2B, 0xA0, 0xEB, 0xFE, 0x25, 0xE9, 0xC6, 0x77, 0xCE, 0xFE, 0x2D, 0x23, 0xFE, 0xD0, 0xF4, - 0x0F, 0xD9, 0x7E, 0xD5, 0xA5, 0x7D, 0x1F, 0xC0, 0xE8, 0xE8, 0xEC, 0x80, 0x5B, 0xC7, 0xFD, - 0xE2, 0xBD, 0x94, 0xA6, 0x2B, 0xDD, 0x6A, 0x60, 0x45, 0x54, 0xAB, 0xCA, 0x42, 0x9C, 0x6A, - 0x6C, 0xBF, 0x3C, 0x84, 0xF9, 0xA5, 0x0E, 0x63, 0x0C, 0x51, 0x58, 0x62, 0x6D, 0x5A, 0xB7, - 0x3C, 0x3F, 0x49, 0x1A, 0xD0, 0x93, 0xB8, 0x4F, 0x1A, 0x6C, 0x5F, 0xC5, 0xE5, 0xA9, 0x75, - 0xD4, 0x86, 0x9E, 0xDF, 0x87, 0x0F, 0x27, 0xB0, 0x26, 0x78, 0x4E, 0xFB, 0xC1, 0x8A, 0x4A, - 0x24, 0x3F, 0x7F, 0x8F, 0x9A, 0x12, 0x51, 0xCB}; - // n = p * q - static constexpr CryptoPP::byte Modulus[] = { - 0xC2, 0xD2, 0x44, 0xBC, 0xDD, 0x84, 0x3F, 0xD9, 0xC5, 0x22, 0xAF, 0xF7, 0xFC, 0x88, 0x8A, - 0x33, 0x80, 0xED, 0x8E, 0xE2, 0xCC, 0x81, 0xF7, 0xEC, 0xF8, 0x1C, 0x79, 0xBF, 0x02, 0xBB, - 0x12, 0x8E, 0x61, 0x68, 0x29, 0x1B, 0x15, 0xB6, 0x5E, 0xC6, 0xF8, 0xBF, 0x5A, 0xE0, 0x3B, - 0x6A, 0x6C, 0xD9, 0xD6, 0xF5, 0x75, 0xAB, 0xA0, 0x6F, 0x34, 0x81, 0x34, 0x9A, 0x5B, 0xAD, - 0xED, 0x31, 0xE3, 0xC6, 0xEA, 0x1A, 0xD1, 0x13, 0x22, 0xBB, 0xB3, 0xDA, 0xB3, 0xB2, 0x53, - 0xBD, 0x45, 0x79, 0x87, 0xAD, 0x0A, 0x01, 0x72, 0x18, 0x10, 0x29, 0x49, 0xF4, 0x41, 0x7F, - 0xD6, 0x47, 0x0C, 0x72, 0x92, 0x9E, 0xE9, 0xBB, 0x95, 0xA9, 0x5D, 0x79, 0xEB, 0xE4, 0x30, - 0x76, 0x90, 0x45, 0x4B, 0x9D, 0x9C, 0xCF, 0x92, 0x03, 0x60, 0x8C, 0x4B, 0x6C, 0xB3, 0x7A, - 0x3A, 0x05, 0x39, 0xA0, 0x66, 0xA9, 0x35, 0xCF, 0xB9, 0xFA, 0xAD, 0x9C, 0xAB, 0xEB, 0xE4, - 0x6A, 0x8C, 0xE9, 0x3B, 0xCC, 0x72, 0x12, 0x62, 0x63, 0xBD, 0x80, 0xC4, 0xEE, 0x37, 0x2B, - 0x32, 0x03, 0xA3, 0x09, 0xF7, 0xA0, 0x61, 0x57, 0xAD, 0x0D, 0xCF, 0x15, 0x98, 0x9E, 0x4E, - 0x49, 0xF8, 0xB5, 0xA3, 0x5C, 0x27, 0xEE, 0x45, 0x04, 0xEA, 0xE4, 0x4B, 0xBC, 0x8F, 0x87, - 0xED, 0x19, 0x1E, 0x46, 0x75, 0x63, 0xC4, 0x5B, 0xD5, 0xBC, 0x09, 0x2F, 0x02, 0x73, 0x19, - 0x3C, 0x58, 0x55, 0x49, 0x66, 0x4C, 0x11, 0xEC, 0x0F, 0x09, 0xFA, 0xA5, 0x56, 0x0A, 0x5A, - 0x63, 0x56, 0xAD, 0xA0, 0x0D, 0x86, 0x08, 0xC1, 0xE6, 0xB6, 0x13, 0x22, 0x49, 0x2F, 0x7C, - 0xDB, 0x4C, 0x56, 0x97, 0x0E, 0xC2, 0xD9, 0x2E, 0x87, 0xBC, 0x0E, 0x67, 0xC0, 0x1B, 0x58, - 0xBC, 0x64, 0x2B, 0xC2, 0x6E, 0xE2, 0x93, 0x2E, 0xB5, 0x6B, 0x70, 0xA4, 0x42, 0x9F, 0x64, - 0xC1}; - // p - static constexpr CryptoPP::byte Prime1[] = { - 0xE5, 0x62, 0xE1, 0x7F, 0x9F, 0x86, 0x08, 0xE2, 0x61, 0xD3, 0xD0, 0x42, 0xE2, 0xC4, 0xB6, - 0xA8, 0x51, 0x09, 0x19, 0x14, 0xA4, 0x3A, 0x11, 0x4C, 0x33, 0xA5, 0x9C, 0x01, 0x5E, 0x34, - 0xB6, 0x3F, 0x02, 0x1A, 0xCA, 0x47, 0xF1, 0x4F, 0x3B, 0x35, 0x2A, 0x07, 0x20, 0xEC, 0xD8, - 0xC1, 0x15, 0xD9, 0xCA, 0x03, 0x4F, 0xB8, 0xE8, 0x09, 0x73, 0x3F, 0x85, 0xB7, 0x41, 0xD5, - 0x51, 0x3E, 0x7B, 0xE3, 0x53, 0x2B, 0x48, 0x8B, 0x8E, 0xCB, 0xBA, 0xF7, 0xE0, 0x60, 0xF5, - 0x35, 0x0E, 0x6F, 0xB0, 0xD9, 0x2A, 0x99, 0xD0, 0xFF, 0x60, 0x14, 0xED, 0x40, 0xEA, 0xF8, - 0xD7, 0x0B, 0xC3, 0x8D, 0x8C, 0xE8, 0x81, 0xB3, 0x75, 0x93, 0x15, 0xB3, 0x7D, 0xF6, 0x39, - 0x60, 0x1A, 0x00, 0xE7, 0xC3, 0x27, 0xAD, 0xA4, 0x33, 0xD5, 0x3E, 0xA4, 0x35, 0x48, 0x6F, - 0x22, 0xEF, 0x5D, 0xDD, 0x7D, 0x7B, 0x61, 0x05}; - // q - static constexpr CryptoPP::byte Prime2[] = { - 0xD9, 0x6C, 0xC2, 0x0C, 0xF7, 0xAE, 0xD1, 0xF3, 0x3B, 0x3B, 0x49, 0x1E, 0x9F, 0x12, 0x9C, - 0xA1, 0x78, 0x1F, 0x35, 0x1D, 0x98, 0x26, 0x13, 0x71, 0xF9, 0x09, 0xFD, 0xF0, 0xAD, 0x38, - 0x55, 0xB7, 0xEE, 0x61, 0x04, 0x72, 0x51, 0x87, 0x2E, 0x05, 0x84, 0xB1, 0x1D, 0x0C, 0x0D, - 0xDB, 0xD4, 0x25, 0x3E, 0x26, 0xED, 0xEA, 0xB8, 0xF7, 0x49, 0xFE, 0xA2, 0x94, 0xE6, 0xF2, - 0x08, 0x92, 0xA7, 0x85, 0xF5, 0x30, 0xB9, 0x84, 0x22, 0xBF, 0xCA, 0xF0, 0x5F, 0xCB, 0x31, - 0x20, 0x34, 0x49, 0x16, 0x76, 0x34, 0xCC, 0x7A, 0xCB, 0x96, 0xFE, 0x78, 0x7A, 0x41, 0xFE, - 0x9A, 0xA2, 0x23, 0xF7, 0x68, 0x80, 0xD6, 0xCE, 0x4A, 0x78, 0xA5, 0xB7, 0x05, 0x77, 0x81, - 0x1F, 0xDE, 0x5E, 0xA8, 0x6E, 0x3E, 0x87, 0xEC, 0x44, 0xD2, 0x69, 0xC6, 0x54, 0x91, 0x6B, - 0x5E, 0x13, 0x8A, 0x03, 0x87, 0x05, 0x31, 0x8D}; - static constexpr CryptoPP::byte PrivateExponent[] = { - 0x01, 0x61, 0xAD, 0xD8, 0x9C, 0x06, 0x89, 0xD0, 0x60, 0xC8, 0x41, 0xF0, 0xB3, 0x83, 0x01, - 0x5D, 0xE3, 0xA2, 0x6B, 0xA2, 0xBA, 0x9A, 0x0A, 0x58, 0xCD, 0x1A, 0xA0, 0x97, 0x64, 0xEC, - 0xD0, 0x31, 0x1F, 0xCA, 0x36, 0x0E, 0x69, 0xDD, 0x40, 0xF7, 0x4E, 0xC0, 0xC6, 0xA3, 0x73, - 0xF0, 0x69, 0x84, 0xB2, 0xF4, 0x4B, 0x29, 0x14, 0x2A, 0x6D, 0xB8, 0x23, 0xD8, 0x1B, 0x61, - 0xD4, 0x9E, 0x87, 0xB3, 0xBB, 0xA9, 0xC4, 0x85, 0x4A, 0xF8, 0x03, 0x4A, 0xBF, 0xFE, 0xF9, - 0xFE, 0x8B, 0xDD, 0x54, 0x83, 0xBA, 0xE0, 0x2F, 0x3F, 0xB1, 0xEF, 0xA5, 0x05, 0x5D, 0x28, - 0x8B, 0xAB, 0xB5, 0xD0, 0x23, 0x2F, 0x8A, 0xCF, 0x48, 0x7C, 0xAA, 0xBB, 0xC8, 0x5B, 0x36, - 0x27, 0xC5, 0x16, 0xA4, 0xB6, 0x61, 0xAC, 0x0C, 0x28, 0x47, 0x79, 0x3F, 0x38, 0xAE, 0x5E, - 0x25, 0xC6, 0xAF, 0x35, 0xAE, 0xBC, 0xB0, 0xF3, 0xBC, 0xBD, 0xFD, 0xA4, 0x87, 0x0D, 0x14, - 0x3D, 0x90, 0xE4, 0xDE, 0x5D, 0x1D, 0x46, 0x81, 0xF1, 0x28, 0x6D, 0x2F, 0x2C, 0x5E, 0x97, - 0x2D, 0x89, 0x2A, 0x51, 0x72, 0x3C, 0x20, 0x02, 0x59, 0xB1, 0x98, 0x93, 0x05, 0x1E, 0x3F, - 0xA1, 0x8A, 0x69, 0x30, 0x0E, 0x70, 0x84, 0x8B, 0xAE, 0x97, 0xA1, 0x08, 0x95, 0x63, 0x4C, - 0xC7, 0xE8, 0x5D, 0x59, 0xCA, 0x78, 0x2A, 0x23, 0x87, 0xAC, 0x6F, 0x04, 0x33, 0xB1, 0x61, - 0xB9, 0xF0, 0x95, 0xDA, 0x33, 0xCC, 0xE0, 0x4C, 0x82, 0x68, 0x82, 0x14, 0x51, 0xBE, 0x49, - 0x1C, 0x58, 0xA2, 0x8B, 0x05, 0x4E, 0x98, 0x37, 0xEB, 0x94, 0x0B, 0x01, 0x22, 0xDC, 0xB3, - 0x19, 0xCA, 0x77, 0xA6, 0x6E, 0x97, 0xFF, 0x8A, 0x53, 0x5A, 0xC5, 0x24, 0xE4, 0xAF, 0x6E, - 0xA8, 0x2B, 0x53, 0xA4, 0xBE, 0x96, 0xA5, 0x7B, 0xCE, 0x22, 0x56, 0xA3, 0xF1, 0xCF, 0x14, - 0xA5}; -}; - -class PkgDerivedKey3Keyset { -public: - // std::uint8_t* PrivateExponent; - static constexpr CryptoPP::byte Exponent1[] = { - 0x52, 0xCC, 0x2D, 0xA0, 0x9C, 0x9E, 0x75, 0xE7, 0x28, 0xEE, 0x3D, 0xDE, 0xE3, 0x45, 0xD1, - 0x4F, 0x94, 0x1C, 0xCC, 0xC8, 0x87, 0x29, 0x45, 0x3B, 0x8D, 0x6E, 0xAB, 0x6E, 0x2A, 0xA7, - 0xC7, 0x15, 0x43, 0xA3, 0x04, 0x8F, 0x90, 0x5F, 0xEB, 0xF3, 0x38, 0x4A, 0x77, 0xFA, 0x36, - 0xB7, 0x15, 0x76, 0xB6, 0x01, 0x1A, 0x8E, 0x25, 0x87, 0x82, 0xF1, 0x55, 0xD8, 0xC6, 0x43, - 0x2A, 0xC0, 0xE5, 0x98, 0xC9, 0x32, 0xD1, 0x94, 0x6F, 0xD9, 0x01, 0xBA, 0x06, 0x81, 0xE0, - 0x6D, 0x88, 0xF2, 0x24, 0x2A, 0x25, 0x01, 0x64, 0x5C, 0xBF, 0xF2, 0xD9, 0x99, 0x67, 0x3E, - 0xF6, 0x72, 0xEE, 0xE4, 0xE2, 0x33, 0x5C, 0xF8, 0x00, 0x40, 0xE3, 0x2A, 0x9A, 0xF4, 0x3D, - 0x22, 0x86, 0x44, 0x3C, 0xFB, 0x0A, 0xA5, 0x7C, 0x3F, 0xCC, 0xF5, 0xF1, 0x16, 0xC4, 0xAC, - 0x88, 0xB4, 0xDE, 0x62, 0x94, 0x92, 0x6A, 0x13}; - // exponent2 = d mod (q - 1) - static constexpr CryptoPP::byte Exponent2[] = { - 0x7C, 0x9D, 0xAD, 0x39, 0xE0, 0xD5, 0x60, 0x14, 0x94, 0x48, 0x19, 0x7F, 0x88, 0x95, 0xD5, - 0x8B, 0x80, 0xAD, 0x85, 0x8A, 0x4B, 0x77, 0x37, 0x85, 0xD0, 0x77, 0xBB, 0xBF, 0x89, 0x71, - 0x4A, 0x72, 0xCB, 0x72, 0x68, 0x38, 0xEC, 0x02, 0xC6, 0x7D, 0xC6, 0x44, 0x06, 0x33, 0x51, - 0x1C, 0xC0, 0xFF, 0x95, 0x8F, 0x0D, 0x75, 0xDC, 0x25, 0xBB, 0x0B, 0x73, 0x91, 0xA9, 0x6D, - 0x42, 0xD8, 0x03, 0xB7, 0x68, 0xD4, 0x1E, 0x75, 0x62, 0xA3, 0x70, 0x35, 0x79, 0x78, 0x00, - 0xC8, 0xF5, 0xEF, 0x15, 0xB9, 0xFC, 0x4E, 0x47, 0x5A, 0xC8, 0x70, 0x70, 0x5B, 0x52, 0x98, - 0xC0, 0xC2, 0x58, 0x4A, 0x70, 0x96, 0xCC, 0xB8, 0x10, 0xE1, 0x2F, 0x78, 0x8B, 0x2B, 0xA1, - 0x7F, 0xF9, 0xAC, 0xDE, 0xF0, 0xBB, 0x2B, 0xE2, 0x66, 0xE3, 0x22, 0x92, 0x31, 0x21, 0x57, - 0x92, 0xC4, 0xB8, 0xF2, 0x3E, 0x76, 0x20, 0x37}; - // e - static constexpr CryptoPP::byte PublicExponent[] = {0, 1, 0, 1}; - // (InverseQ)(q) = 1 mod p - static constexpr CryptoPP::byte Coefficient[] = { - 0x45, 0x97, 0x55, 0xD4, 0x22, 0x08, 0x5E, 0xF3, 0x5C, 0xB4, 0x05, 0x7A, 0xFD, 0xAA, 0x42, - 0x42, 0xAD, 0x9A, 0x8C, 0xA0, 0x6C, 0xBB, 0x1D, 0x68, 0x54, 0x54, 0x6E, 0x3E, 0x32, 0xE3, - 0x53, 0x73, 0x76, 0xF1, 0x3E, 0x01, 0xEA, 0xD3, 0xCF, 0xEB, 0xEB, 0x23, 0x3E, 0xC0, 0xBE, - 0xCE, 0xEC, 0x2C, 0x89, 0x5F, 0xA8, 0x27, 0x3A, 0x4C, 0xB7, 0xE6, 0x74, 0xBC, 0x45, 0x4C, - 0x26, 0xC8, 0x25, 0xFF, 0x34, 0x63, 0x25, 0x37, 0xE1, 0x48, 0x10, 0xC1, 0x93, 0xA6, 0xAF, - 0xEB, 0xBA, 0xE3, 0xA2, 0xF1, 0x3D, 0xEF, 0x63, 0xD8, 0xF4, 0xFD, 0xD3, 0xEE, 0xE2, 0x5D, - 0xE9, 0x33, 0xCC, 0xAD, 0xBA, 0x75, 0x5C, 0x85, 0xAF, 0xCE, 0xA9, 0x3D, 0xD1, 0xA2, 0x17, - 0xF3, 0xF6, 0x98, 0xB3, 0x50, 0x8E, 0x5E, 0xF6, 0xEB, 0x02, 0x8E, 0xA1, 0x62, 0xA7, 0xD6, - 0x2C, 0xEC, 0x91, 0xFF, 0x15, 0x40, 0xD2, 0xE3}; - // n = p * q - static constexpr CryptoPP::byte Modulus[] = { - 0xd2, 0x12, 0xfc, 0x33, 0x5f, 0x6d, 0xdb, 0x83, 0x16, 0x09, 0x62, 0x8b, 0x03, 0x56, 0x27, - 0x37, 0x82, 0xd4, 0x77, 0x85, 0x35, 0x29, 0x39, 0x2d, 0x52, 0x6b, 0x8c, 0x4c, 0x8c, 0xfb, - 0x06, 0xc1, 0x84, 0x5b, 0xe7, 0xd4, 0xf7, 0xbc, 0xd2, 0x4e, 0x62, 0x45, 0xcd, 0x2a, 0xbb, - 0xd7, 0x77, 0x76, 0x45, 0x36, 0x55, 0x27, 0x3f, 0xb3, 0xf5, 0xf9, 0x8e, 0xda, 0x4b, 0xef, - 0xaa, 0x59, 0xae, 0xb3, 0x9b, 0xea, 0x54, 0x98, 0xd2, 0x06, 0x32, 0x6a, 0x58, 0x31, 0x2a, - 0xe0, 0xd4, 0x4f, 0x90, 0xb5, 0x0a, 0x7d, 0xec, 0xf4, 0x3a, 0x9c, 0x52, 0x67, 0x2d, 0x99, - 0x31, 0x8e, 0x0c, 0x43, 0xe6, 0x82, 0xfe, 0x07, 0x46, 0xe1, 0x2e, 0x50, 0xd4, 0x1f, 0x2d, - 0x2f, 0x7e, 0xd9, 0x08, 0xba, 0x06, 0xb3, 0xbf, 0x2e, 0x20, 0x3f, 0x4e, 0x3f, 0xfe, 0x44, - 0xff, 0xaa, 0x50, 0x43, 0x57, 0x91, 0x69, 0x94, 0x49, 0x15, 0x82, 0x82, 0xe4, 0x0f, 0x4c, - 0x8d, 0x9d, 0x2c, 0xc9, 0x5b, 0x1d, 0x64, 0xbf, 0x88, 0x8b, 0xd4, 0xc5, 0x94, 0xe7, 0x65, - 0x47, 0x84, 0x1e, 0xe5, 0x79, 0x10, 0xfb, 0x98, 0x93, 0x47, 0xb9, 0x7d, 0x85, 0x12, 0xa6, - 0x40, 0x98, 0x2c, 0xf7, 0x92, 0xbc, 0x95, 0x19, 0x32, 0xed, 0xe8, 0x90, 0x56, 0x0d, 0x65, - 0xc1, 0xaa, 0x78, 0xc6, 0x2e, 0x54, 0xfd, 0x5f, 0x54, 0xa1, 0xf6, 0x7e, 0xe5, 0xe0, 0x5f, - 0x61, 0xc1, 0x20, 0xb4, 0xb9, 0xb4, 0x33, 0x08, 0x70, 0xe4, 0xdf, 0x89, 0x56, 0xed, 0x01, - 0x29, 0x46, 0x77, 0x5f, 0x8c, 0xb8, 0xa9, 0xf5, 0x1e, 0x2e, 0xb3, 0xb9, 0xbf, 0xe0, 0x09, - 0xb7, 0x8d, 0x28, 0xd4, 0xa6, 0xc3, 0xb8, 0x1e, 0x1f, 0x07, 0xeb, 0xb4, 0x12, 0x0b, 0x95, - 0xb8, 0x85, 0x30, 0xfd, 0xdc, 0x39, 0x13, 0xd0, 0x7c, 0xdc, 0x8f, 0xed, 0xf9, 0xc9, 0xa3, - 0xc1}; - // p - static constexpr CryptoPP::byte Prime1[] = { - 0xF9, 0x67, 0xAD, 0x99, 0x12, 0x31, 0x0C, 0x56, 0xA2, 0x2E, 0x16, 0x1C, 0x46, 0xB3, 0x4D, - 0x5B, 0x43, 0xBE, 0x42, 0xA2, 0xF6, 0x86, 0x96, 0x80, 0x42, 0xC3, 0xC7, 0x3F, 0xC3, 0x42, - 0xF5, 0x87, 0x49, 0x33, 0x9F, 0x07, 0x5D, 0x6E, 0x2C, 0x04, 0xFD, 0xE3, 0xE1, 0xB2, 0xAE, - 0x0A, 0x0C, 0xF0, 0xC7, 0xA6, 0x1C, 0xA1, 0x63, 0x50, 0xC8, 0x09, 0x9C, 0x51, 0x24, 0x52, - 0x6C, 0x5E, 0x5E, 0xBD, 0x1E, 0x27, 0x06, 0xBB, 0xBC, 0x9E, 0x94, 0xE1, 0x35, 0xD4, 0x6D, - 0xB3, 0xCB, 0x3C, 0x68, 0xDD, 0x68, 0xB3, 0xFE, 0x6C, 0xCB, 0x8D, 0x82, 0x20, 0x76, 0x23, - 0x63, 0xB7, 0xE9, 0x68, 0x10, 0x01, 0x4E, 0xDC, 0xBA, 0x27, 0x5D, 0x01, 0xC1, 0x2D, 0x80, - 0x5E, 0x2B, 0xAF, 0x82, 0x6B, 0xD8, 0x84, 0xB6, 0x10, 0x52, 0x86, 0xA7, 0x89, 0x8E, 0xAE, - 0x9A, 0xE2, 0x89, 0xC6, 0xF7, 0xD5, 0x87, 0xFB}; - // q - static constexpr CryptoPP::byte Prime2[] = { - 0xD7, 0xA1, 0x0F, 0x9A, 0x8B, 0xF2, 0xC9, 0x11, 0x95, 0x32, 0x9A, 0x8C, 0xF0, 0xD9, 0x40, - 0x47, 0xF5, 0x68, 0xA0, 0x0D, 0xBD, 0xC1, 0xFC, 0x43, 0x2F, 0x65, 0xF9, 0xC3, 0x61, 0x0F, - 0x25, 0x77, 0x54, 0xAD, 0xD7, 0x58, 0xAC, 0x84, 0x40, 0x60, 0x8D, 0x3F, 0xF3, 0x65, 0x89, - 0x75, 0xB5, 0xC6, 0x2C, 0x51, 0x1A, 0x2F, 0x1F, 0x22, 0xE4, 0x43, 0x11, 0x54, 0xBE, 0xC9, - 0xB4, 0xC7, 0xB5, 0x1B, 0x05, 0x0B, 0xBC, 0x56, 0x9A, 0xCD, 0x4A, 0xD9, 0x73, 0x68, 0x5E, - 0x5C, 0xFB, 0x92, 0xB7, 0x8B, 0x0D, 0xFF, 0xF5, 0x07, 0xCA, 0xB4, 0xC8, 0x9B, 0x96, 0x3C, - 0x07, 0x9E, 0x3E, 0x6B, 0x2A, 0x11, 0xF2, 0x8A, 0xB1, 0x8A, 0xD7, 0x2E, 0x1B, 0xA5, 0x53, - 0x24, 0x06, 0xED, 0x50, 0xB8, 0x90, 0x67, 0xB1, 0xE2, 0x41, 0xC6, 0x92, 0x01, 0xEE, 0x10, - 0xF0, 0x61, 0xBB, 0xFB, 0xB2, 0x7D, 0x4A, 0x73}; - static constexpr CryptoPP::byte PrivateExponent[] = { - 0x32, 0xD9, 0x03, 0x90, 0x8F, 0xBD, 0xB0, 0x8F, 0x57, 0x2B, 0x28, 0x5E, 0x0B, 0x8D, 0xB3, - 0xEA, 0x5C, 0xD1, 0x7E, 0xA8, 0x90, 0x88, 0x8C, 0xDD, 0x6A, 0x80, 0xBB, 0xB1, 0xDF, 0xC1, - 0xF7, 0x0D, 0xAA, 0x32, 0xF0, 0xB7, 0x7C, 0xCB, 0x88, 0x80, 0x0E, 0x8B, 0x64, 0xB0, 0xBE, - 0x4C, 0xD6, 0x0E, 0x9B, 0x8C, 0x1E, 0x2A, 0x64, 0xE1, 0xF3, 0x5C, 0xD7, 0x76, 0x01, 0x41, - 0x5E, 0x93, 0x5C, 0x94, 0xFE, 0xDD, 0x46, 0x62, 0xC3, 0x1B, 0x5A, 0xE2, 0xA0, 0xBC, 0x2D, - 0xEB, 0xC3, 0x98, 0x0A, 0xA7, 0xB7, 0x85, 0x69, 0x70, 0x68, 0x2B, 0x64, 0x4A, 0xB3, 0x1F, - 0xCC, 0x7D, 0xDC, 0x7C, 0x26, 0xF4, 0x77, 0xF6, 0x5C, 0xF2, 0xAE, 0x5A, 0x44, 0x2D, 0xD3, - 0xAB, 0x16, 0x62, 0x04, 0x19, 0xBA, 0xFB, 0x90, 0xFF, 0xE2, 0x30, 0x50, 0x89, 0x6E, 0xCB, - 0x56, 0xB2, 0xEB, 0xC0, 0x91, 0x16, 0x92, 0x5E, 0x30, 0x8E, 0xAE, 0xC7, 0x94, 0x5D, 0xFD, - 0x35, 0xE1, 0x20, 0xF8, 0xAD, 0x3E, 0xBC, 0x08, 0xBF, 0xC0, 0x36, 0x74, 0x9F, 0xD5, 0xBB, - 0x52, 0x08, 0xFD, 0x06, 0x66, 0xF3, 0x7A, 0xB3, 0x04, 0xF4, 0x75, 0x29, 0x5D, 0xE9, 0x5F, - 0xAA, 0x10, 0x30, 0xB2, 0x0F, 0x5A, 0x1A, 0xC1, 0x2A, 0xB3, 0xFE, 0xCB, 0x21, 0xAD, 0x80, - 0xEC, 0x8F, 0x20, 0x09, 0x1C, 0xDB, 0xC5, 0x58, 0x94, 0xC2, 0x9C, 0xC6, 0xCE, 0x82, 0x65, - 0x3E, 0x57, 0x90, 0xBC, 0xA9, 0x8B, 0x06, 0xB4, 0xF0, 0x72, 0xF6, 0x77, 0xDF, 0x98, 0x64, - 0xF1, 0xEC, 0xFE, 0x37, 0x2D, 0xBC, 0xAE, 0x8C, 0x08, 0x81, 0x1F, 0xC3, 0xC9, 0x89, 0x1A, - 0xC7, 0x42, 0x82, 0x4B, 0x2E, 0xDC, 0x8E, 0x8D, 0x73, 0xCE, 0xB1, 0xCC, 0x01, 0xD9, 0x08, - 0x70, 0x87, 0x3C, 0x44, 0x08, 0xEC, 0x49, 0x8F, 0x81, 0x5A, 0xE2, 0x40, 0xFF, 0x77, 0xFC, - 0x0D}; -}; \ No newline at end of file diff --git a/src/core/file_format/pkg.h b/src/core/file_format/pkg.h deleted file mode 100644 index a488a2df8..000000000 --- a/src/core/file_format/pkg.h +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include -#include -#include "common/endian.h" -#include "core/crypto/crypto.h" -#include "pfs.h" -#include "trp.h" - -struct PKGHeader { - u32_be magic; // Magic - u32_be pkg_type; - u32_be pkg_0x8; // unknown field - u32_be pkg_file_count; - u32_be pkg_table_entry_count; - u16_be pkg_sc_entry_count; - u16_be pkg_table_entry_count_2; // same as pkg_entry_count - u32_be pkg_table_entry_offset; // file table offset - u32_be pkg_sc_entry_data_size; - u64_be pkg_body_offset; // offset of PKG entries - u64_be pkg_body_size; // length of all PKG entries - u64_be pkg_content_offset; - u64_be pkg_content_size; - u8 pkg_content_id[0x24]; // packages' content ID as a 36-byte string - u8 pkg_padding[0xC]; // padding - u32_be pkg_drm_type; // DRM type - u32_be pkg_content_type; // Content type - u32_be pkg_content_flags; // Content flags - u32_be pkg_promote_size; - u32_be pkg_version_date; - u32_be pkg_version_hash; - u32_be pkg_0x088; - u32_be pkg_0x08C; - u32_be pkg_0x090; - u32_be pkg_0x094; - u32_be pkg_iro_tag; - u32_be pkg_drm_type_version; - - u8 pkg_zeroes_1[0x60]; - - /* Digest table */ - u8 digest_entries1[0x20]; // sha256 digest for main entry 1 - u8 digest_entries2[0x20]; // sha256 digest for main entry 2 - u8 digest_table_digest[0x20]; // sha256 digest for digest table - u8 digest_body_digest[0x20]; // sha256 digest for main table - - u8 pkg_zeroes_2[0x280]; - - u32_be pkg_0x400; - - u32_be pfs_image_count; // count of PFS images - u64_be pfs_image_flags; // PFS flags - u64_be pfs_image_offset; // offset to start of external PFS image - u64_be pfs_image_size; // size of external PFS image - u64_be mount_image_offset; - u64_be mount_image_size; - u64_be pkg_size; - u32_be pfs_signed_size; - u32_be pfs_cache_size; - u8 pfs_image_digest[0x20]; - u8 pfs_signed_digest[0x20]; - u64_be pfs_split_size_nth_0; - u64_be pfs_split_size_nth_1; - - u8 pkg_zeroes_3[0xB50]; - - u8 pkg_digest[0x20]; -}; - -enum class PKGContentFlag { - FIRST_PATCH = 0x100000, - PATCHGO = 0x200000, - REMASTER = 0x400000, - PS_CLOUD = 0x800000, - GD_AC = 0x2000000, - NON_GAME = 0x4000000, - UNKNOWN_0x8000000 = 0x8000000, - SUBSEQUENT_PATCH = 0x40000000, - DELTA_PATCH = 0x41000000, - CUMULATIVE_PATCH = 0x60000000 -}; - -struct PKGEntry { - u32_be id; // File ID, useful for files without a filename entry - u32_be filename_offset; // Offset into the filenames table (ID 0x200) where this file's name is - // located - u32_be flags1; // Flags including encrypted flag, etc - u32_be flags2; // Flags including encryption key index, etc - u32_be offset; // Offset into PKG to find the file - u32_be size; // Size of the file - u64_be padding; // blank padding -}; -static_assert(sizeof(PKGEntry) == 32); - -class PKG { -public: - PKG(); - ~PKG(); - - bool Open(const std::filesystem::path& filepath, std::string& failreason); - void ExtractFiles(const int index); - bool Extract(const std::filesystem::path& filepath, const std::filesystem::path& extract, - std::string& failreason); - - std::vector sfo; - - u32 GetNumberOfFiles() { - return fsTable.size(); - } - - u64 GetPkgSize() { - return pkgSize; - } - - std::string GetPkgFlags() { - return pkgFlags; - } - - std::string_view GetTitleID() { - return std::string_view(pkgTitleID, 9); - } - - PKGHeader GetPkgHeader() { - return pkgheader; - } - - static bool isFlagSet(u32_be variable, PKGContentFlag flag) { - return (variable) & static_cast(flag); - } - - static constexpr std::array, 10> flagNames = { - {{PKGContentFlag::FIRST_PATCH, "FIRST_PATCH"}, - {PKGContentFlag::PATCHGO, "PATCHGO"}, - {PKGContentFlag::REMASTER, "REMASTER"}, - {PKGContentFlag::PS_CLOUD, "PS_CLOUD"}, - {PKGContentFlag::GD_AC, "GD_AC"}, - {PKGContentFlag::NON_GAME, "NON_GAME"}, - {PKGContentFlag::UNKNOWN_0x8000000, "UNKNOWN_0x8000000"}, - {PKGContentFlag::SUBSEQUENT_PATCH, "SUBSEQUENT_PATCH"}, - {PKGContentFlag::DELTA_PATCH, "DELTA_PATCH"}, - {PKGContentFlag::CUMULATIVE_PATCH, "CUMULATIVE_PATCH"}}}; - -private: - Crypto crypto; - TRP trp; - u64 pkgSize = 0; - char pkgTitleID[9]; - PKGHeader pkgheader; - std::string pkgFlags; - - std::unordered_map extractPaths; - std::vector fsTable; - std::vector iNodeBuf; - std::vector sectorMap; - u64 pfsc_offset; - - std::array dk3_; - std::array ivKey; - std::array imgKey; - std::array ekpfsKey; - std::array dataKey; - std::array tweakKey; - std::vector decNp; - - std::filesystem::path pkgpath; - std::filesystem::path current_dir; - std::filesystem::path extract_path; -}; diff --git a/src/core/file_format/pkg_type.cpp b/src/core/file_format/pkg_type.cpp deleted file mode 100644 index 464f0b993..000000000 --- a/src/core/file_format/pkg_type.cpp +++ /dev/null @@ -1,638 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include "pkg_type.h" - -struct PkgEntryValue { - u32 type; - std::string_view name; - - operator u32() const noexcept { - return type; - } -}; - -constexpr static std::array PkgEntries = {{ - {0x0001, "digests"}, - {0x0010, "entry_keys"}, - {0x0020, "image_key"}, - {0x0080, "general_digests"}, - {0x0100, "metas"}, - {0x0200, "entry_names"}, - {0x0400, "license.dat"}, - {0x0401, "license.info"}, - {0x0402, "nptitle.dat"}, - {0x0403, "npbind.dat"}, - {0x0404, "selfinfo.dat"}, - {0x0406, "imageinfo.dat"}, - {0x0407, "target-deltainfo.dat"}, - {0x0408, "origin-deltainfo.dat"}, - {0x0409, "psreserved.dat"}, - {0x1000, "param.sfo"}, - {0x1001, "playgo-chunk.dat"}, - {0x1002, "playgo-chunk.sha"}, - {0x1003, "playgo-manifest.xml"}, - {0x1004, "pronunciation.xml"}, - {0x1005, "pronunciation.sig"}, - {0x1006, "pic1.png"}, - {0x1007, "pubtoolinfo.dat"}, - {0x1008, "app/playgo-chunk.dat"}, - {0x1009, "app/playgo-chunk.sha"}, - {0x100A, "app/playgo-manifest.xml"}, - {0x100B, "shareparam.json"}, - {0x100C, "shareoverlayimage.png"}, - {0x100D, "save_data.png"}, - {0x100E, "shareprivacyguardimage.png"}, - {0x1200, "icon0.png"}, - {0x1201, "icon0_00.png"}, - {0x1202, "icon0_01.png"}, - {0x1203, "icon0_02.png"}, - {0x1204, "icon0_03.png"}, - {0x1205, "icon0_04.png"}, - {0x1206, "icon0_05.png"}, - {0x1207, "icon0_06.png"}, - {0x1208, "icon0_07.png"}, - {0x1209, "icon0_08.png"}, - {0x120A, "icon0_09.png"}, - {0x120B, "icon0_10.png"}, - {0x120C, "icon0_11.png"}, - {0x120D, "icon0_12.png"}, - {0x120E, "icon0_13.png"}, - {0x120F, "icon0_14.png"}, - {0x1210, "icon0_15.png"}, - {0x1211, "icon0_16.png"}, - {0x1212, "icon0_17.png"}, - {0x1213, "icon0_18.png"}, - {0x1214, "icon0_19.png"}, - {0x1215, "icon0_20.png"}, - {0x1216, "icon0_21.png"}, - {0x1217, "icon0_22.png"}, - {0x1218, "icon0_23.png"}, - {0x1219, "icon0_24.png"}, - {0x121A, "icon0_25.png"}, - {0x121B, "icon0_26.png"}, - {0x121C, "icon0_27.png"}, - {0x121D, "icon0_28.png"}, - {0x121E, "icon0_29.png"}, - {0x121F, "icon0_30.png"}, - {0x1220, "pic0.png"}, - {0x1240, "snd0.at9"}, - {0x1241, "pic1_00.png"}, - {0x1242, "pic1_01.png"}, - {0x1243, "pic1_02.png"}, - {0x1244, "pic1_03.png"}, - {0x1245, "pic1_04.png"}, - {0x1246, "pic1_05.png"}, - {0x1247, "pic1_06.png"}, - {0x1248, "pic1_07.png"}, - {0x1249, "pic1_08.png"}, - {0x124A, "pic1_09.png"}, - {0x124B, "pic1_10.png"}, - {0x124C, "pic1_11.png"}, - {0x124D, "pic1_12.png"}, - {0x124E, "pic1_13.png"}, - {0x124F, "pic1_14.png"}, - {0x1250, "pic1_15.png"}, - {0x1251, "pic1_16.png"}, - {0x1252, "pic1_17.png"}, - {0x1253, "pic1_18.png"}, - {0x1254, "pic1_19.png"}, - {0x1255, "pic1_20.png"}, - {0x1256, "pic1_21.png"}, - {0x1257, "pic1_22.png"}, - {0x1258, "pic1_23.png"}, - {0x1259, "pic1_24.png"}, - {0x125A, "pic1_25.png"}, - {0x125B, "pic1_26.png"}, - {0x125C, "pic1_27.png"}, - {0x125D, "pic1_28.png"}, - {0x125E, "pic1_29.png"}, - {0x125F, "pic1_30.png"}, - {0x1260, "changeinfo/changeinfo.xml"}, - {0x1261, "changeinfo/changeinfo_00.xml"}, - {0x1262, "changeinfo/changeinfo_01.xml"}, - {0x1263, "changeinfo/changeinfo_02.xml"}, - {0x1264, "changeinfo/changeinfo_03.xml"}, - {0x1265, "changeinfo/changeinfo_04.xml"}, - {0x1266, "changeinfo/changeinfo_05.xml"}, - {0x1267, "changeinfo/changeinfo_06.xml"}, - {0x1268, "changeinfo/changeinfo_07.xml"}, - {0x1269, "changeinfo/changeinfo_08.xml"}, - {0x126A, "changeinfo/changeinfo_09.xml"}, - {0x126B, "changeinfo/changeinfo_10.xml"}, - {0x126C, "changeinfo/changeinfo_11.xml"}, - {0x126D, "changeinfo/changeinfo_12.xml"}, - {0x126E, "changeinfo/changeinfo_13.xml"}, - {0x126F, "changeinfo/changeinfo_14.xml"}, - {0x1270, "changeinfo/changeinfo_15.xml"}, - {0x1271, "changeinfo/changeinfo_16.xml"}, - {0x1272, "changeinfo/changeinfo_17.xml"}, - {0x1273, "changeinfo/changeinfo_18.xml"}, - {0x1274, "changeinfo/changeinfo_19.xml"}, - {0x1275, "changeinfo/changeinfo_20.xml"}, - {0x1276, "changeinfo/changeinfo_21.xml"}, - {0x1277, "changeinfo/changeinfo_22.xml"}, - {0x1278, "changeinfo/changeinfo_23.xml"}, - {0x1279, "changeinfo/changeinfo_24.xml"}, - {0x127A, "changeinfo/changeinfo_25.xml"}, - {0x127B, "changeinfo/changeinfo_26.xml"}, - {0x127C, "changeinfo/changeinfo_27.xml"}, - {0x127D, "changeinfo/changeinfo_28.xml"}, - {0x127E, "changeinfo/changeinfo_29.xml"}, - {0x127F, "changeinfo/changeinfo_30.xml"}, - {0x1280, "icon0.dds"}, - {0x1281, "icon0_00.dds"}, - {0x1282, "icon0_01.dds"}, - {0x1283, "icon0_02.dds"}, - {0x1284, "icon0_03.dds"}, - {0x1285, "icon0_04.dds"}, - {0x1286, "icon0_05.dds"}, - {0x1287, "icon0_06.dds"}, - {0x1288, "icon0_07.dds"}, - {0x1289, "icon0_08.dds"}, - {0x128A, "icon0_09.dds"}, - {0x128B, "icon0_10.dds"}, - {0x128C, "icon0_11.dds"}, - {0x128D, "icon0_12.dds"}, - {0x128E, "icon0_13.dds"}, - {0x128F, "icon0_14.dds"}, - {0x1290, "icon0_15.dds"}, - {0x1291, "icon0_16.dds"}, - {0x1292, "icon0_17.dds"}, - {0x1293, "icon0_18.dds"}, - {0x1294, "icon0_19.dds"}, - {0x1295, "icon0_20.dds"}, - {0x1296, "icon0_21.dds"}, - {0x1297, "icon0_22.dds"}, - {0x1298, "icon0_23.dds"}, - {0x1299, "icon0_24.dds"}, - {0x129A, "icon0_25.dds"}, - {0x129B, "icon0_26.dds"}, - {0x129C, "icon0_27.dds"}, - {0x129D, "icon0_28.dds"}, - {0x129E, "icon0_29.dds"}, - {0x129F, "icon0_30.dds"}, - {0x12A0, "pic0.dds"}, - {0x12C0, "pic1.dds"}, - {0x12C1, "pic1_00.dds"}, - {0x12C2, "pic1_01.dds"}, - {0x12C3, "pic1_02.dds"}, - {0x12C4, "pic1_03.dds"}, - {0x12C5, "pic1_04.dds"}, - {0x12C6, "pic1_05.dds"}, - {0x12C7, "pic1_06.dds"}, - {0x12C8, "pic1_07.dds"}, - {0x12C9, "pic1_08.dds"}, - {0x12CA, "pic1_09.dds"}, - {0x12CB, "pic1_10.dds"}, - {0x12CC, "pic1_11.dds"}, - {0x12CD, "pic1_12.dds"}, - {0x12CE, "pic1_13.dds"}, - {0x12CF, "pic1_14.dds"}, - {0x12D0, "pic1_15.dds"}, - {0x12D1, "pic1_16.dds"}, - {0x12D2, "pic1_17.dds"}, - {0x12D3, "pic1_18.dds"}, - {0x12D4, "pic1_19.dds"}, - {0x12D5, "pic1_20.dds"}, - {0x12D6, "pic1_21.dds"}, - {0x12D7, "pic1_22.dds"}, - {0x12D8, "pic1_23.dds"}, - {0x12D9, "pic1_24.dds"}, - {0x12DA, "pic1_25.dds"}, - {0x12DB, "pic1_26.dds"}, - {0x12DC, "pic1_27.dds"}, - {0x12DD, "pic1_28.dds"}, - {0x12DE, "pic1_29.dds"}, - {0x12DF, "pic1_30.dds"}, - {0x1400, "trophy/trophy00.trp"}, - {0x1401, "trophy/trophy01.trp"}, - {0x1402, "trophy/trophy02.trp"}, - {0x1403, "trophy/trophy03.trp"}, - {0x1404, "trophy/trophy04.trp"}, - {0x1405, "trophy/trophy05.trp"}, - {0x1406, "trophy/trophy06.trp"}, - {0x1407, "trophy/trophy07.trp"}, - {0x1408, "trophy/trophy08.trp"}, - {0x1409, "trophy/trophy09.trp"}, - {0x140A, "trophy/trophy10.trp"}, - {0x140B, "trophy/trophy11.trp"}, - {0x140C, "trophy/trophy12.trp"}, - {0x140D, "trophy/trophy13.trp"}, - {0x140E, "trophy/trophy14.trp"}, - {0x140F, "trophy/trophy15.trp"}, - {0x1410, "trophy/trophy16.trp"}, - {0x1411, "trophy/trophy17.trp"}, - {0x1412, "trophy/trophy18.trp"}, - {0x1413, "trophy/trophy19.trp"}, - {0x1414, "trophy/trophy20.trp"}, - {0x1415, "trophy/trophy21.trp"}, - {0x1416, "trophy/trophy22.trp"}, - {0x1417, "trophy/trophy23.trp"}, - {0x1418, "trophy/trophy24.trp"}, - {0x1419, "trophy/trophy25.trp"}, - {0x141A, "trophy/trophy26.trp"}, - {0x141B, "trophy/trophy27.trp"}, - {0x141C, "trophy/trophy28.trp"}, - {0x141D, "trophy/trophy29.trp"}, - {0x141E, "trophy/trophy30.trp"}, - {0x141F, "trophy/trophy31.trp"}, - {0x1420, "trophy/trophy32.trp"}, - {0x1421, "trophy/trophy33.trp"}, - {0x1422, "trophy/trophy34.trp"}, - {0x1423, "trophy/trophy35.trp"}, - {0x1424, "trophy/trophy36.trp"}, - {0x1425, "trophy/trophy37.trp"}, - {0x1426, "trophy/trophy38.trp"}, - {0x1427, "trophy/trophy39.trp"}, - {0x1428, "trophy/trophy40.trp"}, - {0x1429, "trophy/trophy41.trp"}, - {0x142A, "trophy/trophy42.trp"}, - {0x142B, "trophy/trophy43.trp"}, - {0x142C, "trophy/trophy44.trp"}, - {0x142D, "trophy/trophy45.trp"}, - {0x142E, "trophy/trophy46.trp"}, - {0x142F, "trophy/trophy47.trp"}, - {0x1430, "trophy/trophy48.trp"}, - {0x1431, "trophy/trophy49.trp"}, - {0x1432, "trophy/trophy50.trp"}, - {0x1433, "trophy/trophy51.trp"}, - {0x1434, "trophy/trophy52.trp"}, - {0x1435, "trophy/trophy53.trp"}, - {0x1436, "trophy/trophy54.trp"}, - {0x1437, "trophy/trophy55.trp"}, - {0x1438, "trophy/trophy56.trp"}, - {0x1439, "trophy/trophy57.trp"}, - {0x143A, "trophy/trophy58.trp"}, - {0x143B, "trophy/trophy59.trp"}, - {0x143C, "trophy/trophy60.trp"}, - {0x143D, "trophy/trophy61.trp"}, - {0x143E, "trophy/trophy62.trp"}, - {0x143F, "trophy/trophy63.trp"}, - {0x1440, "trophy/trophy64.trp"}, - {0x1441, "trophy/trophy65.trp"}, - {0x1442, "trophy/trophy66.trp"}, - {0x1443, "trophy/trophy67.trp"}, - {0x1444, "trophy/trophy68.trp"}, - {0x1445, "trophy/trophy69.trp"}, - {0x1446, "trophy/trophy70.trp"}, - {0x1447, "trophy/trophy71.trp"}, - {0x1448, "trophy/trophy72.trp"}, - {0x1449, "trophy/trophy73.trp"}, - {0x144A, "trophy/trophy74.trp"}, - {0x144B, "trophy/trophy75.trp"}, - {0x144C, "trophy/trophy76.trp"}, - {0x144D, "trophy/trophy77.trp"}, - {0x144E, "trophy/trophy78.trp"}, - {0x144F, "trophy/trophy79.trp"}, - {0x1450, "trophy/trophy80.trp"}, - {0x1451, "trophy/trophy81.trp"}, - {0x1452, "trophy/trophy82.trp"}, - {0x1453, "trophy/trophy83.trp"}, - {0x1454, "trophy/trophy84.trp"}, - {0x1455, "trophy/trophy85.trp"}, - {0x1456, "trophy/trophy86.trp"}, - {0x1457, "trophy/trophy87.trp"}, - {0x1458, "trophy/trophy88.trp"}, - {0x1459, "trophy/trophy89.trp"}, - {0x145A, "trophy/trophy90.trp"}, - {0x145B, "trophy/trophy91.trp"}, - {0x145C, "trophy/trophy92.trp"}, - {0x145D, "trophy/trophy93.trp"}, - {0x145E, "trophy/trophy94.trp"}, - {0x145F, "trophy/trophy95.trp"}, - {0x1460, "trophy/trophy96.trp"}, - {0x1461, "trophy/trophy97.trp"}, - {0x1462, "trophy/trophy98.trp"}, - {0x1463, "trophy/trophy99.trp"}, - {0x1600, "keymap_rp/001.png"}, - {0x1601, "keymap_rp/002.png"}, - {0x1602, "keymap_rp/003.png"}, - {0x1603, "keymap_rp/004.png"}, - {0x1604, "keymap_rp/005.png"}, - {0x1605, "keymap_rp/006.png"}, - {0x1606, "keymap_rp/007.png"}, - {0x1607, "keymap_rp/008.png"}, - {0x1608, "keymap_rp/009.png"}, - {0x1609, "keymap_rp/010.png"}, - {0x1610, "keymap_rp/00/001.png"}, - {0x1611, "keymap_rp/00/002.png"}, - {0x1612, "keymap_rp/00/003.png"}, - {0x1613, "keymap_rp/00/004.png"}, - {0x1614, "keymap_rp/00/005.png"}, - {0x1615, "keymap_rp/00/006.png"}, - {0x1616, "keymap_rp/00/007.png"}, - {0x1617, "keymap_rp/00/008.png"}, - {0x1618, "keymap_rp/00/009.png"}, - {0x1619, "keymap_rp/00/010.png"}, - {0x1620, "keymap_rp/01/001.png"}, - {0x1621, "keymap_rp/01/002.png"}, - {0x1622, "keymap_rp/01/003.png"}, - {0x1623, "keymap_rp/01/004.png"}, - {0x1624, "keymap_rp/01/005.png"}, - {0x1625, "keymap_rp/01/006.png"}, - {0x1626, "keymap_rp/01/007.png"}, - {0x1627, "keymap_rp/01/008.png"}, - {0x1628, "keymap_rp/01/009.png"}, - {0x1629, "keymap_rp/01/010.png"}, - {0x1630, "keymap_rp/02/001.png"}, - {0x1631, "keymap_rp/02/002.png"}, - {0x1632, "keymap_rp/02/003.png"}, - {0x1633, "keymap_rp/02/004.png"}, - {0x1634, "keymap_rp/02/005.png"}, - {0x1635, "keymap_rp/02/006.png"}, - {0x1636, "keymap_rp/02/007.png"}, - {0x1637, "keymap_rp/02/008.png"}, - {0x1638, "keymap_rp/02/009.png"}, - {0x1639, "keymap_rp/02/010.png"}, - {0x1640, "keymap_rp/03/001.png"}, - {0x1641, "keymap_rp/03/002.png"}, - {0x1642, "keymap_rp/03/003.png"}, - {0x1643, "keymap_rp/03/004.png"}, - {0x1644, "keymap_rp/03/005.png"}, - {0x1645, "keymap_rp/03/006.png"}, - {0x1646, "keymap_rp/03/007.png"}, - {0x1647, "keymap_rp/03/008.png"}, - {0x1648, "keymap_rp/03/0010.png"}, - {0x1650, "keymap_rp/04/001.png"}, - {0x1651, "keymap_rp/04/002.png"}, - {0x1652, "keymap_rp/04/003.png"}, - {0x1653, "keymap_rp/04/004.png"}, - {0x1654, "keymap_rp/04/005.png"}, - {0x1655, "keymap_rp/04/006.png"}, - {0x1656, "keymap_rp/04/007.png"}, - {0x1657, "keymap_rp/04/008.png"}, - {0x1658, "keymap_rp/04/009.png"}, - {0x1659, "keymap_rp/04/010.png"}, - {0x1660, "keymap_rp/05/001.png"}, - {0x1661, "keymap_rp/05/002.png"}, - {0x1662, "keymap_rp/05/003.png"}, - {0x1663, "keymap_rp/05/004.png"}, - {0x1664, "keymap_rp/05/005.png"}, - {0x1665, "keymap_rp/05/006.png"}, - {0x1666, "keymap_rp/05/007.png"}, - {0x1667, "keymap_rp/05/008.png"}, - {0x1668, "keymap_rp/05/009.png"}, - {0x1669, "keymap_rp/05/010.png"}, - {0x1670, "keymap_rp/06/001.png"}, - {0x1671, "keymap_rp/06/002.png"}, - {0x1672, "keymap_rp/06/003.png"}, - {0x1673, "keymap_rp/06/004.png"}, - {0x1674, "keymap_rp/06/005.png"}, - {0x1675, "keymap_rp/06/006.png"}, - {0x1676, "keymap_rp/06/007.png"}, - {0x1677, "keymap_rp/06/008.png"}, - {0x1678, "keymap_rp/06/009.png"}, - {0x1679, "keymap_rp/06/010.png"}, - {0x1680, "keymap_rp/07/001.png"}, - {0x1681, "keymap_rp/07/002.png"}, - {0x1682, "keymap_rp/07/003.png"}, - {0x1683, "keymap_rp/07/004.png"}, - {0x1684, "keymap_rp/07/005.png"}, - {0x1685, "keymap_rp/07/006.png"}, - {0x1686, "keymap_rp/07/007.png"}, - {0x1687, "keymap_rp/07/008.png"}, - {0x1688, "keymap_rp/07/009.png"}, - {0x1689, "keymap_rp/07/010.png"}, - {0x1690, "keymap_rp/08/001.png"}, - {0x1691, "keymap_rp/08/002.png"}, - {0x1692, "keymap_rp/08/003.png"}, - {0x1693, "keymap_rp/08/004.png"}, - {0x1694, "keymap_rp/08/005.png"}, - {0x1695, "keymap_rp/08/006.png"}, - {0x1696, "keymap_rp/08/007.png"}, - {0x1697, "keymap_rp/08/008.png"}, - {0x1698, "keymap_rp/08/009.png"}, - {0x1699, "keymap_rp/08/010.png"}, - {0x16A0, "keymap_rp/09/001.png"}, - {0x16A1, "keymap_rp/09/002.png"}, - {0x16A2, "keymap_rp/09/003.png"}, - {0x16A3, "keymap_rp/09/004.png"}, - {0x16A4, "keymap_rp/09/005.png"}, - {0x16A5, "keymap_rp/09/006.png"}, - {0x16A6, "keymap_rp/09/007.png"}, - {0x16A7, "keymap_rp/09/008.png"}, - {0x16A8, "keymap_rp/09/009.png"}, - {0x16A9, "keymap_rp/09/010.png"}, - {0x16B0, "keymap_rp/10/001.png"}, - {0x16B1, "keymap_rp/10/002.png"}, - {0x16B2, "keymap_rp/10/003.png"}, - {0x16B3, "keymap_rp/10/004.png"}, - {0x16B4, "keymap_rp/10/005.png"}, - {0x16B5, "keymap_rp/10/006.png"}, - {0x16B6, "keymap_rp/10/007.png"}, - {0x16B7, "keymap_rp/10/008.png"}, - {0x16B8, "keymap_rp/10/009.png"}, - {0x16B9, "keymap_rp/10/010.png"}, - {0x16C0, "keymap_rp/11/001.png"}, - {0x16C1, "keymap_rp/11/002.png"}, - {0x16C2, "keymap_rp/11/003.png"}, - {0x16C3, "keymap_rp/11/004.png"}, - {0x16C4, "keymap_rp/11/005.png"}, - {0x16C5, "keymap_rp/11/006.png"}, - {0x16C6, "keymap_rp/11/007.png"}, - {0x16C7, "keymap_rp/11/008.png"}, - {0x16C8, "keymap_rp/11/009.png"}, - {0x16C9, "keymap_rp/11/010.png"}, - {0x16D0, "keymap_rp/12/001.png"}, - {0x16D1, "keymap_rp/12/002.png"}, - {0x16D2, "keymap_rp/12/003.png"}, - {0x16D3, "keymap_rp/12/004.png"}, - {0x16D4, "keymap_rp/12/005.png"}, - {0x16D5, "keymap_rp/12/006.png"}, - {0x16D6, "keymap_rp/12/007.png"}, - {0x16D7, "keymap_rp/12/008.png"}, - {0x16D8, "keymap_rp/12/009.png"}, - {0x16D9, "keymap_rp/12/010.png"}, - {0x16E0, "keymap_rp/13/001.png"}, - {0x16E1, "keymap_rp/13/002.png"}, - {0x16E2, "keymap_rp/13/003.png"}, - {0x16E3, "keymap_rp/13/004.png"}, - {0x16E4, "keymap_rp/13/005.png"}, - {0x16E5, "keymap_rp/13/006.png"}, - {0x16E6, "keymap_rp/13/007.png"}, - {0x16E7, "keymap_rp/13/008.png"}, - {0x16E8, "keymap_rp/13/009.png"}, - {0x16E9, "keymap_rp/13/010.png"}, - {0x16F0, "keymap_rp/14/001.png"}, - {0x16F1, "keymap_rp/14/002.png"}, - {0x16F2, "keymap_rp/14/003.png"}, - {0x16F3, "keymap_rp/14/004.png"}, - {0x16F4, "keymap_rp/14/005.png"}, - {0x16F5, "keymap_rp/14/006.png"}, - {0x16F6, "keymap_rp/14/007.png"}, - {0x16F7, "keymap_rp/14/008.png"}, - {0x16F8, "keymap_rp/14/009.png"}, - {0x16F9, "keymap_rp/14/010.png"}, - {0x1700, "keymap_rp/15/001.png"}, - {0x1701, "keymap_rp/15/002.png"}, - {0x1702, "keymap_rp/15/003.png"}, - {0x1703, "keymap_rp/15/004.png"}, - {0x1704, "keymap_rp/15/005.png"}, - {0x1705, "keymap_rp/15/006.png"}, - {0x1706, "keymap_rp/15/007.png"}, - {0x1707, "keymap_rp/15/008.png"}, - {0x1708, "keymap_rp/15/009.png"}, - {0x1709, "keymap_rp/15/010.png"}, - {0x1710, "keymap_rp/16/001.png"}, - {0x1711, "keymap_rp/16/002.png"}, - {0x1712, "keymap_rp/16/003.png"}, - {0x1713, "keymap_rp/16/004.png"}, - {0x1714, "keymap_rp/16/005.png"}, - {0x1715, "keymap_rp/16/006.png"}, - {0x1716, "keymap_rp/16/007.png"}, - {0x1717, "keymap_rp/16/008.png"}, - {0x1718, "keymap_rp/16/009.png"}, - {0x1719, "keymap_rp/16/010.png"}, - {0x1720, "keymap_rp/17/001.png"}, - {0x1721, "keymap_rp/17/002.png"}, - {0x1722, "keymap_rp/17/003.png"}, - {0x1723, "keymap_rp/17/004.png"}, - {0x1724, "keymap_rp/17/005.png"}, - {0x1725, "keymap_rp/17/006.png"}, - {0x1726, "keymap_rp/17/007.png"}, - {0x1727, "keymap_rp/17/008.png"}, - {0x1728, "keymap_rp/17/009.png"}, - {0x1729, "keymap_rp/17/010.png"}, - {0x1730, "keymap_rp/18/001.png"}, - {0x1731, "keymap_rp/18/002.png"}, - {0x1732, "keymap_rp/18/003.png"}, - {0x1733, "keymap_rp/18/004.png"}, - {0x1734, "keymap_rp/18/005.png"}, - {0x1735, "keymap_rp/18/006.png"}, - {0x1736, "keymap_rp/18/007.png"}, - {0x1737, "keymap_rp/18/008.png"}, - {0x1738, "keymap_rp/18/009.png"}, - {0x1739, "keymap_rp/18/010.png"}, - {0x1740, "keymap_rp/19/001.png"}, - {0x1741, "keymap_rp/19/002.png"}, - {0x1742, "keymap_rp/19/003.png"}, - {0x1743, "keymap_rp/19/004.png"}, - {0x1744, "keymap_rp/19/005.png"}, - {0x1745, "keymap_rp/19/006.png"}, - {0x1746, "keymap_rp/19/007.png"}, - {0x1747, "keymap_rp/19/008.png"}, - {0x1748, "keymap_rp/19/009.png"}, - {0x1749, "keymap_rp/19/010.png"}, - {0x1750, "keymap_rp/20/001.png"}, - {0x1751, "keymap_rp/20/002.png"}, - {0x1752, "keymap_rp/20/003.png"}, - {0x1753, "keymap_rp/20/004.png"}, - {0x1754, "keymap_rp/20/005.png"}, - {0x1755, "keymap_rp/20/006.png"}, - {0x1756, "keymap_rp/20/007.png"}, - {0x1757, "keymap_rp/20/008.png"}, - {0x1758, "keymap_rp/20/009.png"}, - {0x1759, "keymap_rp/20/010.png"}, - {0x1760, "keymap_rp/21/001.png"}, - {0x1761, "keymap_rp/21/002.png"}, - {0x1762, "keymap_rp/21/003.png"}, - {0x1763, "keymap_rp/21/004.png"}, - {0x1764, "keymap_rp/21/005.png"}, - {0x1765, "keymap_rp/21/006.png"}, - {0x1766, "keymap_rp/21/007.png"}, - {0x1767, "keymap_rp/21/008.png"}, - {0x1768, "keymap_rp/21/009.png"}, - {0x1769, "keymap_rp/21/010.png"}, - {0x1770, "keymap_rp/22/001.png"}, - {0x1771, "keymap_rp/22/002.png"}, - {0x1772, "keymap_rp/22/003.png"}, - {0x1773, "keymap_rp/22/004.png"}, - {0x1774, "keymap_rp/22/005.png"}, - {0x1775, "keymap_rp/22/006.png"}, - {0x1776, "keymap_rp/22/007.png"}, - {0x1777, "keymap_rp/22/008.png"}, - {0x1778, "keymap_rp/22/009.png"}, - {0x1779, "keymap_rp/22/010.png"}, - {0x1780, "keymap_rp/23/001.png"}, - {0x1781, "keymap_rp/23/002.png"}, - {0x1782, "keymap_rp/23/003.png"}, - {0x1783, "keymap_rp/23/004.png"}, - {0x1784, "keymap_rp/23/005.png"}, - {0x1785, "keymap_rp/23/006.png"}, - {0x1786, "keymap_rp/23/007.png"}, - {0x1787, "keymap_rp/23/008.png"}, - {0x1788, "keymap_rp/23/009.png"}, - {0x1789, "keymap_rp/23/010.png"}, - {0x1790, "keymap_rp/24/001.png"}, - {0x1791, "keymap_rp/24/002.png"}, - {0x1792, "keymap_rp/24/003.png"}, - {0x1793, "keymap_rp/24/004.png"}, - {0x1794, "keymap_rp/24/005.png"}, - {0x1795, "keymap_rp/24/006.png"}, - {0x1796, "keymap_rp/24/007.png"}, - {0x1797, "keymap_rp/24/008.png"}, - {0x1798, "keymap_rp/24/009.png"}, - {0x1799, "keymap_rp/24/010.png"}, - {0x17A0, "keymap_rp/25/001.png"}, - {0x17A1, "keymap_rp/25/002.png"}, - {0x17A2, "keymap_rp/25/003.png"}, - {0x17A3, "keymap_rp/25/004.png"}, - {0x17A4, "keymap_rp/25/005.png"}, - {0x17A5, "keymap_rp/25/006.png"}, - {0x17A6, "keymap_rp/25/007.png"}, - {0x17A7, "keymap_rp/25/008.png"}, - {0x17A8, "keymap_rp/25/009.png"}, - {0x17A9, "keymap_rp/25/010.png"}, - {0x17B0, "keymap_rp/26/001.png"}, - {0x17B1, "keymap_rp/26/002.png"}, - {0x17B2, "keymap_rp/26/003.png"}, - {0x17B3, "keymap_rp/26/004.png"}, - {0x17B4, "keymap_rp/26/005.png"}, - {0x17B5, "keymap_rp/26/006.png"}, - {0x17B6, "keymap_rp/26/007.png"}, - {0x17B7, "keymap_rp/26/008.png"}, - {0x17B8, "keymap_rp/26/009.png"}, - {0x17B9, "keymap_rp/26/010.png"}, - {0x17C0, "keymap_rp/27/001.png"}, - {0x17C1, "keymap_rp/27/002.png"}, - {0x17C2, "keymap_rp/27/003.png"}, - {0x17C3, "keymap_rp/27/004.png"}, - {0x17C4, "keymap_rp/27/005.png"}, - {0x17C5, "keymap_rp/27/006.png"}, - {0x17C6, "keymap_rp/27/007.png"}, - {0x17C7, "keymap_rp/27/008.png"}, - {0x17C8, "keymap_rp/27/009.png"}, - {0x17C9, "keymap_rp/27/010.png"}, - {0x17D0, "keymap_rp/28/001.png"}, - {0x17D1, "keymap_rp/28/002.png"}, - {0x17D2, "keymap_rp/28/003.png"}, - {0x17D3, "keymap_rp/28/004.png"}, - {0x17D4, "keymap_rp/28/005.png"}, - {0x17D5, "keymap_rp/28/006.png"}, - {0x17D6, "keymap_rp/28/007.png"}, - {0x17D7, "keymap_rp/28/008.png"}, - {0x17D8, "keymap_rp/28/009.png"}, - {0x17D9, "keymap_rp/28/010.png"}, - {0x17E0, "keymap_rp/29/001.png"}, - {0x17E1, "keymap_rp/29/002.png"}, - {0x17E2, "keymap_rp/29/003.png"}, - {0x17E3, "keymap_rp/29/004.png"}, - {0x17E4, "keymap_rp/29/005.png"}, - {0x17E5, "keymap_rp/29/006.png"}, - {0x17E6, "keymap_rp/29/007.png"}, - {0x17E7, "keymap_rp/29/008.png"}, - {0x17E8, "keymap_rp/29/009.png"}, - {0x17E9, "keymap_rp/29/010.png"}, - {0x17F0, "keymap_rp/30/001.png"}, - {0x17F1, "keymap_rp/30/002.png"}, - {0x17F2, "keymap_rp/30/003.png"}, - {0x17F3, "keymap_rp/30/004.png"}, - {0x17F4, "keymap_rp/30/005.png"}, - {0x17F5, "keymap_rp/30/006.png"}, - {0x17F6, "keymap_rp/30/007.png"}, - {0x17F7, "keymap_rp/30/008.png"}, - {0x17F8, "keymap_rp/30/009.png"}, - {0x17F9, "keymap_rp/30/010.png"}, -}}; - -std::string_view GetEntryNameByType(u32 type) { - const auto key = PkgEntryValue{type}; - const auto it = std::ranges::lower_bound(PkgEntries, key); - if (it != PkgEntries.end() && it->type == type) { - return it->name; - } - return ""; -} diff --git a/src/core/file_format/pkg_type.h b/src/core/file_format/pkg_type.h deleted file mode 100644 index 6b010e3a3..000000000 --- a/src/core/file_format/pkg_type.h +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include "common/types.h" - -/// Retrieves the PKG entry name from its type identifier. -std::string_view GetEntryNameByType(u32 type); diff --git a/src/core/file_format/trp.cpp b/src/core/file_format/trp.cpp index d25c93c3f..311bd0b9d 100644 --- a/src/core/file_format/trp.cpp +++ b/src/core/file_format/trp.cpp @@ -1,10 +1,36 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include + #include "common/config.h" #include "common/logging/log.h" #include "common/path_util.h" -#include "trp.h" +#include "core/file_format/trp.h" + +static void DecryptEFSM(std::span trophyKey, + std::span NPcommID, + std::span efsmIv, std::span ciphertext, + std::span decrypted) { + + // step 1: Encrypt NPcommID + CryptoPP::CBC_Mode::Encryption encrypt; + + std::vector trophyIv(16, 0); + std::vector trpKey(16); + + encrypt.SetKeyWithIV(trophyKey.data(), trophyKey.size(), trophyIv.data()); + encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16); + + // step 2: decrypt efsm. + CryptoPP::CBC_Mode::Decryption decrypt; + decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data()); + + for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { + decrypt.ProcessData(decrypted.data() + i, ciphertext.data() + i, CryptoPP::AES::BLOCKSIZE); + } +} TRP::TRP() = default; TRP::~TRP() = default; @@ -115,7 +141,7 @@ bool TRP::Extract(const std::filesystem::path& trophyPath, const std::string tit return false; } file.Read(ESFM); - crypto.decryptEFSM(user_key, np_comm_id, esfmIv, ESFM, XML); // decrypt + DecryptEFSM(user_key, np_comm_id, esfmIv, ESFM, XML); // decrypt removePadding(XML); std::string xml_name = entry.entry_name; size_t pos = xml_name.find("ESFM"); diff --git a/src/core/file_format/trp.h b/src/core/file_format/trp.h index aec129f0e..01207475b 100644 --- a/src/core/file_format/trp.h +++ b/src/core/file_format/trp.h @@ -7,7 +7,6 @@ #include "common/endian.h" #include "common/io_file.h" #include "common/types.h" -#include "core/crypto/crypto.h" struct TrpHeader { u32_be magic; // (0xDCA24D00) @@ -37,10 +36,9 @@ public: void GetNPcommID(const std::filesystem::path& trophyPath, int index); private: - Crypto crypto; std::vector NPcommID = std::vector(12); std::array np_comm_id{}; std::array esfmIv{}; std::filesystem::path trpFilesPath; static constexpr int iv_len = 16; -}; \ No newline at end of file +}; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 3420e933e..e92676c02 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "about_dialog.h" #include "cheats_patches.h" @@ -19,7 +20,6 @@ #include "common/string_util.h" #include "common/version.h" #include "control_settings.h" -#include "core/file_format/pkg.h" #include "core/loader.h" #include "game_install_dialog.h" #include "install_dir_select.h" @@ -718,7 +718,6 @@ void MainWindow::CreateConnects() { }); // Package install. - connect(ui->bootInstallPkgAct, &QAction::triggered, this, &MainWindow::InstallPkg); connect(ui->bootGameAct, &QAction::triggered, this, &MainWindow::BootGame); connect(ui->gameInstallPathAct, &QAction::triggered, this, &MainWindow::InstallDirectory); @@ -726,15 +725,6 @@ void MainWindow::CreateConnects() { connect(ui->addElfFolderAct, &QAction::triggered, m_elf_viewer.data(), &ElfViewer::OpenElfFolder); - // Package Viewer. - connect(ui->pkgViewerAct, &QAction::triggered, this, [this]() { - PKGViewer* pkgViewer = new PKGViewer( - m_game_info, this, [this](std::filesystem::path file, int pkgNum, int nPkg) { - this->InstallDragDropPkg(file, pkgNum, nPkg); - }); - pkgViewer->show(); - }); - // Trophy Viewer connect(ui->trophyViewerAct, &QAction::triggered, this, [this]() { if (m_game_info->m_games.empty()) { @@ -965,22 +955,6 @@ void MainWindow::SaveWindowState() const { this->geometry().width(), this->geometry().height()); } -void MainWindow::InstallPkg() { - QFileDialog dialog; - dialog.setFileMode(QFileDialog::ExistingFiles); - dialog.setNameFilter(tr("PKG File (*.PKG *.pkg)")); - if (dialog.exec()) { - QStringList fileNames = dialog.selectedFiles(); - int nPkg = fileNames.size(); - int pkgNum = 0; - for (const QString& file : fileNames) { - ++pkgNum; - std::filesystem::path path = Common::FS::PathFromQString(file); - MainWindow::InstallDragDropPkg(path, pkgNum, nPkg); - } - } -} - void MainWindow::BootGame() { QFileDialog dialog; dialog.setFileMode(QFileDialog::ExistingFile); @@ -1004,260 +978,6 @@ void MainWindow::BootGame() { } } -void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg) { - if (Loader::DetectFileType(file) == Loader::FileTypes::Pkg) { - std::string failreason; - pkg = PKG(); - if (!pkg.Open(file, failreason)) { - QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); - return; - } - if (!psf.Open(pkg.sfo)) { - QMessageBox::critical(this, tr("PKG ERROR"), - "Could not read SFO. Check log for details"); - return; - } - auto category = psf.GetString("CATEGORY"); - - if (!use_for_all_queued || pkgNum == 1) { - InstallDirSelect ids; - const auto selected = ids.exec(); - if (selected == QDialog::Rejected) { - return; - } - - last_install_dir = ids.getSelectedDirectory(); - delete_file_on_install = ids.deleteFileOnInstall(); - use_for_all_queued = ids.useForAllQueued(); - } - std::filesystem::path game_install_dir = last_install_dir; - - QString pkgType = QString::fromStdString(pkg.GetPkgFlags()); - bool use_game_update = pkgType.contains("PATCH") && Config::getSeparateUpdateEnabled(); - - // Default paths - auto game_folder_path = game_install_dir / pkg.GetTitleID(); - auto game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-patch") - : game_folder_path; - const int max_depth = 5; - - if (pkgType.contains("PATCH")) { - // For patches, try to find the game recursively - auto found_game = Common::FS::FindGameByID(game_install_dir, - std::string{pkg.GetTitleID()}, max_depth); - if (found_game.has_value()) { - game_folder_path = found_game.value().parent_path(); - game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-patch") - : game_folder_path; - } - } else { - // For base games, we check if the game is already installed - auto found_game = Common::FS::FindGameByID(game_install_dir, - std::string{pkg.GetTitleID()}, max_depth); - if (found_game.has_value()) { - game_folder_path = found_game.value().parent_path(); - } - // If the game is not found, we install it in the game install directory - else { - game_folder_path = game_install_dir / pkg.GetTitleID(); - } - game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-patch") - : game_folder_path; - } - - QString gameDirPath; - Common::FS::PathToQString(gameDirPath, game_folder_path); - QDir game_dir(gameDirPath); - if (game_dir.exists()) { - QMessageBox msgBox; - msgBox.setWindowTitle(tr("PKG Extraction")); - - std::string content_id; - if (auto value = psf.GetString("CONTENT_ID"); value.has_value()) { - content_id = std::string{*value}; - } else { - QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no CONTENT_ID"); - return; - } - std::string entitlement_label = Common::SplitString(content_id, '-')[2]; - - auto addon_extract_path = - Config::getAddonInstallDir() / pkg.GetTitleID() / entitlement_label; - QString addonDirPath; - Common::FS::PathToQString(addonDirPath, addon_extract_path); - QDir addon_dir(addonDirPath); - - if (pkgType.contains("PATCH")) { - QString pkg_app_version; - if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { - pkg_app_version = QString::fromStdString(std::string{*app_ver}); - } else { - QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no APP_VER"); - return; - } - std::filesystem::path sce_folder_path = - std::filesystem::exists(game_update_path / "sce_sys" / "param.sfo") - ? game_update_path / "sce_sys" / "param.sfo" - : game_folder_path / "sce_sys" / "param.sfo"; - psf.Open(sce_folder_path); - QString game_app_version; - if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { - game_app_version = QString::fromStdString(std::string{*app_ver}); - } else { - QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no APP_VER"); - return; - } - double appD = game_app_version.toDouble(); - double pkgD = pkg_app_version.toDouble(); - if (pkgD == appD) { - msgBox.setText(QString(tr("Patch detected!") + "\n" + - tr("PKG and Game versions match: ") + pkg_app_version + - "\n" + tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - } else if (pkgD < appD) { - msgBox.setText(QString(tr("Patch detected!") + "\n" + - tr("PKG Version %1 is older than installed version: ") - .arg(pkg_app_version) + - game_app_version + "\n" + - tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - } else { - msgBox.setText(QString(tr("Patch detected!") + "\n" + - tr("Game is installed: ") + game_app_version + "\n" + - tr("Would you like to install Patch: ") + - pkg_app_version + " ?")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - } - int result = msgBox.exec(); - if (result == QMessageBox::Yes) { - // Do nothing. - } else { - return; - } - } else if (category == "ac") { - if (!addon_dir.exists()) { - QMessageBox addonMsgBox; - addonMsgBox.setWindowTitle(tr("DLC Installation")); - addonMsgBox.setText(QString(tr("Would you like to install DLC: %1?")) - .arg(QString::fromStdString(entitlement_label))); - - addonMsgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - addonMsgBox.setDefaultButton(QMessageBox::No); - int result = addonMsgBox.exec(); - if (result == QMessageBox::Yes) { - game_update_path = addon_extract_path; - } else { - return; - } - } else { - msgBox.setText(QString(tr("DLC already installed:") + "\n" + addonDirPath + - "\n\n" + tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - int result = msgBox.exec(); - if (result == QMessageBox::Yes) { - game_update_path = addon_extract_path; - } else { - return; - } - } - } else { - msgBox.setText(QString(tr("Game already installed") + "\n" + gameDirPath + "\n" + - tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - int result = msgBox.exec(); - if (result == QMessageBox::Yes) { - // Do nothing. - } else { - return; - } - } - } else { - // Do nothing; - if (pkgType.contains("PATCH") || category == "ac") { - QMessageBox::information( - this, tr("PKG Extraction"), - tr("PKG is a patch or DLC, please install the game first!")); - return; - } - // what else? - } - if (!pkg.Extract(file, game_update_path, failreason)) { - QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); - } else { - int nfiles = pkg.GetNumberOfFiles(); - - if (nfiles > 0) { - QVector indices; - for (int i = 0; i < nfiles; i++) { - indices.append(i); - } - - QProgressDialog dialog; - dialog.setWindowTitle(tr("PKG Extraction")); - dialog.setWindowModality(Qt::WindowModal); - QString extractmsg = QString(tr("Extracting PKG %1/%2")).arg(pkgNum).arg(nPkg); - dialog.setLabelText(extractmsg); - dialog.setAutoClose(true); - dialog.setRange(0, nfiles); - - dialog.setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, - dialog.size(), this->geometry())); - - QFutureWatcher futureWatcher; - connect(&futureWatcher, &QFutureWatcher::finished, this, [=, this]() { - if (pkgNum == nPkg) { - QString path; - - // We want to show the parent path instead of the full path - Common::FS::PathToQString(path, game_folder_path.parent_path()); - QIcon windowIcon( - Common::FS::PathToUTF8String(game_folder_path / "sce_sys/icon0.png") - .c_str()); - - QMessageBox extractMsgBox(this); - extractMsgBox.setWindowTitle(tr("Extraction Finished")); - if (!windowIcon.isNull()) { - extractMsgBox.setWindowIcon(windowIcon); - } - extractMsgBox.setText( - QString(tr("Game successfully installed at %1")).arg(path)); - extractMsgBox.addButton(QMessageBox::Ok); - extractMsgBox.setDefaultButton(QMessageBox::Ok); - connect(&extractMsgBox, &QMessageBox::buttonClicked, this, - [&](QAbstractButton* button) { - if (extractMsgBox.button(QMessageBox::Ok) == button) { - extractMsgBox.close(); - emit ExtractionFinished(); - } - }); - extractMsgBox.exec(); - } - if (delete_file_on_install) { - std::filesystem::remove(file); - } - }); - connect(&dialog, &QProgressDialog::canceled, [&]() { futureWatcher.cancel(); }); - connect(&futureWatcher, &QFutureWatcher::progressValueChanged, &dialog, - &QProgressDialog::setValue); - futureWatcher.setFuture( - QtConcurrent::map(indices, [&](int index) { pkg.ExtractFiles(index); })); - dialog.exec(); - } - } - } else { - QMessageBox::critical(this, tr("PKG ERROR"), - tr("File doesn't appear to be a valid PKG file")); - } -} - void MainWindow::InstallDirectory() { GameInstallDialog dlg; dlg.exec(); @@ -1340,7 +1060,6 @@ QIcon MainWindow::RecolorIcon(const QIcon& icon, bool isWhite) { } void MainWindow::SetUiIcons(bool isWhite) { - ui->bootInstallPkgAct->setIcon(RecolorIcon(ui->bootInstallPkgAct->icon(), isWhite)); ui->bootGameAct->setIcon(RecolorIcon(ui->bootGameAct->icon(), isWhite)); ui->shadFolderAct->setIcon(RecolorIcon(ui->shadFolderAct->icon(), isWhite)); ui->exitAct->setIcon(RecolorIcon(ui->exitAct->icon(), isWhite)); @@ -1368,7 +1087,6 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite)); ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite)); ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite)); - ui->pkgViewerAct->setIcon(RecolorIcon(ui->pkgViewerAct->icon(), isWhite)); ui->trophyViewerAct->setIcon(RecolorIcon(ui->trophyViewerAct->icon(), isWhite)); ui->configureAct->setIcon(RecolorIcon(ui->configureAct->icon(), isWhite)); ui->addElfFolderAct->setIcon(RecolorIcon(ui->addElfFolderAct->icon(), isWhite)); diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index bcd5e53ba..5d05bfca4 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -22,7 +22,6 @@ #include "game_list_utils.h" #include "main_window_themes.h" #include "main_window_ui.h" -#include "pkg_viewer.h" class GameListFrame; @@ -36,7 +35,6 @@ public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow(); bool Init(); - void InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg); void InstallDirectory(); void StartGame(); void PauseGame(); @@ -72,7 +70,6 @@ private: void SetLastUsedTheme(); void SetLastIconSizeBullet(); void SetUiIcons(bool isWhite); - void InstallPkg(); void BootGame(); void AddRecentFiles(QString filePath); void LoadTranslation(); @@ -89,7 +86,6 @@ private: QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_theme_act_group = nullptr; QActionGroup* m_recent_files_group = nullptr; - PKG pkg; // Dockable widget frames WindowThemes m_window_themes; GameListUtils m_game_list_utils; @@ -120,20 +116,6 @@ protected: } } - void dropEvent(QDropEvent* event1) override { - const QMimeData* mimeData = event1->mimeData(); - if (mimeData->hasUrls()) { - QList urlList = mimeData->urls(); - int pkgNum = 0; - int nPkg = urlList.size(); - for (const QUrl& url : urlList) { - pkgNum++; - std::filesystem::path path = Common::FS::PathFromQString(url.toLocalFile()); - InstallDragDropPkg(path, pkgNum, nPkg); - } - } - } - void resizeEvent(QResizeEvent* event) override; std::filesystem::path last_install_dir = ""; diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index c4f47b636..2c4d4480b 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -9,7 +9,6 @@ class Ui_MainWindow { public: - QAction* bootInstallPkgAct; QAction* bootGameAct; QAction* addElfFolderAct; QAction* shadFolderAct; @@ -27,7 +26,6 @@ public: QAction* gameInstallPathAct; QAction* downloadCheatsPatchesAct; QAction* dumpGameListAct; - QAction* pkgViewerAct; QAction* trophyViewerAct; #ifdef ENABLE_UPDATER QAction* updaterAct; @@ -87,9 +85,6 @@ public: MainWindow->setDockNestingEnabled(true); MainWindow->setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks | QMainWindow::AnimatedDocks | QMainWindow::GroupedDragging); - bootInstallPkgAct = new QAction(MainWindow); - bootInstallPkgAct->setObjectName("bootInstallPkgAct"); - bootInstallPkgAct->setIcon(QIcon(":images/file_icon.png")); bootGameAct = new QAction(MainWindow); bootGameAct->setObjectName("bootGameAct"); bootGameAct->setIcon(QIcon(":images/play_icon.png")); @@ -148,9 +143,6 @@ public: dumpGameListAct = new QAction(MainWindow); dumpGameListAct->setObjectName("dumpGameList"); dumpGameListAct->setIcon(QIcon(":images/dump_icon.png")); - pkgViewerAct = new QAction(MainWindow); - pkgViewerAct->setObjectName("pkgViewer"); - pkgViewerAct->setIcon(QIcon(":images/file_icon.png")); trophyViewerAct = new QAction(MainWindow); trophyViewerAct->setObjectName("trophyViewer"); trophyViewerAct->setIcon(QIcon(":images/trophy_icon.png")); @@ -309,7 +301,6 @@ public: menuBar->addAction(menuView->menuAction()); menuBar->addAction(menuSettings->menuAction()); menuBar->addAction(menuHelp->menuAction()); - menuFile->addAction(bootInstallPkgAct); menuFile->addAction(bootGameAct); menuFile->addSeparator(); menuFile->addAction(addElfFolderAct); @@ -345,7 +336,6 @@ public: menuSettings->addAction(menuUtils->menuAction()); menuUtils->addAction(downloadCheatsPatchesAct); menuUtils->addAction(dumpGameListAct); - menuUtils->addAction(pkgViewerAct); menuUtils->addAction(trophyViewerAct); #ifdef ENABLE_UPDATER menuHelp->addAction(updaterAct); @@ -361,8 +351,6 @@ public: MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "shadPS4", nullptr)); addElfFolderAct->setText( QCoreApplication::translate("MainWindow", "Open/Add Elf Folder", nullptr)); - bootInstallPkgAct->setText( - QCoreApplication::translate("MainWindow", "Install Packages (PKG)", nullptr)); bootGameAct->setText(QCoreApplication::translate("MainWindow", "Boot Game", nullptr)); #ifdef ENABLE_UPDATER updaterAct->setText( @@ -371,8 +359,6 @@ public: aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr)); configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); #if QT_CONFIG(tooltip) - bootInstallPkgAct->setToolTip(QCoreApplication::translate( - "MainWindow", "Install application from a .pkg file", nullptr)); #endif // QT_CONFIG(tooltip) menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr)); shadFolderAct->setText( @@ -404,7 +390,6 @@ public: QCoreApplication::translate("MainWindow", "Download Cheats/Patches", nullptr)); dumpGameListAct->setText( QCoreApplication::translate("MainWindow", "Dump Game List", nullptr)); - pkgViewerAct->setText(QCoreApplication::translate("MainWindow", "PKG Viewer", nullptr)); trophyViewerAct->setText( QCoreApplication::translate("MainWindow", "Trophy Viewer", nullptr)); mw_searchbar->setPlaceholderText( @@ -433,4 +418,4 @@ public: namespace Ui { class MainWindow : public Ui_MainWindow {}; -} // namespace Ui \ No newline at end of file +} // namespace Ui diff --git a/src/qt_gui/pkg_viewer.cpp b/src/qt_gui/pkg_viewer.cpp deleted file mode 100644 index ecbc6312d..000000000 --- a/src/qt_gui/pkg_viewer.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "pkg_viewer.h" - -PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* parent, - std::function InstallDragDropPkg) - : QMainWindow(), m_game_info(game_info_get) { - this->resize(1280, 720); - this->setAttribute(Qt::WA_DeleteOnClose); - dir_list_std = Config::getPkgViewer(); - dir_list.clear(); - for (const auto& str : dir_list_std) { - dir_list.append(QString::fromStdString(str)); - } - statusBar = new QStatusBar(treeWidget); - this->setStatusBar(statusBar); - treeWidget = new QTreeWidget(this); - treeWidget->setColumnCount(9); - QStringList headers; - headers << tr("Name") << tr("Serial") << tr("Installed") << tr("Size") << tr("Category") - << tr("Type") << tr("App Ver") << tr("FW") << tr("Region") << tr("Flags") << tr("Path"); - treeWidget->setHeaderLabels(headers); - treeWidget->header()->setDefaultAlignment(Qt::AlignCenter); - treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); - treeWidget->setColumnWidth(8, 170); - this->setCentralWidget(treeWidget); - QMenuBar* menuBar = new QMenuBar(this); - menuBar->setContextMenuPolicy(Qt::PreventContextMenu); - QMenu* fileMenu = menuBar->addMenu(tr("File")); - QAction* openFolderAct = new QAction(tr("Open Folder"), this); - fileMenu->addAction(openFolderAct); - this->setMenuBar(menuBar); - CheckPKGFolders(); // Check for new PKG files in existing folders. - ProcessPKGInfo(); - - connect(openFolderAct, &QAction::triggered, this, &PKGViewer::OpenPKGFolder); - - connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, - [=, this](const QPoint& pos) { - if (treeWidget->selectedItems().isEmpty()) { - return; - } - m_gui_context_menus.RequestGameMenuPKGViewer(pos, m_full_pkg_list, treeWidget, - InstallDragDropPkg); - }); - - connect(parent, &QWidget::destroyed, this, [this]() { this->deleteLater(); }); -} - -PKGViewer::~PKGViewer() {} - -void PKGViewer::OpenPKGFolder() { - QString folderPath = - QFileDialog::getExistingDirectory(this, tr("Open Folder"), QDir::homePath()); - if (!dir_list.contains(folderPath)) { - dir_list.append(folderPath); - QDir directory(folderPath); - QFileInfoList fileInfoList = directory.entryInfoList(QDir::Files); - for (const QFileInfo& fileInfo : fileInfoList) { - QString file_ext = fileInfo.suffix(); - if (fileInfo.isFile() && file_ext == "pkg") { - m_pkg_list.append(fileInfo.absoluteFilePath()); - } - } - std::sort(m_pkg_list.begin(), m_pkg_list.end()); - ProcessPKGInfo(); - dir_list_std.clear(); - for (auto dir : dir_list) { - dir_list_std.push_back(dir.toStdString()); - } - Config::setPkgViewer(dir_list_std); - } else { - // qDebug() << "Folder selection canceled."; - } -} - -void PKGViewer::CheckPKGFolders() { // Check for new PKG file additions. - m_pkg_list.clear(); - for (const QString& dir : dir_list) { - QDir directory(dir); - QFileInfoList fileInfoList = directory.entryInfoList(QDir::Files); - for (const QFileInfo& fileInfo : fileInfoList) { - QString file_ext = fileInfo.suffix(); - if (fileInfo.isFile() && file_ext == "pkg") { - m_pkg_list.append(fileInfo.absoluteFilePath()); - } - } - } - std::sort(m_pkg_list.begin(), m_pkg_list.end()); -} - -void PKGViewer::ProcessPKGInfo() { - treeWidget->clear(); - map_strings.clear(); - map_integers.clear(); - m_pkg_app_list.clear(); - m_pkg_patch_list.clear(); - m_full_pkg_list.clear(); - for (int i = 0; i < m_pkg_list.size(); i++) { - std::filesystem::path path = Common::FS::PathFromQString(m_pkg_list[i]); - std::string failreason; - if (!package.Open(path, failreason)) { - QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); - return; - } - psf.Open(package.sfo); - QString title_name = QString::fromStdString( - std::string{psf.GetString("TITLE").value_or(std::string{tr("Unknown").toStdString()})}); - QString title_id = QString::fromStdString(std::string{ - psf.GetString("TITLE_ID").value_or(std::string{tr("Unknown").toStdString()})}); - QString app_type = GameListUtils::GetAppType(psf.GetInteger("APP_TYPE").value_or(0)); - QString app_version = QString::fromStdString(std::string{ - psf.GetString("APP_VER").value_or(std::string{tr("Unknown").toStdString()})}); - QString title_category = QString::fromStdString(std::string{ - psf.GetString("CATEGORY").value_or(std::string{tr("Unknown").toStdString()})}); - QString pkg_size = GameListUtils::FormatSize(package.GetPkgHeader().pkg_size); - pkg_content_flag = package.GetPkgHeader().pkg_content_flags; - QString flagss = ""; - for (const auto& flag : package.flagNames) { - if (package.isFlagSet(pkg_content_flag, flag.first)) { - if (!flagss.isEmpty()) - flagss += (", "); - flagss += QString::fromStdString(flag.second.data()); - } - } - - QString fw_ = tr("Unknown"); - if (const auto fw_int_opt = psf.GetInteger("SYSTEM_VER"); fw_int_opt.has_value()) { - const u32 fw_int = *fw_int_opt; - if (fw_int == 0) { - fw_ = "0.00"; - } else { - QString fw = QString::number(fw_int, 16); - fw_ = fw.length() > 7 ? QString::number(fw_int, 16).left(3).insert(2, '.') - : fw.left(3).insert(1, '.'); - } - } - char region = package.GetPkgHeader().pkg_content_id[0]; - QString pkg_info = ""; - if (title_category == "gd" && !flagss.contains("PATCH")) { - title_category = "App"; - pkg_info = title_name + ";;" + title_id + ";;" + pkg_size + ";;" + title_category + - ";;" + app_type + ";;" + app_version + ";;" + fw_ + ";;" + - game_list_util.GetRegion(region) + ";;" + flagss + ";;" + m_pkg_list[i]; - m_pkg_app_list.append(pkg_info); - } else { - title_category = "Patch"; - pkg_info = title_name + ";;" + title_id + ";;" + pkg_size + ";;" + title_category + - ";;" + app_type + ";;" + app_version + ";;" + fw_ + ";;" + - game_list_util.GetRegion(region) + ";;" + flagss + ";;" + m_pkg_list[i]; - m_pkg_patch_list.append(pkg_info); - } - } - std::sort(m_pkg_app_list.begin(), m_pkg_app_list.end()); - for (int i = 0; i < m_pkg_app_list.size(); i++) { - QTreeWidgetItem* treeItem = new QTreeWidgetItem(treeWidget); - QStringList pkg_app_ = m_pkg_app_list[i].split(";;"); - m_full_pkg_list.append(m_pkg_app_list[i]); - treeItem->setExpanded(true); - treeItem->setText(0, pkg_app_[0]); - treeItem->setText(1, pkg_app_[1]); - treeItem->setText(3, pkg_app_[2]); - treeItem->setTextAlignment(3, Qt::AlignCenter); - treeItem->setText(4, pkg_app_[3]); - treeItem->setTextAlignment(4, Qt::AlignCenter); - treeItem->setText(5, pkg_app_[4]); - treeItem->setTextAlignment(5, Qt::AlignCenter); - treeItem->setText(6, pkg_app_[5]); - treeItem->setTextAlignment(6, Qt::AlignCenter); - treeItem->setText(7, pkg_app_[6]); - treeItem->setTextAlignment(7, Qt::AlignCenter); - treeItem->setText(8, pkg_app_[7]); - treeItem->setTextAlignment(8, Qt::AlignCenter); - treeItem->setText(9, pkg_app_[8]); - treeItem->setText(10, pkg_app_[9]); - for (const GameInfo& info : m_game_info->m_games) { // Check if game is installed. - if (info.serial == pkg_app_[1].toStdString()) { - treeItem->setText(2, QChar(0x2713)); - treeItem->setTextAlignment(2, Qt::AlignCenter); - } - } - for (const QString& item : m_pkg_patch_list) { - QStringList pkg_patch_ = item.split(";;"); - if (pkg_patch_[1] == pkg_app_[1]) { // check patches with serial. - m_full_pkg_list.append(item); - QTreeWidgetItem* childItem = new QTreeWidgetItem(treeItem); - childItem->setText(0, pkg_patch_[0]); - childItem->setText(1, pkg_patch_[1]); - childItem->setText(3, pkg_patch_[2]); - childItem->setTextAlignment(3, Qt::AlignCenter); - childItem->setText(4, pkg_patch_[3]); - childItem->setTextAlignment(4, Qt::AlignCenter); - childItem->setText(5, pkg_patch_[4]); - childItem->setTextAlignment(5, Qt::AlignCenter); - childItem->setText(6, pkg_patch_[5]); - childItem->setTextAlignment(6, Qt::AlignCenter); - childItem->setText(7, pkg_patch_[6]); - childItem->setTextAlignment(7, Qt::AlignCenter); - childItem->setText(8, pkg_patch_[7]); - childItem->setTextAlignment(8, Qt::AlignCenter); - childItem->setText(9, pkg_patch_[8]); - childItem->setText(10, pkg_patch_[9]); - } - } - } - - for (int column = 0; column < treeWidget->columnCount() - 2; ++column) { - // Resize the column to fit its contents - treeWidget->resizeColumnToContents(column); - } - // Update status bar. - statusBar->clearMessage(); - int numPkgs = m_pkg_list.size(); - QString statusMessage = QString::number(numPkgs) + " " + tr("Package"); - statusBar->showMessage(statusMessage); -} \ No newline at end of file diff --git a/src/qt_gui/pkg_viewer.h b/src/qt_gui/pkg_viewer.h deleted file mode 100644 index 265a03b92..000000000 --- a/src/qt_gui/pkg_viewer.h +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include - -#include "common/io_file.h" -#include "core/file_format/pkg.h" -#include "core/file_format/pkg_type.h" -#include "core/file_format/psf.h" -#include "game_info.h" -#include "game_list_utils.h" -#include "gui_context_menus.h" - -class PKGViewer : public QMainWindow { - Q_OBJECT -public: - explicit PKGViewer( - std::shared_ptr game_info_get, QWidget* parent, - std::function InstallDragDropPkg = nullptr); - ~PKGViewer(); - void OpenPKGFolder(); - void CheckPKGFolders(); - void ProcessPKGInfo(); - -private: - GuiContextMenus m_gui_context_menus; - PKG package; - PSF psf; - PKGHeader pkgheader; - PKGEntry entry; - PSFHeader header; - char pkgTitleID[9]; - std::vector pkg; - u64 pkgSize = 0; - std::unordered_map map_strings; - std::unordered_map map_integers; - - u32_be pkg_content_flag; - std::shared_ptr m_game_info; - GameListUtils game_list_util; - // Status bar - QStatusBar* statusBar; - - std::vector> appTypes = { - {0, "FULL APP"}, - {1, "UPGRADABLE"}, - {2, "DEMO"}, - {3, "FREEMIUM"}, - }; - - QStringList m_full_pkg_list; - QStringList m_pkg_app_list; - QStringList m_pkg_patch_list; - QStringList m_pkg_list; - QStringList dir_list; - std::vector dir_list_std; - QTreeWidget* treeWidget = nullptr; -}; \ No newline at end of file From 31e1d4f839118b59398ca6f871929fc0e286e13c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 28 Mar 2025 10:32:17 -0700 Subject: [PATCH 16/22] misc: Remove dead code. (#2702) --- CMakeLists.txt | 4 - documents/Quickstart/2.png | Bin 674148 -> 0 bytes documents/Quickstart/Quickstart.md | 9 +- documents/building-linux.md | 2 +- src/common/config.cpp | 12 - src/common/config.h | 2 - src/core/file_format/pkg.cpp | 473 ----------------------------- src/core/loader.cpp | 28 -- src/core/loader.h | 18 -- src/qt_gui/gui_context_menus.h | 25 -- src/qt_gui/install_dir_select.cpp | 94 ------ src/qt_gui/install_dir_select.h | 42 --- src/qt_gui/main_window.cpp | 2 - 13 files changed, 2 insertions(+), 709 deletions(-) delete mode 100644 documents/Quickstart/2.png delete mode 100644 src/core/file_format/pkg.cpp delete mode 100644 src/core/loader.cpp delete mode 100644 src/core/loader.h delete mode 100644 src/qt_gui/install_dir_select.cpp delete mode 100644 src/qt_gui/install_dir_select.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0359246c8..13204f479 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -678,8 +678,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/file_format/trp.h src/core/file_sys/fs.cpp src/core/file_sys/fs.h - src/core/loader.cpp - src/core/loader.h src/core/loader/dwarf.cpp src/core/loader/dwarf.h src/core/loader/elf.cpp @@ -969,8 +967,6 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/game_grid_frame.h src/qt_gui/game_install_dialog.cpp src/qt_gui/game_install_dialog.h - src/qt_gui/install_dir_select.cpp - src/qt_gui/install_dir_select.h src/qt_gui/trophy_viewer.cpp src/qt_gui/trophy_viewer.h src/qt_gui/elf_viewer.cpp diff --git a/documents/Quickstart/2.png b/documents/Quickstart/2.png deleted file mode 100644 index 7e5bdfb155e572865777f38ef686257cedcc60de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674148 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

x=B}xXo7;OR9BQJt>^b8f~1X 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%0A|Hs0bP4YI+0{Oe$?H?^He3@S_ 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�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 diff --git a/documents/Quickstart/Quickstart.md b/documents/Quickstart/Quickstart.md index 2f2751887..9c6bc5a6f 100644 --- a/documents/Quickstart/Quickstart.md +++ b/documents/Quickstart/Quickstart.md @@ -13,7 +13,6 @@ SPDX-License-Identifier: GPL-2.0-or-later - [**RAM**](#ram) - [**OS**](#os) - [**Have the latest WIP version**](#how-to-run-the-latest-work-in-progress-builds-of-shadps4) -- [**Install PKG files (Games and Updates)**](#install-pkg-files) - [**Configure the emulator**](#configure-the-emulator) ## Minimum PC requirements @@ -48,13 +47,7 @@ SPDX-License-Identifier: GPL-2.0-or-later 2. Once downloaded, extract to its own folder, and run shadPS4's executable from the extracted folder. -3. Upon first launch, shadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that shadPS4 can use to install your PKG files to. - -## Install PKG files - -To install PKG files (game and updates), you will need the Qt application (with UI). You will have to go to "File" then to "Install Packages (PKG)", a window will open then you will have to select the files. You can install multiple PKG files at once. Once finished, the game should appear in the application. - - +3. Upon first launch, shadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that contains your dumped games. ## Configure the emulator diff --git a/documents/building-linux.md b/documents/building-linux.md index 18ddab0c6..cdc8ba12f 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -108,7 +108,7 @@ Now run the emulator. If Qt was enabled at configure time: ./build/shadps4 ``` -Otherwise, specify the path to your PKG's boot file: +Otherwise, specify the path to your game's boot file: ```bash ./build/shadps4 /"PATH"/"TO"/"GAME"/"FOLDER"/eboot.bin diff --git a/src/common/config.cpp b/src/common/config.cpp index b113ac0ef..8ead58686 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -98,7 +98,6 @@ u32 m_slider_pos_grid = 0; u32 m_table_mode = 0; u32 m_window_size_W = 1280; u32 m_window_size_H = 720; -std::vector m_pkg_viewer; std::vector m_elf_viewer; std::vector m_recent_files; std::string emulator_language = "en_US"; @@ -601,11 +600,6 @@ void setMainWindowHeight(u32 height) { m_window_size_H = height; } -void setPkgViewer(const std::vector& pkgList) { - m_pkg_viewer.resize(pkgList.size()); - m_pkg_viewer = pkgList; -} - void setElfViewer(const std::vector& elfList) { m_elf_viewer.resize(elfList.size()); m_elf_viewer = elfList; @@ -709,10 +703,6 @@ u32 getMainWindowHeight() { return m_window_size_H; } -std::vector getPkgViewer() { - return m_pkg_viewer; -} - std::vector getElfViewer() { return m_elf_viewer; } @@ -886,7 +876,6 @@ void load(const std::filesystem::path& path) { main_window_geometry_y = toml::find_or(gui, "geometry_y", 0); main_window_geometry_w = toml::find_or(gui, "geometry_w", 0); main_window_geometry_h = toml::find_or(gui, "geometry_h", 0); - m_pkg_viewer = toml::find_or>(gui, "pkgDirs", {}); m_elf_viewer = toml::find_or>(gui, "elfDirs", {}); m_recent_files = toml::find_or>(gui, "recentFiles", {}); m_table_mode = toml::find_or(gui, "gameTableMode", 0); @@ -1105,7 +1094,6 @@ void saveMainWindow(const std::filesystem::path& path) { data["GUI"]["geometry_y"] = main_window_geometry_y; data["GUI"]["geometry_w"] = main_window_geometry_w; data["GUI"]["geometry_h"] = main_window_geometry_h; - data["GUI"]["pkgDirs"] = m_pkg_viewer; data["GUI"]["elfDirs"] = m_elf_viewer; data["GUI"]["recentFiles"] = m_recent_files; diff --git a/src/common/config.h b/src/common/config.h index 3a0bf252c..d040aa337 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -154,7 +154,6 @@ void setSliderPositionGrid(u32 pos); void setTableMode(u32 mode); void setMainWindowWidth(u32 width); void setMainWindowHeight(u32 height); -void setPkgViewer(const std::vector& pkgList); void setElfViewer(const std::vector& elfList); void setRecentFiles(const std::vector& recentFiles); void setEmulatorLanguage(std::string language); @@ -174,7 +173,6 @@ u32 getSliderPositionGrid(); u32 getTableMode(); u32 getMainWindowWidth(); u32 getMainWindowHeight(); -std::vector getPkgViewer(); std::vector getElfViewer(); std::vector getRecentFiles(); std::string getEmulatorLanguage(); diff --git a/src/core/file_format/pkg.cpp b/src/core/file_format/pkg.cpp deleted file mode 100644 index ecc5f10a4..000000000 --- a/src/core/file_format/pkg.cpp +++ /dev/null @@ -1,473 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include "common/io_file.h" -#include "common/logging/formatter.h" -#include "core/file_format/pkg.h" -#include "core/file_format/pkg_type.h" - -static void DecompressPFSC(std::span compressed_data, std::span decompressed_data) { - z_stream decompressStream; - decompressStream.zalloc = Z_NULL; - decompressStream.zfree = Z_NULL; - decompressStream.opaque = Z_NULL; - - if (inflateInit(&decompressStream) != Z_OK) { - // std::cerr << "Error initializing zlib for deflation." << std::endl; - } - - decompressStream.avail_in = compressed_data.size(); - decompressStream.next_in = reinterpret_cast(compressed_data.data()); - decompressStream.avail_out = decompressed_data.size(); - decompressStream.next_out = reinterpret_cast(decompressed_data.data()); - - if (inflate(&decompressStream, Z_FINISH)) { - } - if (inflateEnd(&decompressStream) != Z_OK) { - // std::cerr << "Error ending zlib inflate" << std::endl; - } -} - -u32 GetPFSCOffset(std::span pfs_image) { - static constexpr u32 PfscMagic = 0x43534650; - u32 value; - for (u32 i = 0x20000; i < pfs_image.size(); i += 0x10000) { - std::memcpy(&value, &pfs_image[i], sizeof(u32)); - if (value == PfscMagic) - return i; - } - return -1; -} - -PKG::PKG() = default; - -PKG::~PKG() = default; - -bool PKG::Open(const std::filesystem::path& filepath, std::string& failreason) { - Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - pkgSize = file.GetSize(); - - file.Read(pkgheader); - if (pkgheader.magic != 0x7F434E54) - return false; - - for (const auto& flag : flagNames) { - if (isFlagSet(pkgheader.pkg_content_flags, flag.first)) { - if (!pkgFlags.empty()) - pkgFlags += (", "); - pkgFlags += (flag.second); - } - } - - // Find title id it is part of pkg_content_id starting at offset 0x40 - file.Seek(0x47); // skip first 7 characters of content_id - file.Read(pkgTitleID); - - u32 offset = pkgheader.pkg_table_entry_offset; - u32 n_files = pkgheader.pkg_table_entry_count; - - if (!file.Seek(offset)) { - failreason = "Failed to seek to PKG table entry offset"; - return false; - } - - for (int i = 0; i < n_files; i++) { - PKGEntry entry{}; - file.Read(entry.id); - file.Read(entry.filename_offset); - file.Read(entry.flags1); - file.Read(entry.flags2); - file.Read(entry.offset); - file.Read(entry.size); - file.Seek(8, Common::FS::SeekOrigin::CurrentPosition); - - // Try to figure out the name - const auto name = GetEntryNameByType(entry.id); - if (name == "param.sfo") { - sfo.clear(); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to param.sfo offset"; - return false; - } - sfo.resize(entry.size); - file.ReadRaw(sfo.data(), entry.size); - } - } - file.Close(); - - return true; -} - -bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::path& extract, - std::string& failreason) { - extract_path = extract; - pkgpath = filepath; - Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - pkgSize = file.GetSize(); - file.ReadRaw(&pkgheader, sizeof(PKGHeader)); - - if (pkgheader.magic != 0x7F434E54) - return false; - - if (pkgheader.pkg_size > pkgSize) { - failreason = "PKG file size is different"; - return false; - } - if ((pkgheader.pkg_content_size + pkgheader.pkg_content_offset) > pkgheader.pkg_size) { - failreason = "Content size is bigger than pkg size"; - return false; - } - - u32 offset = pkgheader.pkg_table_entry_offset; - u32 n_files = pkgheader.pkg_table_entry_count; - - std::array concatenated_ivkey_dk3; - std::array seed_digest; - std::array, 7> digest1; - std::array, 7> key1; - std::array imgkeydata; - - if (!file.Seek(offset)) { - failreason = "Failed to seek to PKG table entry offset"; - return false; - } - - for (int i = 0; i < n_files; i++) { - PKGEntry entry{}; - file.Read(entry.id); - file.Read(entry.filename_offset); - file.Read(entry.flags1); - file.Read(entry.flags2); - file.Read(entry.offset); - file.Read(entry.size); - file.Seek(8, Common::FS::SeekOrigin::CurrentPosition); - - auto currentPos = file.Tell(); - - // Try to figure out the name - const auto name = GetEntryNameByType(entry.id); - const auto filepath = extract_path / "sce_sys" / name; - std::filesystem::create_directories(filepath.parent_path()); - - if (name.empty()) { - // Just print with id - Common::FS::IOFile out(extract_path / "sce_sys" / std::to_string(entry.id), - Common::FS::FileAccessMode::Write); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to PKG entry offset"; - return false; - } - - std::vector data; - data.resize(entry.size); - file.ReadRaw(data.data(), entry.size); - out.WriteRaw(data.data(), entry.size); - out.Close(); - - file.Seek(currentPos); - continue; - } - - if (entry.id == 0x1) { // DIGESTS, seek; - // file.Seek(entry.offset, fsSeekSet); - } else if (entry.id == 0x10) { // ENTRY_KEYS, seek; - file.Seek(entry.offset); - file.Read(seed_digest); - - for (int i = 0; i < 7; i++) { - file.Read(digest1[i]); - } - - for (int i = 0; i < 7; i++) { - file.Read(key1[i]); - } - - PKG::crypto.RSA2048Decrypt(dk3_, key1[3], true); // decrypt DK3 - } else if (entry.id == 0x20) { // IMAGE_KEY, seek; IV_KEY - file.Seek(entry.offset); - file.Read(imgkeydata); - - // The Concatenated iv + dk3 imagekey for HASH256 - std::memcpy(concatenated_ivkey_dk3.data(), &entry, sizeof(entry)); - std::memcpy(concatenated_ivkey_dk3.data() + sizeof(entry), dk3_.data(), sizeof(dk3_)); - - PKG::crypto.ivKeyHASH256(concatenated_ivkey_dk3, ivKey); // ivkey_ - // imgkey_ to use for last step to get ekpfs - PKG::crypto.aesCbcCfb128Decrypt(ivKey, imgkeydata, imgKey); - // ekpfs key to get data and tweak keys. - PKG::crypto.RSA2048Decrypt(ekpfsKey, imgKey, false); - } else if (entry.id == 0x80) { - // GENERAL_DIGESTS, seek; - // file.Seek(entry.offset, fsSeekSet); - } - - Common::FS::IOFile out(extract_path / "sce_sys" / name, Common::FS::FileAccessMode::Write); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to PKG entry offset"; - return false; - } - - std::vector data; - data.resize(entry.size); - file.ReadRaw(data.data(), entry.size); - out.WriteRaw(data.data(), entry.size); - out.Close(); - - // Decrypt Np stuff and overwrite. - if (entry.id == 0x400 || entry.id == 0x401 || entry.id == 0x402 || - entry.id == 0x403) { // somehow 0x401 is not decrypting - decNp.resize(entry.size); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to PKG entry offset"; - return false; - } - - std::vector data; - data.resize(entry.size); - file.ReadRaw(data.data(), entry.size); - - std::span cipherNp(data.data(), entry.size); - std::array concatenated_ivkey_dk3_; - std::memcpy(concatenated_ivkey_dk3_.data(), &entry, sizeof(entry)); - std::memcpy(concatenated_ivkey_dk3_.data() + sizeof(entry), dk3_.data(), sizeof(dk3_)); - PKG::crypto.ivKeyHASH256(concatenated_ivkey_dk3_, ivKey); - PKG::crypto.aesCbcCfb128DecryptEntry(ivKey, cipherNp, decNp); - - Common::FS::IOFile out(extract_path / "sce_sys" / name, - Common::FS::FileAccessMode::Write); - out.Write(decNp); - out.Close(); - } - - file.Seek(currentPos); - } - - // Read the seed - std::array seed; - if (!file.Seek(pkgheader.pfs_image_offset + 0x370)) { - failreason = "Failed to seek to PFS image offset"; - return false; - } - file.Read(seed); - - // Get data and tweak keys. - PKG::crypto.PfsGenCryptoKey(ekpfsKey, seed, dataKey, tweakKey); - const u32 length = pkgheader.pfs_cache_size * 0x2; // Seems to be ok. - - int num_blocks = 0; - std::vector pfsc(length); - if (length != 0) { - // Read encrypted pfs_image - std::vector pfs_encrypted(length); - file.Seek(pkgheader.pfs_image_offset); - file.Read(pfs_encrypted); - file.Close(); - // Decrypt the pfs_image. - std::vector pfs_decrypted(length); - PKG::crypto.decryptPFS(dataKey, tweakKey, pfs_encrypted, pfs_decrypted, 0); - - // Retrieve PFSC from decrypted pfs_image. - pfsc_offset = GetPFSCOffset(pfs_decrypted); - std::memcpy(pfsc.data(), pfs_decrypted.data() + pfsc_offset, length - pfsc_offset); - - PFSCHdr pfsChdr; - std::memcpy(&pfsChdr, pfsc.data(), sizeof(pfsChdr)); - - num_blocks = (int)(pfsChdr.data_length / pfsChdr.block_sz2); - sectorMap.resize(num_blocks + 1); // 8 bytes, need extra 1 to get the last offset. - - for (int i = 0; i < num_blocks + 1; i++) { - std::memcpy(§orMap[i], pfsc.data() + pfsChdr.block_offsets + i * 8, 8); - } - } - - u32 ent_size = 0; - u32 ndinode = 0; - int ndinode_counter = 0; - bool dinode_reached = false; - bool uroot_reached = false; - std::vector compressedData; - std::vector decompressedData(0x10000); - - // Get iNdoes and Dirents. - for (int i = 0; i < num_blocks; i++) { - const u64 sectorOffset = sectorMap[i]; - const u64 sectorSize = sectorMap[i + 1] - sectorOffset; - - compressedData.resize(sectorSize); - std::memcpy(compressedData.data(), pfsc.data() + sectorOffset, sectorSize); - - if (sectorSize == 0x10000) // Uncompressed data - std::memcpy(decompressedData.data(), compressedData.data(), 0x10000); - else if (sectorSize < 0x10000) // Compressed data - DecompressPFSC(compressedData, decompressedData); - - if (i == 0) { - std::memcpy(&ndinode, decompressedData.data() + 0x30, 4); // number of folders and files - } - - int occupied_blocks = - (ndinode * 0xA8) / 0x10000; // how many blocks(0x10000) are taken by iNodes. - if (((ndinode * 0xA8) % 0x10000) != 0) - occupied_blocks += 1; - - if (i >= 1 && i <= occupied_blocks) { // Get all iNodes, gives type, file size and location. - for (int p = 0; p < 0x10000; p += 0xA8) { - Inode node; - std::memcpy(&node, &decompressedData[p], sizeof(node)); - if (node.Mode == 0) { - break; - } - iNodeBuf.push_back(node); - } - } - - // let's deal with the root/uroot entries here. - // Sometimes it's more than 2 entries (Tomb Raider Remastered) - const std::string_view flat_path_table(&decompressedData[0x10], 15); - if (flat_path_table == "flat_path_table") { - uroot_reached = true; - } - - if (uroot_reached) { - for (int i = 0; i < 0x10000; i += ent_size) { - Dirent dirent; - std::memcpy(&dirent, &decompressedData[i], sizeof(dirent)); - ent_size = dirent.entsize; - if (dirent.ino != 0) { - ndinode_counter++; - } else { - // Set the the folder according to the current inode. - // Can be 2 or more (rarely) - auto parent_path = extract_path.parent_path(); - auto title_id = GetTitleID(); - - if (parent_path.filename() != title_id && - !fmt::UTF(extract_path.u8string()).data.ends_with("-patch")) { - extractPaths[ndinode_counter] = parent_path / title_id; - } else { - // DLCs path has different structure - extractPaths[ndinode_counter] = extract_path; - } - uroot_reached = false; - break; - } - } - } - - const char dot = decompressedData[0x10]; - const std::string_view dotdot(&decompressedData[0x28], 2); - if (dot == '.' && dotdot == "..") { - dinode_reached = true; - } - - // Get folder and file names. - bool end_reached = false; - if (dinode_reached) { - for (int j = 0; j < 0x10000; j += ent_size) { // Skip the first parent and child. - Dirent dirent; - std::memcpy(&dirent, &decompressedData[j], sizeof(dirent)); - - // Stop here and continue the main loop - if (dirent.ino == 0) { - break; - } - - ent_size = dirent.entsize; - auto& table = fsTable.emplace_back(); - table.name = std::string(dirent.name, dirent.namelen); - table.inode = dirent.ino; - table.type = dirent.type; - - if (table.type == PFS_CURRENT_DIR) { - current_dir = extractPaths[table.inode]; - } - extractPaths[table.inode] = current_dir / std::filesystem::path(table.name); - - if (table.type == PFS_FILE || table.type == PFS_DIR) { - if (table.type == PFS_DIR) { // Create dirs. - std::filesystem::create_directory(extractPaths[table.inode]); - } - ndinode_counter++; - if ((ndinode_counter + 1) == ndinode) // 1 for the image itself (root). - end_reached = true; - } - } - if (end_reached) { - break; - } - } - } - return true; -} - -void PKG::ExtractFiles(const int index) { - int inode_number = fsTable[index].inode; - int inode_type = fsTable[index].type; - std::string inode_name = fsTable[index].name; - - if (inode_type == PFS_FILE) { - int sector_loc = iNodeBuf[inode_number].loc; - int nblocks = iNodeBuf[inode_number].Blocks; - int bsize = iNodeBuf[inode_number].Size; - - Common::FS::IOFile inflated; - inflated.Open(extractPaths[inode_number], Common::FS::FileAccessMode::Write); - - Common::FS::IOFile pkgFile; // Open the file for each iteration to avoid conflict. - pkgFile.Open(pkgpath, Common::FS::FileAccessMode::Read); - - int size_decompressed = 0; - std::vector compressedData; - std::vector decompressedData(0x10000); - - u64 pfsc_buf_size = 0x11000; // extra 0x1000 - std::vector pfsc(pfsc_buf_size); - std::vector pfs_decrypted(pfsc_buf_size); - - for (int j = 0; j < nblocks; j++) { - u64 sectorOffset = - sectorMap[sector_loc + j]; // offset into PFSC_image and not pfs_image. - u64 sectorSize = sectorMap[sector_loc + j + 1] - - sectorOffset; // indicates if data is compressed or not. - u64 fileOffset = (pkgheader.pfs_image_offset + pfsc_offset + sectorOffset); - u64 currentSector1 = - (pfsc_offset + sectorOffset) / 0x1000; // block size is 0x1000 for xts decryption. - - int sectorOffsetMask = (sectorOffset + pfsc_offset) & 0xFFFFF000; - int previousData = (sectorOffset + pfsc_offset) - sectorOffsetMask; - - pkgFile.Seek(fileOffset - previousData); - pkgFile.Read(pfsc); - - PKG::crypto.decryptPFS(dataKey, tweakKey, pfsc, pfs_decrypted, currentSector1); - - compressedData.resize(sectorSize); - std::memcpy(compressedData.data(), pfs_decrypted.data() + previousData, sectorSize); - - if (sectorSize == 0x10000) // Uncompressed data - std::memcpy(decompressedData.data(), compressedData.data(), 0x10000); - else if (sectorSize < 0x10000) // Compressed data - DecompressPFSC(compressedData, decompressedData); - - size_decompressed += 0x10000; - - if (j < nblocks - 1) { - inflated.WriteRaw(decompressedData.data(), decompressedData.size()); - } else { - // This is to remove the zeros at the end of the file. - const u32 write_size = decompressedData.size() - (size_decompressed - bsize); - inflated.WriteRaw(decompressedData.data(), write_size); - } - } - pkgFile.Close(); - inflated.Close(); - } -} diff --git a/src/core/loader.cpp b/src/core/loader.cpp deleted file mode 100644 index f80bfbb81..000000000 --- a/src/core/loader.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/io_file.h" -#include "common/types.h" -#include "loader.h" - -namespace Loader { - -FileTypes DetectFileType(const std::filesystem::path& filepath) { - // No file loaded - if (filepath.empty()) { - return FileTypes::Unknown; - } - Common::FS::IOFile file; - file.Open(filepath, Common::FS::FileAccessMode::Read); - file.Seek(0); - u32 magic; - file.Read(magic); - file.Close(); - switch (magic) { - case PkgMagic: - return FileTypes::Pkg; - } - return FileTypes::Unknown; -} - -} // namespace Loader diff --git a/src/core/loader.h b/src/core/loader.h deleted file mode 100644 index 608970dca..000000000 --- a/src/core/loader.h +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -namespace Loader { - -constexpr static u32 PkgMagic = 0x544e437f; - -enum class FileTypes { - Unknown, - Pkg, -}; - -FileTypes DetectFileType(const std::filesystem::path& filepath); -} // namespace Loader diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 0cc0e48dc..7dcb006ba 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -599,30 +598,6 @@ public: return -1; } - void RequestGameMenuPKGViewer( - const QPoint& pos, QStringList m_pkg_app_list, QTreeWidget* treeWidget, - std::function InstallDragDropPkg) { - QPoint global_pos = treeWidget->viewport()->mapToGlobal(pos); // context menu position - QTreeWidgetItem* currentItem = treeWidget->currentItem(); // current clicked item - int itemIndex = GetRowIndex(treeWidget, currentItem); // row - - QMenu menu(treeWidget); - QAction installPackage(tr("Install PKG"), treeWidget); - - menu.addAction(&installPackage); - - auto selected = menu.exec(global_pos); - if (!selected) { - return; - } - - if (selected == &installPackage) { - QStringList pkg_app_ = m_pkg_app_list[itemIndex].split(";;"); - std::filesystem::path path = Common::FS::PathFromQString(pkg_app_[9]); - InstallDragDropPkg(path, 1, 1); - } - } - private: bool convertPngToIco(const QString& pngFilePath, const QString& icoFilePath) { // Load the PNG image diff --git a/src/qt_gui/install_dir_select.cpp b/src/qt_gui/install_dir_select.cpp deleted file mode 100644 index e90a10ee6..000000000 --- a/src/qt_gui/install_dir_select.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "install_dir_select.h" - -InstallDirSelect::InstallDirSelect() : selected_dir() { - auto install_dirs = Config::getGameInstallDirs(); - selected_dir = install_dirs.empty() ? "" : install_dirs.front(); - - if (!install_dirs.empty() && install_dirs.size() == 1) { - accept(); - } - - auto layout = new QVBoxLayout(this); - - layout->addWidget(SetupInstallDirList()); - layout->addStretch(); - layout->addWidget(SetupDialogActions()); - - setWindowTitle(tr("shadPS4 - Choose directory")); - setWindowIcon(QIcon(":images/shadps4.ico")); -} - -InstallDirSelect::~InstallDirSelect() {} - -QWidget* InstallDirSelect::SetupInstallDirList() { - auto group = new QGroupBox(tr("Select which directory you want to install to.")); - auto vlayout = new QVBoxLayout(); - - auto m_path_list = new QListWidget(); - QList qt_list; - for (const auto& str : Config::getGameInstallDirs()) { - QString installDirPath; - Common::FS::PathToQString(installDirPath, str); - qt_list.append(installDirPath); - } - m_path_list->insertItems(0, qt_list); - m_path_list->setSpacing(1); - - connect(m_path_list, &QListWidget::itemClicked, this, &InstallDirSelect::setSelectedDirectory); - connect(m_path_list, &QListWidget::itemActivated, this, - &InstallDirSelect::setSelectedDirectory); - - vlayout->addWidget(m_path_list); - - auto checkbox = new QCheckBox(tr("Install All Queued to Selected Folder")); - connect(checkbox, &QCheckBox::toggled, this, &InstallDirSelect::setUseForAllQueued); - vlayout->addWidget(checkbox); - - auto checkbox2 = new QCheckBox(tr("Delete PKG File on Install")); - connect(checkbox2, &QCheckBox::toggled, this, &InstallDirSelect::setDeleteFileOnInstall); - vlayout->addWidget(checkbox2); - - group->setLayout(vlayout); - return group; -} - -void InstallDirSelect::setSelectedDirectory(QListWidgetItem* item) { - if (item) { - const auto highlighted_path = Common::FS::PathFromQString(item->text()); - if (!highlighted_path.empty()) { - selected_dir = highlighted_path; - } - } -} - -void InstallDirSelect::setUseForAllQueued(bool enabled) { - use_for_all_queued = enabled; -} - -void InstallDirSelect::setDeleteFileOnInstall(bool enabled) { - delete_file_on_install = enabled; -} - -QWidget* InstallDirSelect::SetupDialogActions() { - auto actions = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - - connect(actions, &QDialogButtonBox::accepted, this, &InstallDirSelect::accept); - connect(actions, &QDialogButtonBox::rejected, this, &InstallDirSelect::reject); - - return actions; -} diff --git a/src/qt_gui/install_dir_select.h b/src/qt_gui/install_dir_select.h deleted file mode 100644 index e11cbf381..000000000 --- a/src/qt_gui/install_dir_select.h +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -#include "common/config.h" -#include "common/path_util.h" - -class QLineEdit; - -class InstallDirSelect final : public QDialog { - Q_OBJECT - -public: - InstallDirSelect(); - ~InstallDirSelect(); - - std::filesystem::path getSelectedDirectory() { - return selected_dir; - } - - bool useForAllQueued() { - return use_for_all_queued; - } - - bool deleteFileOnInstall() { - return delete_file_on_install; - } - -private: - QWidget* SetupInstallDirList(); - QWidget* SetupDialogActions(); - void setSelectedDirectory(QListWidgetItem* item); - void setDeleteFileOnInstall(bool enabled); - void setUseForAllQueued(bool enabled); - std::filesystem::path selected_dir; - bool delete_file_on_install = false; - bool use_for_all_queued = false; -}; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index e92676c02..5d8f8e717 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -20,9 +20,7 @@ #include "common/string_util.h" #include "common/version.h" #include "control_settings.h" -#include "core/loader.h" #include "game_install_dialog.h" -#include "install_dir_select.h" #include "kbm_gui.h" #include "main_window.h" #include "settings_dialog.h" From 501f46e51518a70db4d394ebe0b1510f1e165179 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 28 Mar 2025 19:48:23 +0200 Subject: [PATCH 17/22] New Crowdin updates (#2695) * New translations en_us.ts (Albanian) * New translations en_us.ts (Polish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Arabic) * New translations en_us.ts (Turkish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Russian) * New translations en_us.ts (Finnish) * New translations en_us.ts (Finnish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Arabic) --- src/qt_gui/translations/ar_SA.ts | 42 ++++++++- src/qt_gui/translations/da_DK.ts | 40 ++++++++ src/qt_gui/translations/de_DE.ts | 40 ++++++++ src/qt_gui/translations/el_GR.ts | 40 ++++++++ src/qt_gui/translations/es_ES.ts | 40 ++++++++ src/qt_gui/translations/fa_IR.ts | 40 ++++++++ src/qt_gui/translations/fi_FI.ts | 156 +++++++++++++++++++------------ src/qt_gui/translations/fr_FR.ts | 40 ++++++++ src/qt_gui/translations/hu_HU.ts | 40 ++++++++ src/qt_gui/translations/id_ID.ts | 40 ++++++++ src/qt_gui/translations/it_IT.ts | 46 ++++++++- src/qt_gui/translations/ja_JP.ts | 40 ++++++++ src/qt_gui/translations/ko_KR.ts | 40 ++++++++ src/qt_gui/translations/lt_LT.ts | 40 ++++++++ src/qt_gui/translations/nb_NO.ts | 40 ++++++++ src/qt_gui/translations/nl_NL.ts | 40 ++++++++ src/qt_gui/translations/pl_PL.ts | 40 ++++++++ src/qt_gui/translations/pt_BR.ts | 42 ++++++++- src/qt_gui/translations/pt_PT.ts | 40 ++++++++ src/qt_gui/translations/ro_RO.ts | 40 ++++++++ src/qt_gui/translations/ru_RU.ts | 40 ++++++++ src/qt_gui/translations/sq_AL.ts | 40 ++++++++ src/qt_gui/translations/sv_SE.ts | 40 ++++++++ src/qt_gui/translations/tr_TR.ts | 40 ++++++++ src/qt_gui/translations/uk_UA.ts | 40 ++++++++ src/qt_gui/translations/vi_VN.ts | 40 ++++++++ src/qt_gui/translations/zh_CN.ts | 40 ++++++++ src/qt_gui/translations/zh_TW.ts | 40 ++++++++ 28 files changed, 1183 insertions(+), 63 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index ac6920ea0..9808fdbe6 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -1149,7 +1149,7 @@ Deadzone Offset (def 0.50): - + Deadzone Offset (def 0.50): Speed Multiplier (def 1.0): @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + أبدأ اللعب + + + Pause + توقف مؤقت + + + Stop + إيقاف + + + Restart + إعادة تشغيل + + + Full Screen + وضع ملء الشاشة + + + Controllers + أذرعة التحكم + + + Keyboard + لوحة المفاتيح + + + Refresh List + تحديث القائمة + + + Resume + استئناف + + + Show Labels Under Icons + إظهار العلامات أسفل الأيقونات + PKGViewer diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 1835ba84c..1547a0e13 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 6717a93ef..c0e43065b 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 6e1adaac9..e6fa989aa 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 24844d0a2..288c445c3 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 6b7af042e..1b8813a80 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1514,6 +1514,46 @@ shadPS4 ShadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 324cb6c49..cd880fb23 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -407,206 +407,206 @@ ControlSettings Configure Controls - Configure Controls + Määritä Kontrollit D-Pad - D-Pad + D-Pad Up - Up + Ylös Left - Left + Vasen Right - Right + Oikea Down - Down + Alas Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Vasemman Analogin Deadzone (oletus:2 max:127) Left Deadzone - Left Deadzone + Vasen Deadzone Left Stick - Left Stick + Vasen Analogi Config Selection - Config Selection + Asetusten Valinta Common Config - Common Config + Yleinen Asetus Use per-game configs - Use per-game configs + Käytä pelikohtaisia asetuksia L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT Back - Back + Back R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons - Face Buttons + Etunäppäimet Triangle / Y - Triangle / Y + Kolmio / Y Square / X - Square / X + Neliö / X Circle / B - Circle / B + Ympyrä / B Cross / A - Cross / A + Rasti / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Oikean Analogin Deadzone (oletus:2 max:127) Right Deadzone - Right Deadzone + Oikea Deadzone Right Stick - Right Stick + Oikea Analogi Color Adjustment - Color Adjustment + Värinhallinta R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color - Override Lightbar Color + Pakota Ohjaimen Valopalkin Väri Override Color - Override Color + Pakotettava Väri Unable to Save - Unable to Save + Tallentaminen Epäonnistui Cannot bind axis values more than once - Cannot bind axis values more than once + Akseliarvoja ei voi määrittää kertaa useammin Save - Save + Tallenna Apply - Apply + Ota Käyttöön Restore Defaults - Restore Defaults + Palauta Oletukset Cancel - Cancel + Peruuta EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Muokkaa Näppäimistön + Hiiren ja Ohjaimen näppäinasetuksia Use Per-Game configs - Use Per-Game configs + Käytä Pelikohtaisia Asetuksia Error - Error + Virhe Could not open the file for reading - Could not open the file for reading + Tiedostoa ei voitu avata luettavaksi Could not open the file for writing - Could not open the file for writing + Tiedostoa ei voitu avata kirjoitettavaksi Save Changes - Save Changes + Tallenna Muutokset Do you want to save changes? - Do you want to save changes? + Haluatko tallentaa muutokset? Help - Help + Tietoa Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Haluatko nollata oletusasetuksiin tekemäsi muutokset? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Haluato palauttaa nämä asetukset takaisin määrittämiisi oletuksiin? Reset to Default @@ -1077,35 +1077,35 @@ L3 - L3 + L3 Touchpad Click - Touchpad Click + Kosketuslevyn Klikkaus Mouse to Joystick - Mouse to Joystick + Hiiri Joystickinä *press F7 ingame to activate - *press F7 ingame to activate + *paina F7 pelissä aktivoidaksesi R3 - R3 + R3 Options - Options + Options Mouse Movement Parameters - Mouse Movement Parameters + Hiiren Liikkeen Parametrit note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + huomio: klikkaa apunappia/näppäintä saadaksesi lisää tietoa Face Buttons @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index ec3f9f8b5..1f7a726cd 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 6672337a6..8746058b3 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index e43d31976..5960715ae 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index e63da05b8..3e95e3df6 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1308,11 +1308,11 @@ Trophy Viewer - Trophy Viewer + Visualizzatore Trofei No games found. Please add your games to your library first. - No games found. Please add your games to your library first. + Nessun gioco trovato. Aggiungi prima i tuoi giochi alla tua libreria. PKG Viewer @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer @@ -2201,7 +2241,7 @@ Select Game: - Select Game: + Seleziona Gioco: Progress diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 7cf9fc5c2..1aaa3fa7c 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index d5289ace9..9dd06028d 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 17133da35..6e98ddc45 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index e8ce99f90..6faff415e 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 5c1725bd5..376eea5ef 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 033412efa..a77b43e09 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index d44efce5d..ea82086f3 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -912,7 +912,7 @@ Are you sure you want to delete %1's %2 directory? - Tem certeza de que deseja excluir o diretório %2 de %1? + Tem certeza de que deseja excluir o diretório do %2 %1? Open Update Folder @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Jogar + + + Pause + Pausar + + + Stop + Parar + + + Restart + Reiniciar + + + Full Screen + Tela Cheia + + + Controllers + Controles + + + Keyboard + Teclado + + + Refresh List + Atualizar Lista + + + Resume + Continuar + + + Show Labels Under Icons + Mostrar Rótulos Sob Ícones + PKGViewer diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 455955fad..7ca3eebb5 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 9c7720e17..6e008ac20 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 68eaabc34..560c8c110 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Играть + + + Pause + Пауза + + + Stop + Остановить + + + Restart + Перезапустить + + + Full Screen + Полный экран + + + Controllers + Контроллеры + + + Keyboard + Клавиатура + + + Refresh List + Обновить список + + + Resume + Продолжить + + + Show Labels Under Icons + Показывать метки под значками + PKGViewer diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 657f78d0d..8a2c34c60 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index a002b150a..91b544e05 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 48ce4254d..4946874c9 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Başlat + + + Pause + Duraklat + + + Stop + Durdur + + + Restart + Yeniden Başlat + + + Full Screen + Tam Ekran + + + Controllers + Kontrolcüler + + + Keyboard + Klavye + + + Refresh List + Listeyi Yenile + + + Resume + Devam Et + + + Show Labels Under Icons + Simgelerin Altında Etiketleri Göster + PKGViewer diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 06c88428b..69e6c5fc7 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index c16604b85..14bd29896 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 6364ae1d6..7536b7d17 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + 开始游戏 + + + Pause + 暂停 + + + Stop + 关闭 + + + Restart + 重新启动 + + + Full Screen + 全屏 + + + Controllers + 控制器 + + + Keyboard + 键盘 + + + Refresh List + 刷新列表 + + + Resume + 继续游戏 + + + Show Labels Under Icons + 显示图标下的标签 + PKGViewer diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index fb42a43b0..f195ec1b7 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer From 751a23af0f5a9612b8e28af1400896a3026ee331 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 28 Mar 2025 19:49:04 +0200 Subject: [PATCH 18/22] [ci skip] Qt GUI: Update Translation. (#2703) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 174 ------------------------------- 1 file changed, 174 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index d18609295..28d31b200 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - - - - Delete PKG File on Install - - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Only one file can be selected! - - PKG Extraction - PKG Extraction - - - Patch detected! - Patch detected! - - - PKG and Game versions match: - PKG and Game versions match: - - - Would you like to overwrite? - Would you like to overwrite? - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - Game is installed: - Game is installed: - - - Would you like to install Patch: - Would you like to install Patch: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - DLC already installed: - DLC already installed: - - - Game already installed - Game already installed - - - PKG ERROR - PKG ERROR - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - Extraction Finished - Extraction Finished - - - Game successfully installed at %1 - Game successfully installed at %1 - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found - - PKG File (*.PKG *.pkg) - - - - PKG is a patch or DLC, please install the game first! - - Game is already running! @@ -1555,73 +1448,6 @@ - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG ERROR - - - Name - Name - - - Serial - Serial - - - Installed - - - - Size - Size - - - Category - - - - Type - - - - App Ver - - - - FW - - - - Region - Region - - - Flags - - - - Path - Path - - - File - File - - - Unknown - Unknown - - - Package - - - SettingsDialog From 78c8bca2bb7a1da452ba67f4813b4d504b8b4e7b Mon Sep 17 00:00:00 2001 From: Ked <58560148+k3dr1@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:14:52 +0800 Subject: [PATCH 19/22] Fix support for unicode paths for game install directories (#2699) * Slightly changed how allInstallDirsDisabled is determined * Show a dialog only if no game directories are set * Changed a comment * Fixed formatting * Support for unicode paths for game install directories * Fixed game picture path conversion --- src/common/config.cpp | 2 +- src/qt_gui/game_list_frame.cpp | 3 ++- src/qt_gui/settings_dialog.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 8ead58686..d1bb89897 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -850,7 +850,7 @@ void load(const std::filesystem::path& path) { m_window_size_H = toml::find_or(gui, "mw_height", 0); const auto install_dir_array = - toml::find_or>(gui, "installDirs", {}); + toml::find_or>(gui, "installDirs", {}); try { install_dirs_enabled = toml::find>(gui, "installDirsEnabled"); diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 4c0607571..170215f3d 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -185,7 +185,8 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) { // Recompute if opacity changed or we switched to a different game if (opacity != m_last_opacity || game.pic_path != m_current_game_path) { - QImage original_image(QString::fromStdString(game.pic_path.string())); + auto image_path = game.pic_path.u8string(); + QImage original_image(QString::fromStdString({image_path.begin(), image_path.end()})); if (!original_image.isNull()) { backgroundImage = m_game_list_utils.ChangeImageOpacity( original_image, original_image.rect(), opacity / 100.0f); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index d789f6f48..383cad8fa 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -817,7 +817,7 @@ void SettingsDialog::ResetInstallFolders() { if (data.contains("GUI")) { const toml::value& gui = data.at("GUI"); const auto install_dir_array = - toml::find_or>(gui, "installDirs", {}); + toml::find_or>(gui, "installDirs", {}); std::vector install_dirs_enabled; try { From be7d646e8314ccf1f125818f3589b78d8e3262eb Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:32:06 -0700 Subject: [PATCH 20/22] externals: Remove need for cryptopp build. (#2707) --- .gitmodules | 8 - CMakeLists.txt | 4 +- externals/CMakeLists.txt | 16 +- externals/cryptopp | 1 - externals/cryptopp-cmake | 1 - src/common/aes.h | 1195 ++++++++++++++++++++++++++++++++++ src/common/sha1.h | 180 +++++ src/core/file_format/trp.cpp | 37 +- src/core/module.cpp | 11 +- 9 files changed, 1398 insertions(+), 55 deletions(-) delete mode 160000 externals/cryptopp delete mode 160000 externals/cryptopp-cmake create mode 100644 src/common/aes.h create mode 100644 src/common/sha1.h diff --git a/.gitmodules b/.gitmodules index ca229bedd..98fba2098 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,11 +1,3 @@ -[submodule "externals/cryptopp-cmake"] - path = externals/cryptopp-cmake - url = https://github.com/shadps4-emu/ext-cryptopp-cmake.git - shallow = true -[submodule "externals/cryptopp"] - path = externals/cryptopp - url = https://github.com/shadps4-emu/ext-cryptopp.git - shallow = true [submodule "externals/zlib-ng"] path = externals/zlib-ng url = https://github.com/shadps4-emu/ext-zlib-ng.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 13204f479..bd458f04e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -583,6 +583,7 @@ set(COMMON src/common/logging/backend.cpp src/common/logging/text_formatter.cpp src/common/logging/text_formatter.h src/common/logging/types.h + src/common/aes.h src/common/alignment.h src/common/arch.h src/common/assert.cpp @@ -614,6 +615,7 @@ set(COMMON src/common/logging/backend.cpp src/common/polyfill_thread.h src/common/rdtsc.cpp src/common/rdtsc.h + src/common/sha1.h src/common/signal_context.h src/common/signal_context.cpp src/common/singleton.h @@ -1022,7 +1024,7 @@ endif() create_target_directory_groups(shadps4) target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG) -target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers cryptopp::cryptopp) +target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers) target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h") target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 3b29a838e..d6bdda023 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -26,21 +26,7 @@ if (NOT TARGET fmt::fmt) add_subdirectory(fmt) endif() -# CryptoPP -if (NOT TARGET cryptopp::cryptopp) - set(CRYPTOPP_INSTALL OFF) - set(CRYPTOPP_BUILD_TESTING OFF) - set(CRYPTOPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cryptopp) - # cryptopp instruction set checks do not account for added compile options, - # so disable extensions in the library config to match our chosen target CPU. - set(CRYPTOPP_DISABLE_AESNI ON) - set(CRYPTOPP_DISABLE_AVX2 ON) - add_subdirectory(cryptopp-cmake) - file(COPY cryptopp DESTINATION cryptopp FILES_MATCHING PATTERN "*.h") - # remove externals/cryptopp from include directories because it contains a conflicting zlib.h file - set_target_properties(cryptopp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/cryptopp") -endif() - +# FFmpeg if (NOT TARGET FFmpeg::ffmpeg) add_subdirectory(ffmpeg-core) add_library(FFmpeg::ffmpeg ALIAS ffmpeg) diff --git a/externals/cryptopp b/externals/cryptopp deleted file mode 160000 index effed0d0b..000000000 --- a/externals/cryptopp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit effed0d0b865afc23ed67e0916f83734e4b9b3b7 diff --git a/externals/cryptopp-cmake b/externals/cryptopp-cmake deleted file mode 160000 index 2c384c282..000000000 --- a/externals/cryptopp-cmake +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2c384c28265a93358a2455e610e76393358794df diff --git a/src/common/aes.h b/src/common/aes.h new file mode 100644 index 000000000..5ca0096bd --- /dev/null +++ b/src/common/aes.h @@ -0,0 +1,1195 @@ +// SPDX-FileCopyrightText: 2015 kkAyataka +// SPDX-License-Identifier: BSL-1.0 + +#pragma once + +#include +#include +#include +#include +#include +#include + +/** AES cipher APIs */ +namespace aes { +namespace detail { + +const int kWordSize = 4; +typedef unsigned int Word; + +const int kBlockSize = 4; +/** @private */ +struct State { + Word w[4]; + Word& operator[](const int index) { + return w[index]; + } + const Word& operator[](const int index) const { + return w[index]; + } +}; + +const int kStateSize = 16; // Word * BlockSize +typedef State RoundKey; +typedef std::vector RoundKeys; + +inline void add_round_key(const RoundKey& key, State& state) { + for (int i = 0; i < kBlockSize; ++i) { + state[i] ^= key[i]; + } +} + +const unsigned char kSbox[] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; + +const unsigned char kInvSbox[] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d}; + +inline Word sub_word(const Word w) { + return kSbox[(w >> 0) & 0xFF] << 0 | kSbox[(w >> 8) & 0xFF] << 8 | + kSbox[(w >> 16) & 0xFF] << 16 | kSbox[(w >> 24) & 0xFF] << 24; +} + +inline Word inv_sub_word(const Word w) { + return kInvSbox[(w >> 0) & 0xFF] << 0 | kInvSbox[(w >> 8) & 0xFF] << 8 | + kInvSbox[(w >> 16) & 0xFF] << 16 | kInvSbox[(w >> 24) & 0xFF] << 24; +} + +inline void sub_bytes(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + state[i] = sub_word(state[i]); + } +} + +inline void inv_sub_bytes(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + state[i] = inv_sub_word(state[i]); + } +} + +inline void shift_rows(State& state) { + const State ori = {state[0], state[1], state[2], state[3]}; + for (int r = 1; r < kWordSize; ++r) { + const Word m2 = 0xFF << (r * 8); + const Word m1 = ~m2; + for (int c = 0; c < kBlockSize; ++c) { + state[c] = (state[c] & m1) | (ori[(c + r) % kBlockSize] & m2); + } + } +} + +inline void inv_shift_rows(State& state) { + const State ori = {state[0], state[1], state[2], state[3]}; + for (int r = 1; r < kWordSize; ++r) { + const Word m2 = 0xFF << (r * 8); + const Word m1 = ~m2; + for (int c = 0; c < kBlockSize; ++c) { + state[c] = (state[c] & m1) | (ori[(c + kBlockSize - r) % kWordSize] & m2); + } + } +} + +inline unsigned char mul2(const unsigned char b) { + unsigned char m2 = b << 1; + if (b & 0x80) { + m2 ^= 0x011B; + } + + return m2; +} + +inline unsigned char mul(const unsigned char b, const unsigned char m) { + unsigned char v = 0; + unsigned char t = b; + for (int i = 0; i < 8; ++i) { // 8-bits + if ((m >> i) & 0x01) { + v ^= t; + } + + t = mul2(t); + } + + return v; +} + +inline void mix_columns(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + const unsigned char v0_1 = (state[i] >> 0) & 0xFF; + const unsigned char v1_1 = (state[i] >> 8) & 0xFF; + const unsigned char v2_1 = (state[i] >> 16) & 0xFF; + const unsigned char v3_1 = (state[i] >> 24) & 0xFF; + + const unsigned char v0_2 = mul2(v0_1); + const unsigned char v1_2 = mul2(v1_1); + const unsigned char v2_2 = mul2(v2_1); + const unsigned char v3_2 = mul2(v3_1); + + const unsigned char v0_3 = v0_2 ^ v0_1; + const unsigned char v1_3 = v1_2 ^ v1_1; + const unsigned char v2_3 = v2_2 ^ v2_1; + const unsigned char v3_3 = v3_2 ^ v3_1; + + state[i] = (v0_2 ^ v1_3 ^ v2_1 ^ v3_1) << 0 | (v0_1 ^ v1_2 ^ v2_3 ^ v3_1) << 8 | + (v0_1 ^ v1_1 ^ v2_2 ^ v3_3) << 16 | (v0_3 ^ v1_1 ^ v2_1 ^ v3_2) << 24; + } +} + +inline void inv_mix_columns(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + const unsigned char v0 = (state[i] >> 0) & 0xFF; + const unsigned char v1 = (state[i] >> 8) & 0xFF; + const unsigned char v2 = (state[i] >> 16) & 0xFF; + const unsigned char v3 = (state[i] >> 24) & 0xFF; + + state[i] = (mul(v0, 0x0E) ^ mul(v1, 0x0B) ^ mul(v2, 0x0D) ^ mul(v3, 0x09)) << 0 | + (mul(v0, 0x09) ^ mul(v1, 0x0E) ^ mul(v2, 0x0B) ^ mul(v3, 0x0D)) << 8 | + (mul(v0, 0x0D) ^ mul(v1, 0x09) ^ mul(v2, 0x0E) ^ mul(v3, 0x0B)) << 16 | + (mul(v0, 0x0B) ^ mul(v1, 0x0D) ^ mul(v2, 0x09) ^ mul(v3, 0x0E)) << 24; + } +} + +inline Word rot_word(const Word v) { + return ((v >> 8) & 0x00FFFFFF) | ((v & 0xFF) << 24); +} + +/** + * @private + * @throws std::invalid_argument + */ +inline unsigned int get_round_count(const int key_size) { + switch (key_size) { + case 16: + return 10; + case 24: + return 12; + case 32: + return 14; + default: + throw std::invalid_argument("Invalid key size"); + } +} + +/** + * @private + * @throws std::invalid_argument + */ +inline RoundKeys expand_key(const unsigned char* key, const int key_size) { + if (key_size != 16 && key_size != 24 && key_size != 32) { + throw std::invalid_argument("Invalid key size"); + } + + const Word rcon[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36}; + + const int nb = kBlockSize; + const int nk = key_size / nb; + const int nr = get_round_count(key_size); + + std::vector w(nb * (nr + 1)); + for (int i = 0; i < nk; ++i) { + memcpy(&w[i], key + (i * kWordSize), kWordSize); + } + + for (int i = nk; i < nb * (nr + 1); ++i) { + Word t = w[i - 1]; + if (i % nk == 0) { + t = sub_word(rot_word(t)) ^ rcon[i / nk]; + } else if (nk > 6 && i % nk == 4) { + t = sub_word(t); + } + + w[i] = t ^ w[i - nk]; + } + + RoundKeys keys(nr + 1); + memcpy(&keys[0], &w[0], w.size() * kWordSize); + + return keys; +} + +inline void copy_bytes_to_state(const unsigned char data[16], State& state) { + memcpy(&state[0], data + 0, kWordSize); + memcpy(&state[1], data + 4, kWordSize); + memcpy(&state[2], data + 8, kWordSize); + memcpy(&state[3], data + 12, kWordSize); +} + +inline void copy_state_to_bytes(const State& state, unsigned char buf[16]) { + memcpy(buf + 0, &state[0], kWordSize); + memcpy(buf + 4, &state[1], kWordSize); + memcpy(buf + 8, &state[2], kWordSize); + memcpy(buf + 12, &state[3], kWordSize); +} + +inline void xor_data(unsigned char data[kStateSize], const unsigned char v[kStateSize]) { + for (int i = 0; i < kStateSize; ++i) { + data[i] ^= v[i]; + } +} + +/** increment counter (128-bit int) by 1 */ +inline void incr_counter(unsigned char counter[kStateSize]) { + unsigned n = kStateSize, c = 1; + do { + --n; + c += counter[n]; + counter[n] = c; + c >>= 8; + } while (n); +} + +inline void encrypt_state(const RoundKeys& rkeys, const unsigned char data[16], + unsigned char encrypted[16]) { + State s; + copy_bytes_to_state(data, s); + + add_round_key(rkeys[0], s); + + for (unsigned int i = 1; i < rkeys.size() - 1; ++i) { + sub_bytes(s); + shift_rows(s); + mix_columns(s); + add_round_key(rkeys[i], s); + } + + sub_bytes(s); + shift_rows(s); + add_round_key(rkeys.back(), s); + + copy_state_to_bytes(s, encrypted); +} + +inline void decrypt_state(const RoundKeys& rkeys, const unsigned char data[16], + unsigned char decrypted[16]) { + State s; + copy_bytes_to_state(data, s); + + add_round_key(rkeys.back(), s); + inv_shift_rows(s); + inv_sub_bytes(s); + + for (std::size_t i = rkeys.size() - 2; i > 0; --i) { + add_round_key(rkeys[i], s); + inv_mix_columns(s); + inv_shift_rows(s); + inv_sub_bytes(s); + } + + add_round_key(rkeys[0], s); + + copy_state_to_bytes(s, decrypted); +} + +template +std::vector key_from_string(const char (*key_str)[KeyLen]) { + std::vector key(KeyLen - 1); + memcpy(&key[0], *key_str, KeyLen - 1); + return key; +} + +inline bool is_valid_key_size(const std::size_t key_size) { + if (key_size != 16 && key_size != 24 && key_size != 32) { + return false; + } else { + return true; + } +} + +namespace gcm { + +const int kBlockBitSize = 128; +const int kBlockByteSize = kBlockBitSize / 8; + +/** + * @private + * GCM operation unit as bit. + * This library handles 128 bit little endian bit array. + * e.g. 0^127 || 1 == "000...0001" (bit string) == 1 + */ +typedef std::bitset bitset128; + +/** + * @private + * GCM operation unit. + * Little endian byte array + * + * If bitset128 is 1: 0^127 || 1 == "000...0001" (bit string) == 1 + * byte array is 0x00, 0x00, 0x00 ... 0x01 (low -> high). + * Byte array is NOT 0x01, 0x00 ... 0x00. + * + * This library handles GCM bit string in two ways. + * One is an array of bitset, which is a little endian 128-bit array's array. + * + * <- first byte + * bitset128 || bitset128 || bitset128... + * + * The other one is a byte array. + * <- first byte + * byte || byte || byte... + */ +class Block { +public: + Block() { + init_v(0, 0); + } + + Block(const unsigned char* bytes, const unsigned long bytes_size) { + init_v(bytes, bytes_size); + } + + Block(const std::vector& bytes) { + init_v(&bytes[0], bytes.size()); + } + + Block(const std::bitset<128>& bits); // implementation below + + inline unsigned char* data() { + return v_; + } + + inline const unsigned char* data() const { + return v_; + } + + inline std::bitset<128> to_bits() const { + std::bitset<128> bits; + for (int i = 0; i < 16; ++i) { + bits <<= 8; + bits |= v_[i]; + } + + return bits; + } + + inline Block operator^(const Block& b) const { + Block r; + for (int i = 0; i < 16; ++i) { + r.data()[i] = data()[i] ^ b.data()[i]; + } + return r; + } + +private: + unsigned char v_[16]; + + inline void init_v(const unsigned char* bytes, const std::size_t bytes_size) { + memset(v_, 0, sizeof(v_)); + + const std::size_t cs = (std::min)(bytes_size, static_cast(16)); + for (std::size_t i = 0; i < cs; ++i) { + v_[i] = bytes[i]; + } + } +}; + +// Workaround for clang optimization in 32-bit build via Visual Studio producing incorrect results +// (https://github.com/kkAyataka/plusaes/issues/43) +#if defined(__clang__) && defined(_WIN32) && !defined(_WIN64) +#pragma optimize("", off) +#endif +inline Block::Block(const std::bitset<128>& bits) { + init_v(0, 0); + const std::bitset<128> mask(0xFF); // 1 byte mask + for (std::size_t i = 0; i < 16; ++i) { + v_[15 - i] = static_cast(((bits >> (i * 8)) & mask).to_ulong()); + } +} +#if defined(__clang__) && defined(_WIN32) && !defined(_WIN64) +#pragma optimize("", on) +#endif + +template +unsigned long ceil(const T v) { + return static_cast(std::ceil(v) + 0.5); +} + +template +std::bitset operator||(const std::bitset& v1, const std::bitset& v2) { + std::bitset ret(v1.to_string() + v2.to_string()); + return ret; +} + +template +std::bitset lsb(const std::bitset& X) { + std::bitset r; + for (std::size_t i = 0; i < S; ++i) { + r[i] = X[i]; + } + return r; +} + +template +std::bitset msb(const std::bitset& X) { + std::bitset r; + for (std::size_t i = 0; i < S; ++i) { + r[S - 1 - i] = X[X.size() - 1 - i]; + } + return r; +} + +template +std::bitset inc32(const std::bitset X) { + const std::size_t S = 32; + + const auto a = msb(X); + const std::bitset b( + (lsb(X).to_ulong() + 1)); // % (2^32); + // lsb<32> is low 32-bit value + // Spec.'s "mod 2^S" is not necessary when S is 32 (inc32). + // ...and 2^32 is over 32-bit integer. + + return a || b; +} + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wself-assign" +#endif // __clang__ + +/** Algorithm 1 @private */ +inline Block mul_blocks(const Block X, const Block Y) { + const bitset128 R = (std::bitset<8>("11100001") || std::bitset<120>()); + + bitset128 X_bits = X.to_bits(); + bitset128 Z; + bitset128 V = Y.to_bits(); + for (int i = 127; i >= 0; --i) { + // Z + if (X_bits[i] == false) { + Z = Z; + } else { + Z = Z ^ V; + } + + // V + if (V[0] == false) { + V = V >> 1; + } else { + V = (V >> 1) ^ R; + } + } + + return Z; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif // __clang__ + +/** Algorithm 2 @private */ +inline Block ghash(const Block& H, const std::vector& X) { + const std::size_t m = X.size() / kBlockByteSize; + Block Ym; + for (std::size_t i = 0; i < m; ++i) { + const Block Xi(&X[i * kBlockByteSize], kBlockByteSize); + Ym = mul_blocks((Ym ^ Xi), H); + } + + return Ym; +} + +template +std::bitset make_bitset(const unsigned char* bytes, const std::size_t bytes_size) { + std::bitset bits; + for (auto i = 0u; i < bytes_size; ++i) { + bits <<= 8; + bits |= bytes[i]; + } + return bits; +} + +/** Algorithm 3 @private */ +inline std::vector gctr(const detail::RoundKeys& rkeys, const Block& ICB, + const unsigned char* X, const std::size_t X_size) { + if (!X || X_size == 0) { + return std::vector(); + } else { + const unsigned long n = ceil(X_size * 8.0 / kBlockBitSize); + std::vector Y(X_size); + + Block CB; + for (std::size_t i = 0; i < n; ++i) { + // CB + if (i == 0) { // first + CB = ICB; + } else { + CB = inc32(CB.to_bits()); + } + + // CIPH + Block eCB; + encrypt_state(rkeys, CB.data(), eCB.data()); + + // Y + int op_size = 0; + if (i < n - 1) { + op_size = kBlockByteSize; + } else { // last + op_size = (X_size % kBlockByteSize) ? (X_size % kBlockByteSize) : kBlockByteSize; + } + const Block Yi = Block(X + i * kBlockBitSize / 8, op_size) ^ eCB; + memcpy(&Y[i * kBlockByteSize], Yi.data(), op_size); + } + + return Y; + } +} + +inline void push_back(std::vector& bytes, const unsigned char* data, + const std::size_t data_size) { + bytes.insert(bytes.end(), data, data + data_size); +} + +inline void push_back(std::vector& bytes, const std::bitset<64>& bits) { + const std::bitset<64> mask(0xFF); // 1 byte mask + for (std::size_t i = 0; i < 8; ++i) { + bytes.push_back(static_cast(((bits >> ((7 - i) * 8)) & mask).to_ulong())); + } +} + +inline void push_back_zero_bits(std::vector& bytes, + const std::size_t zero_bits_size) { + const std::vector zero_bytes(zero_bits_size / 8); + bytes.insert(bytes.end(), zero_bytes.begin(), zero_bytes.end()); +} + +inline Block calc_H(const RoundKeys& rkeys) { + std::vector H_raw(gcm::kBlockByteSize); + encrypt_state(rkeys, &H_raw[0], &H_raw[0]); + return gcm::Block(H_raw); +} + +inline Block calc_J0(const Block& H, const unsigned char* iv, const std::size_t iv_size) { + if (iv_size == 12) { + const std::bitset<96> iv_bits = gcm::make_bitset<96>(iv, iv_size); + return iv_bits || std::bitset<31>() || std::bitset<1>(1); + } else { + const auto len_iv = iv_size * 8; + const auto s = 128 * gcm::ceil(len_iv / 128.0) - len_iv; + std::vector ghash_in; + gcm::push_back(ghash_in, iv, iv_size); + gcm::push_back_zero_bits(ghash_in, s + 64); + gcm::push_back(ghash_in, std::bitset<64>(len_iv)); + + return gcm::ghash(H, ghash_in); + } +} + +inline void calc_gcm_tag(const unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char* iv, const std::size_t iv_size, unsigned char* tag, + const std::size_t tag_size) { + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + const gcm::Block H = gcm::calc_H(rkeys); + const gcm::Block J0 = gcm::calc_J0(H, iv, iv_size); + + const auto lenC = data_size * 8; + const auto lenA = aadata_size * 8; + const std::size_t u = 128 * gcm::ceil(lenC / 128.0) - lenC; + const std::size_t v = 128 * gcm::ceil(lenA / 128.0) - lenA; + + std::vector ghash_in; + ghash_in.reserve((aadata_size + v / 8) + (data_size + u / 8) + 8 + 8); + gcm::push_back(ghash_in, aadata, aadata_size); + gcm::push_back_zero_bits(ghash_in, v); + gcm::push_back(ghash_in, data, data_size); + gcm::push_back_zero_bits(ghash_in, u); + gcm::push_back(ghash_in, std::bitset<64>(lenA)); + gcm::push_back(ghash_in, std::bitset<64>(lenC)); + const gcm::Block S = gcm::ghash(H, ghash_in); + const std::vector T = gcm::gctr(rkeys, J0, S.data(), gcm::kBlockByteSize); + + // return + memcpy(tag, &T[0], (std::min)(tag_size, static_cast(16))); +} + +/** Algorithm 4 and 5 @private */ +inline void crypt_gcm(const unsigned char* data, const std::size_t data_size, + const unsigned char* key, const std::size_t key_size, const unsigned char* iv, + const std::size_t iv_size, unsigned char* crypted) { + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + const gcm::Block H = gcm::calc_H(rkeys); + const gcm::Block J0 = gcm::calc_J0(H, iv, iv_size); + + const std::vector C = + gcm::gctr(rkeys, gcm::inc32(J0.to_bits()), data, data_size); + + if (crypted) { + memcpy(crypted, &C[0], data_size); + } +} + +} // namespace gcm + +} // namespace detail + +/** @defgroup Base Base + * Base definitions and convenient functions + * @{ */ + +/** Create 128-bit key from string. */ +inline std::vector key_from_string(const char (*key_str)[17]) { + return detail::key_from_string<17>(key_str); +} + +/** Create 192-bit key from string. */ +inline std::vector key_from_string(const char (*key_str)[25]) { + return detail::key_from_string<25>(key_str); +} + +/** Create 256-bit key from string. */ +inline std::vector key_from_string(const char (*key_str)[33]) { + return detail::key_from_string<33>(key_str); +} + +/** Calculates encrypted data size when padding is enabled. */ +inline unsigned long get_padded_encrypted_size(const unsigned long data_size) { + return data_size + detail::kStateSize - (data_size % detail::kStateSize); +} + +/** Error code */ +typedef enum { + kErrorOk = 0, + kErrorInvalidDataSize = 1, + kErrorInvalidKeySize, + kErrorInvalidBufferSize, + kErrorInvalidKey, + kErrorDeprecated, // kErrorInvalidNonceSize + kErrorInvalidIvSize, + kErrorInvalidTagSize, + kErrorInvalidTag +} Error; + +/** @} */ + +namespace detail { + +inline Error check_encrypt_cond(const unsigned long data_size, const unsigned long key_size, + const unsigned long encrypted_size, const bool pads) { + // check data size + if (!pads && (data_size % kStateSize != 0)) { + return kErrorInvalidDataSize; + } + + // check key size + if (!detail::is_valid_key_size(key_size)) { + return kErrorInvalidKeySize; + } + + // check encrypted buffer size + if (pads) { + const unsigned long required_size = get_padded_encrypted_size(data_size); + if (encrypted_size < required_size) { + return kErrorInvalidBufferSize; + } + } else { + if (encrypted_size < data_size) { + return kErrorInvalidBufferSize; + } + } + return kErrorOk; +} + +inline Error check_decrypt_cond(const unsigned long data_size, const unsigned long key_size, + const unsigned long decrypted_size, + const unsigned long* padded_size) { + // check data size + if (data_size % 16 != 0) { + return kErrorInvalidDataSize; + } + + // check key size + if (!detail::is_valid_key_size(key_size)) { + return kErrorInvalidKeySize; + } + + // check decrypted buffer size + if (!padded_size) { + if (decrypted_size < data_size) { + return kErrorInvalidBufferSize; + } + } else { + if (decrypted_size < (data_size - kStateSize)) { + return kErrorInvalidBufferSize; + } + } + + return kErrorOk; +} + +inline bool check_padding(const unsigned long padding, const unsigned char data[kStateSize]) { + if (padding > kStateSize) { + return false; + } + + for (unsigned long i = 0; i < padding; ++i) { + if (data[kStateSize - 1 - i] != padding) { + return false; + } + } + + return true; +} + +inline Error check_gcm_cond(const std::size_t key_size, const std::size_t iv_size, + const std::size_t tag_size) { + // check key size + if (!detail::is_valid_key_size(key_size)) { + return kErrorInvalidKeySize; + } + + if (iv_size < 1) { + return kErrorInvalidIvSize; + } + + // check tag size + if ((tag_size < 12 || 16 < tag_size) && (tag_size != 8) && (tag_size != 4)) { + return kErrorInvalidTagSize; + } + + return kErrorOk; +} + +} // namespace detail + +/** @defgroup ECB ECB + * ECB mode functions + * @{ */ + +/** + * Encrypts data with ECB mode. + * @param [in] data Data. + * @param [in] data_size Data size. + * If the pads is false, data size must be multiple of 16. + * @param [in] key key bytes. The key length must be 16 (128-bit), 24 (192-bit) or 32 (256-bit). + * @param [in] key_size key size. + * @param [out] encrypted Encrypted data buffer. + * @param [in] encrypted_size Encrypted data buffer size. + * @param [in] pads If this value is true, encrypted data is padded by PKCS. + * Encrypted data size must be multiple of 16. + * If the pads is true, encrypted data is padded with PKCS. + * So the data is multiple of 16, encrypted data size needs additonal 16 bytes. + * @since 1.0.0 + */ +inline Error encrypt_ecb(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + unsigned char* encrypted, const unsigned long encrypted_size, + const bool pads) { + const Error e = detail::check_encrypt_cond(data_size, key_size, encrypted_size, pads); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + const unsigned long bc = data_size / detail::kStateSize; + for (unsigned long i = 0; i < bc; ++i) { + detail::encrypt_state(rkeys, data + (i * detail::kStateSize), + encrypted + (i * detail::kStateSize)); + } + + if (pads) { + const int rem = data_size % detail::kStateSize; + const char pad_v = detail::kStateSize - rem; + + std::vector ib(detail::kStateSize, pad_v), ob(detail::kStateSize); + memcpy(&ib[0], data + data_size - rem, rem); + + detail::encrypt_state(rkeys, &ib[0], &ob[0]); + memcpy(encrypted + (data_size - rem), &ob[0], detail::kStateSize); + } + + return kErrorOk; +} + +/** + * Decrypts data with ECB mode. + * @param [in] data Data bytes. + * @param [in] data_size Data size. + * @param [in] key Key bytes. + * @param [in] key_size Key size. + * @param [out] decrypted Decrypted data buffer. + * @param [in] decrypted_size Decrypted data buffer size. + * @param [out] padded_size If this value is NULL, this function does not remove padding. + * If this value is not NULL, this function removes padding by PKCS + * and returns padded size using padded_size. + * @since 1.0.0 + */ +inline Error decrypt_ecb(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + unsigned char* decrypted, const unsigned long decrypted_size, + unsigned long* padded_size) { + const Error e = detail::check_decrypt_cond(data_size, key_size, decrypted_size, padded_size); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + const unsigned long bc = data_size / detail::kStateSize - 1; + for (unsigned long i = 0; i < bc; ++i) { + detail::decrypt_state(rkeys, data + (i * detail::kStateSize), + decrypted + (i * detail::kStateSize)); + } + + unsigned char last[detail::kStateSize] = {}; + detail::decrypt_state(rkeys, data + (bc * detail::kStateSize), last); + + if (padded_size) { + *padded_size = last[detail::kStateSize - 1]; + const unsigned long cs = detail::kStateSize - *padded_size; + + if (!detail::check_padding(*padded_size, last)) { + return kErrorInvalidKey; + } else if (decrypted_size >= (bc * detail::kStateSize) + cs) { + memcpy(decrypted + (bc * detail::kStateSize), last, cs); + } else { + return kErrorInvalidBufferSize; + } + } else { + memcpy(decrypted + (bc * detail::kStateSize), last, sizeof(last)); + } + + return kErrorOk; +} + +/** @} */ + +/** @defgroup CBC CBC + * CBC mode functions + * @{ */ + +/** + * Encrypt data with CBC mode. + * @param [in] data Data. + * @param [in] data_size Data size. + * If the pads is false, data size must be multiple of 16. + * @param [in] key key bytes. The key length must be 16 (128-bit), 24 (192-bit) or 32 (256-bit). + * @param [in] key_size key size. + * @param [in] iv Initialize vector. + * @param [out] encrypted Encrypted data buffer. + * @param [in] encrypted_size Encrypted data buffer size. + * @param [in] pads If this value is true, encrypted data is padded by PKCS. + * Encrypted data size must be multiple of 16. + * If the pads is true, encrypted data is padded with PKCS. + * So the data is multiple of 16, encrypted data size needs additonal 16 bytes. + * @since 1.0.0 + */ +inline Error encrypt_cbc(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + const unsigned char iv[16], unsigned char* encrypted, + const unsigned long encrypted_size, const bool pads) { + const Error e = detail::check_encrypt_cond(data_size, key_size, encrypted_size, pads); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + unsigned char s[detail::kStateSize] = {}; // encrypting data + + // calculate padding value + const bool ge16 = (data_size >= detail::kStateSize); + const int rem = data_size % detail::kStateSize; + const unsigned char pad_v = detail::kStateSize - rem; + + // encrypt 1st state + if (ge16) { + memcpy(s, data, detail::kStateSize); + } else { + memset(s, pad_v, detail::kStateSize); + memcpy(s, data, data_size); + } + if (iv) { + detail::xor_data(s, iv); + } + detail::encrypt_state(rkeys, s, encrypted); + + // encrypt mid + const unsigned long bc = data_size / detail::kStateSize; + for (unsigned long i = 1; i < bc; ++i) { + const long offset = i * detail::kStateSize; + memcpy(s, data + offset, detail::kStateSize); + detail::xor_data(s, encrypted + offset - detail::kStateSize); + + detail::encrypt_state(rkeys, s, encrypted + offset); + } + + // enctypt last + if (pads && ge16) { + std::vector ib(detail::kStateSize, pad_v), ob(detail::kStateSize); + memcpy(&ib[0], data + data_size - rem, rem); + + detail::xor_data(&ib[0], encrypted + (bc - 1) * detail::kStateSize); + + detail::encrypt_state(rkeys, &ib[0], &ob[0]); + memcpy(encrypted + (data_size - rem), &ob[0], detail::kStateSize); + } + + return kErrorOk; +} + +/** + * Decrypt data with CBC mode. + * @param [in] data Data bytes. + * @param [in] data_size Data size. + * @param [in] key Key bytes. + * @param [in] key_size Key size. + * @param [in] iv Initialize vector. + * @param [out] decrypted Decrypted data buffer. + * @param [in] decrypted_size Decrypted data buffer size. + * @param [out] padded_size If this value is NULL, this function does not remove padding. + * If this value is not NULL, this function removes padding by PKCS + * and returns padded size using padded_size. + * @since 1.0.0 + */ +inline Error decrypt_cbc(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + const unsigned char iv[16], unsigned char* decrypted, + const unsigned long decrypted_size, unsigned long* padded_size) { + const Error e = detail::check_decrypt_cond(data_size, key_size, decrypted_size, padded_size); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + // decrypt 1st state + detail::decrypt_state(rkeys, data, decrypted); + if (iv) { + detail::xor_data(decrypted, iv); + } + + // decrypt mid + const unsigned long bc = data_size / detail::kStateSize - 1; + for (unsigned long i = 1; i < bc; ++i) { + const long offset = i * detail::kStateSize; + detail::decrypt_state(rkeys, data + offset, decrypted + offset); + detail::xor_data(decrypted + offset, data + offset - detail::kStateSize); + } + + // decrypt last + unsigned char last[detail::kStateSize] = {}; + if (data_size > detail::kStateSize) { + detail::decrypt_state(rkeys, data + (bc * detail::kStateSize), last); + detail::xor_data(last, data + (bc * detail::kStateSize - detail::kStateSize)); + } else { + memcpy(last, decrypted, data_size); + memset(decrypted, 0, decrypted_size); + } + + if (padded_size) { + *padded_size = last[detail::kStateSize - 1]; + const unsigned long cs = detail::kStateSize - *padded_size; + + if (!detail::check_padding(*padded_size, last)) { + return kErrorInvalidKey; + } else if (decrypted_size >= (bc * detail::kStateSize) + cs) { + memcpy(decrypted + (bc * detail::kStateSize), last, cs); + } else { + return kErrorInvalidBufferSize; + } + } else { + memcpy(decrypted + (bc * detail::kStateSize), last, sizeof(last)); + } + + return kErrorOk; +} + +/** @} */ + +/** @defgroup GCM GCM + * GCM mode functions + * @{ */ + +/** + * Encrypts data with GCM mode and gets an authentication tag. + * + * You can specify iv size and tag size. + * But usually you should use the other overloaded function whose iv and tag size is fixed. + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @returns kErrorInvalidIvSize + * @returns kErrorInvalidTagSize + */ +inline Error encrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char* iv, const std::size_t iv_size, unsigned char* tag, + const std::size_t tag_size) { + const Error err = detail::check_gcm_cond(key_size, iv_size, tag_size); + if (err != kErrorOk) { + return err; + } + + detail::gcm::crypt_gcm(data, data_size, key, key_size, iv, iv_size, data); + detail::gcm::calc_gcm_tag(data, data_size, aadata, aadata_size, key, key_size, iv, iv_size, tag, + tag_size); + + return kErrorOk; +} + +/** + * Encrypts data with GCM mode and gets an authentication tag. + * + * @param [in,out] data Input data and output buffer. + * This buffer is replaced with encrypted data. + * @param [in] data_size data size + * @param [in] aadata Additional Authenticated data + * @param [in] aadata_size aadata size + * @param [in] key Cipher key + * @param [in] key_size Cipher key size. This value must be 16 (128-bit), 24 (192-bit), or 32 + * (256-bit). + * @param [in] iv Initialization vector + * @param [out] tag Calculated authentication tag data + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + */ +inline Error encrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char (*iv)[12], unsigned char (*tag)[16]) { + return encrypt_gcm(data, data_size, aadata, aadata_size, key, key_size, *iv, 12, *tag, 16); +} + +/** + * Decrypts data with GCM mode and checks an authentication tag. + * + * You can specify iv size and tag size. + * But usually you should use the other overloaded function whose iv and tag size is fixed. + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @returns kErrorInvalidIvSize + * @returns kErrorInvalidTagSize + * @returns kErrorInvalidTag + */ +inline Error decrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char* iv, const std::size_t iv_size, + const unsigned char* tag, const std::size_t tag_size) { + const Error err = detail::check_gcm_cond(key_size, iv_size, tag_size); + if (err != kErrorOk) { + return err; + } + + unsigned char* C = data; + const auto C_size = data_size; + unsigned char tagd[16] = {}; + detail::gcm::calc_gcm_tag(C, C_size, aadata, aadata_size, key, key_size, iv, iv_size, tagd, 16); + + if (memcmp(tag, tagd, tag_size) != 0) { + return kErrorInvalidTag; + } else { + detail::gcm::crypt_gcm(C, C_size, key, key_size, iv, iv_size, C); + + return kErrorOk; + } +} + +/** + * Decrypts data with GCM mode and checks an authentication tag. + * + * @param [in,out] data Input data and output buffer. + * This buffer is replaced with decrypted data. + * @param [in] data_size data size + * @param [in] aadata Additional Authenticated data + * @param [in] aadata_size aadata size + * @param [in] key Cipher key + * @param [in] key_size Cipher key size. This value must be 16 (128-bit), 24 (192-bit), or 32 + * (256-bit). + * @param [in] iv Initialization vector + * @param [in] tag Authentication tag data + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @returns kErrorInvalidTag + */ +inline Error decrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char (*iv)[12], const unsigned char (*tag)[16]) { + return decrypt_gcm(data, data_size, aadata, aadata_size, key, key_size, *iv, 12, *tag, 16); +} + +/** @} */ + +/** @defgroup CTR CTR + * CTR mode function + * @{ */ + +/** + * Encrypts or decrypt data in-place with CTR mode. + * + * @param [in,out] data Input data and output buffer. + * This buffer is replaced with encrypted / decrypted data. + * @param [in] data_size Data size. + * @param [in] key Cipher key + * @param [in] key_size Cipher key size. This value must be 16 (128-bit), 24 (192-bit), or 32 + * (256-bit). + * @param [in] nonce Nonce of the counter initialization. + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @since 1.0.0 + */ +inline Error crypt_ctr(unsigned char* data, const std::size_t data_size, const unsigned char* key, + const std::size_t key_size, const unsigned char (*nonce)[16]) { + if (!detail::is_valid_key_size(key_size)) + return kErrorInvalidKeySize; + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + unsigned long pos = 0; + unsigned long blkpos = detail::kStateSize; + unsigned char blk[detail::kStateSize] = {}; + unsigned char counter[detail::kStateSize] = {}; + memcpy(counter, nonce, 16); + + while (pos < data_size) { + if (blkpos == detail::kStateSize) { + detail::encrypt_state(rkeys, counter, blk); + detail::incr_counter(counter); + blkpos = 0; + } + data[pos++] ^= blk[blkpos++]; + } + + return kErrorOk; +} + +/** @} */ + +} // namespace aes diff --git a/src/common/sha1.h b/src/common/sha1.h new file mode 100644 index 000000000..fad849dcc --- /dev/null +++ b/src/common/sha1.h @@ -0,0 +1,180 @@ +// SPDX-FileCopyrightText: 2012 SAURAV MOHAPATRA +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include +#include + +namespace sha1 { +class SHA1 { +public: + typedef uint32_t digest32_t[5]; + typedef uint8_t digest8_t[20]; + inline static uint32_t LeftRotate(uint32_t value, size_t count) { + return (value << count) ^ (value >> (32 - count)); + } + SHA1() { + reset(); + } + virtual ~SHA1() {} + SHA1(const SHA1& s) { + *this = s; + } + const SHA1& operator=(const SHA1& s) { + memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t)); + memcpy(m_block, s.m_block, 64); + m_blockByteIndex = s.m_blockByteIndex; + m_byteCount = s.m_byteCount; + return *this; + } + SHA1& reset() { + m_digest[0] = 0x67452301; + m_digest[1] = 0xEFCDAB89; + m_digest[2] = 0x98BADCFE; + m_digest[3] = 0x10325476; + m_digest[4] = 0xC3D2E1F0; + m_blockByteIndex = 0; + m_byteCount = 0; + return *this; + } + SHA1& processByte(uint8_t octet) { + this->m_block[this->m_blockByteIndex++] = octet; + ++this->m_byteCount; + if (m_blockByteIndex == 64) { + this->m_blockByteIndex = 0; + processBlock(); + } + return *this; + } + SHA1& processBlock(const void* const start, const void* const end) { + const uint8_t* begin = static_cast(start); + const uint8_t* finish = static_cast(end); + while (begin != finish) { + processByte(*begin); + begin++; + } + return *this; + } + SHA1& processBytes(const void* const data, size_t len) { + const uint8_t* block = static_cast(data); + processBlock(block, block + len); + return *this; + } + const uint32_t* getDigest(digest32_t digest) { + size_t bitCount = this->m_byteCount * 8; + processByte(0x80); + if (this->m_blockByteIndex > 56) { + while (m_blockByteIndex != 0) { + processByte(0); + } + while (m_blockByteIndex < 56) { + processByte(0); + } + } else { + while (m_blockByteIndex < 56) { + processByte(0); + } + } + processByte(0); + processByte(0); + processByte(0); + processByte(0); + processByte(static_cast((bitCount >> 24) & 0xFF)); + processByte(static_cast((bitCount >> 16) & 0xFF)); + processByte(static_cast((bitCount >> 8) & 0xFF)); + processByte(static_cast((bitCount) & 0xFF)); + + memcpy(digest, m_digest, 5 * sizeof(uint32_t)); + return digest; + } + const uint8_t* getDigestBytes(digest8_t digest) { + digest32_t d32; + getDigest(d32); + size_t di = 0; + digest[di++] = ((d32[0] >> 24) & 0xFF); + digest[di++] = ((d32[0] >> 16) & 0xFF); + digest[di++] = ((d32[0] >> 8) & 0xFF); + digest[di++] = ((d32[0]) & 0xFF); + + digest[di++] = ((d32[1] >> 24) & 0xFF); + digest[di++] = ((d32[1] >> 16) & 0xFF); + digest[di++] = ((d32[1] >> 8) & 0xFF); + digest[di++] = ((d32[1]) & 0xFF); + + digest[di++] = ((d32[2] >> 24) & 0xFF); + digest[di++] = ((d32[2] >> 16) & 0xFF); + digest[di++] = ((d32[2] >> 8) & 0xFF); + digest[di++] = ((d32[2]) & 0xFF); + + digest[di++] = ((d32[3] >> 24) & 0xFF); + digest[di++] = ((d32[3] >> 16) & 0xFF); + digest[di++] = ((d32[3] >> 8) & 0xFF); + digest[di++] = ((d32[3]) & 0xFF); + + digest[di++] = ((d32[4] >> 24) & 0xFF); + digest[di++] = ((d32[4] >> 16) & 0xFF); + digest[di++] = ((d32[4] >> 8) & 0xFF); + digest[di++] = ((d32[4]) & 0xFF); + return digest; + } + +protected: + void processBlock() { + uint32_t w[80]; + for (size_t i = 0; i < 16; i++) { + w[i] = (m_block[i * 4 + 0] << 24); + w[i] |= (m_block[i * 4 + 1] << 16); + w[i] |= (m_block[i * 4 + 2] << 8); + w[i] |= (m_block[i * 4 + 3]); + } + for (size_t i = 16; i < 80; i++) { + w[i] = LeftRotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1); + } + + uint32_t a = m_digest[0]; + uint32_t b = m_digest[1]; + uint32_t c = m_digest[2]; + uint32_t d = m_digest[3]; + uint32_t e = m_digest[4]; + + for (std::size_t i = 0; i < 80; ++i) { + uint32_t f = 0; + uint32_t k = 0; + + if (i < 20) { + f = (b & c) | (~b & d); + k = 0x5A827999; + } else if (i < 40) { + f = b ^ c ^ d; + k = 0x6ED9EBA1; + } else if (i < 60) { + f = (b & c) | (b & d) | (c & d); + k = 0x8F1BBCDC; + } else { + f = b ^ c ^ d; + k = 0xCA62C1D6; + } + uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i]; + e = d; + d = c; + c = LeftRotate(b, 30); + b = a; + a = temp; + } + + m_digest[0] += a; + m_digest[1] += b; + m_digest[2] += c; + m_digest[3] += d; + m_digest[4] += e; + } + +private: + digest32_t m_digest; + uint8_t m_block[64]; + size_t m_blockByteIndex; + size_t m_byteCount; +}; +} // namespace sha1 diff --git a/src/core/file_format/trp.cpp b/src/core/file_format/trp.cpp index 311bd0b9d..a5d11b0eb 100644 --- a/src/core/file_format/trp.cpp +++ b/src/core/file_format/trp.cpp @@ -1,35 +1,24 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include - +#include "common/aes.h" #include "common/config.h" #include "common/logging/log.h" #include "common/path_util.h" #include "core/file_format/trp.h" -static void DecryptEFSM(std::span trophyKey, - std::span NPcommID, - std::span efsmIv, std::span ciphertext, - std::span decrypted) { +static void DecryptEFSM(std::span trophyKey, std::span NPcommID, + std::span efsmIv, std::span ciphertext, + std::span decrypted) { + // Step 1: Encrypt NPcommID + std::array trophyIv{}; + std::array trpKey; + aes::encrypt_cbc(NPcommID.data(), NPcommID.size(), trophyKey.data(), trophyKey.size(), + trophyIv.data(), trpKey.data(), trpKey.size(), false); - // step 1: Encrypt NPcommID - CryptoPP::CBC_Mode::Encryption encrypt; - - std::vector trophyIv(16, 0); - std::vector trpKey(16); - - encrypt.SetKeyWithIV(trophyKey.data(), trophyKey.size(), trophyIv.data()); - encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16); - - // step 2: decrypt efsm. - CryptoPP::CBC_Mode::Decryption decrypt; - decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - decrypt.ProcessData(decrypted.data() + i, ciphertext.data() + i, CryptoPP::AES::BLOCKSIZE); - } + // Step 2: Decrypt EFSM + aes::decrypt_cbc(ciphertext.data(), ciphertext.size(), trpKey.data(), trpKey.size(), + efsmIv.data(), decrypted.data(), decrypted.size(), nullptr); } TRP::TRP() = default; @@ -80,7 +69,7 @@ bool TRP::Extract(const std::filesystem::path& trophyPath, const std::string tit return false; } - std::array user_key{}; + std::array user_key{}; hexToBytes(user_key_str.c_str(), user_key.data()); for (int index = 0; const auto& it : std::filesystem::directory_iterator(gameSysDir)) { diff --git a/src/core/module.cpp b/src/core/module.cpp index a18c1141a..1004f4404 100644 --- a/src/core/module.cpp +++ b/src/core/module.cpp @@ -1,13 +1,12 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include - #include "common/alignment.h" #include "common/arch.h" #include "common/assert.h" #include "common/logging/log.h" #include "common/memory_patcher.h" +#include "common/sha1.h" #include "common/string_util.h" #include "core/aerolib/aerolib.h" #include "core/cpu_patches.h" @@ -65,11 +64,13 @@ static std::string StringToNid(std::string_view symbol) { std::memcpy(input.data(), symbol.data(), symbol.size()); std::memcpy(input.data() + symbol.size(), Salt.data(), Salt.size()); - std::array hash; - CryptoPP::SHA1().CalculateDigest(hash.data(), input.data(), input.size()); + sha1::SHA1::digest8_t hash; + sha1::SHA1 sha; + sha.processBytes(input.data(), input.size()); + sha.getDigestBytes(hash); u64 digest; - std::memcpy(&digest, hash.data(), sizeof(digest)); + std::memcpy(&digest, hash, sizeof(digest)); static constexpr std::string_view codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-"; From df9151481c56512d05fc939313e3c944eac87819 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Sat, 29 Mar 2025 08:32:57 +0000 Subject: [PATCH 21/22] Fix the "Open Update Folder" for folders ending with "-patch" (#2712) * fix open update folder * Update gui_context_menus.h --- src/qt_gui/gui_context_menus.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 7dcb006ba..c13388bbc 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -141,14 +141,16 @@ public: Common::FS::PathToQString(open_update_path, m_games[itemID].path); open_update_path += "-UPDATE"; if (!std::filesystem::exists(Common::FS::PathFromQString(open_update_path))) { + QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); + } else { Common::FS::PathToQString(open_update_path, m_games[itemID].path); open_update_path += "-patch"; if (!std::filesystem::exists(Common::FS::PathFromQString(open_update_path))) { + QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); + } else { QMessageBox::critical(nullptr, tr("Error"), QString(tr("This game has no update folder to open!"))); } - } else { - QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); } } From 9dbc79dc96a4cf439adbead5563e46d1eb301391 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sat, 29 Mar 2025 11:03:40 +0200 Subject: [PATCH 22/22] New Crowdin updates (#2705) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Swedish) * New translations en_us.ts (French) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Norwegian Bokmal) --- src/qt_gui/translations/ar_SA.ts | 174 --------------------------- src/qt_gui/translations/da_DK.ts | 174 --------------------------- src/qt_gui/translations/de_DE.ts | 174 --------------------------- src/qt_gui/translations/el_GR.ts | 174 --------------------------- src/qt_gui/translations/es_ES.ts | 194 ++---------------------------- src/qt_gui/translations/fa_IR.ts | 174 --------------------------- src/qt_gui/translations/fi_FI.ts | 174 --------------------------- src/qt_gui/translations/fr_FR.ts | 200 ++----------------------------- src/qt_gui/translations/hu_HU.ts | 174 --------------------------- src/qt_gui/translations/id_ID.ts | 200 ++----------------------------- src/qt_gui/translations/it_IT.ts | 174 --------------------------- src/qt_gui/translations/ja_JP.ts | 174 --------------------------- src/qt_gui/translations/ko_KR.ts | 174 --------------------------- src/qt_gui/translations/lt_LT.ts | 174 --------------------------- src/qt_gui/translations/nb_NO.ts | 194 ++---------------------------- src/qt_gui/translations/nl_NL.ts | 174 --------------------------- src/qt_gui/translations/pl_PL.ts | 174 --------------------------- src/qt_gui/translations/pt_BR.ts | 174 --------------------------- src/qt_gui/translations/pt_PT.ts | 174 --------------------------- src/qt_gui/translations/ro_RO.ts | 174 --------------------------- src/qt_gui/translations/ru_RU.ts | 174 --------------------------- src/qt_gui/translations/sq_AL.ts | 174 --------------------------- src/qt_gui/translations/sv_SE.ts | 194 ++---------------------------- src/qt_gui/translations/tr_TR.ts | 174 --------------------------- src/qt_gui/translations/uk_UA.ts | 174 --------------------------- src/qt_gui/translations/vi_VN.ts | 174 --------------------------- src/qt_gui/translations/zh_CN.ts | 174 --------------------------- src/qt_gui/translations/zh_TW.ts | 174 --------------------------- 28 files changed, 56 insertions(+), 4928 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 9808fdbe6..f5503e189 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -882,10 +882,6 @@ Error creating shortcut! خطأ في إنشاء الاختصار - - Install PKG - PKG تثبيت - Game اللعبة @@ -978,25 +974,6 @@ أزرار التحكم - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - اختر المجلد - - - Select which directory you want to install to. - حدد الدليل الذي تريد تثبيت إليه. - - - Install All Queued to Selected Folder - تثبيت كل قائمة الانتظار إلى المجلد المحدد - - - Delete PKG File on Install - حذف مِلَفّ PKG عند التثبيت - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elf فتح/إضافة مجلد - - Install Packages (PKG) - (PKG) تثبيت الحزم - Boot Game تشغيل اللعبة @@ -1234,10 +1207,6 @@ Configure... ...تكوين - - Install application from a .pkg file - .pkg تثبيت التطبيق من ملف - Recent Games الألعاب الأخيرة @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. لم يتم العثور على ألعاب. الرجاء إضافة ألعابك إلى مكتبتك أولاً. - - PKG Viewer - عارض PKG - Search... ...بحث @@ -1426,70 +1391,6 @@ Only one file can be selected! !يمكن تحديد ملف واحد فقط - - PKG Extraction - PKG استخراج - - - Patch detected! - تم اكتشاف تصحيح! - - - PKG and Game versions match: - :واللعبة تتطابق إصدارات PKG - - - Would you like to overwrite? - هل ترغب في الكتابة فوق الملف الموجود؟ - - - PKG Version %1 is older than installed version: - :أقدم من الإصدار المثبت PKG Version %1 - - - Game is installed: - :اللعبة مثبتة - - - Would you like to install Patch: - :هل ترغب في تثبيت التصحيح - - - DLC Installation - تثبيت المحتوى القابل للتنزيل - - - Would you like to install DLC: %1? - هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ - - - DLC already installed: - :المحتوى القابل للتنزيل مثبت بالفعل - - - Game already installed - اللعبة مثبتة بالفعل - - - PKG ERROR - PKG خطأ في - - - Extracting PKG %1/%2 - PKG %1/%2 جاري استخراج - - - Extraction Finished - اكتمل الاستخراج - - - Game successfully installed at %1 - تم تثبيت اللعبة بنجاح في %1 - - - File doesn't appear to be a valid PKG file - يبدو أن الملف ليس ملف PKG صالحًا - Run Game تشغيل اللعبة @@ -1498,14 +1399,6 @@ Eboot.bin file not found لم يتم العثور على ملف Eboot.bin - - PKG File (*.PKG *.pkg) - ملف PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG هو تصحيح أو DLC، يرجى تثبيت اللعبة أولاً! - Game is already running! اللعبة قيد التشغيل بالفعل! @@ -1555,73 +1448,6 @@ إظهار العلامات أسفل الأيقونات - - PKGViewer - - Open Folder - فتح المجلد - - - PKG ERROR - PKG خطأ في - - - Name - اسم - - - Serial - سيريال - - - Installed - مثبت - - - Size - حجم - - - Category - الفئة - - - Type - النوع - - - App Ver - إصدار - - - FW - FW - - - Region - منطقة - - - Flags - Flags - - - Path - مسار - - - File - ملف - - - Unknown - غير معروف - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 1547a0e13..658ac118f 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Kun én fil kan vælges! - - PKG Extraction - PKG-udtrækning - - - Patch detected! - Opdatering detekteret! - - - PKG and Game versions match: - PKG og spilversioner matcher: - - - Would you like to overwrite? - Vil du overskrive? - - - PKG Version %1 is older than installed version: - PKG Version %1 er ældre end den installerede version: - - - Game is installed: - Spillet er installeret: - - - Would you like to install Patch: - Vil du installere opdateringen: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Vil du installere DLC: %1? - - - DLC already installed: - DLC allerede installeret: - - - Game already installed - Spillet er allerede installeret - - - PKG ERROR - PKG FEJL - - - Extracting PKG %1/%2 - Udvinding af PKG %1/%2 - - - Extraction Finished - Udvinding afsluttet - - - Game successfully installed at %1 - Spillet blev installeret succesfuldt på %1 - - - File doesn't appear to be a valid PKG file - Filen ser ikke ud til at være en gyldig PKG-fil - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG FEJL - - - Name - Navn - - - Serial - Seriel - - - Installed - Installed - - - Size - Størrelse - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Flags - - - Path - Sti - - - File - File - - - Unknown - Ukendt - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index c0e43065b..b6cd3105f 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -882,10 +882,6 @@ Error creating shortcut! Fehler beim Erstellen der Verknüpfung! - - Install PKG - PKG installieren - Game Spiel @@ -978,25 +974,6 @@ Tastenbelegung - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Wähle Ordner - - - Select which directory you want to install to. - Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. - - - Install All Queued to Selected Folder - Installieren Sie alles aus der Warteschlange in den ausgewählten Ordner - - - Delete PKG File on Install - PKG-Datei beim Installieren löschen - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elf-Ordner öffnen/hinzufügen - - Install Packages (PKG) - Pakete installieren (PKG) - Boot Game Spiel starten @@ -1234,10 +1207,6 @@ Configure... Konfigurieren... - - Install application from a .pkg file - Installiere Anwendung aus .pkg-Datei - Recent Games Zuletzt gespielt @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG-Anschauer - Search... Suchen... @@ -1426,70 +1391,6 @@ Only one file can be selected! Es kann nur eine Datei ausgewählt werden! - - PKG Extraction - PKG-Extraktion - - - Patch detected! - Patch erkannt! - - - PKG and Game versions match: - PKG- und Spielversionen stimmen überein: - - - Would you like to overwrite? - Willst du überschreiben? - - - PKG Version %1 is older than installed version: - PKG-Version %1 ist älter als die installierte Version: - - - Game is installed: - Spiel ist installiert: - - - Would you like to install Patch: - Willst du den Patch installieren: - - - DLC Installation - DLC-Installation - - - Would you like to install DLC: %1? - Willst du das DLC installieren: %1? - - - DLC already installed: - DLC bereits installiert: - - - Game already installed - Spiel bereits installiert - - - PKG ERROR - PKG-FEHLER - - - Extracting PKG %1/%2 - Extrahiere PKG %1/%2 - - - Extraction Finished - Extraktion abgeschlossen - - - Game successfully installed at %1 - Spiel erfolgreich installiert auf %1 - - - File doesn't appear to be a valid PKG file - Die Datei scheint keine gültige PKG-Datei zu sein - Run Game Spiel ausführen @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin Datei nicht gefunden - - PKG File (*.PKG *.pkg) - PKG-Datei (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG ist ein Patch oder DLC, bitte installieren Sie zuerst das Spiel! - Game is already running! Spiel läuft bereits! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Ordner öffnen - - - PKG ERROR - PKG-FEHLER - - - Name - Name - - - Serial - Seriennummer - - - Installed - Installiert - - - Size - Größe - - - Category - Kategorie - - - Type - Typ - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Markierungen - - - Path - Pfad - - - File - Datei - - - Unknown - Unbekannt - - - Package - Paket - - SettingsDialog diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index e6fa989aa..d1cf0d4a6 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Μπορεί να επιλεγεί μόνο ένα αρχείο! - - PKG Extraction - Εξαγωγή PKG - - - Patch detected! - Αναγνώριση ενημέρωσης! - - - PKG and Game versions match: - Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: - - - Would you like to overwrite? - Θέλετε να αντικαταστήσετε; - - - PKG Version %1 is older than installed version: - Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: - - - Game is installed: - Το παιχνίδι είναι εγκατεστημένο: - - - Would you like to install Patch: - Θέλετε να εγκαταστήσετε την ενημέρωση: - - - DLC Installation - Εγκατάσταση DLC - - - Would you like to install DLC: %1? - Θέλετε να εγκαταστήσετε το DLC: %1; - - - DLC already installed: - DLC ήδη εγκατεστημένο: - - - Game already installed - Παιχνίδι ήδη εγκατεστημένο - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - Extracting PKG %1/%2 - Εξαγωγή PKG %1/%2 - - - Extraction Finished - Η εξαγωγή ολοκληρώθηκε - - - Game successfully installed at %1 - Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 - - - File doesn't appear to be a valid PKG file - Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - Name - Όνομα - - - Serial - Σειριακός αριθμός - - - Installed - Installed - - - Size - Μέγεθος - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Περιοχή - - - Flags - Flags - - - Path - Διαδρομή - - - File - File - - - Unknown - Άγνωστο - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 288c445c3..bbd49f61d 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -882,10 +882,6 @@ Error creating shortcut! ¡Error al crear el acceso directo! - - Install PKG - Instalar PKG - Game Juego @@ -978,25 +974,6 @@ Asignación de Teclas - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Elegir carpeta - - - Select which directory you want to install to. - Selecciona el directorio de instalación. - - - Install All Queued to Selected Folder - Instalar toda la cola en la carpeta seleccionada - - - Delete PKG File on Install - Eliminar archivo PKG tras la instalación - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Abrir/Agregar carpeta Elf - - Install Packages (PKG) - Instalar paquetes (PKG) - Boot Game Iniciar juego @@ -1234,10 +1207,6 @@ Configure... Configurar... - - Install application from a .pkg file - Instalar aplicación desde un archivo .pkg - Recent Games Juegos recientes @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No se encontraron juegos. Por favor, añade tus juegos a tu biblioteca primero. - - PKG Viewer - Vista PKG - Search... Buscar... @@ -1426,70 +1391,6 @@ Only one file can be selected! ¡Solo se puede seleccionar un archivo! - - PKG Extraction - Extracción de PKG - - - Patch detected! - ¡Actualización detectada! - - - PKG and Game versions match: - Las versiones de PKG y del juego coinciden: - - - Would you like to overwrite? - ¿Desea sobrescribir? - - - PKG Version %1 is older than installed version: - La versión de PKG %1 es más antigua que la versión instalada: - - - Game is installed: - El juego está instalado: - - - Would you like to install Patch: - ¿Desea instalar la actualización: - - - DLC Installation - Instalación de DLC - - - Would you like to install DLC: %1? - ¿Desea instalar el DLC: %1? - - - DLC already installed: - DLC ya instalado: - - - Game already installed - Juego ya instalado - - - PKG ERROR - ERROR PKG - - - Extracting PKG %1/%2 - Extrayendo PKG %1/%2 - - - Extraction Finished - Extracción terminada - - - Game successfully installed at %1 - Juego instalado exitosamente en %1 - - - File doesn't appear to be a valid PKG file - El archivo parece no ser un archivo PKG válido - Run Game Ejecutar juego @@ -1498,14 +1399,6 @@ Eboot.bin file not found Archivo Eboot.bin no encontrado - - PKG File (*.PKG *.pkg) - Archivo PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - El archivo PKG es un parche o DLC, ¡debes instalar el juego primero! - Game is already running! ¡El juego ya se está ejecutando! @@ -1516,110 +1409,43 @@ Play - Play + Jugar Pause - Pause + Pausar Stop - Stop + Detener Restart - Restart + Reiniciar Full Screen - Full Screen + Pantalla completa Controllers - Controllers + Controles Keyboard - Keyboard + Teclado Refresh List - Refresh List + Actualizar lista Resume - Resume + Reanudar Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Abrir Carpeta - - - PKG ERROR - ERROR PKG - - - Name - Nombre - - - Serial - Número de Serie - - - Installed - Instalado - - - Size - Tamaño - - - Category - Categoría - - - Type - Tipo - - - App Ver - Versión de la Aplicación - - - FW - FW - - - Region - Región - - - Flags - Etiquetas - - - Path - Ruta - - - File - Archivo - - - Unknown - Desconocido - - - Package - Paquete + Mostrar etiquetas debajo de los iconos diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 1b8813a80..f1f2c62ab 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -882,10 +882,6 @@ Error creating shortcut! مشکلی در هنگام ساخت میانبر بوجود آمد! - - Install PKG - نصب PKG - Game بازی @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - ShadPS4 - انتخاب محل نصب بازی - - - Select which directory you want to install to. - محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder ELF بازکردن/ساختن پوشه - - Install Packages (PKG) - نصب بسته (PKG) - Boot Game اجرای بازی @@ -1234,10 +1207,6 @@ Configure... ...تنظیمات - - Install application from a .pkg file - .PKG نصب بازی از فایل - Recent Games بازی های اخیر @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG مشاهده گر - Search... جست و جو... @@ -1426,70 +1391,6 @@ Only one file can be selected! فقط یک فایل انتخاب کنید! - - PKG Extraction - PKG استخراج فایل - - - Patch detected! - پچ شناسایی شد! - - - PKG and Game versions match: - و نسخه بازی همخوانی دارد PKG فایل: - - - Would you like to overwrite? - آیا مایل به جایگزینی فایل هستید؟ - - - PKG Version %1 is older than installed version: - نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: - - - Game is installed: - بازی نصب شد: - - - Would you like to install Patch: - آیا مایل به نصب پچ هستید: - - - DLC Installation - نصب DLC - - - Would you like to install DLC: %1? - آیا مایل به نصب DLC هستید: %1 - - - DLC already installed: - قبلا نصب شده DLC این: - - - Game already installed - این بازی قبلا نصب شده - - - PKG ERROR - PKG ارور فایل - - - Extracting PKG %1/%2 - درحال استخراج PKG %1/%2 - - - Extraction Finished - استخراج به پایان رسید - - - Game successfully installed at %1 - بازی با موفقیت در %1 نصب شد - - - File doesn't appear to be a valid PKG file - این فایل یک PKG درست به نظر نمی آید - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - بازکردن پوشه - - - PKG ERROR - PKG ارور فایل - - - Name - نام - - - Serial - سریال - - - Installed - Installed - - - Size - اندازه - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - منطقه - - - Flags - Flags - - - Path - مسیر - - - File - فایل - - - Unknown - ناشناخته - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index cd880fb23..d07f82bd5 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -882,10 +882,6 @@ Error creating shortcut! Virhe pikakuvakkeen luonnissa! - - Install PKG - Asenna PKG - Game Peli @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Valitse hakemisto - - - Select which directory you want to install to. - Valitse, mihin hakemistoon haluat asentaa. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Avaa/Lisää Elf Hakemisto - - Install Packages (PKG) - Asenna Paketteja (PKG) - Boot Game Käynnistä Peli @@ -1234,10 +1207,6 @@ Configure... Asetukset... - - Install application from a .pkg file - Asenna sovellus .pkg tiedostosta - Recent Games Viimeisimmät Pelit @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Selain - Search... Hae... @@ -1426,70 +1391,6 @@ Only one file can be selected! Vain yksi tiedosto voi olla valittuna! - - PKG Extraction - PKG:n purku - - - Patch detected! - Päivitys havaittu! - - - PKG and Game versions match: - PKG- ja peliversiot vastaavat: - - - Would you like to overwrite? - Haluatko korvata? - - - PKG Version %1 is older than installed version: - PKG-versio %1 on vanhempi kuin asennettu versio: - - - Game is installed: - Peli on asennettu: - - - Would you like to install Patch: - Haluatko asentaa päivityksen: - - - DLC Installation - Lisäsisällön asennus - - - Would you like to install DLC: %1? - Haluatko asentaa lisäsisällön: %1? - - - DLC already installed: - Lisäsisältö on jo asennettu: - - - Game already installed - Peli on jo asennettu - - - PKG ERROR - PKG VIRHE - - - Extracting PKG %1/%2 - Purkaminen PKG %1/%2 - - - Extraction Finished - Purku valmis - - - Game successfully installed at %1 - Peli asennettu onnistuneesti kohtaan %1 - - - File doesn't appear to be a valid PKG file - Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Avaa Hakemisto - - - PKG ERROR - PKG VIRHE - - - Name - Nimi - - - Serial - Sarjanumero - - - Installed - Installed - - - Size - Koko - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Alue - - - Flags - Flags - - - Path - Polku - - - File - Tiedosto - - - Unknown - Tuntematon - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 1f7a726cd..89599e32c 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Erreur lors de la création du raccourci ! - - Install PKG - Installer un PKG - Game Jeu @@ -978,25 +974,6 @@ Raccourcis - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire - - - Select which directory you want to install to. - Sélectionnez le répertoire où vous souhaitez effectuer l'installation. - - - Install All Queued to Selected Folder - Installer toute la file d’attente dans le dossier sélectionné - - - Delete PKG File on Install - Supprimer le fichier PKG à l'installation - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Ouvrir/Ajouter un dossier ELF - - Install Packages (PKG) - Installer des packages (PKG) - Boot Game Démarrer un jeu @@ -1234,10 +1207,6 @@ Configure... Configurer... - - Install application from a .pkg file - Installer une application depuis un fichier .pkg - Recent Games Jeux récents @@ -1308,15 +1277,11 @@ Trophy Viewer - Trophy Viewer + Visionneuse de trophées No games found. Please add your games to your library first. - No games found. Please add your games to your library first. - - - PKG Viewer - Visionneuse PKG + Aucun jeu trouvé. Veuillez d'abord ajouter vos jeux à votre bibliothèque. Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Un seul fichier peut être sélectionné ! - - PKG Extraction - Extraction du PKG - - - Patch detected! - Patch détecté ! - - - PKG and Game versions match: - Les versions PKG et jeu correspondent: - - - Would you like to overwrite? - Souhaitez-vous remplacer ? - - - PKG Version %1 is older than installed version: - La version PKG %1 est plus ancienne que la version installée: - - - Game is installed: - Jeu installé: - - - Would you like to install Patch: - Souhaitez-vous installer le patch: - - - DLC Installation - Installation du DLC - - - Would you like to install DLC: %1? - Souhaitez-vous installer le DLC: %1 ? - - - DLC already installed: - DLC déjà installé: - - - Game already installed - Jeu déjà installé - - - PKG ERROR - Erreur PKG - - - Extracting PKG %1/%2 - Extraction PKG %1/%2 - - - Extraction Finished - Extraction terminée - - - Game successfully installed at %1 - Jeu installé avec succès dans %1 - - - File doesn't appear to be a valid PKG file - Le fichier ne semble pas être un PKG valide - Run Game Lancer le jeu @@ -1498,14 +1399,6 @@ Eboot.bin file not found Fichier Eboot.bin introuvable - - PKG File (*.PKG *.pkg) - Fichier PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG est un patch ou DLC, veuillez d'abord installer le jeu ! - Game is already running! Le jeu est déjà en cours ! @@ -1516,110 +1409,43 @@ Play - Play + Jouer Pause - Pause + Pause Stop - Stop + Stop Restart - Restart + Redémarrer Full Screen - Full Screen + Plein écran Controllers - Controllers + Contrôleurs Keyboard - Keyboard + Clavier Refresh List - Refresh List + Rafraîchir la liste Resume - Resume + Reprendre Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Ouvrir un dossier - - - PKG ERROR - Erreur PKG - - - Name - Nom - - - Serial - Numéro de série - - - Installed - Installé - - - Size - Taille - - - Category - Catégorie - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Région - - - Flags - Les indicateurs - - - Path - Répertoire - - - File - Fichier - - - Unknown - Inconnu - - - Package - Package + Afficher les libellés sous les icônes @@ -2241,7 +2067,7 @@ Select Game: - Select Game: + Sélectionnez un jeu: Progress diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 8746058b3..85b6f2c95 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -882,10 +882,6 @@ Error creating shortcut! Hiba a parancsikon létrehozásával! - - Install PKG - PKG telepítése - Game Játék @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása - - - Select which directory you want to install to. - Válassza ki a mappát a játékok telepítésére. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder ELF Mappa Megnyitása/Hozzáadása - - Install Packages (PKG) - PKG-k Telepítése (PKG) - Boot Game Játék Indítása @@ -1234,10 +1207,6 @@ Configure... Konfigurálás... - - Install application from a .pkg file - Program telepítése egy .pkg fájlból - Recent Games Legutóbbi Játékok @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Nézegető - Search... Keresés... @@ -1426,70 +1391,6 @@ Only one file can be selected! Csak egy fájl választható ki! - - PKG Extraction - PKG kicsomagolás - - - Patch detected! - Frissítés észlelve! - - - PKG and Game versions match: - A PKG és a játék verziói egyeznek: - - - Would you like to overwrite? - Szeretné felülírni? - - - PKG Version %1 is older than installed version: - A(z) %1-es PKG verzió régebbi, mint a telepített verzió: - - - Game is installed: - A játék telepítve van: - - - Would you like to install Patch: - Szeretné telepíteni a frissítést: - - - DLC Installation - DLC Telepítés - - - Would you like to install DLC: %1? - Szeretné telepíteni a %1 DLC-t? - - - DLC already installed: - DLC már telepítve: - - - Game already installed - A játék már telepítve van - - - PKG ERROR - PKG HIBA - - - Extracting PKG %1/%2 - PKG kicsomagolása %1/%2 - - - Extraction Finished - Kicsomagolás befejezve - - - Game successfully installed at %1 - A játék sikeresen telepítve itt: %1 - - - File doesn't appear to be a valid PKG file - A fájl nem tűnik érvényes PKG fájlnak - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Mappa Megnyitása - - - PKG ERROR - PKG HIBA - - - Name - Név - - - Serial - Sorozatszám - - - Installed - Installed - - - Size - Méret - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Régió - - - Flags - Flags - - - Path - Útvonal - - - File - Fájl - - - Unknown - Ismeretlen - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 5960715ae..1858da2a7 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -7,22 +7,22 @@ AboutDialog About shadPS4 - About shadPS4 + Tentang shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 adalah emulator sumber terbuka eksperimental untuk PlayStation 4. This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Perangkat lunak ini tidak boleh digunakan untuk memainkan permainan yang tidak Anda peroleh secara legal. CheatsPatches Cheats / Patches for - Cheats / Patches for + Kecurangan / Tambalan untuk Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -34,7 +34,7 @@ Serial: - Serial: + Seri: Version: @@ -400,38 +400,38 @@ Playable - Playable + Dapat dimainkan ControlSettings Configure Controls - Configure Controls + Konfigurasi Kontrol D-Pad - D-Pad + Tombol arah Up - Up + Atas Left - Left + Kiri Right - Right + Kanan Down - Down + Bawah Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona Mati Stik Kiri (standar: 2, maksimum: 127) Left Deadzone @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Hanya satu file yang bisa dipilih! - - PKG Extraction - Ekstraksi PKG - - - Patch detected! - Patch terdeteksi! - - - PKG and Game versions match: - Versi PKG dan Game cocok: - - - Would you like to overwrite? - Apakah Anda ingin menimpa? - - - PKG Version %1 is older than installed version: - Versi PKG %1 lebih lama dari versi yang terpasang: - - - Game is installed: - Game telah terpasang: - - - Would you like to install Patch: - Apakah Anda ingin menginstal patch: - - - DLC Installation - Instalasi DLC - - - Would you like to install DLC: %1? - Apakah Anda ingin menginstal DLC: %1? - - - DLC already installed: - DLC sudah terpasang: - - - Game already installed - Game sudah terpasang - - - PKG ERROR - KESALAHAN PKG - - - Extracting PKG %1/%2 - Mengekstrak PKG %1/%2 - - - Extraction Finished - Ekstraksi Selesai - - - Game successfully installed at %1 - Game berhasil dipasang di %1 - - - File doesn't appear to be a valid PKG file - File tampaknya bukan file PKG yang valid - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - KESALAHAN PKG - - - Name - Nama - - - Serial - Serial - - - Installed - Installed - - - Size - Ukuran - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Wilayah - - - Flags - Flags - - - Path - Jalur - - - File - File - - - Unknown - Tidak Dikenal - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 3e95e3df6..af321bd92 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -882,10 +882,6 @@ Error creating shortcut! Errore nella creazione della scorciatoia! - - Install PKG - Installa PKG - Game Gioco @@ -978,25 +974,6 @@ Associazioni dei pulsanti - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Scegli cartella - - - Select which directory you want to install to. - Seleziona in quale cartella vuoi effettuare l'installazione. - - - Install All Queued to Selected Folder - Installa tutto in coda nella Cartella Selezionata - - - Delete PKG File on Install - Elimina file PKG dopo Installazione - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Apri/Aggiungi cartella Elf - - Install Packages (PKG) - Installa Pacchetti (PKG) - Boot Game Avvia Gioco @@ -1234,10 +1207,6 @@ Configure... Configura... - - Install application from a .pkg file - Installa applicazione da un file .pkg - Recent Games Giochi Recenti @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nessun gioco trovato. Aggiungi prima i tuoi giochi alla tua libreria. - - PKG Viewer - Visualizzatore PKG - Search... Cerca... @@ -1426,70 +1391,6 @@ Only one file can be selected! Si può selezionare solo un file! - - PKG Extraction - Estrazione file PKG - - - Patch detected! - Patch rilevata! - - - PKG and Game versions match: - Le versioni di PKG e del Gioco corrispondono: - - - Would you like to overwrite? - Vuoi sovrascrivere? - - - PKG Version %1 is older than installed version: - La versione PKG %1 è più vecchia rispetto alla versione installata: - - - Game is installed: - Gioco installato: - - - Would you like to install Patch: - Vuoi installare la patch: - - - DLC Installation - Installazione DLC - - - Would you like to install DLC: %1? - Vuoi installare il DLC: %1? - - - DLC already installed: - DLC già installato: - - - Game already installed - Gioco già installato - - - PKG ERROR - ERRORE PKG - - - Extracting PKG %1/%2 - Estrazione file PKG %1/%2 - - - Extraction Finished - Estrazione Completata - - - Game successfully installed at %1 - Gioco installato correttamente in %1 - - - File doesn't appear to be a valid PKG file - Il file sembra non essere un file PKG valido - Run Game Esegui Gioco @@ -1498,14 +1399,6 @@ Eboot.bin file not found File Eboot.bin non trovato - - PKG File (*.PKG *.pkg) - File PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Il file PKG è una patch o DLC, si prega di installare prima il gioco! - Game is already running! Il gioco è già in esecuzione! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Apri Cartella - - - PKG ERROR - ERRORE PKG - - - Name - Nome - - - Serial - Seriale - - - Installed - Installato - - - Size - Dimensione - - - Category - Categoria - - - Type - Tipo - - - App Ver - Vers. App. - - - FW - FW - - - Region - Regione - - - Flags - Segnalazioni - - - Path - Percorso - - - File - File - - - Unknown - Sconosciuto - - - Package - Pacchetto - - SettingsDialog diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 1aaa3fa7c..d4b8fa5b7 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -882,10 +882,6 @@ Error creating shortcut! ショートカットの作成に失敗しました! - - Install PKG - PKGをインストール - Game ゲーム @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 - - - Select which directory you want to install to. - インストール先のディレクトリを選択してください。 - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - インストール時にPKGファイルを削除 - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elfフォルダを開く/追加する - - Install Packages (PKG) - パッケージをインストール (PKG) - Boot Game ゲームを起動 @@ -1234,10 +1207,6 @@ Configure... 設定... - - Install application from a .pkg file - .pkgファイルからアプリケーションをインストール - Recent Games 最近プレイしたゲーム @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKGビューアー - Search... 検索... @@ -1426,70 +1391,6 @@ Only one file can be selected! 1つのファイルしか選択できません! - - PKG Extraction - PKGの抽出 - - - Patch detected! - パッチが検出されました! - - - PKG and Game versions match: - PKGとゲームのバージョンが一致しています: - - - Would you like to overwrite? - 上書きしてもよろしいですか? - - - PKG Version %1 is older than installed version: - PKGバージョン %1 はインストールされているバージョンよりも古いです: - - - Game is installed: - ゲームはインストール済みです: - - - Would you like to install Patch: - パッチをインストールしてもよろしいですか: - - - DLC Installation - DLCのインストール - - - Would you like to install DLC: %1? - DLCをインストールしてもよろしいですか: %1? - - - DLC already installed: - DLCはすでにインストールされています: - - - Game already installed - ゲームはすでにインストールされています - - - PKG ERROR - PKGエラー - - - Extracting PKG %1/%2 - PKGを抽出中 %1/%2 - - - Extraction Finished - 抽出完了 - - - Game successfully installed at %1 - ゲームが %1 に正常にインストールされました - - - File doesn't appear to be a valid PKG file - ファイルが有効なPKGファイルでないようです - Run Game ゲームを実行 @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin ファイルが見つかりません - - PKG File (*.PKG *.pkg) - PKGファイル (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! ゲームは既に実行されています! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - フォルダーを開く - - - PKG ERROR - PKGエラー - - - Name - 名前 - - - Serial - シリアル - - - Installed - Installed - - - Size - サイズ - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - 地域 - - - Flags - Flags - - - Path - パス - - - File - ファイル - - - Unknown - 不明 - - - Package - パッケージ - - SettingsDialog diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 9dd06028d..9d4b58c79 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Only one file can be selected! - - PKG Extraction - PKG Extraction - - - Patch detected! - Patch detected! - - - PKG and Game versions match: - PKG and Game versions match: - - - Would you like to overwrite? - Would you like to overwrite? - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - Game is installed: - Game is installed: - - - Would you like to install Patch: - Would you like to install Patch: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - DLC already installed: - DLC already installed: - - - Game already installed - Game already installed - - - PKG ERROR - PKG ERROR - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - Extraction Finished - Extraction Finished - - - Game successfully installed at %1 - Game successfully installed at %1 - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG ERROR - - - Name - Name - - - Serial - Serial - - - Installed - Installed - - - Size - Size - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Flags - - - Path - Path - - - File - File - - - Unknown - 알 수 없음 - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 6e98ddc45..55a9fac0c 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Žaidimas @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Galite pasirinkti tik vieną failą! - - PKG Extraction - PKG ištraukimas - - - Patch detected! - Rasta atnaujinimą! - - - PKG and Game versions match: - PKG ir žaidimo versijos sutampa: - - - Would you like to overwrite? - Ar norite perrašyti? - - - PKG Version %1 is older than installed version: - PKG versija %1 yra senesnė nei įdiegta versija: - - - Game is installed: - Žaidimas įdiegtas: - - - Would you like to install Patch: - Ar norite įdiegti atnaujinimą: - - - DLC Installation - DLC diegimas - - - Would you like to install DLC: %1? - Ar norite įdiegti DLC: %1? - - - DLC already installed: - DLC jau įdiegtas: - - - Game already installed - Žaidimas jau įdiegtas - - - PKG ERROR - PKG KLAIDA - - - Extracting PKG %1/%2 - Ekstrakcinis PKG %1/%2 - - - Extraction Finished - Ekstrakcija baigta - - - Game successfully installed at %1 - Žaidimas sėkmingai įdiegtas %1 - - - File doesn't appear to be a valid PKG file - Failas atrodo, kad nėra galiojantis PKG failas - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG KLAIDA - - - Name - Vardas - - - Serial - Serijinis numeris - - - Installed - Installed - - - Size - Dydis - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Regionas - - - Flags - Flags - - - Path - Kelias - - - File - File - - - Unknown - Nežinoma - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 6faff415e..4a0835c1c 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -882,10 +882,6 @@ Error creating shortcut! Feil ved opprettelse av snarvei! - - Install PKG - Installer PKG - Game Spill @@ -978,25 +974,6 @@ Hurtigtast - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Velg mappe - - - Select which directory you want to install to. - Velg hvilken mappe du vil installere til. - - - Install All Queued to Selected Folder - Installer alle i kø til den valgte mappa - - - Delete PKG File on Install - Slett PKG-fila ved installering - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Åpne eller legg til Elf-mappe - - Install Packages (PKG) - Installer pakker (PKG) - Boot Game Start spill @@ -1234,10 +1207,6 @@ Configure... Sett opp … - - Install application from a .pkg file - Installer fra en .pkg fil - Recent Games Nylige spill @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Fant ingen spill. Legg til spillene dine i biblioteket først. - - PKG Viewer - PKG-viser - Search... Søk … @@ -1426,70 +1391,6 @@ Only one file can be selected! Kun én fil kan velges! - - PKG Extraction - PKG-utpakking - - - Patch detected! - Programrettelse oppdaget! - - - PKG and Game versions match: - PKG og spillversjoner stemmer overens: - - - Would you like to overwrite? - Ønsker du å overskrive? - - - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: - - - Game is installed: - Spillet er installert: - - - Would you like to install Patch: - Ønsker du å installere programrettelsen: - - - DLC Installation - DLC installasjon - - - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? - - - DLC already installed: - DLC allerede installert: - - - Game already installed - Spillet er allerede installert - - - PKG ERROR - PKG FEIL - - - Extracting PKG %1/%2 - Pakker ut PKG %1/%2 - - - Extraction Finished - Utpakking fullført - - - Game successfully installed at %1 - Spillet ble installert i %1 - - - File doesn't appear to be a valid PKG file - Fila ser ikke ut til å være en gyldig PKG-fil - Run Game Kjør spill @@ -1498,14 +1399,6 @@ Eboot.bin file not found Klarte ikke finne Eboot.bin-fila - - PKG File (*.PKG *.pkg) - PKG-fil (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG er en programrettelse eller DLC. Installer spillet først! - Game is already running! Spillet kjører allerede! @@ -1516,110 +1409,43 @@ Play - Play + Spill Pause - Pause + Pause Stop - Stop + Stopp Restart - Restart + Start på nytt Full Screen - Full Screen + Fullskjerm Controllers - Controllers + Kontroller Keyboard - Keyboard + Tastatur Refresh List - Refresh List + Oppdater lista Resume - Resume + Gjenoppta Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Åpne mappe - - - PKG ERROR - PKG FEIL - - - Name - Navn - - - Serial - Serienummer - - - Installed - Installert - - - Size - Størrelse - - - Category - Kategori - - - Type - Type - - - App Ver - Programversjon - - - FW - FV - - - Region - Region - - - Flags - Flagg - - - Path - Adresse - - - File - Fil - - - Unknown - Ukjent - - - Package - Pakke + Vis merkelapp under ikoner diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 376eea5ef..918da6a67 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Je kunt slechts één bestand selecteren! - - PKG Extraction - PKG-extractie - - - Patch detected! - Patch gedetecteerd! - - - PKG and Game versions match: - PKG- en gameversies komen overeen: - - - Would you like to overwrite? - Wilt u overschrijven? - - - PKG Version %1 is older than installed version: - PKG-versie %1 is ouder dan de geïnstalleerde versie: - - - Game is installed: - Game is geïnstalleerd: - - - Would you like to install Patch: - Wilt u de patch installeren: - - - DLC Installation - DLC-installatie - - - Would you like to install DLC: %1? - Wilt u DLC installeren: %1? - - - DLC already installed: - DLC al geïnstalleerd: - - - Game already installed - Game al geïnstalleerd - - - PKG ERROR - PKG FOUT - - - Extracting PKG %1/%2 - PKG %1/%2 aan het extraheren - - - Extraction Finished - Extractie voltooid - - - Game successfully installed at %1 - Spel succesvol geïnstalleerd op %1 - - - File doesn't appear to be a valid PKG file - Het bestand lijkt geen geldig PKG-bestand te zijn - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG FOUT - - - Name - Naam - - - Serial - Serienummer - - - Installed - Installed - - - Size - Grootte - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Regio - - - Flags - Flags - - - Path - Pad - - - File - File - - - Unknown - Onbekend - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index a77b43e09..39950d6ec 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -882,10 +882,6 @@ Error creating shortcut! Utworzenie skrótu zakończone niepowodzeniem! - - Install PKG - Zainstaluj PKG - Game Gra @@ -978,25 +974,6 @@ Przypisanie klawiszy - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Wybierz katalog - - - Select which directory you want to install to. - Wybierz katalog, do którego chcesz zainstalować. - - - Install All Queued to Selected Folder - Zainstaluj wszystkie oczekujące do wybranego folderu - - - Delete PKG File on Install - Usuń plik PKG po instalacji - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Otwórz/Dodaj folder Elf - - Install Packages (PKG) - Zainstaluj paczkę (PKG) - Boot Game Uruchom grę @@ -1234,10 +1207,6 @@ Configure... Konfiguruj... - - Install application from a .pkg file - Zainstaluj aplikacje z pliku .pkg - Recent Games Ostatnie gry @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nie znaleziono gier. Najpierw dodaj swoje gry do swojej biblioteki. - - PKG Viewer - Menedżer plików PKG - Search... Szukaj... @@ -1426,70 +1391,6 @@ Only one file can be selected! Można wybrać tylko jeden plik! - - PKG Extraction - Wypakowywanie PKG - - - Patch detected! - Wykryto łatkę! - - - PKG and Game versions match: - Wersje PKG i gry są zgodne: - - - Would you like to overwrite? - Czy chcesz nadpisać? - - - PKG Version %1 is older than installed version: - Wersja PKG %1 jest starsza niż zainstalowana wersja: - - - Game is installed: - Gra jest zainstalowana: - - - Would you like to install Patch: - Czy chcesz zainstalować łatkę: - - - DLC Installation - Instalacja dodatkowej zawartości (DLC) - - - Would you like to install DLC: %1? - Czy chcesz zainstalować dodatkową zawartość (DLC): %1? - - - DLC already installed: - Dodatkowa zawartość (DLC) już zainstalowana: - - - Game already installed - Gra już zainstalowana - - - PKG ERROR - BŁĄD PKG - - - Extracting PKG %1/%2 - Wypakowywanie PKG %1/%2 - - - Extraction Finished - Wypakowywanie zakończone - - - Game successfully installed at %1 - Gra pomyślnie zainstalowana w %1 - - - File doesn't appear to be a valid PKG file - Plik nie wydaje się być prawidłowym plikiem PKG - Run Game Uruchom grę @@ -1498,14 +1399,6 @@ Eboot.bin file not found Nie znaleziono pliku EBOOT.BIN - - PKG File (*.PKG *.pkg) - Plik PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG jest aktualizacją lub dodatkową zawartością (DLC), najpierw zainstaluj grę! - Game is already running! Gra jest już uruchomiona! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Otwórz folder - - - PKG ERROR - BŁĄD PKG - - - Name - Nazwa - - - Serial - Numer seryjny - - - Installed - Zainstalowano - - - Size - Rozmiar - - - Category - Kategoria - - - Type - Typ - - - App Ver - Wersja aplikacji - - - FW - Oprogramowanie - - - Region - Region - - - Flags - Flagi - - - Path - Ścieżka - - - File - Plik - - - Unknown - Nieznany - - - Package - Paczka - - SettingsDialog diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index ea82086f3..5d1582b5a 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Erro ao criar atalho! - - Install PKG - Instalar PKG - Game Jogo @@ -978,25 +974,6 @@ Teclas de atalho - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Escolha o diretório - - - Select which directory you want to install to. - Selecione o diretório em que você deseja instalar. - - - Install All Queued to Selected Folder - Instalar Tudo da Fila para a Pasta Selecionada - - - Delete PKG File on Install - Excluir o PKG após a Instalação - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Abrir/Adicionar pasta Elf - - Install Packages (PKG) - Instalar Pacotes (PKG) - Boot Game Iniciar Jogo @@ -1234,10 +1207,6 @@ Configure... Configurar... - - Install application from a .pkg file - Instalar aplicativo de um arquivo .pkg - Recent Games Jogos Recentes @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nenhum jogo encontrado. Adicione seus jogos à sua biblioteca primeiro. - - PKG Viewer - Visualizador de PKG - Search... Pesquisar... @@ -1426,70 +1391,6 @@ Only one file can be selected! Apenas um arquivo pode ser selecionado! - - PKG Extraction - Extração de PKG - - - Patch detected! - Atualização detectada! - - - PKG and Game versions match: - As versões do PKG e do Jogo são iguais: - - - Would you like to overwrite? - Você gostaria de sobrescrever? - - - PKG Version %1 is older than installed version: - A Versão do PKG %1 é mais antiga do que a versão instalada: - - - Game is installed: - Jogo instalado: - - - Would you like to install Patch: - Você gostaria de instalar a atualização: - - - DLC Installation - Instalação de DLC - - - Would you like to install DLC: %1? - Você gostaria de instalar o DLC: %1? - - - DLC already installed: - DLC já está instalado: - - - Game already installed - O jogo já está instalado: - - - PKG ERROR - ERRO DE PKG - - - Extracting PKG %1/%2 - Extraindo PKG %1/%2 - - - Extraction Finished - Extração Concluída - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - File doesn't appear to be a valid PKG file - O arquivo não parece ser um arquivo PKG válido - Run Game Executar Jogo @@ -1498,14 +1399,6 @@ Eboot.bin file not found Arquivo Eboot.bin não encontrado - - PKG File (*.PKG *.pkg) - Arquivo PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - O PKG é um patch ou DLC, por favor instale o jogo primeiro! - Game is already running! O jogo já está executando! @@ -1555,73 +1448,6 @@ Mostrar Rótulos Sob Ícones - - PKGViewer - - Open Folder - Abrir Pasta - - - PKG ERROR - ERRO DE PKG - - - Name - Nome - - - Serial - Serial - - - Installed - Instalado - - - Size - Tamanho - - - Category - Categoria - - - Type - Tipo - - - App Ver - Versão do App - - - FW - FW - - - Region - Região - - - Flags - Flags - - - Path - Caminho - - - File - Arquivo - - - Unknown - Desconhecido - - - Package - Pacote - - SettingsDialog diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 7ca3eebb5..a155a6324 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -882,10 +882,6 @@ Error creating shortcut! Erro ao criar atalho! - - Install PKG - Instalar PKG - Game Jogo @@ -978,25 +974,6 @@ Combinações de Teclas - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Escolher diretório - - - Select which directory you want to install to. - Selecione o diretório em que deseja instalar. - - - Install All Queued to Selected Folder - Instalar Todos os Pendentes para a Pasta Selecionada - - - Delete PKG File on Install - Eliminar Ficheiro PKG após Instalação - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Abrir/Adicionar pasta Elf - - Install Packages (PKG) - Instalar Pacotes (PKG) - Boot Game Iniciar Jogo @@ -1234,10 +1207,6 @@ Configure... Configurar... - - Install application from a .pkg file - Instalar aplicação através de um ficheiro .pkg - Recent Games Jogos Recentes @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nenhum jogo encontrado. Por favor, adicione os seus jogos à sua biblioteca primeiro. - - PKG Viewer - Visualizador PKG - Search... Procurar... @@ -1426,70 +1391,6 @@ Only one file can be selected! Apenas um ficheiro pode ser selecionado! - - PKG Extraction - Extração de PKG - - - Patch detected! - Patch detetado! - - - PKG and Game versions match: - As versões do PKG e do Jogo coincidem: - - - Would you like to overwrite? - Gostaria de substituir? - - - PKG Version %1 is older than installed version: - A versão do PKG %1 é mais antiga do que a versão instalada: - - - Game is installed: - O jogo está instalado: - - - Would you like to install Patch: - Gostaria de instalar o Patch: - - - DLC Installation - Instalação de DLC - - - Would you like to install DLC: %1? - Deseja instalar o DLC: %1? - - - DLC already installed: - DLC já está instalado: - - - Game already installed - O jogo já está instalado - - - PKG ERROR - ERRO PKG - - - Extracting PKG %1/%2 - A extrair PKG %1/%2 - - - Extraction Finished - Extração Finalizada - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - File doesn't appear to be a valid PKG file - O ficheiro não aparenta ser um ficheiro PKG válido - Run Game Executar Jogo @@ -1498,14 +1399,6 @@ Eboot.bin file not found Ficheiro eboot.bin não encontrado - - PKG File (*.PKG *.pkg) - Ficheiro PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Este PKG é um patch ou DLC, por favor instale o respetivo jogo primeiro! - Game is already running! O jogo já está a ser executado! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Abrir Pasta - - - PKG ERROR - ERRO PKG - - - Name - Nome - - - Serial - Número de Série - - - Installed - Instalado - - - Size - Tamanho - - - Category - Categoria - - - Type - Tipo - - - App Ver - App Ver - - - FW - FW - - - Region - Região - - - Flags - Flags - - - Path - Caminho - - - File - Ficheiro - - - Unknown - Desconhecido - - - Package - Pacote - - SettingsDialog diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 6e008ac20..18121a204 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Numai un fișier poate fi selectat! - - PKG Extraction - Extracție PKG - - - Patch detected! - Patch detectat! - - - PKG and Game versions match: - Versiunile PKG și ale jocului sunt compatibile: - - - Would you like to overwrite? - Doriți să suprascrieți? - - - PKG Version %1 is older than installed version: - Versiunea PKG %1 este mai veche decât versiunea instalată: - - - Game is installed: - Jocul este instalat: - - - Would you like to install Patch: - Doriți să instalați patch-ul: - - - DLC Installation - Instalare DLC - - - Would you like to install DLC: %1? - Doriți să instalați DLC-ul: %1? - - - DLC already installed: - DLC deja instalat: - - - Game already installed - Jocul deja instalat - - - PKG ERROR - EROARE PKG - - - Extracting PKG %1/%2 - Extracție PKG %1/%2 - - - Extraction Finished - Extracție terminată - - - Game successfully installed at %1 - Jocul a fost instalat cu succes la %1 - - - File doesn't appear to be a valid PKG file - Fișierul nu pare să fie un fișier PKG valid - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Deschide Folder - - - PKG ERROR - EROARE PKG - - - Name - Nume - - - Serial - Serie - - - Installed - Installed - - - Size - Dimensiune - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Regiune - - - Flags - Flags - - - Path - Drum - - - File - File - - - Unknown - Necunoscut - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 560c8c110..3944af589 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -882,10 +882,6 @@ Error creating shortcut! Ошибка создания ярлыка! - - Install PKG - Установить PKG - Game Игры @@ -978,25 +974,6 @@ Бинды клавиш - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - Select which directory you want to install to. - Выберите папку, в которую вы хотите установить. - - - Install All Queued to Selected Folder - Установить все из очереди в выбранную папку - - - Delete PKG File on Install - Удалить файл PKG при установке - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Открыть/Добавить папку Elf - - Install Packages (PKG) - Установить пакеты (PKG) - Boot Game Запустить игру @@ -1234,10 +1207,6 @@ Configure... Настроить... - - Install application from a .pkg file - Установить приложение из файла .pkg - Recent Games Недавние игры @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Не найдено ни одной игры. Пожалуйста, сначала добавьте игры в библиотеку. - - PKG Viewer - Просмотр PKG - Search... Поиск... @@ -1426,70 +1391,6 @@ Only one file can be selected! Можно выбрать только один файл! - - PKG Extraction - Извлечение PKG - - - Patch detected! - Обнаружен патч! - - - PKG and Game versions match: - Версии PKG и игры совпадают: - - - Would you like to overwrite? - Хотите перезаписать? - - - PKG Version %1 is older than installed version: - Версия PKG %1 старше установленной версии: - - - Game is installed: - Игра установлена: - - - Would you like to install Patch: - Хотите установить патч: - - - DLC Installation - Установка DLC - - - Would you like to install DLC: %1? - Вы хотите установить DLC: %1? - - - DLC already installed: - DLC уже установлен: - - - Game already installed - Игра уже установлена - - - PKG ERROR - ОШИБКА PKG - - - Extracting PKG %1/%2 - Извлечение PKG %1/%2 - - - Extraction Finished - Извлечение завершено - - - Game successfully installed at %1 - Игра успешно установлена в %1 - - - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG - Run Game Запустить игру @@ -1498,14 +1399,6 @@ Eboot.bin file not found Файл eboot.bin не найден - - PKG File (*.PKG *.pkg) - Файл PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! - Game is already running! Игра уже запущена! @@ -1555,73 +1448,6 @@ Показывать метки под значками - - PKGViewer - - Open Folder - Открыть папку - - - PKG ERROR - ОШИБКА PKG - - - Name - Название - - - Serial - Серийный номер - - - Installed - Установлено - - - Size - Размер - - - Category - Категория - - - Type - Тип - - - App Ver - Версия приложения - - - FW - Прошивка - - - Region - Регион - - - Flags - Флаги - - - Path - Путь - - - File - Файл - - - Unknown - Неизвестно - - - Package - Пакет - - SettingsDialog diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 8a2c34c60..d59fd8c3e 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -882,10 +882,6 @@ Error creating shortcut! Gabim në krijimin e shkurtores! - - Install PKG - Instalo PKG - Game Loja @@ -978,25 +974,6 @@ Caktimet e Tasteve - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen - - - Select which directory you want to install to. - Përzgjidh në cilën dosje do që të instalosh. - - - Install All Queued to Selected Folder - Instalo të gjitha të radhiturat në dosjen e zgjedhur - - - Delete PKG File on Install - Fshi skedarin PKG pas instalimit - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Hap/Shto Dosje ELF - - Install Packages (PKG) - Instalo Paketat (PKG) - Boot Game Nis Lojën @@ -1234,10 +1207,6 @@ Configure... Konfiguro... - - Install application from a .pkg file - Instalo aplikacionin nga një skedar .pkg - Recent Games Lojërat e fundit @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nuk u gjetën lojëra. Shto lojërat në librarinë tënde fillimisht. - - PKG Viewer - Shikuesi i PKG - Search... Kërko... @@ -1426,70 +1391,6 @@ Only one file can be selected! Mund të përzgjidhet vetëm një skedar! - - PKG Extraction - Nxjerrja e PKG-së - - - Patch detected! - U zbulua një arnë! - - - PKG and Game versions match: - PKG-ja dhe versioni i Lojës përputhen: - - - Would you like to overwrite? - Dëshiron të mbishkruash? - - - PKG Version %1 is older than installed version: - Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: - - - Game is installed: - Loja është instaluar: - - - Would you like to install Patch: - Dëshiron të instalosh Arnën: - - - DLC Installation - Instalimi i DLC-ve - - - Would you like to install DLC: %1? - Dëshiron të instalosh DLC-në: %1? - - - DLC already installed: - DLC-ja është instaluar tashmë: - - - Game already installed - Loja është instaluar tashmë - - - PKG ERROR - GABIM PKG - - - Extracting PKG %1/%2 - Po nxirret PKG-ja %1/%2 - - - Extraction Finished - Nxjerrja Përfundoi - - - Game successfully installed at %1 - Loja u instalua me sukses në %1 - - - File doesn't appear to be a valid PKG file - Skedari nuk duket si skedar PKG i vlefshëm - Run Game Ekzekuto lojën @@ -1498,14 +1399,6 @@ Eboot.bin file not found Skedari Eboot.bin nuk u gjet - - PKG File (*.PKG *.pkg) - Skedar PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG-ja është një arnë ose DLC, të lutem instalo lojën fillimisht! - Game is already running! Loja tashmë është duke u ekzekutuar! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Hap Dosjen - - - PKG ERROR - GABIM PKG - - - Name - Emri - - - Serial - Seriku - - - Installed - Instaluar - - - Size - Madhësia - - - Category - Kategoria - - - Type - Lloji - - - App Ver - Versioni i aplikacionit - - - FW - Firmueri - - - Region - Rajoni - - - Flags - Flamurët - - - Path - Shtegu - - - File - Skedari - - - Unknown - E panjohur - - - Package - Paketa - - SettingsDialog diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 91b544e05..b570c420e 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -882,10 +882,6 @@ Error creating shortcut! Fel vid skapandet av genväg! - - Install PKG - Installera PKG - Game Spel @@ -978,25 +974,6 @@ Tangentbindningar - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Välj katalog - - - Select which directory you want to install to. - Välj vilken katalog som du vill installera till. - - - Install All Queued to Selected Folder - Installera alla köade till markerad mapp - - - Delete PKG File on Install - Ta bort PKG-fil efter installation - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Öppna/Lägg till Elf-mapp - - Install Packages (PKG) - Installera paket (PKG) - Boot Game Starta spel @@ -1234,10 +1207,6 @@ Configure... Konfigurera... - - Install application from a .pkg file - Installera program från en .pkg-fil - Recent Games Senaste spel @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Inga spel hittades. Lägg till dina spel till biblioteket först. - - PKG Viewer - PKG-visare - Search... Sök... @@ -1426,70 +1391,6 @@ Only one file can be selected! Endast en fil kan väljas! - - PKG Extraction - PKG-extrahering - - - Patch detected! - Patch upptäcktes! - - - PKG and Game versions match: - PKG och spelversioner matchar: - - - Would you like to overwrite? - Vill du skriva över? - - - PKG Version %1 is older than installed version: - PKG-versionen %1 är äldre än installerad version: - - - Game is installed: - Spelet är installerat: - - - Would you like to install Patch: - Vill du installera patch: - - - DLC Installation - DLC-installation - - - Would you like to install DLC: %1? - Vill du installera DLC: %1? - - - DLC already installed: - DLC redan installerat: - - - Game already installed - Spelet redan installerat - - - PKG ERROR - PKG-FEL - - - Extracting PKG %1/%2 - Extraherar PKG %1/%2 - - - Extraction Finished - Extrahering färdig - - - Game successfully installed at %1 - Spelet installerades i %1 - - - File doesn't appear to be a valid PKG file - Filen verkar inte vara en giltig PKG-fil - Run Game Kör spel @@ -1498,14 +1399,6 @@ Eboot.bin file not found Filen eboot.bin hittades inte - - PKG File (*.PKG *.pkg) - PKG-fil (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG är en patch eller DLC. Installera spelet först! - Game is already running! Spelet är redan igång! @@ -1516,110 +1409,43 @@ Play - Play + Spela Pause - Pause + Paus Stop - Stop + Stoppa Restart - Restart + Starta om Full Screen - Full Screen + Helskärm Controllers - Controllers + Kontroller Keyboard - Keyboard + Tangentbord Refresh List - Refresh List + Uppdatera lista Resume - Resume + Återuppta Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Öppna mapp - - - PKG ERROR - PKG-FEL - - - Name - Namn - - - Serial - Serienummer - - - Installed - Installerat - - - Size - Storlek - - - Category - Kategori - - - Type - Typ - - - App Ver - Appver - - - FW - FW - - - Region - Region - - - Flags - Flaggor - - - Path - Sökväg - - - File - Arkiv - - - Unknown - Okänt - - - Package - Paket + Visa etiketter under ikoner diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 4946874c9..d2d018116 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Kısayol oluşturulurken hata oluştu! - - Install PKG - PKG Yükle - Game Oyun @@ -978,25 +974,6 @@ Tuş Atamaları - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Klasörü Seç - - - Select which directory you want to install to. - Hangi dizine yüklemek istediğinizi seçin. - - - Install All Queued to Selected Folder - Tüm Kuyruktakileri Seçili Klasöre Yükle - - - Delete PKG File on Install - Yüklemede PKG Dosyasını Sil - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elf Klasörü Aç/Ekle - - Install Packages (PKG) - Paketleri Kur (PKG) - Boot Game Oyunu Başlat @@ -1234,10 +1207,6 @@ Configure... Yapılandır... - - Install application from a .pkg file - .pkg dosyasından uygulama yükle - Recent Games Son Oyunlar @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Oyun bulunamadı. Oyunlarınızı lütfen önce kütüphanenize ekleyin. - - PKG Viewer - PKG Görüntüleyici - Search... Ara... @@ -1426,70 +1391,6 @@ Only one file can be selected! Sadece bir dosya seçilebilir! - - PKG Extraction - PKG Çıkartma - - - Patch detected! - Yama tespit edildi! - - - PKG and Game versions match: - PKG ve oyun sürümleri uyumlu: - - - Would you like to overwrite? - Üzerine yazmak ister misiniz? - - - PKG Version %1 is older than installed version: - PKG Sürümü %1, kurulu sürümden daha eski: - - - Game is installed: - Oyun yüklendi: - - - Would you like to install Patch: - Yamanın yüklenmesini ister misiniz: - - - DLC Installation - DLC Yükleme - - - Would you like to install DLC: %1? - DLC'yi yüklemek ister misiniz: %1? - - - DLC already installed: - DLC zaten yüklü: - - - Game already installed - Oyun zaten yüklü - - - PKG ERROR - PKG HATASI - - - Extracting PKG %1/%2 - PKG Çıkarılıyor %1/%2 - - - Extraction Finished - Çıkarma Tamamlandı - - - Game successfully installed at %1 - Oyun başarıyla %1 konumuna yüklendi - - - File doesn't appear to be a valid PKG file - Dosya geçerli bir PKG dosyası gibi görünmüyor - Run Game Oyunu Çalıştır @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin dosyası bulunamadı - - PKG File (*.PKG *.pkg) - PKG Dosyası (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG bir yama ya da DLC, lütfen önce oyunu yükleyin! - Game is already running! Oyun zaten çalışıyor! @@ -1555,73 +1448,6 @@ Simgelerin Altında Etiketleri Göster - - PKGViewer - - Open Folder - Klasörü Aç - - - PKG ERROR - PKG HATASI - - - Name - Ad - - - Serial - Seri Numarası - - - Installed - Yüklü - - - Size - Boyut - - - Category - Kategori - - - Type - Tür - - - App Ver - Uygulama Sürümü - - - FW - Sistem Yazılımı - - - Region - Bölge - - - Flags - Bayraklar - - - Path - Yol - - - File - Dosya - - - Unknown - Bilinmeyen - - - Package - Paket - - SettingsDialog diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 69e6c5fc7..890fa163e 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -882,10 +882,6 @@ Error creating shortcut! Помилка при створенні ярлика! - - Install PKG - Встановити PKG - Game гри @@ -978,25 +974,6 @@ Призначення клавіш - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Виберіть папку - - - Select which directory you want to install to. - Виберіть папку, до якої ви хочете встановити. - - - Install All Queued to Selected Folder - Встановити все з черги до вибраної папки - - - Delete PKG File on Install - Видалити файл PKG під час встановлення - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Відкрити/Додати папку Elf - - Install Packages (PKG) - Встановити пакети (PKG) - Boot Game Запустити гру @@ -1234,10 +1207,6 @@ Configure... Налаштувати... - - Install application from a .pkg file - Встановити додаток з файлу .pkg - Recent Games Нещодавні ігри @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - Перегляд PKG - Search... Пошук... @@ -1426,70 +1391,6 @@ Only one file can be selected! Можна вибрати лише один файл! - - PKG Extraction - Розпакування PKG - - - Patch detected! - Виявлено патч! - - - PKG and Game versions match: - Версії PKG та гри збігаються: - - - Would you like to overwrite? - Бажаєте перезаписати? - - - PKG Version %1 is older than installed version: - Версія PKG %1 старіша за встановлену версію: - - - Game is installed: - Встановлена гра: - - - Would you like to install Patch: - Бажаєте встановити патч: - - - DLC Installation - Встановлення DLC - - - Would you like to install DLC: %1? - Ви бажаєте встановити DLC: %1? - - - DLC already installed: - DLC вже встановлено: - - - Game already installed - Гра вже встановлена - - - PKG ERROR - ПОМИЛКА PKG - - - Extracting PKG %1/%2 - Витягування PKG %1/%2 - - - Extraction Finished - Розпакування завершено - - - Game successfully installed at %1 - Гру успішно встановлено у %1 - - - File doesn't appear to be a valid PKG file - Файл не є дійсним PKG-файлом - Run Game Запустити гру @@ -1498,14 +1399,6 @@ Eboot.bin file not found Файл Boot.bin не знайдено - - PKG File (*.PKG *.pkg) - Файл PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG - це патч або DLC, будь ласка, спочатку встановіть гру! - Game is already running! Гра вже запущена! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Відкрити папку - - - PKG ERROR - ПОМИЛКА PKG - - - Name - Назва - - - Serial - Серійний номер - - - Installed - Встановлені - - - Size - Розмір - - - Category - Категорія - - - Type - Тип - - - App Ver - Версія додатку - - - FW - ПЗ - - - Region - Регіон - - - Flags - Мітки - - - Path - Шлях - - - File - Файл - - - Unknown - Невідомо - - - Package - Пакет - - SettingsDialog diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 14bd29896..b8c1759be 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Chỉ có thể chọn một tệp duy nhất! - - PKG Extraction - Giải nén PKG - - - Patch detected! - Đã phát hiện bản vá! - - - PKG and Game versions match: - Các phiên bản PKG và trò chơi khớp nhau: - - - Would you like to overwrite? - Bạn có muốn ghi đè không? - - - PKG Version %1 is older than installed version: - Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: - - - Game is installed: - Trò chơi đã được cài đặt: - - - Would you like to install Patch: - Bạn có muốn cài đặt bản vá: - - - DLC Installation - Cài đặt DLC - - - Would you like to install DLC: %1? - Bạn có muốn cài đặt DLC: %1? - - - DLC already installed: - DLC đã được cài đặt: - - - Game already installed - Trò chơi đã được cài đặt - - - PKG ERROR - LOI PKG - - - Extracting PKG %1/%2 - Đang giải nén PKG %1/%2 - - - Extraction Finished - Giải nén hoàn tất - - - Game successfully installed at %1 - Trò chơi đã được cài đặt thành công tại %1 - - - File doesn't appear to be a valid PKG file - Tệp không có vẻ là tệp PKG hợp lệ - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - LOI PKG - - - Name - Tên - - - Serial - Số seri - - - Installed - Installed - - - Size - Kích thước - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Khu vực - - - Flags - Flags - - - Path - Đường dẫn - - - File - File - - - Unknown - Không xác định - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 7536b7d17..7d414a493 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -882,10 +882,6 @@ Error creating shortcut! 创建快捷方式出错! - - Install PKG - 安装 PKG - Game 游戏 @@ -978,25 +974,6 @@ 按键绑定 - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - 选择文件目录 - - - Select which directory you want to install to. - 选择您想要安装到的目录。 - - - Install All Queued to Selected Folder - 安装所有 PKG 到选定的文件夹 - - - Delete PKG File on Install - 安装后删除 PKG 文件 - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder 打开/添加 Elf 文件夹 - - Install Packages (PKG) - 安装 Packages (PKG) - Boot Game 启动游戏 @@ -1234,10 +1207,6 @@ Configure... 设置... - - Install application from a .pkg file - 从 .pkg 文件安装应用程序 - Recent Games 最近启动的游戏 @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. 未找到游戏。请先将您的游戏添加到您的资料库。 - - PKG Viewer - PKG 查看器 - Search... 搜索... @@ -1426,70 +1391,6 @@ Only one file can be selected! 只能选择一个文件! - - PKG Extraction - PKG 解压 - - - Patch detected! - 检测到补丁! - - - PKG and Game versions match: - PKG 和游戏版本匹配: - - - Would you like to overwrite? - 您想要覆盖吗? - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安装版本更旧: - - - Game is installed: - 游戏已安装: - - - Would you like to install Patch: - 您想安装补丁吗: - - - DLC Installation - DLC 安装 - - - Would you like to install DLC: %1? - 您想安装 DLC:%1 吗? - - - DLC already installed: - DLC 已经安装: - - - Game already installed - 游戏已经安装 - - - PKG ERROR - PKG 错误 - - - Extracting PKG %1/%2 - 正在解压 PKG %1/%2 - - - Extraction Finished - 解压完成 - - - Game successfully installed at %1 - 游戏成功安装在 %1 - - - File doesn't appear to be a valid PKG file - 文件似乎不是有效的 PKG 文件 - Run Game 运行游戏 @@ -1498,14 +1399,6 @@ Eboot.bin file not found 找不到 Eboot.bin 文件 - - PKG File (*.PKG *.pkg) - PKG 文件(*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG是一个补丁或 DLC,请先安装游戏! - Game is already running! 游戏已经在运行中! @@ -1555,73 +1448,6 @@ 显示图标下的标签 - - PKGViewer - - Open Folder - 打开文件夹 - - - PKG ERROR - PKG 错误 - - - Name - 名称 - - - Serial - 序列号 - - - Installed - 已安装 - - - Size - 大小 - - - Category - 分类 - - - Type - 类型 - - - App Ver - 版本 - - - FW - 固件 - - - Region - 区域 - - - Flags - 标志 - - - Path - 路径 - - - File - 文件 - - - Unknown - 未知 - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index f195ec1b7..08aa812fb 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! 只能選擇一個檔案! - - PKG Extraction - PKG 解壓縮 - - - Patch detected! - 檢測到補丁! - - - PKG and Game versions match: - PKG 和遊戲版本匹配: - - - Would you like to overwrite? - 您想要覆蓋嗎? - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安裝版本更舊: - - - Game is installed: - 遊戲已安裝: - - - Would you like to install Patch: - 您想要安裝補丁嗎: - - - DLC Installation - DLC 安裝 - - - Would you like to install DLC: %1? - 您想要安裝 DLC: %1 嗎? - - - DLC already installed: - DLC 已經安裝: - - - Game already installed - 遊戲已經安裝 - - - PKG ERROR - PKG 錯誤 - - - Extracting PKG %1/%2 - 正在解壓縮 PKG %1/%2 - - - Extraction Finished - 解壓縮完成 - - - Game successfully installed at %1 - 遊戲成功安裝於 %1 - - - File doesn't appear to be a valid PKG file - 檔案似乎不是有效的 PKG 檔案 - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG 錯誤 - - - Name - 名稱 - - - Serial - 序號 - - - Installed - Installed - - - Size - 大小 - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - 區域 - - - Flags - Flags - - - Path - 路徑 - - - File - File - - - Unknown - 未知 - - - Package - Package - - SettingsDialog