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?
emuThread->emuStop();
emuThread->emuExit();
emuThread->wait();
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()
{
return globalCfg.GetBool("Screen.UseGL") ||

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -63,22 +63,7 @@ namespace melonDS::Platform
void SignalStop(StopReason reason, void* userdata)
{
EmuInstance* inst = (EmuInstance*)userdata;
emuStop();
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;
}
inst->emuStop(reason);
}

View File

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

View File

@ -82,32 +82,62 @@
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 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
static bool FileExtensionInList(const QString& filename, const QStringList& extensions, Qt::CaseSensitivity cs = Qt::CaseInsensitive)
{
@ -1515,7 +1545,7 @@ void MainWindow::onImportSavefile()
return;
}
if (RunningSomething)
if (emuThread->emuIsActive())
{
if (QMessageBox::warning(this,
"melonDS",
@ -1553,7 +1583,7 @@ void MainWindow::onQuit()
void MainWindow::onPause(bool checked)
{
if (!RunningSomething) return;
if (!emuThread->emuIsActive()) return;
if (checked)
{
@ -1571,7 +1601,7 @@ void MainWindow::onPause(bool checked)
void MainWindow::onReset()
{
if (!RunningSomething) return;
if (!emuThread->emuIsActive()) return;
emuThread->emuPause();
@ -1585,7 +1615,7 @@ void MainWindow::onReset()
void MainWindow::onStop()
{
if (!RunningSomething) return;
if (!emuThread->emuIsActive()) return;
emuThread->emuPause();
emuInstance->nds->Stop();
@ -1593,7 +1623,7 @@ void MainWindow::onStop()
void MainWindow::onFrameStep()
{
if (!RunningSomething) return;
if (!emuThread->emuIsActive()) return;
emuThread->emuFrameStep();
}
@ -1693,7 +1723,7 @@ void MainWindow::onEmuSettingsDialogFinished(int res)
actCurrentGBACart->setText("GBA slot: " + emuInstance->gbaCartLabel());
if (!RunningSomething)
if (!emuThread->emuIsActive())
actTitleManager->setEnabled(!globalCfg.GetString("DSi.NANDPath").empty());
}
@ -2049,7 +2079,7 @@ void MainWindow::onEmuStart()
void MainWindow::onEmuStop()
{
emuThread->emuPause();
emuThread->emuStop();
for (int i = 0; i < 9; i++)
{

View File

@ -77,145 +77,61 @@
#include "CLI.h"
// TODO: uniform variable spelling
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;
// 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;
bool RunningSomething;
//MainWindow* mainWindow;
//EmuThread* emuThread;
EmuInstance* testinst;
const int kMaxEmuInstances = 16;
EmuInstance* emuInstances[kMaxEmuInstances];
CameraManager* camManager[2];
bool camStarted[2];
static bool FileExtensionInList(const QString& filename, const QStringList& extensions, Qt::CaseSensitivity cs = Qt::CaseInsensitive)
bool createEmuInstance()
{
return std::any_of(extensions.cbegin(), extensions.cend(), [&](const auto& ext) {
return filename.endsWith(ext, cs);
});
int id = -1;
for (int i = 0; i < kMaxEmuInstances; i++)
{
if (!emuInstances[i])
{
id = i;
break;
}
}
if (id == -1)
return false;
auto inst = new EmuInstance(id);
emuInstances[id] = inst;
return true;
}
static bool MimeTypeInList(const QMimeType& mimetype, const QStringList& superTypeNames)
void deleteEmuInstance(int id)
{
return std::any_of(superTypeNames.cbegin(), superTypeNames.cend(), [&](const auto& superTypeName) {
return mimetype.inherits(superTypeName);
});
auto inst = emuInstances[id];
if (!inst) return;
delete inst;
emuInstances[id] = nullptr;
}
static bool NdsRomByExtension(const QString& filename)
void deleteAllEmuInstances()
{
return FileExtensionInList(filename, NdsRomExtensions);
for (int i = 0; i < kMaxEmuInstances; i++)
deleteEmuInstance(i);
}
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;
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 pathInit()
{
@ -254,12 +170,6 @@ void pathInit()
}
void emuStop()
{
RunningSomething = false;
//emit emuThread->windowEmuStop();
}
MelonApplication::MelonApplication(int& argc, char** argv)
: QApplication(argc, argv)
@ -291,6 +201,9 @@ int main(int argc, char** argv)
{
srand(time(nullptr));
for (int i = 0; i < kMaxEmuInstances; i++)
emuInstances[i] = nullptr;
qputenv("QT_SCALE_FACTOR", "1");
#if QT_VERSION_MAJOR == 6 && defined(__WIN32__)