remove some global cruft.

some functions (like stop) are still broken. bear with me, we'll get there.
This commit is contained in:
Arisotura 2024-06-04 12:13:54 +02:00
parent 724d5fbac1
commit 83c9b8dd42
12 changed files with 137 additions and 190 deletions

View File

@ -99,7 +99,7 @@ EmuInstance::~EmuInstance()
{ {
// TODO window cleanup and shit? // TODO window cleanup and shit?
emuThread->emuStop(); emuThread->emuExit();
emuThread->wait(); emuThread->wait();
delete emuThread; delete emuThread;
@ -165,6 +165,33 @@ void EmuInstance::osdAddMessage(unsigned int color, const char* fmt, ...)
} }
bool EmuInstance::emuIsActive()
{
return emuThread->emuIsActive();
}
void EmuInstance::emuStop(StopReason reason)
{
emuThread->emuStop();
switch (reason)
{
case StopReason::GBAModeNotSupported:
Log(LogLevel::Error, "!! GBA MODE NOT SUPPORTED\n");
osdAddMessage(0xFFA0A0, "GBA mode not supported");
break;
case StopReason::BadExceptionRegion:
osdAddMessage(0xFFA0A0, "Internal error");
break;
case StopReason::PowerOff:
case StopReason::External:
osdAddMessage(0xFFC040, "Shutdown");
default:
break;
}
}
bool EmuInstance::usesOpenGL() bool EmuInstance::usesOpenGL()
{ {
return globalCfg.GetBool("Screen.UseGL") || return globalCfg.GetBool("Screen.UseGL") ||

View File

@ -90,6 +90,9 @@ public:
void osdAddMessage(unsigned int color, const char* fmt, ...); void osdAddMessage(unsigned int color, const char* fmt, ...);
bool emuIsActive();
void emuStop(melonDS::Platform::StopReason reason);
bool usesOpenGL(); bool usesOpenGL();
void initOpenGL(); void initOpenGL();
void deinitOpenGL(); void deinitOpenGL();

View File

@ -32,8 +32,6 @@ using namespace melonDS;
EmuSettingsDialog* EmuSettingsDialog::currentDlg = nullptr; EmuSettingsDialog* EmuSettingsDialog::currentDlg = nullptr;
extern bool RunningSomething;
bool EmuSettingsDialog::needsReset = false; bool EmuSettingsDialog::needsReset = false;
inline void EmuSettingsDialog::updateLastBIOSFolder(QString& filename) inline void EmuSettingsDialog::updateLastBIOSFolder(QString& filename)
@ -246,7 +244,7 @@ void EmuSettingsDialog::done(int r)
if (modified) if (modified)
{ {
if (RunningSomething if (emuInstance->emuIsActive()
&& QMessageBox::warning(this, "Reset necessary to apply changes", && QMessageBox::warning(this, "Reset necessary to apply changes",
"The emulation will be reset for the changes to take place.", "The emulation will be reset for the changes to take place.",
QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok) QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)

View File

@ -55,18 +55,9 @@
#include "Savestate.h" #include "Savestate.h"
#include "EmuInstance.h" #include "EmuInstance.h"
//#include "ArchiveUtil.h"
//#include "CameraManager.h"
//#include "CLI.h"
// TODO: uniform variable spelling
using namespace melonDS; using namespace melonDS;
// TEMP
extern bool RunningSomething;
//extern MainWindow* mainWindow;
EmuThread::EmuThread(EmuInstance* inst, QObject* parent) : QThread(parent) EmuThread::EmuThread(EmuInstance* inst, QObject* parent) : QThread(parent)
{ {
@ -75,7 +66,7 @@ EmuThread::EmuThread(EmuInstance* inst, QObject* parent) : QThread(parent)
EmuStatus = emuStatus_Exit; EmuStatus = emuStatus_Exit;
EmuRunning = emuStatus_Paused; EmuRunning = emuStatus_Paused;
EmuPauseStack = EmuPauseStackRunning; EmuPauseStack = EmuPauseStackRunning;
RunningSomething = false; emuActive = false;
} }
void EmuThread::attachWindow(MainWindow* window) void EmuThread::attachWindow(MainWindow* window)
@ -494,7 +485,7 @@ void EmuThread::emuRun()
{ {
EmuRunning = emuStatus_Running; EmuRunning = emuStatus_Running;
EmuPauseStack = EmuPauseStackRunning; EmuPauseStack = EmuPauseStackRunning;
RunningSomething = true; emuActive = true;
// checkme // checkme
emit windowEmuStart(); emit windowEmuStart();
@ -538,6 +529,12 @@ void EmuThread::emuUnpause()
} }
void EmuThread::emuStop() void EmuThread::emuStop()
{
emuPause();
emuActive = false;
}
void EmuThread::emuExit()
{ {
EmuRunning = emuStatus_Exit; EmuRunning = emuStatus_Exit;
EmuPauseStack = EmuPauseStackRunning; EmuPauseStack = EmuPauseStackRunning;
@ -558,7 +555,7 @@ bool EmuThread::emuIsRunning()
bool EmuThread::emuIsActive() bool EmuThread::emuIsActive()
{ {
return (RunningSomething == 1); return emuActive;
} }
void EmuThread::updateRenderer() void EmuThread::updateRenderer()

View File

@ -60,6 +60,7 @@ public:
void emuPause(); void emuPause();
void emuUnpause(); void emuUnpause();
void emuStop(); void emuStop();
void emuExit();
void emuFrameStep(); void emuFrameStep();
bool emuIsRunning(); bool emuIsRunning();
@ -108,6 +109,7 @@ private:
EmuStatusKind PrevEmuStatus; EmuStatusKind PrevEmuStatus;
EmuStatusKind EmuRunning; EmuStatusKind EmuRunning;
bool emuActive;
constexpr static int EmuPauseStackRunning = 0; constexpr static int EmuPauseStackRunning = 0;
constexpr static int EmuPauseStackPauseThreshold = 1; constexpr static int EmuPauseStackPauseThreshold = 1;

View File

@ -30,8 +30,6 @@ namespace Platform = melonDS::Platform;
FirmwareSettingsDialog* FirmwareSettingsDialog::currentDlg = nullptr; FirmwareSettingsDialog* FirmwareSettingsDialog::currentDlg = nullptr;
extern bool RunningSomething;
bool FirmwareSettingsDialog::needsReset = false; bool FirmwareSettingsDialog::needsReset = false;
FirmwareSettingsDialog::FirmwareSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::FirmwareSettingsDialog) FirmwareSettingsDialog::FirmwareSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::FirmwareSettingsDialog)
@ -169,7 +167,7 @@ void FirmwareSettingsDialog::done(int r)
if (modified) if (modified)
{ {
if (RunningSomething if (emuInstance->emuIsActive()
&& QMessageBox::warning(this, "Reset necessary to apply changes", && QMessageBox::warning(this, "Reset necessary to apply changes",
"The emulation will be reset for the changes to take place.", "The emulation will be reset for the changes to take place.",
QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok) QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)

View File

@ -34,8 +34,6 @@
MPSettingsDialog* MPSettingsDialog::currentDlg = nullptr; MPSettingsDialog* MPSettingsDialog::currentDlg = nullptr;
extern bool RunningSomething;
MPSettingsDialog::MPSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::MPSettingsDialog) MPSettingsDialog::MPSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::MPSettingsDialog)
{ {

View File

@ -34,8 +34,6 @@ namespace Platform = melonDS::Platform;
PathSettingsDialog* PathSettingsDialog::currentDlg = nullptr; PathSettingsDialog* PathSettingsDialog::currentDlg = nullptr;
extern bool RunningSomething;
bool PathSettingsDialog::needsReset = false; bool PathSettingsDialog::needsReset = false;
constexpr char errordialog[] = "melonDS cannot write to that directory."; constexpr char errordialog[] = "melonDS cannot write to that directory.";
@ -97,7 +95,7 @@ void PathSettingsDialog::done(int r)
if (modified) if (modified)
{ {
if (RunningSomething if (emuInstance->emuIsActive()
&& QMessageBox::warning(this, "Reset necessary to apply changes", && QMessageBox::warning(this, "Reset necessary to apply changes",
"The emulation will be reset for the changes to take place.", "The emulation will be reset for the changes to take place.",
QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok) QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Ok)

View File

@ -63,22 +63,7 @@ namespace melonDS::Platform
void SignalStop(StopReason reason, void* userdata) void SignalStop(StopReason reason, void* userdata)
{ {
EmuInstance* inst = (EmuInstance*)userdata; EmuInstance* inst = (EmuInstance*)userdata;
emuStop(); inst->emuStop(reason);
switch (reason)
{
case StopReason::GBAModeNotSupported:
Log(LogLevel::Error, "!! GBA MODE NOT SUPPORTED\n");
//mainWindow->osdAddMessage(0xFFA0A0, "GBA mode not supported.");
break;
case StopReason::BadExceptionRegion:
//mainWindow->osdAddMessage(0xFFA0A0, "Internal error.");
break;
case StopReason::PowerOff:
case StopReason::External:
//mainWindow->osdAddMessage(0xFFC040, "Shutdown");
default:
break;
}
} }

View File

@ -43,8 +43,6 @@ WifiSettingsDialog* WifiSettingsDialog::currentDlg = nullptr;
bool WifiSettingsDialog::needsReset = false; bool WifiSettingsDialog::needsReset = false;
extern bool RunningSomething;
WifiSettingsDialog::WifiSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::WifiSettingsDialog) WifiSettingsDialog::WifiSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::WifiSettingsDialog)
{ {

View File

@ -82,32 +82,62 @@
using namespace melonDS; using namespace melonDS;
// TEMP
extern MainWindow* mainWindow;
//extern EmuThread* emuThread;
extern bool RunningSomething;
extern QString NdsRomMimeType;
extern QStringList NdsRomExtensions;
extern QString GbaRomMimeType;
extern QStringList GbaRomExtensions;
extern QStringList ArchiveMimeTypes;
extern QStringList ArchiveExtensions;
/*static bool FileExtensionInList(const QString& filename, const QStringList& extensions, Qt::CaseSensitivity cs);
static bool MimeTypeInList(const QMimeType& mimetype, const QStringList& superTypeNames);
static bool NdsRomByExtension(const QString& filename);
static bool GbaRomByExtension(const QString& filename);
static bool SupportedArchiveByExtension(const QString& filename);
static bool NdsRomByMimetype(const QMimeType& mimetype);
static bool GbaRomByMimetype(const QMimeType& mimetype);
static bool SupportedArchiveByMimetype(const QMimeType& mimetype);
static bool ZstdNdsRomByExtension(const QString& filename);
static bool ZstdGbaRomByExtension(const QString& filename);
static bool FileIsSupportedFiletype(const QString& filename, bool insideArchive);*/
extern CameraManager* camManager[2]; extern CameraManager* camManager[2];
extern bool camStarted[2]; extern bool camStarted[2];
QString NdsRomMimeType = "application/x-nintendo-ds-rom";
QStringList NdsRomExtensions { ".nds", ".srl", ".dsi", ".ids" };
QString GbaRomMimeType = "application/x-gba-rom";
QStringList GbaRomExtensions { ".gba", ".agb" };
// This list of supported archive formats is based on libarchive(3) version 3.6.2 (2022-12-09).
QStringList ArchiveMimeTypes
{
#ifdef ARCHIVE_SUPPORT_ENABLED
"application/zip",
"application/x-7z-compressed",
"application/vnd.rar", // *.rar
"application/x-tar",
"application/x-compressed-tar", // *.tar.gz
"application/x-xz-compressed-tar",
"application/x-bzip-compressed-tar",
"application/x-lz4-compressed-tar",
"application/x-zstd-compressed-tar",
"application/x-tarz", // *.tar.Z
"application/x-lzip-compressed-tar",
"application/x-lzma-compressed-tar",
"application/x-lrzip-compressed-tar",
"application/x-tzo", // *.tar.lzo
#endif
};
QStringList ArchiveExtensions
{
#ifdef ARCHIVE_SUPPORT_ENABLED
".zip", ".7z", ".rar", ".tar",
".tar.gz", ".tgz",
".tar.xz", ".txz",
".tar.bz2", ".tbz2",
".tar.lz4", ".tlz4",
".tar.zst", ".tzst",
".tar.Z", ".taz",
".tar.lz",
".tar.lzma", ".tlz",
".tar.lrz", ".tlrz",
".tar.lzo", ".tzo"
#endif
};
// AAAAAAA // AAAAAAA
static bool FileExtensionInList(const QString& filename, const QStringList& extensions, Qt::CaseSensitivity cs = Qt::CaseInsensitive) static bool FileExtensionInList(const QString& filename, const QStringList& extensions, Qt::CaseSensitivity cs = Qt::CaseInsensitive)
{ {
@ -1515,7 +1545,7 @@ void MainWindow::onImportSavefile()
return; return;
} }
if (RunningSomething) if (emuThread->emuIsActive())
{ {
if (QMessageBox::warning(this, if (QMessageBox::warning(this,
"melonDS", "melonDS",
@ -1553,7 +1583,7 @@ void MainWindow::onQuit()
void MainWindow::onPause(bool checked) void MainWindow::onPause(bool checked)
{ {
if (!RunningSomething) return; if (!emuThread->emuIsActive()) return;
if (checked) if (checked)
{ {
@ -1571,7 +1601,7 @@ void MainWindow::onPause(bool checked)
void MainWindow::onReset() void MainWindow::onReset()
{ {
if (!RunningSomething) return; if (!emuThread->emuIsActive()) return;
emuThread->emuPause(); emuThread->emuPause();
@ -1585,7 +1615,7 @@ void MainWindow::onReset()
void MainWindow::onStop() void MainWindow::onStop()
{ {
if (!RunningSomething) return; if (!emuThread->emuIsActive()) return;
emuThread->emuPause(); emuThread->emuPause();
emuInstance->nds->Stop(); emuInstance->nds->Stop();
@ -1593,7 +1623,7 @@ void MainWindow::onStop()
void MainWindow::onFrameStep() void MainWindow::onFrameStep()
{ {
if (!RunningSomething) return; if (!emuThread->emuIsActive()) return;
emuThread->emuFrameStep(); emuThread->emuFrameStep();
} }
@ -1693,7 +1723,7 @@ void MainWindow::onEmuSettingsDialogFinished(int res)
actCurrentGBACart->setText("GBA slot: " + emuInstance->gbaCartLabel()); actCurrentGBACart->setText("GBA slot: " + emuInstance->gbaCartLabel());
if (!RunningSomething) if (!emuThread->emuIsActive())
actTitleManager->setEnabled(!globalCfg.GetString("DSi.NANDPath").empty()); actTitleManager->setEnabled(!globalCfg.GetString("DSi.NANDPath").empty());
} }
@ -2049,7 +2079,7 @@ void MainWindow::onEmuStart()
void MainWindow::onEmuStop() void MainWindow::onEmuStop()
{ {
emuThread->emuPause(); emuThread->emuStop();
for (int i = 0; i < 9; i++) for (int i = 0; i < 9; i++)
{ {

View File

@ -77,144 +77,60 @@
#include "CLI.h" #include "CLI.h"
// TODO: uniform variable spelling
using namespace melonDS; using namespace melonDS;
QString NdsRomMimeType = "application/x-nintendo-ds-rom";
QStringList NdsRomExtensions { ".nds", ".srl", ".dsi", ".ids" };
QString GbaRomMimeType = "application/x-gba-rom";
QStringList GbaRomExtensions { ".gba", ".agb" };
QString* systemThemeName; QString* systemThemeName;
// This list of supported archive formats is based on libarchive(3) version 3.6.2 (2022-12-09).
QStringList ArchiveMimeTypes
{
#ifdef ARCHIVE_SUPPORT_ENABLED
"application/zip",
"application/x-7z-compressed",
"application/vnd.rar", // *.rar
"application/x-tar",
"application/x-compressed-tar", // *.tar.gz
"application/x-xz-compressed-tar",
"application/x-bzip-compressed-tar",
"application/x-lz4-compressed-tar",
"application/x-zstd-compressed-tar",
"application/x-tarz", // *.tar.Z
"application/x-lzip-compressed-tar",
"application/x-lzma-compressed-tar",
"application/x-lrzip-compressed-tar",
"application/x-tzo", // *.tar.lzo
#endif
};
QStringList ArchiveExtensions
{
#ifdef ARCHIVE_SUPPORT_ENABLED
".zip", ".7z", ".rar", ".tar",
".tar.gz", ".tgz",
".tar.xz", ".txz",
".tar.bz2", ".tbz2",
".tar.lz4", ".tlz4",
".tar.zst", ".tzst",
".tar.Z", ".taz",
".tar.lz",
".tar.lzma", ".tlz",
".tar.lrz", ".tlrz",
".tar.lzo", ".tzo"
#endif
};
QString emuDirectory; QString emuDirectory;
bool RunningSomething;
//MainWindow* mainWindow; //MainWindow* mainWindow;
//EmuThread* emuThread; //EmuThread* emuThread;
EmuInstance* testinst; EmuInstance* testinst;
const int kMaxEmuInstances = 16;
EmuInstance* emuInstances[kMaxEmuInstances];
CameraManager* camManager[2]; CameraManager* camManager[2];
bool camStarted[2]; bool camStarted[2];
bool createEmuInstance()
static bool FileExtensionInList(const QString& filename, const QStringList& extensions, Qt::CaseSensitivity cs = Qt::CaseInsensitive)
{ {
return std::any_of(extensions.cbegin(), extensions.cend(), [&](const auto& ext) { int id = -1;
return filename.endsWith(ext, cs); for (int i = 0; i < kMaxEmuInstances; i++)
}); {
} if (!emuInstances[i])
{
id = i;
break;
}
}
static bool MimeTypeInList(const QMimeType& mimetype, const QStringList& superTypeNames) if (id == -1)
{ return false;
return std::any_of(superTypeNames.cbegin(), superTypeNames.cend(), [&](const auto& superTypeName) {
return mimetype.inherits(superTypeName);
});
}
auto inst = new EmuInstance(id);
emuInstances[id] = inst;
static bool NdsRomByExtension(const QString& filename)
{
return FileExtensionInList(filename, NdsRomExtensions);
}
static bool GbaRomByExtension(const QString& filename)
{
return FileExtensionInList(filename, GbaRomExtensions);
}
static bool SupportedArchiveByExtension(const QString& filename)
{
return FileExtensionInList(filename, ArchiveExtensions);
}
static bool NdsRomByMimetype(const QMimeType& mimetype)
{
return mimetype.inherits(NdsRomMimeType);
}
static bool GbaRomByMimetype(const QMimeType& mimetype)
{
return mimetype.inherits(GbaRomMimeType);
}
static bool SupportedArchiveByMimetype(const QMimeType& mimetype)
{
return MimeTypeInList(mimetype, ArchiveMimeTypes);
}
static bool ZstdNdsRomByExtension(const QString& filename)
{
return filename.endsWith(".zst", Qt::CaseInsensitive) &&
NdsRomByExtension(filename.left(filename.size() - 4));
}
static bool ZstdGbaRomByExtension(const QString& filename)
{
return filename.endsWith(".zst", Qt::CaseInsensitive) &&
GbaRomByExtension(filename.left(filename.size() - 4));
}
static bool FileIsSupportedFiletype(const QString& filename, bool insideArchive = false)
{
if (ZstdNdsRomByExtension(filename) || ZstdGbaRomByExtension(filename))
return true; return true;
if (NdsRomByExtension(filename) || GbaRomByExtension(filename) || SupportedArchiveByExtension(filename))
return true;
const auto matchmode = insideArchive ? QMimeDatabase::MatchExtension : QMimeDatabase::MatchDefault;
const QMimeType mimetype = QMimeDatabase().mimeTypeForFile(filename, matchmode);
return NdsRomByMimetype(mimetype) || GbaRomByMimetype(mimetype) || SupportedArchiveByMimetype(mimetype);
} }
void deleteEmuInstance(int id)
{
auto inst = emuInstances[id];
if (!inst) return;
delete inst;
emuInstances[id] = nullptr;
}
void deleteAllEmuInstances()
{
for (int i = 0; i < kMaxEmuInstances; i++)
deleteEmuInstance(i);
}
void pathInit() void pathInit()
@ -254,12 +170,6 @@ void pathInit()
} }
void emuStop()
{
RunningSomething = false;
//emit emuThread->windowEmuStop();
}
MelonApplication::MelonApplication(int& argc, char** argv) MelonApplication::MelonApplication(int& argc, char** argv)
: QApplication(argc, argv) : QApplication(argc, argv)
@ -291,6 +201,9 @@ int main(int argc, char** argv)
{ {
srand(time(nullptr)); srand(time(nullptr));
for (int i = 0; i < kMaxEmuInstances; i++)
emuInstances[i] = nullptr;
qputenv("QT_SCALE_FACTOR", "1"); qputenv("QT_SCALE_FACTOR", "1");
#if QT_VERSION_MAJOR == 6 && defined(__WIN32__) #if QT_VERSION_MAJOR == 6 && defined(__WIN32__)