From 590483b81f10685b9ad44c33178b8ba4751a6340 Mon Sep 17 00:00:00 2001 From: shockdude Date: Fri, 15 Oct 2021 22:57:37 -0700 Subject: [PATCH] Add emulated Guitar Hero Live guitar controller in Settings I/O tab --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 11 ++++++++--- rpcs3/Emu/Io/GHLtar.cpp | 4 ++-- rpcs3/Emu/Io/GHLtar.h | 5 ++++- rpcs3/Emu/system_config.h | 1 + rpcs3/Emu/system_config_types.cpp | 16 ++++++++++++++++ rpcs3/Emu/system_config_types.h | 7 +++++++ rpcs3/rpcs3qt/emu_settings.cpp | 8 ++++++++ rpcs3/rpcs3qt/emu_settings_type.h | 2 ++ rpcs3/rpcs3qt/settings_dialog.cpp | 3 +++ rpcs3/rpcs3qt/settings_dialog.ui | 13 +++++++++++-- rpcs3/rpcs3qt/tooltips.h | 1 + 11 files changed, 63 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 34dc3338d..ee6b5f290 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -236,10 +236,15 @@ usb_handler_thread::usb_handler_thread() usb_devices.push_back(std::make_shared()); } - if (!found_ghltar) + if (g_cfg.io.ghltar == ghltar_handler::one_controller || g_cfg.io.ghltar == ghltar_handler::two_controllers) { - sys_usbd.notice("Adding emulated GHLtar"); - usb_devices.push_back(std::make_shared()); + sys_usbd.notice("Adding emulated GHLtar (1 player)"); + usb_devices.push_back(std::make_shared(0)); + } + if (g_cfg.io.ghltar == ghltar_handler::two_controllers) + { + sys_usbd.notice("Adding emulated GHLtar (2 players)"); + usb_devices.push_back(std::make_shared(1)); } if (g_cfg.io.turntable == turntable_handler::one_controller || g_cfg.io.turntable == turntable_handler::two_controllers) diff --git a/rpcs3/Emu/Io/GHLtar.cpp b/rpcs3/Emu/Io/GHLtar.cpp index 7f921935e..d0db026d9 100644 --- a/rpcs3/Emu/Io/GHLtar.cpp +++ b/rpcs3/Emu/Io/GHLtar.cpp @@ -7,7 +7,7 @@ LOG_CHANNEL(ghltar_log); -usb_device_ghltar::usb_device_ghltar() +usb_device_ghltar::usb_device_ghltar(int controller_index) : m_controller_index(controller_index) { device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x20, 0x12BA, 0x074B, 0x0100, 0x01, 0x02, 0x00, 0x01}); auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, UsbDeviceConfiguration{0x0029, 0x01, 0x01, 0x00, 0x80, 0x96})); @@ -98,7 +98,7 @@ void usb_device_ghltar::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endpoint std::lock_guard lock(pad::g_pad_mutex); const auto handler = pad::get_current_handler(); - const auto& pad = handler->GetPads()[6]; + const auto& pad = handler->GetPads()[m_controller_index]; if (!(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return; diff --git a/rpcs3/Emu/Io/GHLtar.h b/rpcs3/Emu/Io/GHLtar.h index 564d93203..7790da3a2 100644 --- a/rpcs3/Emu/Io/GHLtar.h +++ b/rpcs3/Emu/Io/GHLtar.h @@ -4,8 +4,11 @@ class usb_device_ghltar : public usb_device_emulated { +private: + int m_controller_index; + public: - usb_device_ghltar(); + usb_device_ghltar(int controller_index); ~usb_device_ghltar(); void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override; diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 54b382872..079f6713e 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -246,6 +246,7 @@ struct cfg_root : cfg::node cfg::_enum move{ this, "Move", move_handler::null }; cfg::_enum buzz{ this, "Buzz emulated controller", buzz_handler::null }; cfg::_enum turntable{this, "Turntable emulated controller", turntable_handler::null}; + cfg::_enum ghltar{this, "GHLtar emulated controller", ghltar_handler::null}; } io{ this }; struct node_sys : cfg::node diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index 343281787..8c96f9a61 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -405,6 +405,22 @@ void fmt_class_string::format(std::string& out, u64 arg) }); } +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto value) + { + switch (value) + { + case ghltar_handler::null: return "Null"; + case ghltar_handler::one_controller: return "1 controller"; + case ghltar_handler::two_controllers: return "2 controllers"; + } + + return unknown; + }); +} + template <> void fmt_class_string::format(std::string& out, u64 arg) { diff --git a/rpcs3/Emu/system_config_types.h b/rpcs3/Emu/system_config_types.h index bd4907cca..fa876424d 100644 --- a/rpcs3/Emu/system_config_types.h +++ b/rpcs3/Emu/system_config_types.h @@ -109,6 +109,13 @@ enum class turntable_handler two_controllers, }; +enum class ghltar_handler +{ + null, + one_controller, + two_controllers, +}; + enum class microphone_handler { null, diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index f79a0eb44..cd29a1d69 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -1038,6 +1038,14 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ case turntable_handler::two_controllers: return tr("2 controllers", "Turntable handler"); } break; + case emu_settings_type::GHLtar: + switch (static_cast(index)) + { + case ghltar_handler::null: return tr("Null", "GHLtar handler"); + case ghltar_handler::one_controller: return tr("1 controller", "GHLtar handler"); + case ghltar_handler::two_controllers: return tr("2 controllers", "GHLtar handler"); + } + break; case emu_settings_type::InternetStatus: switch (static_cast(index)) { diff --git a/rpcs3/rpcs3qt/emu_settings_type.h b/rpcs3/rpcs3qt/emu_settings_type.h index f4acec0d3..0dda65d73 100644 --- a/rpcs3/rpcs3qt/emu_settings_type.h +++ b/rpcs3/rpcs3qt/emu_settings_type.h @@ -128,6 +128,7 @@ enum class emu_settings_type Move, Buzz, Turntable, + GHLtar, // Misc ExitRPCS3OnFinish, @@ -281,6 +282,7 @@ inline static const QMap settings_location = { emu_settings_type::Move, { "Input/Output", "Move" }}, { emu_settings_type::Buzz, { "Input/Output", "Buzz emulated controller" }}, { emu_settings_type::Turntable, { "Input/Output", "Turntable emulated controller" }}, + { emu_settings_type::GHLtar, { "Input/Output", "GHLtar emulated controller" }}, // Misc { emu_settings_type::ExitRPCS3OnFinish, { "Miscellaneous", "Exit RPCS3 when process finishes" }}, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index e29a956f7..e342b5a8c 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -964,6 +964,9 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std m_emu_settings->EnhanceComboBox(ui->turntableBox, emu_settings_type::Turntable); SubscribeTooltip(ui->gb_turntable_emulated, tooltips.settings.turntable); + m_emu_settings->EnhanceComboBox(ui->ghltarBox, emu_settings_type::GHLtar); + SubscribeTooltip(ui->gb_ghltar_emulated, tooltips.settings.ghltar); + // _____ _ _______ _ // / ____| | | |__ __| | | // | (___ _ _ ___| |_ ___ _ __ ___ | | __ _| |__ diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index e455ab8e6..dcb3586e9 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -1508,10 +1508,19 @@ - + + + Guitar Hero Live emulated guitar + + + + + + + - + diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index d3015da0b..39c0dcd77 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -197,6 +197,7 @@ public: const QString move = tr("PlayStation Move support.\nFake: Experimental! This maps Move controls to DS3 controller mappings.\nMouse: Emulate PSMove with Mouse handler."); const QString buzz = tr("Buzz! support.\nSelect 1 or 2 controllers if the game requires Buzz! controllers and you don't have real controllers.\nSelect Null if the game has support for DualShock or if you have real Buzz! controllers."); const QString turntable = tr("DJ Hero Turntable controller support.\nSelect 1 or 2 controllers if the game requires DJ Hero Turntable controllers and you don't have real turntable controllers.\nSelect Null if the game has support for DualShock or if you have real turntable controllers.\nA real turntable controller can be used at the same time as an emulated turntable controller."); + const QString ghltar = tr("Guitar Hero Live (GHL) Guitar controller support.\nSelect 1 or 2 controllers if the game requires GHL Guitar controllers and you don't have real guitar controllers.\nSelect Null if the game has support for DualShock or if you have real guitar controllers.\nA real guitar controller can be used at the same time as an emulated guitar controller."); // network