From de18f029a6622e436a62a89eddb24e0aefc80f4e Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 26 May 2024 13:08:41 +0200 Subject: [PATCH] port camera stuff --- src/frontend/qt_sdl/CameraManager.cpp | 17 +++++--- src/frontend/qt_sdl/CameraManager.h | 5 +++ src/frontend/qt_sdl/CameraSettingsDialog.cpp | 45 +++++++++++++------- src/frontend/qt_sdl/CameraSettingsDialog.h | 13 +++++- src/frontend/qt_sdl/Config.cpp | 2 - src/frontend/qt_sdl/Config.h | 22 ---------- src/frontend/qt_sdl/main.cpp | 2 - 7 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/frontend/qt_sdl/CameraManager.cpp b/src/frontend/qt_sdl/CameraManager.cpp index cc575d2c..e576de87 100644 --- a/src/frontend/qt_sdl/CameraManager.cpp +++ b/src/frontend/qt_sdl/CameraManager.cpp @@ -23,6 +23,8 @@ using namespace melonDS; +const char* kCamConfigPath[] = {"DSi.Camera0", "DSi.Camera1"}; + #if QT_VERSION >= 0x060000 CameraFrameDumper::CameraFrameDumper(QObject* parent) : QVideoSink(parent) @@ -116,10 +118,11 @@ QList CameraFrameDumper::supportedPixelFormats(QAbstra #endif -CameraManager::CameraManager(int num, int width, int height, bool yuv) : QObject() +CameraManager::CameraManager(int num, int width, int height, bool yuv) + : QObject(), + num(num), + config(Config::GetGlobalTable().GetTable(kCamConfigPath[num])) { - this->num = num; - startNum = 0; // QCamera needs to be controlled from the UI thread, hence this @@ -136,7 +139,7 @@ CameraManager::CameraManager(int num, int width, int height, bool yuv) : QObject tempFrameBuffer = new u32[fbsize]; inputType = -1; - xFlip = false; + xFlip = config.GetBool("XFlip"); init(); } @@ -157,9 +160,9 @@ void CameraManager::init() startNum = 0; - inputType = Config::Camera[num].InputType; - imagePath = QString::fromStdString(Config::Camera[num].ImagePath); - camDeviceName = QString::fromStdString(Config::Camera[num].CamDeviceName); + inputType = config.GetInt("InputType"); + imagePath = config.GetQString("ImagePath"); + camDeviceName = config.GetQString("DeviceName"); camDevice = nullptr; diff --git a/src/frontend/qt_sdl/CameraManager.h b/src/frontend/qt_sdl/CameraManager.h index 882b051a..80adf511 100644 --- a/src/frontend/qt_sdl/CameraManager.h +++ b/src/frontend/qt_sdl/CameraManager.h @@ -33,6 +33,7 @@ #include #include "types.h" +#include "Config.h" class CameraManager; @@ -80,6 +81,8 @@ public: CameraManager(int num, int width, int height, bool yuv); ~CameraManager(); + Config::Table& getConfig() { return config; } + void init(); void deInit(); @@ -106,6 +109,8 @@ private slots: private: int num; + Config::Table config; + int startNum; int inputType; diff --git a/src/frontend/qt_sdl/CameraSettingsDialog.cpp b/src/frontend/qt_sdl/CameraSettingsDialog.cpp index cf404173..e9955453 100644 --- a/src/frontend/qt_sdl/CameraSettingsDialog.cpp +++ b/src/frontend/qt_sdl/CameraSettingsDialog.cpp @@ -22,6 +22,7 @@ #include #include "types.h" +#include "main.h" #include "CameraSettingsDialog.h" #include "ui_CameraSettingsDialog.h" @@ -71,9 +72,16 @@ CameraSettingsDialog::CameraSettingsDialog(QWidget* parent) : QDialog(parent), u ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose); + emuInstance = ((MainWindow*)parent)->getEmuInstance(); + for (int i = 0; i < 2; i++) { - oldCamSettings[i] = Config::Camera[i]; + auto& cfg = camManager[i]->getConfig(); + + oldCamSettings[i].InputType = cfg.GetInt("InputType"); + oldCamSettings[i].ImagePath = cfg.GetString("ImagePath"); + oldCamSettings[i].CamDeviceName = cfg.GetString("DeviceName"); + oldCamSettings[i].XFlip = cfg.GetBool("XFlip"); } ui->cbCameraSel->addItem("DSi outer camera"); @@ -161,7 +169,13 @@ void CameraSettingsDialog::on_CameraSettingsDialog_rejected() { camManager[i]->stop(); camManager[i]->deInit(); - Config::Camera[i] = oldCamSettings[i]; + + auto& cfg = camManager[i]->getConfig(); + cfg.SetInt("InputType", oldCamSettings[i].InputType); + cfg.SetString("ImagePath", oldCamSettings[i].ImagePath); + cfg.SetString("DeviceName", oldCamSettings[i].CamDeviceName); + cfg.SetBool("XFlip", oldCamSettings[i].XFlip); + camManager[i]->init(); } @@ -178,7 +192,7 @@ void CameraSettingsDialog::on_cbCameraSel_currentIndexChanged(int id) } currentId = id; - currentCfg = &Config::Camera[id]; + currentCfg = &camManager[id]->getConfig(); //currentCam = camManager[id]; currentCam = nullptr; populateCamControls(id); @@ -198,16 +212,16 @@ void CameraSettingsDialog::onChangeInputType(int type) currentCam->deInit(); } - currentCfg->InputType = type; + currentCfg->SetInt("InputType", type); ui->txtSrcImagePath->setEnabled(type == 1); ui->btnSrcImageBrowse->setEnabled(type == 1); ui->cbPhysicalCamera->setEnabled((type == 2) && (ui->cbPhysicalCamera->count()>0)); - currentCfg->ImagePath = ui->txtSrcImagePath->text().toStdString(); + currentCfg->SetQString("ImagePath", ui->txtSrcImagePath->text()); if (ui->cbPhysicalCamera->count() > 0) - currentCfg->CamDeviceName = ui->cbPhysicalCamera->currentData().toString().toStdString(); + currentCfg->SetQString("DeviceName", ui->cbPhysicalCamera->currentData().toString()); if (currentCam) { @@ -226,7 +240,7 @@ void CameraSettingsDialog::on_txtSrcImagePath_textChanged() currentCam->deInit(); } - currentCfg->ImagePath = ui->txtSrcImagePath->text().toStdString(); + currentCfg->SetQString("ImagePath", ui->txtSrcImagePath->text()); if (currentCam) { @@ -257,7 +271,7 @@ void CameraSettingsDialog::on_cbPhysicalCamera_currentIndexChanged(int id) currentCam->deInit(); } - currentCfg->CamDeviceName = ui->cbPhysicalCamera->itemData(id).toString().toStdString(); + currentCfg->SetQString("DeviceName", ui->cbPhysicalCamera->itemData(id).toString()); if (currentCam) { @@ -268,16 +282,16 @@ void CameraSettingsDialog::on_cbPhysicalCamera_currentIndexChanged(int id) void CameraSettingsDialog::populateCamControls(int id) { - Config::CameraConfig& cfg = Config::Camera[id]; + Config::Table& cfg = camManager[id]->getConfig(); - int type = cfg.InputType; + int type = cfg.GetInt("InputType"); if (type < 0 || type >= grpInputType->buttons().count()) type = 0; grpInputType->button(type)->setChecked(true); - ui->txtSrcImagePath->setText(QString::fromStdString(cfg.ImagePath)); + ui->txtSrcImagePath->setText(cfg.GetQString("ImagePath")); bool deviceset = false; - QString device = QString::fromStdString(cfg.CamDeviceName); + QString device = cfg.GetQString("DeviceName"); for (int i = 0; i < ui->cbPhysicalCamera->count(); i++) { QString itemdev = ui->cbPhysicalCamera->itemData(i).toString(); @@ -293,13 +307,14 @@ void CameraSettingsDialog::populateCamControls(int id) onChangeInputType(type); - ui->chkFlipPicture->setChecked(cfg.XFlip); + ui->chkFlipPicture->setChecked(cfg.GetBool("XFlip")); } void CameraSettingsDialog::on_chkFlipPicture_clicked() { if (!currentCfg) return; - currentCfg->XFlip = ui->chkFlipPicture->isChecked(); - if (currentCam) currentCam->setXFlip(currentCfg->XFlip); + bool xflip = ui->chkFlipPicture->isChecked(); + currentCfg->SetBool("XFlip", xflip); + if (currentCam) currentCam->setXFlip(xflip); } diff --git a/src/frontend/qt_sdl/CameraSettingsDialog.h b/src/frontend/qt_sdl/CameraSettingsDialog.h index a740193a..784d94fe 100644 --- a/src/frontend/qt_sdl/CameraSettingsDialog.h +++ b/src/frontend/qt_sdl/CameraSettingsDialog.h @@ -28,6 +28,8 @@ namespace Ui { class CameraSettingsDialog; } class CameraSettingsDialog; +class EmuInstance; + class CameraPreviewPanel : public QWidget { Q_OBJECT @@ -92,15 +94,22 @@ private slots: private: Ui::CameraSettingsDialog* ui; + EmuInstance* emuInstance; QButtonGroup* grpInputType; CameraPreviewPanel* previewPanel; int currentId; - Config::CameraConfig* currentCfg; + Config::Table* currentCfg; CameraManager* currentCam; - Config::CameraConfig oldCamSettings[2]; + struct + { + int InputType; // 0=blank 1=image 2=camera + std::string ImagePath; + std::string CamDeviceName; + bool XFlip; + } oldCamSettings[2]; void populateCamControls(int id); }; diff --git a/src/frontend/qt_sdl/Config.cpp b/src/frontend/qt_sdl/Config.cpp index e680d273..0cf6a5bd 100644 --- a/src/frontend/qt_sdl/Config.cpp +++ b/src/frontend/qt_sdl/Config.cpp @@ -48,8 +48,6 @@ int GL_ScaleFactor; bool GL_BetterPolygons; bool GL_HiresCoordinates; -CameraConfig Camera[2]; - const char* kConfigFile = "melonDS.toml"; diff --git a/src/frontend/qt_sdl/Config.h b/src/frontend/qt_sdl/Config.h index 4a18b63f..5f2e16aa 100644 --- a/src/frontend/qt_sdl/Config.h +++ b/src/frontend/qt_sdl/Config.h @@ -25,9 +25,6 @@ #include #include -//#define TOML_HEADER_ONLY 0 -//#include "toml/toml.hpp" - #ifndef TOML11_VALUE_HPP namespace toml { @@ -46,23 +43,6 @@ struct LegacyEntry bool InstanceUnique; // whether the setting can exist individually for each instance in multiplayer }; -struct ConfigEntry -{ - char Name[32]; - int Type; // 0=int 1=bool 2=string 3=64bit int - void* Value; // pointer to the value variable - std::variant Default; - bool InstanceUnique; // whether the setting can exist individually for each instance in multiplayer -}; - -struct CameraConfig -{ - int InputType; // 0=blank 1=image 2=camera - std::string ImagePath; - std::string CamDeviceName; - bool XFlip; -}; - template using DefaultList = std::unordered_map; @@ -162,8 +142,6 @@ extern int GL_ScaleFactor; extern bool GL_BetterPolygons; extern bool GL_HiresCoordinates; -extern CameraConfig Camera[2]; - bool Load(); void Save(); diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index c545f73a..7f1aecab 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -324,8 +324,6 @@ int main(int argc, char** argv) camStarted[1] = false; camManager[0] = new CameraManager(0, 640, 480, true); camManager[1] = new CameraManager(1, 640, 480, true); - camManager[0]->setXFlip(Config::Camera[0].XFlip); - camManager[1]->setXFlip(Config::Camera[1].XFlip); systemThemeName = new QString(QApplication::style()->objectName());