#include "main_application.h" #include "Emu/Io/Null/NullPadHandler.h" #include "Emu/Io/Null/NullKeyboardHandler.h" #include "Emu/Io/Null/NullMouseHandler.h" #include "Emu/Io/KeyboardHandler.h" #include "Emu/Io/PadHandler.h" #include "Emu/Io/MouseHandler.h" #include "basic_keyboard_handler.h" #include "basic_mouse_handler.h" #include "keyboard_pad_handler.h" #include "ds4_pad_handler.h" #ifdef _WIN32 #include "xinput_pad_handler.h" #include "mm_joystick_handler.h" #endif #ifdef HAVE_LIBEVDEV #include "evdev_joystick_handler.h" #endif #include "Emu/Audio/AudioBackend.h" #include "Emu/Audio/Null/NullAudioBackend.h" #include "Emu/Audio/AL/OpenALBackend.h" #ifdef _WIN32 #include "Emu/Audio/XAudio2/XAudio2Backend.h" #endif #ifdef HAVE_ALSA #include "Emu/Audio/ALSA/ALSABackend.h" #endif #ifdef HAVE_PULSE #include "Emu/Audio/Pulse/PulseBackend.h" #endif /** Emu.Init() wrapper for user manager */ bool main_application::InitializeEmulator(const std::string& user, bool force_init) { // try to set a new user const bool user_was_set = Emu.SetUsr(user); // only init the emulation if forced or a user was set if (user_was_set || force_init) { Emu.Init(); } return user_was_set; } /** RPCS3 emulator has functions it desires to call from the GUI at times. Initialize them in here. */ EmuCallbacks main_application::CreateCallbacks() { EmuCallbacks callbacks; callbacks.reset_pads = [this](const std::string& title_id = "") { pad::get_current_handler()->Reset(title_id); }; callbacks.enable_pads = [this](bool enable) { pad::get_current_handler()->SetEnabled(enable); }; callbacks.get_kb_handler = [=]() -> std::shared_ptr { switch (keyboard_handler type = g_cfg.io.keyboard) { case keyboard_handler::null: return std::make_shared(); case keyboard_handler::basic: { basic_keyboard_handler* ret = new basic_keyboard_handler(); ret->moveToThread(get_thread()); ret->SetTargetWindow(m_game_window); return std::shared_ptr(ret); } default: fmt::throw_exception("Invalid keyboard handler: %s", type); } }; callbacks.get_mouse_handler = [=]() -> std::shared_ptr { switch (mouse_handler type = g_cfg.io.mouse) { case mouse_handler::null: return std::make_shared(); case mouse_handler::basic: { basic_mouse_handler* ret = new basic_mouse_handler(); ret->moveToThread(get_thread()); ret->SetTargetWindow(m_game_window); return std::shared_ptr(ret); } default: fmt::throw_exception("Invalid mouse handler: %s", type); } }; callbacks.get_pad_handler = [this](const std::string& title_id) -> std::shared_ptr { return std::make_shared(get_thread(), m_game_window, title_id); }; callbacks.get_gs_render = []() -> std::shared_ptr { switch (video_renderer type = g_cfg.video.renderer) { case video_renderer::null: return std::make_shared>("rsx::thread"); case video_renderer::opengl: return std::make_shared>("rsx::thread"); #if defined(_WIN32) || defined(HAVE_VULKAN) case video_renderer::vulkan: return std::make_shared>("rsx::thread"); #endif #ifdef _MSC_VER case video_renderer::dx12: return std::make_shared>("rsx::thread"); #endif default: fmt::throw_exception("Invalid video renderer: %s" HERE, type); } }; callbacks.get_audio = []() -> std::shared_ptr { switch (audio_renderer type = g_cfg.audio.renderer) { case audio_renderer::null: return std::make_shared(); #ifdef _WIN32 case audio_renderer::xaudio: return std::make_shared(); #endif #ifdef HAVE_ALSA case audio_renderer::alsa: return std::make_shared(); #endif #ifdef HAVE_PULSE case audio_renderer::pulse: return std::make_shared(); #endif case audio_renderer::openal: return std::make_shared(); default: fmt::throw_exception("Invalid audio renderer: %s" HERE, type); } }; return callbacks; }