From 56b52f49a76a242f545a776d433af83a0f3b0b4f Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Wed, 23 Jul 2025 20:33:31 +0200 Subject: [PATCH 1/4] Make CameraManager request the camera access permission when using Qt 6 Camera access seems to have changed to require explicitly asking for permission rather than doing it for you. Starting the session was moved to the camStart slot so that the permission prompt will show up when the camera is actually used the first time rather than in some cases before the main window even shows up. --- src/frontend/qt_sdl/CMakeLists.txt | 2 ++ src/frontend/qt_sdl/CameraManager.cpp | 44 ++++++++++++++++++++------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/frontend/qt_sdl/CMakeLists.txt b/src/frontend/qt_sdl/CMakeLists.txt index b0b6e5ab41..0df7231d49 100644 --- a/src/frontend/qt_sdl/CMakeLists.txt +++ b/src/frontend/qt_sdl/CMakeLists.txt @@ -260,3 +260,5 @@ if (ENABLE_OGLRENDERER) target_compile_definitions(melonDS PUBLIC MELONDS_GL_HEADER=${MELONDS_GL_HEADER}) target_compile_definitions(core PUBLIC MELONDS_GL_HEADER=${MELONDS_GL_HEADER}) endif() + +qt_finalize_target(melonDS) \ No newline at end of file diff --git a/src/frontend/qt_sdl/CameraManager.cpp b/src/frontend/qt_sdl/CameraManager.cpp index 3b133b8b10..3a60c42e4f 100644 --- a/src/frontend/qt_sdl/CameraManager.cpp +++ b/src/frontend/qt_sdl/CameraManager.cpp @@ -26,6 +26,10 @@ using namespace melonDS; const char* kCamConfigPath[] = {"DSi.Camera0", "DSi.Camera1"}; #if QT_VERSION >= 0x060000 +#if QT_CONFIG(permissions) +#include +#include +#endif CameraFrameDumper::CameraFrameDumper(QObject* parent) : QVideoSink(parent) { @@ -245,14 +249,6 @@ void CameraManager::init() delete camDevice; camDevice = nullptr; } - else - { - camDumper = new CameraFrameDumper(this); - - camSession = new QMediaCaptureSession(this); - camSession->setCamera(camDevice); - camSession->setVideoOutput(camDumper); - } } #else camDevice = new QCamera(camDeviceName.toUtf8()); @@ -328,13 +324,14 @@ void CameraManager::deInit() void CameraManager::start() { - if (startNum == 1) return; - startNum = 1; - if (inputType == 2) { emit camStartSignal(); } + else + { + startNum = 1; + } } void CameraManager::stop() @@ -356,7 +353,32 @@ bool CameraManager::isStarted() void CameraManager::camStart() { if (camDevice) + { +#if QT_VERSION_MAJOR >= 6 +#if QT_CONFIG(permissions) + QCameraPermission cameraPermission; + bool granted = false; + switch (qApp->checkPermission(cameraPermission)) { + case Qt::PermissionStatus::Undetermined: + qApp->requestPermission(cameraPermission, this, &CameraManager::camStart);; + return; + case Qt::PermissionStatus::Denied: + return; + case Qt::PermissionStatus::Granted: + break; + } +#endif + + camDumper = new CameraFrameDumper(this); + + camSession = new QMediaCaptureSession(this); + camSession->setCamera(camDevice); + camSession->setVideoOutput(camDumper); +#endif + camDevice->start(); + } + startNum = 1; } void CameraManager::camStop() From 01935d95ef9961b7acc3ec4187cdbec28ab97866 Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Thu, 24 Jul 2025 08:18:18 +0200 Subject: [PATCH 2/4] Add a version check for the permissions feature check Checking for an unknown feature causes a division by zero --- src/frontend/qt_sdl/CameraManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/qt_sdl/CameraManager.cpp b/src/frontend/qt_sdl/CameraManager.cpp index 3a60c42e4f..d1b44c187b 100644 --- a/src/frontend/qt_sdl/CameraManager.cpp +++ b/src/frontend/qt_sdl/CameraManager.cpp @@ -26,7 +26,7 @@ using namespace melonDS; const char* kCamConfigPath[] = {"DSi.Camera0", "DSi.Camera1"}; #if QT_VERSION >= 0x060000 -#if QT_CONFIG(permissions) +#if QT_VERSION_CHECK(6, 5, 0) && QT_CONFIG(permissions) #include #include #endif @@ -355,7 +355,7 @@ void CameraManager::camStart() if (camDevice) { #if QT_VERSION_MAJOR >= 6 -#if QT_CONFIG(permissions) +#if QT_VERSION_CHECK(6, 5, 0) && QT_CONFIG(permissions) QCameraPermission cameraPermission; bool granted = false; switch (qApp->checkPermission(cameraPermission)) { From ab8696c504f6fb6af38e68f34a61f11ca11187e1 Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Thu, 24 Jul 2025 08:33:20 +0200 Subject: [PATCH 3/4] does it work if I put the check separately then --- src/frontend/qt_sdl/CameraManager.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/frontend/qt_sdl/CameraManager.cpp b/src/frontend/qt_sdl/CameraManager.cpp index d1b44c187b..4e0d69e733 100644 --- a/src/frontend/qt_sdl/CameraManager.cpp +++ b/src/frontend/qt_sdl/CameraManager.cpp @@ -26,10 +26,12 @@ using namespace melonDS; const char* kCamConfigPath[] = {"DSi.Camera0", "DSi.Camera1"}; #if QT_VERSION >= 0x060000 -#if QT_VERSION_CHECK(6, 5, 0) && QT_CONFIG(permissions) +#if QT_VERSION_CHECK(6, 5, 0) +#if QT_CONFIG(permissions) #include #include #endif +#endif CameraFrameDumper::CameraFrameDumper(QObject* parent) : QVideoSink(parent) { @@ -355,7 +357,8 @@ void CameraManager::camStart() if (camDevice) { #if QT_VERSION_MAJOR >= 6 -#if QT_VERSION_CHECK(6, 5, 0) && QT_CONFIG(permissions) +#if QT_VERSION_CHECK(6, 5, 0) +#if QT_CONFIG(permissions) QCameraPermission cameraPermission; bool granted = false; switch (qApp->checkPermission(cameraPermission)) { @@ -367,6 +370,7 @@ void CameraManager::camStart() case Qt::PermissionStatus::Granted: break; } +#endif #endif camDumper = new CameraFrameDumper(this); From d7cc20e394ef959463789b3d9e91f67abe1d75c5 Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Thu, 24 Jul 2025 08:39:02 +0200 Subject: [PATCH 4/4] Use QT_VERSION_CHECK properly --- src/frontend/qt_sdl/CameraManager.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/frontend/qt_sdl/CameraManager.cpp b/src/frontend/qt_sdl/CameraManager.cpp index 4e0d69e733..7ab854b783 100644 --- a/src/frontend/qt_sdl/CameraManager.cpp +++ b/src/frontend/qt_sdl/CameraManager.cpp @@ -26,12 +26,10 @@ using namespace melonDS; const char* kCamConfigPath[] = {"DSi.Camera0", "DSi.Camera1"}; #if QT_VERSION >= 0x060000 -#if QT_VERSION_CHECK(6, 5, 0) -#if QT_CONFIG(permissions) +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) && QT_CONFIG(permissions) #include #include #endif -#endif CameraFrameDumper::CameraFrameDumper(QObject* parent) : QVideoSink(parent) { @@ -357,8 +355,7 @@ void CameraManager::camStart() if (camDevice) { #if QT_VERSION_MAJOR >= 6 -#if QT_VERSION_CHECK(6, 5, 0) -#if QT_CONFIG(permissions) +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) && QT_CONFIG(permissions) QCameraPermission cameraPermission; bool granted = false; switch (qApp->checkPermission(cameraPermission)) { @@ -370,7 +367,6 @@ void CameraManager::camStart() case Qt::PermissionStatus::Granted: break; } -#endif #endif camDumper = new CameraFrameDumper(this);