From e5b03d9cbd2b8365e7703e547fcda9f604b7bc4e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Nov 2023 22:49:25 +0100 Subject: [PATCH] Qt: check microphone permissions --- rpcs3/Emu/System.cpp | 10 ++++++++++ rpcs3/rpcs3qt/main_window.cpp | 31 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index abdd8046f3..1f2d8c8846 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -87,6 +87,7 @@ extern std::pair, CellError> ppu_load_overlay(const extern bool ppu_load_rel_exec(const ppu_rel_object&); extern void send_close_home_menu_cmds(); +extern void check_microphone_permissions(); extern void signal_system_cache_can_stay(); @@ -1722,6 +1723,15 @@ game_boot_result Emulator::Load(const std::string& title_id, bool is_disc_patch, return game_boot_result::no_errors; } + // Check microphone permissions + if (g_cfg.audio.microphone_type != microphone_handler::null) + { + if (const std::vector device_list = fmt::split(g_cfg.audio.microphone_devices.to_string(), {"@@@"}); !device_list.empty()) + { + check_microphone_permissions(); + } + } + // Detect boot location const std::string hdd0_game = vfs::get("/dev_hdd0/game/"); const bool from_hdd0_game = IsPathInsideDir(m_path, hdd0_game); diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index df7035247e..c6c2b9be47 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -81,6 +81,11 @@ #include "ui_main_window.h" +#if QT_CONFIG(permissions) +#include +#include +#endif + LOG_CHANNEL(gui_log, "GUI"); extern atomic_t g_user_asked_for_frame_capture; @@ -102,6 +107,32 @@ extern void process_qt_events() } } +extern void check_microphone_permissions() +{ +#if QT_CONFIG(permissions) + Emu.BlockingCallFromMainThread([]() + { + QMicrophonePermission permission; + switch (qApp->checkPermission(permission)) + { + case Qt::PermissionStatus::Undetermined: + gui_log.notice("Requesting microphone permission"); + qApp->requestPermission(permission, []() + { + check_microphone_permissions(); + }); + break; + case Qt::PermissionStatus::Denied: + gui_log.error("RPCS3 has no permissions to access microphones on this device."); + break; + case Qt::PermissionStatus::Granted: + gui_log.notice("Microphone permission granted"); + break; + } + }); +#endif +} + main_window::main_window(std::shared_ptr gui_settings, std::shared_ptr emu_settings, std::shared_ptr persistent_settings, QWidget *parent) : QMainWindow(parent) , ui(new Ui::main_window)