Clang and emulator fixes

This commit is contained in:
Dmugetsu 2025-02-16 12:22:45 -06:00
parent d642033ae4
commit 86a10d6e4a
2 changed files with 101 additions and 109 deletions

View File

@ -335,120 +335,120 @@ void Emulator::Restart() {
LOG_ERROR(Loader, "No previous EBOOT path found! Cannot restart."); LOG_ERROR(Loader, "No previous EBOOT path found! Cannot restart.");
return; return;
} }
} // namespace Core }
void Core::Emulator::LoadSystemModules(const std::string& game_serial) {
constexpr std::array<SysModules, 11> ModulesToLoad{
{{"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2},
{"libSceUlt.sprx", nullptr},
{"libSceJson.sprx", nullptr},
{"libSceJson2.sprx", nullptr},
{"libSceLibcInternal.sprx", &Libraries::LibcInternal::RegisterlibSceLibcInternal},
{"libSceDiscMap.sprx", &Libraries::DiscMap::RegisterlibSceDiscMap},
{"libSceRtc.sprx", &Libraries::Rtc::RegisterlibSceRtc},
{"libSceCesCs.sprx", nullptr},
{"libSceFont.sprx", nullptr},
{"libSceFontFt.sprx", nullptr},
{"libSceFreeTypeOt.sprx", nullptr}}};
void Core::Emulator::LoadSystemModules(const std::string& game_serial) { std::vector<std::filesystem::path> found_modules;
constexpr std::array<SysModules, 11> ModulesToLoad{ const auto& sys_module_path = Common::FS::GetUserPath(Common::FS::PathType::SysModuleDir);
{{"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2}, for (const auto& entry : std::filesystem::directory_iterator(sys_module_path)) {
{"libSceUlt.sprx", nullptr}, found_modules.push_back(entry.path());
{"libSceJson.sprx", nullptr}, }
{"libSceJson2.sprx", nullptr}, for (const auto& [module_name, init_func] : ModulesToLoad) {
{"libSceLibcInternal.sprx", &Libraries::LibcInternal::RegisterlibSceLibcInternal}, const auto it = std::ranges::find_if(
{"libSceDiscMap.sprx", &Libraries::DiscMap::RegisterlibSceDiscMap}, found_modules, [&](const auto& path) { return path.filename() == module_name; });
{"libSceRtc.sprx", &Libraries::Rtc::RegisterlibSceRtc}, if (it != found_modules.end()) {
{"libSceCesCs.sprx", nullptr}, LOG_INFO(Loader, "Loading {}", it->string());
{"libSceFont.sprx", nullptr}, if (linker->LoadModule(*it) != -1) {
{"libSceFontFt.sprx", nullptr}, continue;
{"libSceFreeTypeOt.sprx", nullptr}}}; }
}
std::vector<std::filesystem::path> found_modules; if (init_func) {
const auto& sys_module_path = Common::FS::GetUserPath(Common::FS::PathType::SysModuleDir); LOG_INFO(Loader, "Can't Load {} switching to HLE", module_name);
for (const auto& entry : std::filesystem::directory_iterator(sys_module_path)) { init_func(&linker->GetHLESymbols());
found_modules.push_back(entry.path()); } else {
} LOG_INFO(Loader, "No HLE available for {} module", module_name);
for (const auto& [module_name, init_func] : ModulesToLoad) {
const auto it = std::ranges::find_if(
found_modules, [&](const auto& path) { return path.filename() == module_name; });
if (it != found_modules.end()) {
LOG_INFO(Loader, "Loading {}", it->string());
if (linker->LoadModule(*it) != -1) {
continue;
} }
} }
if (init_func) { if (!game_serial.empty() && std::filesystem::exists(sys_module_path / game_serial)) {
LOG_INFO(Loader, "Can't Load {} switching to HLE", module_name); for (const auto& entry :
init_func(&linker->GetHLESymbols()); std::filesystem::directory_iterator(sys_module_path / game_serial)) {
} else { LOG_INFO(Loader, "Loading {} from game serial file {}", entry.path().string(),
LOG_INFO(Loader, "No HLE available for {} module", module_name); game_serial);
linker->LoadModule(entry.path());
}
} }
} }
if (!game_serial.empty() && std::filesystem::exists(sys_module_path / game_serial)) {
for (const auto& entry :
std::filesystem::directory_iterator(sys_module_path / game_serial)) {
LOG_INFO(Loader, "Loading {} from game serial file {}", entry.path().string(),
game_serial);
linker->LoadModule(entry.path());
}
}
}
#ifdef ENABLE_QT_GUI #ifdef ENABLE_QT_GUI
void Core::Emulator::UpdatePlayTime(const std::string& serial) const { void Core::Emulator::UpdatePlayTime(const std::string& serial) const {
const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
QString filePath = QString::fromStdString((user_dir / "play_time.txt").string()); QString filePath = QString::fromStdString((user_dir / "play_time.txt").string());
QFile file(filePath); QFile file(filePath);
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
LOG_INFO(Loader, "Error opening play_time.txt"); LOG_INFO(Loader, "Error opening play_time.txt");
return; return;
}
auto end_time = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::seconds>(end_time - start_time);
int totalSeconds = duration.count();
QTextStream in(&file);
QStringList lines;
QString content;
while (!in.atEnd()) {
content += in.readLine() + "\n";
}
file.close();
QStringList existingLines = content.split('\n', Qt::SkipEmptyParts);
int accumulatedSeconds = 0;
bool found = false;
for (const QString& line : existingLines) {
QStringList parts = line.split(' ');
if (parts.size() == 2 && parts[0] == QString::fromStdString(serial)) {
QStringList timeParts = parts[1].split(':');
if (timeParts.size() == 3) {
int hours = timeParts[0].toInt();
int minutes = timeParts[1].toInt();
int seconds = timeParts[2].toInt();
accumulatedSeconds = hours * 3600 + minutes * 60 + seconds;
found = true;
break;
}
} }
}
accumulatedSeconds += totalSeconds;
int hours = accumulatedSeconds / 3600;
int minutes = (accumulatedSeconds % 3600) / 60;
int seconds = accumulatedSeconds % 60;
QString playTimeSaved = QString::number(hours) + ":" +
QString::number(minutes).rightJustified(2, '0') + ":" +
QString::number(seconds).rightJustified(2, '0');
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { auto end_time = std::chrono::steady_clock::now();
QTextStream out(&file); auto duration = std::chrono::duration_cast<std::chrono::seconds>(end_time - start_time);
bool lineUpdated = false; int totalSeconds = duration.count();
QTextStream in(&file);
QStringList lines;
QString content;
while (!in.atEnd()) {
content += in.readLine() + "\n";
}
file.close();
QStringList existingLines = content.split('\n', Qt::SkipEmptyParts);
int accumulatedSeconds = 0;
bool found = false;
for (const QString& line : existingLines) { for (const QString& line : existingLines) {
if (line.startsWith(QString::fromStdString(serial))) { QStringList parts = line.split(' ');
out << QString::fromStdString(serial) + " " + playTimeSaved + "\n"; if (parts.size() == 2 && parts[0] == QString::fromStdString(serial)) {
lineUpdated = true; QStringList timeParts = parts[1].split(':');
} else { if (timeParts.size() == 3) {
out << line << "\n"; int hours = timeParts[0].toInt();
int minutes = timeParts[1].toInt();
int seconds = timeParts[2].toInt();
accumulatedSeconds = hours * 3600 + minutes * 60 + seconds;
found = true;
break;
}
} }
} }
accumulatedSeconds += totalSeconds;
int hours = accumulatedSeconds / 3600;
int minutes = (accumulatedSeconds % 3600) / 60;
int seconds = accumulatedSeconds % 60;
QString playTimeSaved = QString::number(hours) + ":" +
QString::number(minutes).rightJustified(2, '0') + ":" +
QString::number(seconds).rightJustified(2, '0');
if (!lineUpdated) { if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
out << QString::fromStdString(serial) + " " + playTimeSaved + "\n"; QTextStream out(&file);
bool lineUpdated = false;
for (const QString& line : existingLines) {
if (line.startsWith(QString::fromStdString(serial))) {
out << QString::fromStdString(serial) + " " + playTimeSaved + "\n";
lineUpdated = true;
} else {
out << line << "\n";
}
}
if (!lineUpdated) {
out << QString::fromStdString(serial) + " " + playTimeSaved + "\n";
}
} }
LOG_INFO(Loader, "Playing time for {}: {}", serial, playTimeSaved.toStdString());
} }
LOG_INFO(Loader, "Playing time for {}: {}", serial, playTimeSaved.toStdString());
}
}
#endif #endif
} // namespace Core

View File

@ -1,20 +1,12 @@
// 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
#ifdef ENABLE_QT_GUI
#include <QCoreApplication>
#include <QFileInfo>
#include <QProcess>
#include <QStandardPaths>
#include <QString>
#include <QThread>
#include "common/memory_patcher.h"
#endif
#include <chrono> #include <chrono>
#include <cstdlib> #include <cstdlib>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <thread> #include <thread>
#include <sys/stat.h>
#include "SDL3/SDL_events.h" #include "SDL3/SDL_events.h"
#include "SDL3/SDL_hints.h" #include "SDL3/SDL_hints.h"
#include "SDL3/SDL_init.h" #include "SDL3/SDL_init.h"