Merge branch 'shadps4-emu:main' into main
@ -113,28 +113,39 @@ git_describe(GIT_DESC --always --long --dirty)
|
|||||||
git_branch_name(GIT_BRANCH)
|
git_branch_name(GIT_BRANCH)
|
||||||
string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S")
|
string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
message("start git things")
|
||||||
# Try to get the upstream remote and branch
|
# Try to get the upstream remote and branch
|
||||||
|
message("check for remote and branch")
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND git rev-parse --abbrev-ref --symbolic-full-name @{u}
|
COMMAND git rev-parse --abbrev-ref --symbolic-full-name @{u}
|
||||||
OUTPUT_VARIABLE GIT_REMOTE_NAME
|
OUTPUT_VARIABLE GIT_REMOTE_NAME
|
||||||
RESULT_VARIABLE GIT_BRANCH_RESULT
|
RESULT_VARIABLE GIT_REMOTE_RESULT
|
||||||
ERROR_QUIET
|
ERROR_QUIET
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
)
|
)
|
||||||
|
|
||||||
# If there's no upstream set or the command failed, check remote.pushDefault
|
# 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(
|
execute_process(
|
||||||
COMMAND git config --get remote.pushDefault
|
COMMAND git config --get remote.pushDefault
|
||||||
OUTPUT_VARIABLE GIT_REMOTE_NAME
|
OUTPUT_VARIABLE GIT_REMOTE_NAME
|
||||||
RESULT_VARIABLE GIT_PUSH_DEFAULT_RESULT
|
RESULT_VARIABLE GIT_REMOTE_RESULT
|
||||||
ERROR_QUIET
|
ERROR_QUIET
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
# If remote.pushDefault is not set or fails, default to origin
|
# If running in GitHub Actions and the above fails
|
||||||
if (GIT_PUSH_DEFAULT_RESULT OR GIT_REMOTE_NAME STREQUAL "")
|
if (GIT_REMOTE_RESULT OR GIT_REMOTE_NAME STREQUAL "")
|
||||||
set(GIT_REMOTE_NAME "origin")
|
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()
|
endif()
|
||||||
else()
|
else()
|
||||||
# Extract remote name if the output contains a remote/branch format
|
# Extract remote name if the output contains a remote/branch format
|
||||||
@ -148,6 +159,7 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Get remote link
|
# Get remote link
|
||||||
|
message("getting remote link")
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND git config --get remote.${GIT_REMOTE_NAME}.url
|
COMMAND git config --get remote.${GIT_REMOTE_NAME}.url
|
||||||
OUTPUT_VARIABLE GIT_REMOTE_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)
|
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(Boost 1.84.0 CONFIG)
|
||||||
find_package(FFmpeg 5.1.2 MODULE)
|
find_package(FFmpeg 5.1.2 MODULE)
|
||||||
find_package(fmt 10.2.0 CONFIG)
|
find_package(fmt 10.2.0 CONFIG)
|
||||||
@ -378,6 +392,24 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp
|
|||||||
src/core/libraries/ngs2/ngs2_error.h
|
src/core/libraries/ngs2/ngs2_error.h
|
||||||
src/core/libraries/ngs2/ngs2_impl.cpp
|
src/core/libraries/ngs2/ngs2_impl.cpp
|
||||||
src/core/libraries/ngs2/ngs2_impl.h
|
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/ajm/ajm_error.h
|
||||||
src/core/libraries/audio3d/audio3d.cpp
|
src/core/libraries/audio3d/audio3d.cpp
|
||||||
src/core/libraries/audio3d/audio3d.h
|
src/core/libraries/audio3d/audio3d.h
|
||||||
|
@ -49,8 +49,10 @@ path = [
|
|||||||
"src/images/pause_icon.png",
|
"src/images/pause_icon.png",
|
||||||
"src/images/play_icon.png",
|
"src/images/play_icon.png",
|
||||||
"src/images/ps4_controller.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/settings_icon.png",
|
||||||
|
"src/images/fullscreen_icon.png",
|
||||||
"src/images/stop_icon.png",
|
"src/images/stop_icon.png",
|
||||||
"src/images/utils_icon.png",
|
"src/images/utils_icon.png",
|
||||||
"src/images/shadPS4.icns",
|
"src/images/shadPS4.icns",
|
||||||
|
@ -32,6 +32,7 @@ std::filesystem::path find_fs_path_or(const basic_value<TC>& v, const K& ky,
|
|||||||
namespace Config {
|
namespace Config {
|
||||||
|
|
||||||
static bool isNeo = false;
|
static bool isNeo = false;
|
||||||
|
static bool isDevKit = false;
|
||||||
static bool playBGM = false;
|
static bool playBGM = false;
|
||||||
static bool isTrophyPopupDisabled = false;
|
static bool isTrophyPopupDisabled = false;
|
||||||
static int BGMvolume = 50;
|
static int BGMvolume = 50;
|
||||||
@ -40,7 +41,7 @@ static u32 screenWidth = 1280;
|
|||||||
static u32 screenHeight = 720;
|
static u32 screenHeight = 720;
|
||||||
static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select
|
static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select
|
||||||
static std::string logFilter;
|
static std::string logFilter;
|
||||||
static std::string logType = "async";
|
static std::string logType = "sync";
|
||||||
static std::string userName = "shadPS4";
|
static std::string userName = "shadPS4";
|
||||||
static std::string updateChannel;
|
static std::string updateChannel;
|
||||||
static std::string chooseHomeTab;
|
static std::string chooseHomeTab;
|
||||||
@ -106,6 +107,7 @@ static bool showBackgroundImage = true;
|
|||||||
static bool isFullscreen = false;
|
static bool isFullscreen = false;
|
||||||
static std::string fullscreenMode = "Windowed";
|
static std::string fullscreenMode = "Windowed";
|
||||||
static bool isHDRAllowed = false;
|
static bool isHDRAllowed = false;
|
||||||
|
static bool showLabelsUnderIcons = true;
|
||||||
|
|
||||||
// Language
|
// Language
|
||||||
u32 m_language = 1; // english
|
u32 m_language = 1; // english
|
||||||
@ -167,10 +169,22 @@ bool isNeoModeConsole() {
|
|||||||
return isNeo;
|
return isNeo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isDevKitConsole() {
|
||||||
|
return isDevKit;
|
||||||
|
}
|
||||||
|
|
||||||
bool getIsFullscreen() {
|
bool getIsFullscreen() {
|
||||||
return isFullscreen;
|
return isFullscreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool getShowLabelsUnderIcons() {
|
||||||
|
return showLabelsUnderIcons;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool setShowLabelsUnderIcons() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::string getFullscreenMode() {
|
std::string getFullscreenMode() {
|
||||||
return fullscreenMode;
|
return fullscreenMode;
|
||||||
}
|
}
|
||||||
@ -422,6 +436,9 @@ void setVblankDiv(u32 value) {
|
|||||||
void setIsFullscreen(bool enable) {
|
void setIsFullscreen(bool enable) {
|
||||||
isFullscreen = enable;
|
isFullscreen = enable;
|
||||||
}
|
}
|
||||||
|
static void setShowLabelsUnderIcons(bool enable) {
|
||||||
|
showLabelsUnderIcons = enable;
|
||||||
|
}
|
||||||
|
|
||||||
void setFullscreenMode(std::string mode) {
|
void setFullscreenMode(std::string mode) {
|
||||||
fullscreenMode = mode;
|
fullscreenMode = mode;
|
||||||
@ -755,6 +772,7 @@ void load(const std::filesystem::path& path) {
|
|||||||
const toml::value& general = data.at("General");
|
const toml::value& general = data.at("General");
|
||||||
|
|
||||||
isNeo = toml::find_or<bool>(general, "isPS4Pro", false);
|
isNeo = toml::find_or<bool>(general, "isPS4Pro", false);
|
||||||
|
isDevKit = toml::find_or<bool>(general, "isDevKit", false);
|
||||||
playBGM = toml::find_or<bool>(general, "playBGM", false);
|
playBGM = toml::find_or<bool>(general, "playBGM", false);
|
||||||
isTrophyPopupDisabled = toml::find_or<bool>(general, "isTrophyPopupDisabled", false);
|
isTrophyPopupDisabled = toml::find_or<bool>(general, "isTrophyPopupDisabled", false);
|
||||||
trophyNotificationDuration =
|
trophyNotificationDuration =
|
||||||
@ -955,6 +973,7 @@ void save(const std::filesystem::path& path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
data["General"]["isPS4Pro"] = isNeo;
|
data["General"]["isPS4Pro"] = isNeo;
|
||||||
|
data["General"]["isDevKit"] = isDevKit;
|
||||||
data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled;
|
data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled;
|
||||||
data["General"]["trophyNotificationDuration"] = trophyNotificationDuration;
|
data["General"]["trophyNotificationDuration"] = trophyNotificationDuration;
|
||||||
data["General"]["playBGM"] = playBGM;
|
data["General"]["playBGM"] = playBGM;
|
||||||
@ -1101,6 +1120,7 @@ void saveMainWindow(const std::filesystem::path& path) {
|
|||||||
void setDefaultValues() {
|
void setDefaultValues() {
|
||||||
isHDRAllowed = false;
|
isHDRAllowed = false;
|
||||||
isNeo = false;
|
isNeo = false;
|
||||||
|
isDevKit = false;
|
||||||
isFullscreen = false;
|
isFullscreen = false;
|
||||||
isTrophyPopupDisabled = false;
|
isTrophyPopupDisabled = false;
|
||||||
playBGM = false;
|
playBGM = false;
|
||||||
@ -1109,7 +1129,7 @@ void setDefaultValues() {
|
|||||||
screenWidth = 1280;
|
screenWidth = 1280;
|
||||||
screenHeight = 720;
|
screenHeight = 720;
|
||||||
logFilter = "";
|
logFilter = "";
|
||||||
logType = "async";
|
logType = "sync";
|
||||||
userName = "shadPS4";
|
userName = "shadPS4";
|
||||||
if (Common::isRelease) {
|
if (Common::isRelease) {
|
||||||
updateChannel = "Release";
|
updateChannel = "Release";
|
||||||
|
@ -26,8 +26,11 @@ bool GetLoadGameSizeEnabled();
|
|||||||
std::filesystem::path GetSaveDataPath();
|
std::filesystem::path GetSaveDataPath();
|
||||||
void setLoadGameSizeEnabled(bool enable);
|
void setLoadGameSizeEnabled(bool enable);
|
||||||
bool getIsFullscreen();
|
bool getIsFullscreen();
|
||||||
|
bool getShowLabelsUnderIcons();
|
||||||
|
bool setShowLabelsUnderIcons();
|
||||||
std::string getFullscreenMode();
|
std::string getFullscreenMode();
|
||||||
bool isNeoModeConsole();
|
bool isNeoModeConsole();
|
||||||
|
bool isDevKitConsole();
|
||||||
bool getPlayBGM();
|
bool getPlayBGM();
|
||||||
int getBGMvolume();
|
int getBGMvolume();
|
||||||
bool getisTrophyPopupDisabled();
|
bool getisTrophyPopupDisabled();
|
||||||
|
@ -125,12 +125,15 @@ namespace {
|
|||||||
[[nodiscard]] constexpr int ToSeekOrigin(SeekOrigin origin) {
|
[[nodiscard]] constexpr int ToSeekOrigin(SeekOrigin origin) {
|
||||||
switch (origin) {
|
switch (origin) {
|
||||||
case SeekOrigin::SetOrigin:
|
case SeekOrigin::SetOrigin:
|
||||||
default:
|
|
||||||
return SEEK_SET;
|
return SEEK_SET;
|
||||||
case SeekOrigin::CurrentPosition:
|
case SeekOrigin::CurrentPosition:
|
||||||
return SEEK_CUR;
|
return SEEK_CUR;
|
||||||
case SeekOrigin::End:
|
case SeekOrigin::End:
|
||||||
return SEEK_END;
|
return SEEK_END;
|
||||||
|
default:
|
||||||
|
LOG_ERROR(Common_Filesystem, "Unsupported origin {}, defaulting to SEEK_SET",
|
||||||
|
static_cast<u32>(origin));
|
||||||
|
return SEEK_SET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@ enum class SeekOrigin : u32 {
|
|||||||
SetOrigin, // Seeks from the start of the file.
|
SetOrigin, // Seeks from the start of the file.
|
||||||
CurrentPosition, // Seeks from the current file pointer position.
|
CurrentPosition, // Seeks from the current file pointer position.
|
||||||
End, // Seeks from the end of the file.
|
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 {
|
class IOFile final {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "SDL3/SDL_log.h"
|
||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
|
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
@ -117,22 +118,6 @@ void L::DrawMenuBar() {
|
|||||||
|
|
||||||
EndMainMenuBar();
|
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) {
|
if (open_popup_options) {
|
||||||
OpenPopup("GPU Tools Options");
|
OpenPopup("GPU Tools Options");
|
||||||
just_opened_options = true;
|
just_opened_options = true;
|
||||||
@ -381,6 +366,32 @@ void L::Draw() {
|
|||||||
visibility_toggled = true;
|
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 (show_simple_fps) {
|
||||||
if (Begin("Video Info", nullptr,
|
if (Begin("Video Info", nullptr,
|
||||||
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration |
|
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration |
|
||||||
|
@ -19,6 +19,7 @@ public:
|
|||||||
static void SetupSettings();
|
static void SetupSettings();
|
||||||
|
|
||||||
void Draw() override;
|
void Draw() override;
|
||||||
|
bool show_pause_status = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Core::Devtools
|
} // namespace Core::Devtools
|
||||||
|
@ -65,10 +65,10 @@ constexpr int ORBIS_KERNEL_O_DSYNC = 0x1000;
|
|||||||
constexpr int ORBIS_KERNEL_O_DIRECT = 0x00010000;
|
constexpr int ORBIS_KERNEL_O_DIRECT = 0x00010000;
|
||||||
constexpr int ORBIS_KERNEL_O_DIRECTORY = 0x00020000;
|
constexpr int ORBIS_KERNEL_O_DIRECTORY = 0x00020000;
|
||||||
|
|
||||||
s64 PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes);
|
s64 PS4_SYSV_ABI sceKernelWrite(s32 fd, const void* buf, size_t nbytes);
|
||||||
s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes);
|
s64 PS4_SYSV_ABI sceKernelRead(s32 fd, void* buf, size_t nbytes);
|
||||||
s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset);
|
s64 PS4_SYSV_ABI sceKernelPread(s32 fd, 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 sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset);
|
||||||
void RegisterFileSystem(Core::Loader::SymbolsResolver* sym);
|
void RegisterFileSystem(Core::Loader::SymbolsResolver* sym);
|
||||||
|
|
||||||
} // namespace Libraries::Kernel
|
} // namespace Libraries::Kernel
|
||||||
|
@ -85,17 +85,23 @@ int ErrnoToSceKernelError(int error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetPosixErrno(int e) {
|
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) {
|
switch (e) {
|
||||||
case EPERM:
|
case EPERM:
|
||||||
g_posix_errno = POSIX_EPERM;
|
g_posix_errno = POSIX_EPERM;
|
||||||
break;
|
break;
|
||||||
case EAGAIN:
|
case ENOENT:
|
||||||
g_posix_errno = POSIX_EAGAIN;
|
g_posix_errno = POSIX_ENOENT;
|
||||||
|
break;
|
||||||
|
case EDEADLK:
|
||||||
|
g_posix_errno = POSIX_EDEADLK;
|
||||||
break;
|
break;
|
||||||
case ENOMEM:
|
case ENOMEM:
|
||||||
g_posix_errno = POSIX_ENOMEM;
|
g_posix_errno = POSIX_ENOMEM;
|
||||||
break;
|
break;
|
||||||
|
case EACCES:
|
||||||
|
g_posix_errno = POSIX_EACCES;
|
||||||
|
break;
|
||||||
case EINVAL:
|
case EINVAL:
|
||||||
g_posix_errno = POSIX_EINVAL;
|
g_posix_errno = POSIX_EINVAL;
|
||||||
break;
|
break;
|
||||||
@ -105,13 +111,14 @@ void SetPosixErrno(int e) {
|
|||||||
case ERANGE:
|
case ERANGE:
|
||||||
g_posix_errno = POSIX_ERANGE;
|
g_posix_errno = POSIX_ERANGE;
|
||||||
break;
|
break;
|
||||||
case EDEADLK:
|
case EAGAIN:
|
||||||
g_posix_errno = POSIX_EDEADLK;
|
g_posix_errno = POSIX_EAGAIN;
|
||||||
break;
|
break;
|
||||||
case ETIMEDOUT:
|
case ETIMEDOUT:
|
||||||
g_posix_errno = POSIX_ETIMEDOUT;
|
g_posix_errno = POSIX_ETIMEDOUT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
LOG_WARNING(Kernel, "Unhandled errno {}", e);
|
||||||
g_posix_errno = e;
|
g_posix_errno = e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,14 +140,6 @@ void PS4_SYSV_ABI sceLibcHeapGetTraceInfo(HeapInfoInfo* info) {
|
|||||||
info->getSegmentInfo = 0;
|
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 {
|
struct OrbisKernelUuid {
|
||||||
u32 timeLow;
|
u32 timeLow;
|
||||||
u16 timeMid;
|
u16 timeMid;
|
||||||
@ -229,13 +228,10 @@ void RegisterKernel(Core::Loader::SymbolsResolver* sym) {
|
|||||||
LIB_FUNCTION("Xjoosiw+XPI", "libkernel", 1, "libkernel", 1, 1, sceKernelUuidCreate);
|
LIB_FUNCTION("Xjoosiw+XPI", "libkernel", 1, "libkernel", 1, 1, sceKernelUuidCreate);
|
||||||
LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail);
|
LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail);
|
||||||
LIB_FUNCTION("9BcDykPmo1I", "libkernel", 1, "libkernel", 1, 1, __Error);
|
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", "libkernel", 1, "libkernel", 1, 1, posix_getpagesize);
|
||||||
LIB_FUNCTION("k+AXqu2-eBc", "libScePosix", 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,
|
LIB_FUNCTION("NWtTN10cJzE", "libSceLibcInternalExt", 1, "libSceLibcInternal", 1, 1,
|
||||||
sceLibcHeapGetTraceInfo);
|
sceLibcHeapGetTraceInfo);
|
||||||
LIB_FUNCTION("FxVZqBAA7ks", "libkernel", 1, "libkernel", 1, 1, ps4__write);
|
|
||||||
LIB_FUNCTION("FN4gaPmuFV8", "libScePosix", 1, "libkernel", 1, 1, ps4__write);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Libraries::Kernel
|
} // namespace Libraries::Kernel
|
||||||
|
@ -5,21 +5,480 @@
|
|||||||
#include "core/libraries/error_codes.h"
|
#include "core/libraries/error_codes.h"
|
||||||
#include "core/libraries/libs.h"
|
#include "core/libraries/libs.h"
|
||||||
#include "core/libraries/ngs2/ngs2.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_error.h"
|
||||||
|
#include "core/libraries/ngs2/ngs2_geom.h"
|
||||||
#include "core/libraries/ngs2/ngs2_impl.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 {
|
namespace Libraries::Ngs2 {
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNgs2CalcWaveformBlock() {
|
// Ngs2
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
|
||||||
|
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;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNgs2CustomRackGetModuleInfo() {
|
s32 PS4_SYSV_ABI sceNgs2GetWaveformFrameInfo(const OrbisNgs2WaveformFormat* format,
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
u32* outFrameSize, u32* outNumFrameSamples,
|
||||||
|
u32* outUnitsPerFrame, u32* outNumDelaySamples) {
|
||||||
|
LOG_INFO(Lib_Ngs2, "called");
|
||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2FftInit() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
@ -35,31 +494,6 @@ int PS4_SYSV_ABI sceNgs2FftQuerySize() {
|
|||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2JobSchedulerResetOption() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
@ -80,71 +514,6 @@ int PS4_SYSV_ABI sceNgs2ModuleQueueEnumItems() {
|
|||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2RackQueryInfo() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
@ -155,116 +524,21 @@ int PS4_SYSV_ABI sceNgs2RackRunCommands() {
|
|||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2SystemQueryInfo() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2SystemRunCommands() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNgs2SystemSetGrainSamples() {
|
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
|
||||||
return ORBIS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNgs2SystemSetLoudThreshold() {
|
int PS4_SYSV_ABI sceNgs2SystemSetLoudThreshold() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2StreamCreate() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
@ -300,36 +574,6 @@ int PS4_SYSV_ABI sceNgs2StreamRunCommands() {
|
|||||||
return ORBIS_OK;
|
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() {
|
int PS4_SYSV_ABI sceNgs2VoiceQueryInfo() {
|
||||||
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
LOG_ERROR(Lib_Ngs2, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
|
@ -3,7 +3,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/libraries/ngs2/ngs2_impl.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <mutex>
|
||||||
|
#include <vector>
|
||||||
#include "common/types.h"
|
#include "common/types.h"
|
||||||
|
|
||||||
namespace Core::Loader {
|
namespace Core::Loader {
|
||||||
@ -12,60 +16,253 @@ class SymbolsResolver;
|
|||||||
|
|
||||||
namespace Libraries::Ngs2 {
|
namespace Libraries::Ngs2 {
|
||||||
|
|
||||||
class Ngs2;
|
typedef s32 (*OrbisNgs2ParseReadHandler)(uintptr_t userData, u32 offset, void* data, size_t size);
|
||||||
|
|
||||||
using SceNgs2Handle = Ngs2*;
|
enum class OrbisNgs2HandleType : u32 {
|
||||||
|
Invalid = 0,
|
||||||
enum class SceNgs2HandleType : u32 {
|
System = 1,
|
||||||
System = 0,
|
Rack = 2,
|
||||||
|
Voice = 3,
|
||||||
|
VoiceControl = 6
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ngs2Handle {
|
static const int ORBIS_NGS2_MAX_VOICE_CHANNELS = 8;
|
||||||
void* selfPointer;
|
static const int ORBIS_NGS2_WAVEFORM_INFO_MAX_BLOCKS = 4;
|
||||||
void* dataPointer;
|
static const int ORBIS_NGS2_MAX_MATRIX_LEVELS =
|
||||||
std::atomic<u32>* atomicPtr;
|
(ORBIS_NGS2_MAX_VOICE_CHANNELS * ORBIS_NGS2_MAX_VOICE_CHANNELS);
|
||||||
u32 handleType;
|
|
||||||
u32 flags_unk;
|
|
||||||
|
|
||||||
u32 uid;
|
struct OrbisNgs2WaveformFormat {
|
||||||
u16 maxGrainSamples;
|
u32 waveformType;
|
||||||
u16 minGrainSamples;
|
u32 numChannels;
|
||||||
u16 currentGrainSamples;
|
|
||||||
u16 numGrainSamples;
|
|
||||||
u16 unknown2;
|
|
||||||
u32 sampleRate;
|
u32 sampleRate;
|
||||||
u32 unknown3;
|
u32 configData;
|
||||||
|
u32 frameOffset;
|
||||||
void* flushMutex;
|
u32 frameMargin;
|
||||||
u32 flushMutexInitialized;
|
|
||||||
void* processMutex;
|
|
||||||
u32 processMutexInitialized;
|
|
||||||
|
|
||||||
// Linked list pointers for system list
|
|
||||||
Ngs2Handle* prev;
|
|
||||||
Ngs2Handle* next;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SystemOptions {
|
struct OrbisNgs2WaveformBlock {
|
||||||
char padding[6];
|
u32 dataOffset;
|
||||||
s32 maxGrainSamples;
|
u32 dataSize;
|
||||||
s32 numGrainSamples;
|
u32 numRepeats;
|
||||||
s32 sampleRate;
|
u32 numSkipSamples;
|
||||||
|
u32 numSamples;
|
||||||
|
u32 reserved;
|
||||||
|
uintptr_t userData;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SystemState {
|
struct OrbisNgs2WaveformInfo {
|
||||||
// TODO
|
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 {
|
struct OrbisNgs2EnvelopePoint {
|
||||||
void** top;
|
u32 curve;
|
||||||
void* base;
|
u32 duration;
|
||||||
void* curr;
|
float height;
|
||||||
size_t usedSize;
|
};
|
||||||
size_t totalSize;
|
|
||||||
size_t alignment;
|
struct OrbisNgs2UserFxProcessContext {
|
||||||
char isVerifyEnabled;
|
float** aChannelData;
|
||||||
char padding[7];
|
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);
|
void RegisterlibSceNgs2(Core::Loader::SymbolsResolver* sym);
|
||||||
|
12
src/core/libraries/ngs2/ngs2_custom.cpp
Normal file
@ -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
|
444
src/core/libraries/ngs2/ngs2_custom.h
Normal file
@ -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
|
12
src/core/libraries/ngs2/ngs2_eq.cpp
Normal file
@ -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
|
41
src/core/libraries/ngs2/ngs2_eq.h
Normal file
@ -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
|
12
src/core/libraries/ngs2/ngs2_geom.cpp
Normal file
@ -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
|
80
src/core/libraries/ngs2/ngs2_geom.h
Normal file
@ -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
|
@ -12,153 +12,171 @@ using namespace Libraries::Kernel;
|
|||||||
|
|
||||||
namespace Libraries::Ngs2 {
|
namespace Libraries::Ngs2 {
|
||||||
|
|
||||||
s32 Ngs2::ReportInvalid(Ngs2Handle* handle, u32 handle_type) const {
|
s32 HandleReportInvalid(OrbisNgs2Handle handle, u32 handleType) {
|
||||||
uintptr_t hAddress = reinterpret_cast<uintptr_t>(handle);
|
switch (handleType) {
|
||||||
switch (handle_type) {
|
|
||||||
case 1:
|
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;
|
return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE;
|
||||||
case 2:
|
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;
|
return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE;
|
||||||
case 4:
|
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;
|
return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE;
|
||||||
case 8:
|
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;
|
return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE;
|
||||||
default:
|
default:
|
||||||
LOG_ERROR(Lib_Ngs2, "Invalid handle {}", hAddress);
|
LOG_ERROR(Lib_Ngs2, "Invalid handle {}", handle);
|
||||||
return ORBIS_NGS2_ERROR_INVALID_HANDLE;
|
return ORBIS_NGS2_ERROR_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Ngs2::HandleSetup(Ngs2Handle* handle, void* data, std::atomic<u32>* atomic, u32 type,
|
void* MemoryClear(void* buffer, size_t size) {
|
||||||
u32 flags) {
|
return memset(buffer, 0, size);
|
||||||
handle->dataPointer = data;
|
|
||||||
handle->atomicPtr = atomic;
|
|
||||||
handle->handleType = type;
|
|
||||||
handle->flags_unk = flags;
|
|
||||||
return ORBIS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Ngs2::HandleCleanup(Ngs2Handle* handle, u32 hType, void* dataOut) {
|
s32 StackBufferClose(StackBuffer* stackBuffer, size_t* outTotalSize) {
|
||||||
if (handle && handle->selfPointer == handle) {
|
if (outTotalSize) {
|
||||||
std::atomic<u32>* tmp_atomic = handle->atomicPtr;
|
*outTotalSize = stackBuffer->usedSize + stackBuffer->alignment;
|
||||||
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<u32>* 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;
|
|
||||||
}
|
}
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Ngs2::HandleLeave(Ngs2Handle* handle) {
|
s32 StackBufferOpen(StackBuffer* stackBuffer, void* bufferStart, size_t bufferSize,
|
||||||
std::atomic<u32>* tmp_atomic;
|
void** outBuffer, u8 flags) {
|
||||||
u32 i;
|
stackBuffer->top = outBuffer;
|
||||||
do {
|
stackBuffer->base = bufferStart;
|
||||||
tmp_atomic = handle->atomicPtr;
|
stackBuffer->size = (size_t)bufferStart;
|
||||||
i = tmp_atomic->load();
|
stackBuffer->currentOffset = (size_t)bufferStart;
|
||||||
} while (!tmp_atomic->compare_exchange_strong(i, i - 1));
|
stackBuffer->usedSize = 0;
|
||||||
return ORBIS_OK;
|
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,
|
if (outBuffer != NULL) {
|
||||||
bool verify) {
|
*outBuffer = NULL;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Ngs2::StackBufferClose(StackBuffer* buf, size_t* usedSize) {
|
s32 SystemCleanup(OrbisNgs2Handle systemHandle, OrbisNgs2ContextBufferInfo* outInfo) {
|
||||||
if (usedSize) {
|
if (!systemHandle) {
|
||||||
*usedSize = buf->usedSize + buf->alignment;
|
return ORBIS_NGS2_ERROR_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
|
||||||
return ORBIS_OK;
|
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 maxGrainSamples = 512;
|
||||||
u32 numGrainSamples = 256;
|
u32 numGrainSamples = 256;
|
||||||
u32 sampleRate = 48000;
|
u32 sampleRate = 48000;
|
||||||
|
|
||||||
if (options) {
|
if (option) {
|
||||||
maxGrainSamples = options->maxGrainSamples;
|
sampleRate = option->sampleRate;
|
||||||
numGrainSamples = options->numGrainSamples;
|
maxGrainSamples = option->maxGrainSamples;
|
||||||
sampleRate = options->sampleRate;
|
numGrainSamples = option->numGrainSamples;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate maxGrainSamples
|
if (maxGrainSamples < 64 || maxGrainSamples > 1024 || (maxGrainSamples & 63) != 0) {
|
||||||
if (maxGrainSamples < 64 || maxGrainSamples > 1024 || (maxGrainSamples & 0x3F) != 0) {
|
|
||||||
LOG_ERROR(Lib_Ngs2, "Invalid system option (maxGrainSamples={},x64)", maxGrainSamples);
|
LOG_ERROR(Lib_Ngs2, "Invalid system option (maxGrainSamples={},x64)", maxGrainSamples);
|
||||||
return ORBIS_NGS2_ERROR_INVALID_MAX_GRAIN_SAMPLES;
|
return ORBIS_NGS2_ERROR_INVALID_MAX_GRAIN_SAMPLES;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate numGrainSamples
|
if (numGrainSamples < 64 || numGrainSamples > 1024 || (numGrainSamples & 63) != 0) {
|
||||||
if (numGrainSamples < 64 || numGrainSamples > 1024 || (numGrainSamples & 0x3F) != 0) {
|
|
||||||
LOG_ERROR(Lib_Ngs2, "Invalid system option (numGrainSamples={},x64)", numGrainSamples);
|
LOG_ERROR(Lib_Ngs2, "Invalid system option (numGrainSamples={},x64)", numGrainSamples);
|
||||||
return ORBIS_NGS2_ERROR_INVALID_NUM_GRAIN_SAMPLES;
|
return ORBIS_NGS2_ERROR_INVALID_NUM_GRAIN_SAMPLES;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate sampleRate
|
|
||||||
if (sampleRate != 11025 && sampleRate != 12000 && sampleRate != 22050 && sampleRate != 24000 &&
|
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);
|
LOG_ERROR(Lib_Ngs2, "Invalid system option(sampleRate={}:44.1/48kHz series)", sampleRate);
|
||||||
return ORBIS_NGS2_ERROR_INVALID_SAMPLE_RATE;
|
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
|
// 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
|
} // namespace Libraries::Ngs2
|
||||||
|
@ -3,23 +3,176 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ngs2.h"
|
#include "core/libraries/kernel/threads/pthread.h"
|
||||||
|
|
||||||
namespace Libraries::Ngs2 {
|
namespace Libraries::Ngs2 {
|
||||||
|
|
||||||
class Ngs2 {
|
static const int ORBIS_NGS2_SYSTEM_NAME_LENGTH = 16;
|
||||||
public:
|
static const int ORBIS_NGS2_RACK_NAME_LENGTH = 16;
|
||||||
s32 ReportInvalid(Ngs2Handle* handle, u32 handle_type) const;
|
|
||||||
s32 HandleSetup(Ngs2Handle* handle, void* data, std::atomic<u32>* 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);
|
|
||||||
|
|
||||||
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<int> 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<int> 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
|
} // namespace Libraries::Ngs2
|
||||||
|
12
src/core/libraries/ngs2/ngs2_mastering.cpp
Normal file
@ -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
|
81
src/core/libraries/ngs2/ngs2_mastering.h
Normal file
@ -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
|
12
src/core/libraries/ngs2/ngs2_pan.cpp
Normal file
@ -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
|
25
src/core/libraries/ngs2/ngs2_pan.h
Normal file
@ -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
|
12
src/core/libraries/ngs2/ngs2_report.cpp
Normal file
@ -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
|
78
src/core/libraries/ngs2/ngs2_report.h
Normal file
@ -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 <stdarg.h> // 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
|
12
src/core/libraries/ngs2/ngs2_reverb.cpp
Normal file
@ -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
|
61
src/core/libraries/ngs2/ngs2_reverb.h
Normal file
@ -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
|
12
src/core/libraries/ngs2/ngs2_sampler.cpp
Normal file
@ -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
|
162
src/core/libraries/ngs2/ngs2_sampler.h
Normal file
@ -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
|
12
src/core/libraries/ngs2/ngs2_submixer.cpp
Normal file
@ -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
|
126
src/core/libraries/ngs2/ngs2_submixer.h
Normal file
@ -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
|
@ -38,6 +38,16 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1
|
|||||||
bool use_extended_mem2) {
|
bool use_extended_mem2) {
|
||||||
const bool is_neo = ::Libraries::Kernel::sceKernelIsNeoMode();
|
const bool is_neo = ::Libraries::Kernel::sceKernelIsNeoMode();
|
||||||
auto total_size = is_neo ? SCE_KERNEL_TOTAL_MEM_PRO : SCE_KERNEL_TOTAL_MEM;
|
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) {
|
if (!use_extended_mem1 && is_neo) {
|
||||||
total_size -= 256_MB;
|
total_size -= 256_MB;
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 4.0 KiB |
BIN
src/images/fullscreen_icon.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 965 B After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.3 KiB |
BIN
src/images/refreshlist_icon.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
src/images/restart_game_icon.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 658 B After Width: | Height: | Size: 1.6 KiB |
@ -1,6 +1,8 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "SDL3/SDL_events.h"
|
||||||
|
|
||||||
#include <QDockWidget>
|
#include <QDockWidget>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QPlainTextEdit>
|
#include <QPlainTextEdit>
|
||||||
@ -132,23 +134,160 @@ void MainWindow::CreateActions() {
|
|||||||
m_theme_act_group->addAction(ui->setThemeOled);
|
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() {
|
void MainWindow::AddUiWidgets() {
|
||||||
// add toolbar widgets
|
// add toolbar widgets
|
||||||
QApplication::setStyle("Fusion");
|
QApplication::setStyle("Fusion");
|
||||||
ui->toolBar->setObjectName("mw_toolbar");
|
|
||||||
ui->toolBar->addWidget(ui->playButton);
|
bool showLabels = ui->toggleLabelsAct->isChecked();
|
||||||
ui->toolBar->addWidget(ui->pauseButton);
|
ui->toolBar->clear();
|
||||||
ui->toolBar->addWidget(ui->stopButton);
|
|
||||||
ui->toolBar->addWidget(ui->refreshButton);
|
ui->toolBar->addWidget(createSpacer(this));
|
||||||
ui->toolBar->addWidget(ui->settingsButton);
|
ui->toolBar->addWidget(createButtonWithLabel(ui->playButton, tr("Play"), showLabels));
|
||||||
ui->toolBar->addWidget(ui->controllerButton);
|
ui->toolBar->addWidget(createButtonWithLabel(ui->pauseButton, tr("Pause"), showLabels));
|
||||||
ui->toolBar->addWidget(ui->keyboardButton);
|
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);
|
QFrame* line = new QFrame(this);
|
||||||
line->setFrameShape(QFrame::StyledPanel);
|
line->setFrameShape(QFrame::VLine);
|
||||||
line->setFrameShadow(QFrame::Sunken);
|
line->setFrameShadow(QFrame::Sunken);
|
||||||
|
line->setMinimumWidth(2);
|
||||||
ui->toolBar->addWidget(line);
|
ui->toolBar->addWidget(line);
|
||||||
ui->toolBar->addWidget(ui->sizeSliderContainer);
|
ui->toolBar->addWidget(createSpacer(this));
|
||||||
ui->toolBar->addWidget(ui->mw_searchbar);
|
if (showLabels) {
|
||||||
|
QLabel* pauseButtonLabel = ui->pauseButton->parentWidget()->findChild<QLabel*>();
|
||||||
|
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<QLabel*>();
|
||||||
|
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<QLabel*>();
|
||||||
|
if (pauseButtonLabel) {
|
||||||
|
pauseButtonLabel->setText(is_paused ? tr("Resume") : tr("Pause"));
|
||||||
|
pauseButtonLabel->setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::UpdateToolbarLabels() {
|
||||||
|
AddUiWidgets();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::CreateDockWindows() {
|
void MainWindow::CreateDockWindows() {
|
||||||
@ -253,6 +392,8 @@ void MainWindow::CreateConnects() {
|
|||||||
connect(ui->refreshButton, &QPushButton::clicked, this, &MainWindow::RefreshGameTable);
|
connect(ui->refreshButton, &QPushButton::clicked, this, &MainWindow::RefreshGameTable);
|
||||||
connect(ui->showGameListAct, &QAction::triggered, this, &MainWindow::ShowGameList);
|
connect(ui->showGameListAct, &QAction::triggered, this, &MainWindow::ShowGameList);
|
||||||
connect(this, &MainWindow::ExtractionFinished, this, &MainWindow::RefreshGameTable);
|
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) {
|
connect(ui->sizeSlider, &QSlider::valueChanged, this, [this](int value) {
|
||||||
if (isTableList) {
|
if (isTableList) {
|
||||||
@ -276,6 +417,7 @@ void MainWindow::CreateConnects() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
connect(ui->playButton, &QPushButton::clicked, this, &MainWindow::StartGame);
|
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,
|
connect(m_game_grid_frame.get(), &QTableWidget::cellDoubleClicked, this,
|
||||||
&MainWindow::StartGame);
|
&MainWindow::StartGame);
|
||||||
connect(m_game_list_frame.get(), &QTableWidget::cellDoubleClicked, this,
|
connect(m_game_list_frame.get(), &QTableWidget::cellDoubleClicked, this,
|
||||||
@ -743,6 +885,8 @@ void MainWindow::StartGame() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
StartEmulator(path);
|
StartEmulator(path);
|
||||||
|
|
||||||
|
UpdateToolbarButtons();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1217,7 +1361,9 @@ void MainWindow::SetUiIcons(bool isWhite) {
|
|||||||
ui->pauseButton->setIcon(RecolorIcon(ui->pauseButton->icon(), isWhite));
|
ui->pauseButton->setIcon(RecolorIcon(ui->pauseButton->icon(), isWhite));
|
||||||
ui->stopButton->setIcon(RecolorIcon(ui->stopButton->icon(), isWhite));
|
ui->stopButton->setIcon(RecolorIcon(ui->stopButton->icon(), isWhite));
|
||||||
ui->refreshButton->setIcon(RecolorIcon(ui->refreshButton->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->settingsButton->setIcon(RecolorIcon(ui->settingsButton->icon(), isWhite));
|
||||||
|
ui->fullscreenButton->setIcon(RecolorIcon(ui->fullscreenButton->icon(), isWhite));
|
||||||
ui->controllerButton->setIcon(RecolorIcon(ui->controllerButton->icon(), isWhite));
|
ui->controllerButton->setIcon(RecolorIcon(ui->controllerButton->icon(), isWhite));
|
||||||
ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite));
|
ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite));
|
||||||
ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite));
|
ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite));
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <QActionGroup>
|
#include <QActionGroup>
|
||||||
#include <QDragEnterEvent>
|
#include <QDragEnterEvent>
|
||||||
|
#include <QProcess>
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
|
|
||||||
#include "background_music_player.h"
|
#include "background_music_player.h"
|
||||||
@ -38,6 +39,8 @@ public:
|
|||||||
void InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg);
|
void InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg);
|
||||||
void InstallDirectory();
|
void InstallDirectory();
|
||||||
void StartGame();
|
void StartGame();
|
||||||
|
void PauseGame();
|
||||||
|
bool showLabels;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void ConfigureGuiFromSettings();
|
void ConfigureGuiFromSettings();
|
||||||
@ -47,15 +50,21 @@ private Q_SLOTS:
|
|||||||
void RefreshGameTable();
|
void RefreshGameTable();
|
||||||
void HandleResize(QResizeEvent* event);
|
void HandleResize(QResizeEvent* event);
|
||||||
void OnLanguageChanged(const std::string& locale);
|
void OnLanguageChanged(const std::string& locale);
|
||||||
|
void toggleLabelsUnderIcons();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui_MainWindow* ui;
|
Ui_MainWindow* ui;
|
||||||
void AddUiWidgets();
|
void AddUiWidgets();
|
||||||
|
void UpdateToolbarLabels();
|
||||||
|
void UpdateToolbarButtons();
|
||||||
|
QWidget* createButtonWithLabel(QPushButton* button, const QString& labelText, bool showLabel);
|
||||||
void CreateActions();
|
void CreateActions();
|
||||||
|
void toggleFullscreen();
|
||||||
void CreateRecentGameActions();
|
void CreateRecentGameActions();
|
||||||
void CreateDockWindows();
|
void CreateDockWindows();
|
||||||
void GetPhysicalDevices();
|
void GetPhysicalDevices();
|
||||||
void LoadGameLists();
|
void LoadGameLists();
|
||||||
|
|
||||||
#ifdef ENABLE_UPDATER
|
#ifdef ENABLE_UPDATER
|
||||||
void CheckUpdateMain(bool checkSave);
|
void CheckUpdateMain(bool checkSave);
|
||||||
#endif
|
#endif
|
||||||
@ -73,6 +82,9 @@ private:
|
|||||||
bool isIconBlack = false;
|
bool isIconBlack = false;
|
||||||
bool isTableList = true;
|
bool isTableList = true;
|
||||||
bool isGameRunning = false;
|
bool isGameRunning = false;
|
||||||
|
bool isWhite = false;
|
||||||
|
bool is_paused = false;
|
||||||
|
|
||||||
QActionGroup* m_icon_size_act_group = nullptr;
|
QActionGroup* m_icon_size_act_group = nullptr;
|
||||||
QActionGroup* m_list_mode_act_group = nullptr;
|
QActionGroup* m_list_mode_act_group = nullptr;
|
||||||
QActionGroup* m_theme_act_group = nullptr;
|
QActionGroup* m_theme_act_group = nullptr;
|
||||||
|
@ -19,7 +19,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) {
|
|||||||
themePalette.setColor(QPalette::WindowText, Qt::white);
|
themePalette.setColor(QPalette::WindowText, Qt::white);
|
||||||
themePalette.setColor(QPalette::Base, QColor(20, 20, 20));
|
themePalette.setColor(QPalette::Base, QColor(20, 20, 20));
|
||||||
themePalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
|
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::ToolTipText, Qt::white);
|
||||||
themePalette.setColor(QPalette::Text, Qt::white);
|
themePalette.setColor(QPalette::Text, Qt::white);
|
||||||
themePalette.setColor(QPalette::Button, QColor(53, 53, 53));
|
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; }"
|
"border-radius: 4px; padding: 5px; }"
|
||||||
"QLineEdit:focus {"
|
"QLineEdit:focus {"
|
||||||
"border: 1px solid #2A82DA; }");
|
"border: 1px solid #2A82DA; }");
|
||||||
themePalette.setColor(QPalette::Window, QColor(240, 240, 240)); // Light gray
|
themePalette.setColor(QPalette::Window, QColor(240, 240, 240)); // Light gray
|
||||||
themePalette.setColor(QPalette::WindowText, Qt::black); // Black
|
themePalette.setColor(QPalette::WindowText, Qt::black); // Black
|
||||||
themePalette.setColor(QPalette::Base, QColor(230, 230, 230, 80)); // Grayish
|
themePalette.setColor(QPalette::Base, QColor(230, 230, 230, 80)); // Grayish
|
||||||
themePalette.setColor(QPalette::ToolTipBase, Qt::black); // Black
|
themePalette.setColor(QPalette::ToolTipBase, QColor(230, 230, 230, 80)); // Grayish
|
||||||
themePalette.setColor(QPalette::ToolTipText, Qt::black); // Black
|
themePalette.setColor(QPalette::ToolTipText, Qt::black); // Black
|
||||||
themePalette.setColor(QPalette::Text, Qt::black); // Black
|
themePalette.setColor(QPalette::Text, Qt::black); // Black
|
||||||
themePalette.setColor(QPalette::Button, QColor(240, 240, 240)); // Light gray
|
themePalette.setColor(QPalette::Button, QColor(240, 240, 240)); // Light gray
|
||||||
themePalette.setColor(QPalette::ButtonText, Qt::black); // Black
|
themePalette.setColor(QPalette::ButtonText, Qt::black); // Black
|
||||||
themePalette.setColor(QPalette::BrightText, Qt::red); // Red
|
themePalette.setColor(QPalette::BrightText, Qt::red); // Red
|
||||||
themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); // Blue
|
themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); // Blue
|
||||||
themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); // Blue
|
themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); // Blue
|
||||||
themePalette.setColor(QPalette::HighlightedText, Qt::white); // White
|
themePalette.setColor(QPalette::HighlightedText, Qt::white); // White
|
||||||
qApp->setPalette(themePalette);
|
qApp->setPalette(themePalette);
|
||||||
break;
|
break;
|
||||||
case Theme::Green:
|
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::WindowText, Qt::white); // White text
|
||||||
themePalette.setColor(QPalette::Base, QColor(25, 40, 25)); // Darker green base
|
themePalette.setColor(QPalette::Base, QColor(25, 40, 25)); // Darker green base
|
||||||
themePalette.setColor(QPalette::AlternateBase,
|
themePalette.setColor(QPalette::AlternateBase,
|
||||||
QColor(53, 69, 53)); // Dark green alternate base
|
QColor(53, 69, 53)); // Dark green alternate base
|
||||||
themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background
|
themePalette.setColor(QPalette::ToolTipBase,
|
||||||
|
QColor(25, 40, 25)); // White tooltip background
|
||||||
themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text
|
themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text
|
||||||
themePalette.setColor(QPalette::Text, Qt::white); // White text
|
themePalette.setColor(QPalette::Text, Qt::white); // White text
|
||||||
themePalette.setColor(QPalette::Button, QColor(53, 69, 53)); // Dark green button
|
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::WindowText, Qt::white); // White text
|
||||||
themePalette.setColor(QPalette::Base, QColor(20, 40, 60)); // Darker blue base
|
themePalette.setColor(QPalette::Base, QColor(20, 40, 60)); // Darker blue base
|
||||||
themePalette.setColor(QPalette::AlternateBase,
|
themePalette.setColor(QPalette::AlternateBase,
|
||||||
QColor(40, 60, 90)); // Dark blue alternate base
|
QColor(40, 60, 90)); // Dark blue alternate base
|
||||||
themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background
|
themePalette.setColor(QPalette::ToolTipBase,
|
||||||
|
QColor(20, 40, 60)); // White tooltip background
|
||||||
themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text
|
themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text
|
||||||
themePalette.setColor(QPalette::Text, Qt::white); // White text
|
themePalette.setColor(QPalette::Text, Qt::white); // White text
|
||||||
themePalette.setColor(QPalette::Button, QColor(40, 60, 90)); // Dark blue button
|
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::WindowText, Qt::white); // White text
|
||||||
themePalette.setColor(QPalette::Base, QColor(80, 30, 90)); // Darker violet base
|
themePalette.setColor(QPalette::Base, QColor(80, 30, 90)); // Darker violet base
|
||||||
themePalette.setColor(QPalette::AlternateBase,
|
themePalette.setColor(QPalette::AlternateBase,
|
||||||
QColor(100, 50, 120)); // Violet alternate base
|
QColor(100, 50, 120)); // Violet alternate base
|
||||||
themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background
|
themePalette.setColor(QPalette::ToolTipBase,
|
||||||
|
QColor(80, 30, 90)); // White tooltip background
|
||||||
themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text
|
themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text
|
||||||
themePalette.setColor(QPalette::Text, Qt::white); // White text
|
themePalette.setColor(QPalette::Text, Qt::white); // White text
|
||||||
themePalette.setColor(QPalette::Button, QColor(100, 50, 120)); // Violet button
|
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::WindowText, QColor(249, 245, 215));
|
||||||
themePalette.setColor(QPalette::Base, QColor(29, 32, 33));
|
themePalette.setColor(QPalette::Base, QColor(29, 32, 33));
|
||||||
themePalette.setColor(QPalette::AlternateBase, QColor(50, 48, 47));
|
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::ToolTipText, QColor(249, 245, 215));
|
||||||
themePalette.setColor(QPalette::Text, QColor(249, 245, 215));
|
themePalette.setColor(QPalette::Text, QColor(249, 245, 215));
|
||||||
themePalette.setColor(QPalette::Button, QColor(40, 40, 40));
|
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::WindowText, QColor(192, 202, 245));
|
||||||
themePalette.setColor(QPalette::Base, QColor(25, 28, 39));
|
themePalette.setColor(QPalette::Base, QColor(25, 28, 39));
|
||||||
themePalette.setColor(QPalette::AlternateBase, QColor(36, 40, 59));
|
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::ToolTipText, QColor(192, 202, 245));
|
||||||
themePalette.setColor(QPalette::Text, QColor(192, 202, 245));
|
themePalette.setColor(QPalette::Text, QColor(192, 202, 245));
|
||||||
themePalette.setColor(QPalette::Button, QColor(30, 30, 41));
|
themePalette.setColor(QPalette::Button, QColor(30, 30, 41));
|
||||||
|
@ -20,6 +20,7 @@ public:
|
|||||||
QAction* setIconSizeSmallAct;
|
QAction* setIconSizeSmallAct;
|
||||||
QAction* setIconSizeMediumAct;
|
QAction* setIconSizeMediumAct;
|
||||||
QAction* setIconSizeLargeAct;
|
QAction* setIconSizeLargeAct;
|
||||||
|
QAction* toggleLabelsAct;
|
||||||
QAction* setlistModeListAct;
|
QAction* setlistModeListAct;
|
||||||
QAction* setlistModeGridAct;
|
QAction* setlistModeGridAct;
|
||||||
QAction* setlistElfAct;
|
QAction* setlistElfAct;
|
||||||
@ -50,6 +51,8 @@ public:
|
|||||||
QPushButton* settingsButton;
|
QPushButton* settingsButton;
|
||||||
QPushButton* controllerButton;
|
QPushButton* controllerButton;
|
||||||
QPushButton* keyboardButton;
|
QPushButton* keyboardButton;
|
||||||
|
QPushButton* fullscreenButton;
|
||||||
|
QPushButton* restartButton;
|
||||||
|
|
||||||
QWidget* sizeSliderContainer;
|
QWidget* sizeSliderContainer;
|
||||||
QHBoxLayout* sizeSliderContainer_layout;
|
QHBoxLayout* sizeSliderContainer_layout;
|
||||||
@ -104,7 +107,15 @@ public:
|
|||||||
showGameListAct->setCheckable(true);
|
showGameListAct->setCheckable(true);
|
||||||
refreshGameListAct = new QAction(MainWindow);
|
refreshGameListAct = new QAction(MainWindow);
|
||||||
refreshGameListAct->setObjectName("refreshGameListAct");
|
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 = new QAction(MainWindow);
|
||||||
setIconSizeTinyAct->setObjectName("setIconSizeTinyAct");
|
setIconSizeTinyAct->setObjectName("setIconSizeTinyAct");
|
||||||
setIconSizeTinyAct->setCheckable(true);
|
setIconSizeTinyAct->setCheckable(true);
|
||||||
@ -210,20 +221,28 @@ public:
|
|||||||
stopButton->setIconSize(QSize(40, 40));
|
stopButton->setIconSize(QSize(40, 40));
|
||||||
refreshButton = new QPushButton(centralWidget);
|
refreshButton = new QPushButton(centralWidget);
|
||||||
refreshButton->setFlat(true);
|
refreshButton->setFlat(true);
|
||||||
refreshButton->setIcon(QIcon(":images/refresh_icon.png"));
|
refreshButton->setIcon(QIcon(":images/refreshlist_icon.png"));
|
||||||
refreshButton->setIconSize(QSize(32, 32));
|
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 = new QPushButton(centralWidget);
|
||||||
settingsButton->setFlat(true);
|
settingsButton->setFlat(true);
|
||||||
settingsButton->setIcon(QIcon(":images/settings_icon.png"));
|
settingsButton->setIcon(QIcon(":images/settings_icon.png"));
|
||||||
settingsButton->setIconSize(QSize(44, 44));
|
settingsButton->setIconSize(QSize(40, 40));
|
||||||
controllerButton = new QPushButton(centralWidget);
|
controllerButton = new QPushButton(centralWidget);
|
||||||
controllerButton->setFlat(true);
|
controllerButton->setFlat(true);
|
||||||
controllerButton->setIcon(QIcon(":images/controller_icon.png"));
|
controllerButton->setIcon(QIcon(":images/controller_icon.png"));
|
||||||
controllerButton->setIconSize(QSize(40, 40));
|
controllerButton->setIconSize(QSize(55, 48));
|
||||||
keyboardButton = new QPushButton(centralWidget);
|
keyboardButton = new QPushButton(centralWidget);
|
||||||
keyboardButton->setFlat(true);
|
keyboardButton->setFlat(true);
|
||||||
keyboardButton->setIcon(QIcon(":images/keyboard_icon.png"));
|
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 = new QWidget(centralWidget);
|
||||||
sizeSliderContainer->setObjectName("sizeSliderContainer");
|
sizeSliderContainer->setObjectName("sizeSliderContainer");
|
||||||
@ -304,6 +323,7 @@ public:
|
|||||||
menuView->addAction(refreshGameListAct);
|
menuView->addAction(refreshGameListAct);
|
||||||
menuView->addAction(menuGame_List_Mode->menuAction());
|
menuView->addAction(menuGame_List_Mode->menuAction());
|
||||||
menuView->addAction(menuGame_List_Icons->menuAction());
|
menuView->addAction(menuGame_List_Icons->menuAction());
|
||||||
|
menuView->addAction(toggleLabelsAct);
|
||||||
menuView->addAction(menuThemes->menuAction());
|
menuView->addAction(menuThemes->menuAction());
|
||||||
menuThemes->addAction(setThemeDark);
|
menuThemes->addAction(setThemeDark);
|
||||||
menuThemes->addAction(setThemeLight);
|
menuThemes->addAction(setThemeLight);
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Spielliste ausgeben</translation>
|
<translation>Spielliste ausgeben</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG-Anschauer</translation>
|
<translation>PKG-Anschauer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Trophäenansicht</translation>
|
<translation>Trophäenansicht</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1514,6 +1514,46 @@
|
|||||||
<source>shadPS4</source>
|
<source>shadPS4</source>
|
||||||
<translation type="unfinished">shadPS4</translation>
|
<translation type="unfinished">shadPS4</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Play</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Pause</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Stop</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Restart</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Full Screen</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Controllers</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Keyboard</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Refresh List</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Resume</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Show Labels Under Icons</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PKGViewer</name>
|
<name>PKGViewer</name>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Volcar Lista de Juegos</translation>
|
<translation>Volcar Lista de Juegos</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Expositor de Trofeos</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>No se encontraron juegos. Por favor, añade tus juegos a tu biblioteca primero.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Vista PKG</translation>
|
<translation>Vista PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Expositor de Trofeos</translation>
|
<translation>Expositor de Trofeos</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Selecciona un Juego:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Progreso</translation>
|
<translation>Progreso</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>استخراج لیست بازی ها</translation>
|
<translation>استخراج لیست بازی ها</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG مشاهده گر</translation>
|
<translation>PKG مشاهده گر</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>مشاهده جوایز</translation>
|
<translation>مشاهده جوایز</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Kirjoita Pelilista Tiedostoon</translation>
|
<translation>Kirjoita Pelilista Tiedostoon</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG Selain</translation>
|
<translation>PKG Selain</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Trophy Selain</translation>
|
<translation>Trophy Selain</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Dumper la liste des jeux</translation>
|
<translation>Dumper la liste des jeux</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Visionneuse PKG</translation>
|
<translation>Visionneuse PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Visionneuse de trophées</translation>
|
<translation>Visionneuse de trophées</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Progression</translation>
|
<translation>Progression</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Játéklista Dumpolása</translation>
|
<translation>Játéklista Dumpolása</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG Nézegető</translation>
|
<translation>PKG Nézegető</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Trófeák Megtekintése</translation>
|
<translation>Trófeák Megtekintése</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Scarica Lista Giochi</translation>
|
<translation>Scarica Lista Giochi</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Visualizzatore PKG</translation>
|
<translation>Visualizzatore PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Visualizzatore Trofei</translation>
|
<translation>Visualizzatore Trofei</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Progresso</translation>
|
<translation>Progresso</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>ゲームリストをダンプ</translation>
|
<translation>ゲームリストをダンプ</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKGビューアー</translation>
|
<translation>PKGビューアー</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>トロフィービューアー</translation>
|
<translation>トロフィービューアー</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<name>AboutDialog</name>
|
<name>AboutDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>About shadPS4</source>
|
<source>About shadPS4</source>
|
||||||
<translation type="unfinished">About shadPS4</translation>
|
<translation>Apie shadPS4</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||||
@ -15,7 +15,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>This software should not be used to play games you have not legally obtained.</source>
|
<source>This software should not be used to play games you have not legally obtained.</source>
|
||||||
<translation type="unfinished">This software should not be used to play games you have not legally obtained.</translation>
|
<translation>Ši programa neturėtų būti naudojama žaidimams kurių neturite legaliai įsigiję.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -463,7 +463,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<translation type="unfinished">Back</translation>
|
<translation>Atgal</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>R1 / RB</source>
|
<source>R1 / RB</source>
|
||||||
@ -519,7 +519,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Color Adjustment</source>
|
<source>Color Adjustment</source>
|
||||||
<translation type="unfinished">Color Adjustment</translation>
|
<translation>Spalvų Reguliavimas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>R:</source>
|
<source>R:</source>
|
||||||
@ -543,7 +543,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Unable to Save</source>
|
<source>Unable to Save</source>
|
||||||
<translation type="unfinished">Unable to Save</translation>
|
<translation>Nepavyko Išsaugoti</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot bind axis values more than once</source>
|
<source>Cannot bind axis values more than once</source>
|
||||||
@ -563,7 +563,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation type="unfinished">Cancel</translation>
|
<translation>Atšaukti</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -590,15 +590,15 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save Changes</source>
|
<source>Save Changes</source>
|
||||||
<translation type="unfinished">Save Changes</translation>
|
<translation>Išsaugoti Pakeitimus</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to save changes?</source>
|
<source>Do you want to save changes?</source>
|
||||||
<translation type="unfinished">Do you want to save changes?</translation>
|
<translation>Ar norite išsaugoti pakeitimus?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation type="unfinished">Help</translation>
|
<translation>Pagalba</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to reset your custom default config to the original default config?</source>
|
<source>Do you want to reset your custom default config to the original default config?</source>
|
||||||
@ -876,7 +876,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished">Error</translation>
|
<translation>Klaida</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Error creating shortcut!</source>
|
<source>Error creating shortcut!</source>
|
||||||
@ -888,7 +888,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Game</source>
|
<source>Game</source>
|
||||||
<translation type="unfinished">Game</translation>
|
<translation>Žaidimas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>This game has no update to delete!</source>
|
<source>This game has no update to delete!</source>
|
||||||
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Dump spilliste</translation>
|
<translation>Dump spilliste</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Troféviser</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Fant ingen spill. Legg til spillene dine i biblioteket først.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG-viser</translation>
|
<translation>PKG-viser</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Troféviser</translation>
|
<translation>Troféviser</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Velg spill:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Fremdrift</translation>
|
<translation>Fremdrift</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -543,38 +543,38 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Unable to Save</source>
|
<source>Unable to Save</source>
|
||||||
<translation type="unfinished">Unable to Save</translation>
|
<translation>Zapisywanie nie powiodło się</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot bind axis values more than once</source>
|
<source>Cannot bind axis values more than once</source>
|
||||||
<translation type="unfinished">Cannot bind axis values more than once</translation>
|
<translation>Nie można powiązać wartości osi więcej niż raz</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation type="unfinished">Save</translation>
|
<translation>Zapisz</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Apply</source>
|
<source>Apply</source>
|
||||||
<translation type="unfinished">Apply</translation>
|
<translation>Zastosuj</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Restore Defaults</source>
|
<source>Restore Defaults</source>
|
||||||
<translation type="unfinished">Restore Defaults</translation>
|
<translation>Przywróć ustawienia domyślne</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation type="unfinished">Cancel</translation>
|
<translation>Anuluj</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditorDialog</name>
|
<name>EditorDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit Keyboard + Mouse and Controller input bindings</source>
|
<source>Edit Keyboard + Mouse and Controller input bindings</source>
|
||||||
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
|
<translation>Edytuj przypisanie klawiszy klawiatury + myszy oraz kontrolera</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Use Per-Game configs</source>
|
<source>Use Per-Game configs</source>
|
||||||
<translation type="unfinished">Use Per-Game configs</translation>
|
<translation>Użyj osobnej konfiguracji dla każdej gry</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
@ -582,11 +582,11 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Could not open the file for reading</source>
|
<source>Could not open the file for reading</source>
|
||||||
<translation type="unfinished">Could not open the file for reading</translation>
|
<translation>Nie można otworzyć pliku do odczytu</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Could not open the file for writing</source>
|
<source>Could not open the file for writing</source>
|
||||||
<translation type="unfinished">Could not open the file for writing</translation>
|
<translation>Nie można otworzyć pliku do zapisu</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save Changes</source>
|
<source>Save Changes</source>
|
||||||
@ -602,11 +602,11 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to reset your custom default config to the original default config?</source>
|
<source>Do you want to reset your custom default config to the original default config?</source>
|
||||||
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
|
<translation>Czy chcesz zresetować Twoją domyślną konfigurację do oryginalnej domyślnej konfiguracji?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to reset this config to your custom default config?</source>
|
<source>Do you want to reset this config to your custom default config?</source>
|
||||||
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
|
<translation>Czy chcesz zresetować tę konfigurację do Twojej domyślnej konfiguracji?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Reset to Default</source>
|
<source>Reset to Default</source>
|
||||||
@ -959,23 +959,23 @@
|
|||||||
<name>HelpDialog</name>
|
<name>HelpDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Quickstart</source>
|
<source>Quickstart</source>
|
||||||
<translation type="unfinished">Quickstart</translation>
|
<translation>Szybki start</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>FAQ</source>
|
<source>FAQ</source>
|
||||||
<translation type="unfinished">FAQ</translation>
|
<translation>Najczęściej zadawane pytania</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Syntax</source>
|
<source>Syntax</source>
|
||||||
<translation type="unfinished">Syntax</translation>
|
<translation>Składnia</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Special Bindings</source>
|
<source>Special Bindings</source>
|
||||||
<translation type="unfinished">Special Bindings</translation>
|
<translation>Specjalne wiązania</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Keybindings</source>
|
<source>Keybindings</source>
|
||||||
<translation type="unfinished">Keybindings</translation>
|
<translation>Przypisanie klawiszy</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1001,211 +1001,211 @@
|
|||||||
<name>KBMSettings</name>
|
<name>KBMSettings</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Configure Controls</source>
|
<source>Configure Controls</source>
|
||||||
<translation type="unfinished">Configure Controls</translation>
|
<translation>Skonfiguruj sterowanie</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>D-Pad</source>
|
<source>D-Pad</source>
|
||||||
<translation type="unfinished">D-Pad</translation>
|
<translation>Krzyżak</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Up</source>
|
<source>Up</source>
|
||||||
<translation type="unfinished">Up</translation>
|
<translation>Strzałka w górę</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>unmapped</source>
|
<source>unmapped</source>
|
||||||
<translation type="unfinished">unmapped</translation>
|
<translation>nieprzypisane</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Left</source>
|
<source>Left</source>
|
||||||
<translation type="unfinished">Left</translation>
|
<translation>Strzałka w lewo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Right</source>
|
<source>Right</source>
|
||||||
<translation type="unfinished">Right</translation>
|
<translation>Strzałka w prawo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Down</source>
|
<source>Down</source>
|
||||||
<translation type="unfinished">Down</translation>
|
<translation>Strzałka w dół</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Left Analog Halfmode</source>
|
<source>Left Analog Halfmode</source>
|
||||||
<translation type="unfinished">Left Analog Halfmode</translation>
|
<translation>Połowiczny tryb lewego drążka</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>hold to move left stick at half-speed</source>
|
<source>hold to move left stick at half-speed</source>
|
||||||
<translation type="unfinished">hold to move left stick at half-speed</translation>
|
<translation>przytrzymaj, aby przesuwać lewy drążek dwa razy wolniej</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Left Stick</source>
|
<source>Left Stick</source>
|
||||||
<translation type="unfinished">Left Stick</translation>
|
<translation>Lewy drążek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Config Selection</source>
|
<source>Config Selection</source>
|
||||||
<translation type="unfinished">Config Selection</translation>
|
<translation>Wybór konfiguracji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Common Config</source>
|
<source>Common Config</source>
|
||||||
<translation type="unfinished">Common Config</translation>
|
<translation>Typowa konfiguracja</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Use per-game configs</source>
|
<source>Use per-game configs</source>
|
||||||
<translation type="unfinished">Use per-game configs</translation>
|
<translation>Użyj osobnej konfiguracji dla każdej gry</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>L1</source>
|
<source>L1</source>
|
||||||
<translation type="unfinished">L1</translation>
|
<translation>L1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>L2</source>
|
<source>L2</source>
|
||||||
<translation type="unfinished">L2</translation>
|
<translation>L2</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Text Editor</source>
|
<source>Text Editor</source>
|
||||||
<translation type="unfinished">Text Editor</translation>
|
<translation>Edytor tekstu</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation type="unfinished">Help</translation>
|
<translation>Pomoc</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>R1</source>
|
<source>R1</source>
|
||||||
<translation type="unfinished">R1</translation>
|
<translation>R1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>R2</source>
|
<source>R2</source>
|
||||||
<translation type="unfinished">R2</translation>
|
<translation>R2</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>L3</source>
|
<source>L3</source>
|
||||||
<translation type="unfinished">L3</translation>
|
<translation>L3</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Touchpad Click</source>
|
<source>Touchpad Click</source>
|
||||||
<translation type="unfinished">Touchpad Click</translation>
|
<translation>Kliknięcie Touchpada</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Mouse to Joystick</source>
|
<source>Mouse to Joystick</source>
|
||||||
<translation type="unfinished">Mouse to Joystick</translation>
|
<translation>Mysz na Joystick</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>*press F7 ingame to activate</source>
|
<source>*press F7 ingame to activate</source>
|
||||||
<translation type="unfinished">*press F7 ingame to activate</translation>
|
<translation>*naciśnij F7 w grze aby aktywować</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>R3</source>
|
<source>R3</source>
|
||||||
<translation type="unfinished">R3</translation>
|
<translation>R3</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Options</source>
|
<source>Options</source>
|
||||||
<translation type="unfinished">Options</translation>
|
<translation>Opcje</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Mouse Movement Parameters</source>
|
<source>Mouse Movement Parameters</source>
|
||||||
<translation type="unfinished">Mouse Movement Parameters</translation>
|
<translation>Parametry ruchu myszy</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>note: click Help Button/Special Keybindings for more information</source>
|
<source>note: click Help Button/Special Keybindings for more information</source>
|
||||||
<translation type="unfinished">note: click Help Button/Special Keybindings for more information</translation>
|
<translation>uwaga: kliknij przycisk Pomoc/Specjalne skróty klawiszowe, aby uzyskać więcej informacji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Face Buttons</source>
|
<source>Face Buttons</source>
|
||||||
<translation type="unfinished">Face Buttons</translation>
|
<translation>Przednie przyciski</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Triangle</source>
|
<source>Triangle</source>
|
||||||
<translation type="unfinished">Triangle</translation>
|
<translation>Trójkąt</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Square</source>
|
<source>Square</source>
|
||||||
<translation type="unfinished">Square</translation>
|
<translation>Kwadrat</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Circle</source>
|
<source>Circle</source>
|
||||||
<translation type="unfinished">Circle</translation>
|
<translation>Kółko</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cross</source>
|
<source>Cross</source>
|
||||||
<translation type="unfinished">Cross</translation>
|
<translation>Krzyżyk</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Right Analog Halfmode</source>
|
<source>Right Analog Halfmode</source>
|
||||||
<translation type="unfinished">Right Analog Halfmode</translation>
|
<translation>Połowiczny tryb prawego drążka</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>hold to move right stick at half-speed</source>
|
<source>hold to move right stick at half-speed</source>
|
||||||
<translation type="unfinished">hold to move right stick at half-speed</translation>
|
<translation>przytrzymaj, aby przesuwać prawy drążek dwa razy wolniej</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Right Stick</source>
|
<source>Right Stick</source>
|
||||||
<translation type="unfinished">Right Stick</translation>
|
<translation>Prawy drążek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Speed Offset (def 0.125):</source>
|
<source>Speed Offset (def 0.125):</source>
|
||||||
<translation type="unfinished">Speed Offset (def 0.125):</translation>
|
<translation>Offset prędkości (def 0,125):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Copy from Common Config</source>
|
<source>Copy from Common Config</source>
|
||||||
<translation type="unfinished">Copy from Common Config</translation>
|
<translation>Kopiuj z typowej konfiguracji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Deadzone Offset (def 0.50):</source>
|
<source>Deadzone Offset (def 0.50):</source>
|
||||||
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
|
<translation>Offset martwych stref (def 0,50):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Speed Multiplier (def 1.0):</source>
|
<source>Speed Multiplier (def 1.0):</source>
|
||||||
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
|
<translation>Mnożnik prędkości (def1.0):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Common Config Selected</source>
|
<source>Common Config Selected</source>
|
||||||
<translation type="unfinished">Common Config Selected</translation>
|
<translation>Wybrano typową konfigurację</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<translation type="unfinished">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.</translation>
|
<translation>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.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Copy values from Common Config</source>
|
<source>Copy values from Common Config</source>
|
||||||
<translation type="unfinished">Copy values from Common Config</translation>
|
<translation>Kopiuj z typowej konfiguracji</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
|
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
|
||||||
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
|
<translation>Czy chcesz nadpisać istniejące mapowania mapowaniem z typowej konfiguracji?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Unable to Save</source>
|
<source>Unable to Save</source>
|
||||||
<translation type="unfinished">Unable to Save</translation>
|
<translation>Zapisywanie nie powiodło się</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot bind any unique input more than once</source>
|
<source>Cannot bind any unique input more than once</source>
|
||||||
<translation type="unfinished">Cannot bind any unique input more than once</translation>
|
<translation>Nie można powiązać żadnych unikalnych danych wejściowych więcej niż raz</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Press a key</source>
|
<source>Press a key</source>
|
||||||
<translation type="unfinished">Press a key</translation>
|
<translation>Naciśnij klawisz</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot set mapping</source>
|
<source>Cannot set mapping</source>
|
||||||
<translation type="unfinished">Cannot set mapping</translation>
|
<translation>Nie można ustawić mapowania</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Mousewheel cannot be mapped to stick outputs</source>
|
<source>Mousewheel cannot be mapped to stick outputs</source>
|
||||||
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
|
<translation>Kółko myszy nie może być przypisane do sterowania drążkiem</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation type="unfinished">Save</translation>
|
<translation>Zapisz</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Apply</source>
|
<source>Apply</source>
|
||||||
<translation type="unfinished">Apply</translation>
|
<translation>Zastosuj</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Restore Defaults</source>
|
<source>Restore Defaults</source>
|
||||||
<translation type="unfinished">Restore Defaults</translation>
|
<translation>Przywróć ustawienia domyślne</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation type="unfinished">Cancel</translation>
|
<translation>Anuluj</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Zgraj listę gier</translation>
|
<translation>Zgraj listę gier</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Menedżer trofeów</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Nie znaleziono gier. Najpierw dodaj swoje gry do swojej biblioteki.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Menedżer plików PKG</translation>
|
<translation>Menedżer plików PKG</translation>
|
||||||
@ -2154,35 +2162,35 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Portable User Folder</source>
|
<source>Portable User Folder</source>
|
||||||
<translation type="unfinished">Portable User Folder</translation>
|
<translation>Przenośny folder użytkownika</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Create Portable User Folder from Common User Folder</source>
|
<source>Create Portable User Folder from Common User Folder</source>
|
||||||
<translation type="unfinished">Create Portable User Folder from Common User Folder</translation>
|
<translation>Utwórz przenośny folder użytkownika ze zwykłego folderu użytkownika</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<translation type="unfinished">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.</translation>
|
<translation>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ć.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot create portable user folder</source>
|
<source>Cannot create portable user folder</source>
|
||||||
<translation type="unfinished">Cannot create portable user folder</translation>
|
<translation>Nie można utworzyć przenośnego folderu użytkownika</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 already exists</source>
|
<source>%1 already exists</source>
|
||||||
<translation type="unfinished">%1 already exists</translation>
|
<translation>%1 już istnieje</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Portable user folder created</source>
|
<source>Portable user folder created</source>
|
||||||
<translation type="unfinished">Portable user folder created</translation>
|
<translation>Utworzono przenośny folder użytkownika</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 successfully created.</source>
|
<source>%1 successfully created.</source>
|
||||||
<translation type="unfinished">%1 successfully created.</translation>
|
<translation>%1 prawidłowo utworzony.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<translation type="unfinished">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.</translation>
|
<translation>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.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Menedżer trofeów</translation>
|
<translation>Menedżer trofeów</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Wybierz grę:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Postęp</translation>
|
<translation>Postęp</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Exportar Lista de Jogos</translation>
|
<translation>Exportar Lista de Jogos</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Visualizador de Troféus</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Nenhum jogo encontrado. Adicione seus jogos à sua biblioteca primeiro.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Visualizador de PKG</translation>
|
<translation>Visualizador de PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Visualizador de Troféus</translation>
|
<translation>Visualizador de Troféus</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Selecionar Jogo:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Progresso</translation>
|
<translation>Progresso</translation>
|
||||||
|
@ -543,74 +543,74 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Unable to Save</source>
|
<source>Unable to Save</source>
|
||||||
<translation type="unfinished">Unable to Save</translation>
|
<translation>Não é possível salvar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot bind axis values more than once</source>
|
<source>Cannot bind axis values more than once</source>
|
||||||
<translation type="unfinished">Cannot bind axis values more than once</translation>
|
<translation>Não foi possível atribuir os valores do eixo X ou Y mais de uma vez</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation type="unfinished">Save</translation>
|
<translation>Salvar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Apply</source>
|
<source>Apply</source>
|
||||||
<translation type="unfinished">Apply</translation>
|
<translation>Aplicar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Restore Defaults</source>
|
<source>Restore Defaults</source>
|
||||||
<translation type="unfinished">Restore Defaults</translation>
|
<translation>Restaurar o Padrão</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation type="unfinished">Cancel</translation>
|
<translation>Cancelar</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>EditorDialog</name>
|
<name>EditorDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit Keyboard + Mouse and Controller input bindings</source>
|
<source>Edit Keyboard + Mouse and Controller input bindings</source>
|
||||||
<translation type="unfinished">Edit Keyboard + Mouse and Controller input bindings</translation>
|
<translation>Editar comandos do Teclado + Mouse e do Controle</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Use Per-Game configs</source>
|
<source>Use Per-Game configs</source>
|
||||||
<translation type="unfinished">Use Per-Game configs</translation>
|
<translation>Use uma configuração para cada jogo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished">Error</translation>
|
<translation>Erro</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Could not open the file for reading</source>
|
<source>Could not open the file for reading</source>
|
||||||
<translation type="unfinished">Could not open the file for reading</translation>
|
<translation>Não foi possível abrir o arquivo para ler</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Could not open the file for writing</source>
|
<source>Could not open the file for writing</source>
|
||||||
<translation type="unfinished">Could not open the file for writing</translation>
|
<translation>Não foi possível abrir o arquivo para escrever</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save Changes</source>
|
<source>Save Changes</source>
|
||||||
<translation type="unfinished">Save Changes</translation>
|
<translation>Salvar mudanças</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to save changes?</source>
|
<source>Do you want to save changes?</source>
|
||||||
<translation type="unfinished">Do you want to save changes?</translation>
|
<translation>Salvar as mudanças?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation type="unfinished">Help</translation>
|
<translation>Ajuda</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to reset your custom default config to the original default config?</source>
|
<source>Do you want to reset your custom default config to the original default config?</source>
|
||||||
<translation type="unfinished">Do you want to reset your custom default config to the original default config?</translation>
|
<translation>Restaurar a configuração customizada padrão para a configuração original padrão?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to reset this config to your custom default config?</source>
|
<source>Do you want to reset this config to your custom default config?</source>
|
||||||
<translation type="unfinished">Do you want to reset this config to your custom default config?</translation>
|
<translation>Deseja redefinir esta configuração para a configuração padrão personalizada?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Reset to Default</source>
|
<source>Reset to Default</source>
|
||||||
<translation type="unfinished">Reset to Default</translation>
|
<translation>Resetar ao Padrão</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -959,23 +959,23 @@
|
|||||||
<name>HelpDialog</name>
|
<name>HelpDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Quickstart</source>
|
<source>Quickstart</source>
|
||||||
<translation type="unfinished">Quickstart</translation>
|
<translation>Início Rápido</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>FAQ</source>
|
<source>FAQ</source>
|
||||||
<translation type="unfinished">FAQ</translation>
|
<translation>Perguntas Frequentes</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Syntax</source>
|
<source>Syntax</source>
|
||||||
<translation type="unfinished">Syntax</translation>
|
<translation>Sintaxe</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Special Bindings</source>
|
<source>Special Bindings</source>
|
||||||
<translation type="unfinished">Special Bindings</translation>
|
<translation>Atalhos Especiais</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Keybindings</source>
|
<source>Keybindings</source>
|
||||||
<translation type="unfinished">Keybindings</translation>
|
<translation>Combinações de Teclas</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1145,67 +1145,67 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Copy from Common Config</source>
|
<source>Copy from Common Config</source>
|
||||||
<translation type="unfinished">Copy from Common Config</translation>
|
<translation>Copiar da Configuração Comum</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Deadzone Offset (def 0.50):</source>
|
<source>Deadzone Offset (def 0.50):</source>
|
||||||
<translation type="unfinished">Deadzone Offset (def 0.50):</translation>
|
<translation>Deslocamento da Zona Morta (def 0,50):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Speed Multiplier (def 1.0):</source>
|
<source>Speed Multiplier (def 1.0):</source>
|
||||||
<translation type="unfinished">Speed Multiplier (def 1.0):</translation>
|
<translation>Multiplicador de Velocidade (def 1,0):</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Common Config Selected</source>
|
<source>Common Config Selected</source>
|
||||||
<translation type="unfinished">Common Config Selected</translation>
|
<translation>Configuração Comum Selecionada</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<translation type="unfinished">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.</translation>
|
<translation>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.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Copy values from Common Config</source>
|
<source>Copy values from Common Config</source>
|
||||||
<translation type="unfinished">Copy values from Common Config</translation>
|
<translation>Copiar valores da Configuração Comum</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
|
<source>Do you want to overwrite existing mappings with the mappings from the Common Config?</source>
|
||||||
<translation type="unfinished">Do you want to overwrite existing mappings with the mappings from the Common Config?</translation>
|
<translation>Substituir mapeamentos existentes com os mapeamentos da Configuração Comum?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Unable to Save</source>
|
<source>Unable to Save</source>
|
||||||
<translation type="unfinished">Unable to Save</translation>
|
<translation>Não é possível salvar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot bind any unique input more than once</source>
|
<source>Cannot bind any unique input more than once</source>
|
||||||
<translation type="unfinished">Cannot bind any unique input more than once</translation>
|
<translation>Não é possível vincular qualquer entrada única mais de uma vez</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Press a key</source>
|
<source>Press a key</source>
|
||||||
<translation type="unfinished">Press a key</translation>
|
<translation>Pressione uma tecla</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot set mapping</source>
|
<source>Cannot set mapping</source>
|
||||||
<translation type="unfinished">Cannot set mapping</translation>
|
<translation>Não é possível definir o mapeamento</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Mousewheel cannot be mapped to stick outputs</source>
|
<source>Mousewheel cannot be mapped to stick outputs</source>
|
||||||
<translation type="unfinished">Mousewheel cannot be mapped to stick outputs</translation>
|
<translation>Roda do rato não pode ser mapeada para saídas empates</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation type="unfinished">Save</translation>
|
<translation>Salvar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Apply</source>
|
<source>Apply</source>
|
||||||
<translation type="unfinished">Apply</translation>
|
<translation>Aplicar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Restore Defaults</source>
|
<source>Restore Defaults</source>
|
||||||
<translation type="unfinished">Restore Defaults</translation>
|
<translation>Restaurar Definições</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation type="unfinished">Cancel</translation>
|
<translation>Cancelar</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Exportar Lista de Jogos</translation>
|
<translation>Exportar Lista de Jogos</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Visualizador de Troféus</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Nenhum jogo encontrado. Por favor, adicione os seus jogos à sua biblioteca primeiro.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Visualizador PKG</translation>
|
<translation>Visualizador PKG</translation>
|
||||||
@ -2166,23 +2174,23 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot create portable user folder</source>
|
<source>Cannot create portable user folder</source>
|
||||||
<translation type="unfinished">Cannot create portable user folder</translation>
|
<translation>Não é possível criar pasta de utilizador portátil</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 already exists</source>
|
<source>%1 already exists</source>
|
||||||
<translation type="unfinished">%1 already exists</translation>
|
<translation>%1 já existe</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Portable user folder created</source>
|
<source>Portable user folder created</source>
|
||||||
<translation type="unfinished">Portable user folder created</translation>
|
<translation>Pasta de utilizador portátil criada</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 successfully created.</source>
|
<source>%1 successfully created.</source>
|
||||||
<translation type="unfinished">%1 successfully created.</translation>
|
<translation>%1 criado com sucesso.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<translation type="unfinished">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.</translation>
|
<translation>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.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Visualizador de Troféus</translation>
|
<translation>Visualizador de Troféus</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Escolha o Jogo:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Progresso</translation>
|
<translation>Progresso</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Дамп списка игр</translation>
|
<translation>Дамп списка игр</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Просмотр трофеев</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Не найдено ни одной игры. Пожалуйста, сначала добавьте игры в библиотеку.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Просмотр PKG</translation>
|
<translation>Просмотр PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Просмотр трофеев</translation>
|
<translation>Просмотр трофеев</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Выберите игру:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Прогресс</translation>
|
<translation>Прогресс</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Zbraz Listën e Lojërave</translation>
|
<translation>Zbraz Listën e Lojërave</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Shikuesi i Trofeve</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Nuk u gjetën lojëra. Shto lojërat në librarinë tënde fillimisht.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Shikuesi i PKG</translation>
|
<translation>Shikuesi i PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Shikuesi i Trofeve</translation>
|
<translation>Shikuesi i Trofeve</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Zgjidh Lojën:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Ecuria</translation>
|
<translation>Ecuria</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Dumpa spellista</translation>
|
<translation>Dumpa spellista</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Trofévisare</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Inga spel hittades. Lägg till dina spel till biblioteket först.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG-visare</translation>
|
<translation>PKG-visare</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Trofé-visare</translation>
|
<translation>Trofé-visare</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Välj spel:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Förlopp</translation>
|
<translation>Förlopp</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Oyun Listesini Kaydet</translation>
|
<translation>Oyun Listesini Kaydet</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>Kupa Görüntüleyici</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>Oyun bulunamadı. Oyunlarınızı lütfen önce kütüphanenize ekleyin.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG Görüntüleyici</translation>
|
<translation>PKG Görüntüleyici</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Kupa Görüntüleyici</translation>
|
<translation>Kupa Görüntüleyici</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>Oyun Seç:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>İlerleme</translation>
|
<translation>İlerleme</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>Дамп списку ігор</translation>
|
<translation>Дамп списку ігор</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>Перегляд PKG</translation>
|
<translation>Перегляд PKG</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Трофеї</translation>
|
<translation>Трофеї</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>Прогрес</translation>
|
<translation>Прогрес</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>Trình xem chiến tích</translation>
|
<translation>Trình xem chiến tích</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation>导出游戏列表</translation>
|
<translation>导出游戏列表</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation>奖杯查看器</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation>未找到游戏。请先将您的游戏添加到您的资料库。</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation>PKG 查看器</translation>
|
<translation>PKG 查看器</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation>奖杯查看器</translation>
|
<translation>奖杯查看器</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation>选择游戏:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation>进度</translation>
|
<translation>进度</translation>
|
||||||
|
@ -407,7 +407,7 @@
|
|||||||
<name>ControlSettings</name>
|
<name>ControlSettings</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Configure Controls</source>
|
<source>Configure Controls</source>
|
||||||
<translation type="unfinished">Configure Controls</translation>
|
<translation>操控設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>D-Pad</source>
|
<source>D-Pad</source>
|
||||||
@ -519,7 +519,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Color Adjustment</source>
|
<source>Color Adjustment</source>
|
||||||
<translation type="unfinished">Color Adjustment</translation>
|
<translation>色彩調整</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>R:</source>
|
<source>R:</source>
|
||||||
@ -543,7 +543,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Unable to Save</source>
|
<source>Unable to Save</source>
|
||||||
<translation type="unfinished">Unable to Save</translation>
|
<translation>無法保存</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot bind axis values more than once</source>
|
<source>Cannot bind axis values more than once</source>
|
||||||
@ -551,11 +551,11 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation type="unfinished">Save</translation>
|
<translation>保存</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Apply</source>
|
<source>Apply</source>
|
||||||
<translation type="unfinished">Apply</translation>
|
<translation>套用</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Restore Defaults</source>
|
<source>Restore Defaults</source>
|
||||||
@ -563,7 +563,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation type="unfinished">Cancel</translation>
|
<translation>取消</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -578,7 +578,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished">Error</translation>
|
<translation>錯誤</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Could not open the file for reading</source>
|
<source>Could not open the file for reading</source>
|
||||||
@ -590,7 +590,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save Changes</source>
|
<source>Save Changes</source>
|
||||||
<translation type="unfinished">Save Changes</translation>
|
<translation>儲存變更</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Do you want to save changes?</source>
|
<source>Do you want to save changes?</source>
|
||||||
@ -1306,6 +1306,14 @@
|
|||||||
<source>Dump Game List</source>
|
<source>Dump Game List</source>
|
||||||
<translation type="unfinished">Dump Game List</translation>
|
<translation type="unfinished">Dump Game List</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Trophy Viewer</source>
|
||||||
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No games found. Please add your games to your library first.</source>
|
||||||
|
<translation type="unfinished">No games found. Please add your games to your library first.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>PKG Viewer</source>
|
<source>PKG Viewer</source>
|
||||||
<translation type="unfinished">PKG Viewer</translation>
|
<translation type="unfinished">PKG Viewer</translation>
|
||||||
@ -2191,6 +2199,10 @@
|
|||||||
<source>Trophy Viewer</source>
|
<source>Trophy Viewer</source>
|
||||||
<translation type="unfinished">Trophy Viewer</translation>
|
<translation type="unfinished">Trophy Viewer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select Game:</source>
|
||||||
|
<translation type="unfinished">Select Game:</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progress</translation>
|
<translation type="unfinished">Progress</translation>
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "common/config.h"
|
#include "common/config.h"
|
||||||
#include "common/elf_info.h"
|
#include "common/elf_info.h"
|
||||||
#include "common/version.h"
|
#include "common/version.h"
|
||||||
|
#include "core/debug_state.h"
|
||||||
#include "core/libraries/kernel/time.h"
|
#include "core/libraries/kernel/time.h"
|
||||||
#include "core/libraries/pad/pad.h"
|
#include "core/libraries/pad/pad.h"
|
||||||
#include "imgui/renderer/imgui_core.h"
|
#include "imgui/renderer/imgui_core.h"
|
||||||
@ -396,6 +397,25 @@ void WindowSDL::WaitEvent() {
|
|||||||
case SDL_EVENT_QUIT:
|
case SDL_EVENT_QUIT:
|
||||||
is_open = false;
|
is_open = false;
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include "core/libraries/pad/pad.h"
|
#include "core/libraries/pad/pad.h"
|
||||||
#include "input/controller.h"
|
#include "input/controller.h"
|
||||||
#include "string"
|
#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_Window;
|
||||||
struct SDL_Gamepad;
|
struct SDL_Gamepad;
|
||||||
|
@ -1,38 +1,40 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
<file>images/shadps4.ico</file>
|
<file>images/shadps4.ico</file>
|
||||||
<file>images/about_icon.png</file>
|
<file>images/about_icon.png</file>
|
||||||
<file>images/dump_icon.png</file>
|
<file>images/dump_icon.png</file>
|
||||||
<file>images/play_icon.png</file>
|
<file>images/play_icon.png</file>
|
||||||
<file>images/pause_icon.png</file>
|
<file>images/pause_icon.png</file>
|
||||||
<file>images/stop_icon.png</file>
|
<file>images/stop_icon.png</file>
|
||||||
<file>images/utils_icon.png</file>
|
<file>images/utils_icon.png</file>
|
||||||
<file>images/file_icon.png</file>
|
<file>images/file_icon.png</file>
|
||||||
<file>images/trophy_icon.png</file>
|
<file>images/folder_icon.png</file>
|
||||||
<file>images/folder_icon.png</file>
|
<file>images/themes_icon.png</file>
|
||||||
<file>images/themes_icon.png</file>
|
<file>images/iconsize_icon.png</file>
|
||||||
<file>images/iconsize_icon.png</file>
|
<file>images/list_icon.png</file>
|
||||||
<file>images/list_icon.png</file>
|
<file>images/grid_icon.png</file>
|
||||||
<file>images/grid_icon.png</file>
|
<file>images/exit_icon.png</file>
|
||||||
<file>images/exit_icon.png</file>
|
<file>images/settings_icon.png</file>
|
||||||
<file>images/settings_icon.png</file>
|
<file>images/controller_icon.png</file>
|
||||||
<file>images/controller_icon.png</file>
|
<file>images/restart_game_icon.png</file>
|
||||||
<file>images/refresh_icon.png</file>
|
<file>images/update_icon.png</file>
|
||||||
<file>images/update_icon.png</file>
|
<file>images/list_mode_icon.png</file>
|
||||||
<file>images/list_mode_icon.png</file>
|
<file>images/flag_jp.png</file>
|
||||||
<file>images/flag_jp.png</file>
|
<file>images/flag_eu.png</file>
|
||||||
<file>images/flag_eu.png</file>
|
<file>images/flag_unk.png</file>
|
||||||
<file>images/flag_unk.png</file>
|
<file>images/flag_us.png</file>
|
||||||
<file>images/flag_us.png</file>
|
<file>images/flag_world.png</file>
|
||||||
<file>images/flag_world.png</file>
|
<file>images/flag_china.png</file>
|
||||||
<file>images/flag_china.png</file>
|
<file>images/github.png</file>
|
||||||
<file>images/github.png</file>
|
<file>images/discord.png</file>
|
||||||
<file>images/discord.png</file>
|
<file>images/ko-fi.png</file>
|
||||||
<file>images/ko-fi.png</file>
|
<file>images/youtube.png</file>
|
||||||
<file>images/youtube.png</file>
|
<file>images/website.png</file>
|
||||||
<file>images/website.png</file>
|
<file>images/ps4_controller.png</file>
|
||||||
<file>images/ps4_controller.png</file>
|
<file>images/keyboard_icon.png</file>
|
||||||
<file>images/keyboard_icon.png</file>
|
<file>images/KBM.png</file>
|
||||||
<file>images/KBM.png</file>
|
<file>images/fullscreen_icon.png</file>
|
||||||
</qresource>
|
<file>images/refreshlist_icon.png</file>
|
||||||
|
<file>images/trophy_icon.png</file>
|
||||||
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -602,20 +602,25 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
|
|||||||
if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) {
|
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),
|
rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32),
|
||||||
true);
|
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) {
|
dma_data->dst_sel == DmaDataDst::Gds) {
|
||||||
rasterizer->InlineData(dma_data->dst_addr_lo,
|
rasterizer->InlineData(dma_data->dst_addr_lo,
|
||||||
dma_data->SrcAddress<const void*>(),
|
dma_data->SrcAddress<const void*>(),
|
||||||
dma_data->NumBytes(), true);
|
dma_data->NumBytes(), true);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Data &&
|
} 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<VAddr>(), &dma_data->data,
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(), &dma_data->data,
|
||||||
sizeof(u32), false);
|
sizeof(u32), false);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
} 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");
|
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
|
||||||
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
||||||
dma_data->SrcAddress<const void*>(),
|
dma_data->SrcAddress<const void*>(),
|
||||||
dma_data->NumBytes(), false);
|
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) {
|
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);
|
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) {
|
dma_data->dst_sel == DmaDataDst::Gds) {
|
||||||
rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress<const void*>(),
|
rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress<const void*>(),
|
||||||
dma_data->NumBytes(), true);
|
dma_data->NumBytes(), true);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Data &&
|
} 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<VAddr>(), &dma_data->data, sizeof(u32),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(), &dma_data->data, sizeof(u32),
|
||||||
false);
|
false);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
} 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");
|
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
|
||||||
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
||||||
dma_data->SrcAddress<const void*>(), dma_data->NumBytes(),
|
dma_data->SrcAddress<const void*>(), dma_data->NumBytes(),
|
||||||
false);
|
false);
|
||||||
|
@ -377,12 +377,14 @@ struct PM4CmdAcquireMem {
|
|||||||
enum class DmaDataDst : u32 {
|
enum class DmaDataDst : u32 {
|
||||||
Memory = 0,
|
Memory = 0,
|
||||||
Gds = 1,
|
Gds = 1,
|
||||||
|
MemoryUsingL2 = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DmaDataSrc : u32 {
|
enum class DmaDataSrc : u32 {
|
||||||
Memory = 0,
|
Memory = 0,
|
||||||
Gds = 1,
|
Gds = 1,
|
||||||
Data = 2,
|
Data = 2,
|
||||||
|
MemoryUsingL2 = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PM4DmaData {
|
struct PM4DmaData {
|
||||||
|