diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 3e603a27fab6..6edc751d5d03 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -231,8 +231,11 @@ usb_handler_thread::usb_handler_thread() if (!found_buzz) { - sys_usbd.error("Adding emulated Buzz! buzzer"); - usb_devices.push_back(std::make_shared()); + sys_usbd.notice("Adding emulated Buzz! buzzer"); + usb_devices.push_back(std::make_shared(0, 3)); + // The current buzz emulation piggybacks on the pad input. + // Since there can only be 7 pads connected on a PS3 the 8th player is currently not supported + usb_devices.push_back(std::make_shared(4, 6)); } for (u32 index = 0; index < MAX_SYS_USBD_TRANSFERS; index++) diff --git a/rpcs3/Emu/Io/Buzz.cpp b/rpcs3/Emu/Io/Buzz.cpp index 7cc714ebabc6..5ff807616789 100644 --- a/rpcs3/Emu/Io/Buzz.cpp +++ b/rpcs3/Emu/Io/Buzz.cpp @@ -7,8 +7,11 @@ LOG_CHANNEL(buzz_log); -usb_device_buzz::usb_device_buzz() +usb_device_buzz::usb_device_buzz(int first_controller, int last_controller) { + this->first_controller = first_controller; + this->last_controller = last_controller; + device = UsbDescriptorNode(USB_DESCRIPTOR_DEVICE, UsbDeviceDescriptor{0x0200, 0x00, 0x00, 0x00, 0x08, 0x054c, 0x0002, 0x05a1, 0x03, 0x01, 0x00, 0x01}); auto& config0 = device.add_node(UsbDescriptorNode(USB_DESCRIPTOR_CONFIG, UsbDeviceConfiguration{0x0022, 0x01, 0x01, 0x00, 0x80, 0x32})); config0.add_node(UsbDescriptorNode(USB_DESCRIPTOR_INTERFACE, UsbDeviceInterface{0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00})); @@ -44,7 +47,7 @@ void usb_device_buzz::interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, Us transfer->fake = true; transfer->expected_count = 5; transfer->expected_result = HC_CC_NOERR; - // Interrupt transfers are slow(6ms, TODO accurate measurement) + // Interrupt transfers are slow (6ms, TODO accurate measurement) transfer->expected_time = get_timestamp() + 6000; memset(buf, 0, buf_size); @@ -59,9 +62,10 @@ void usb_device_buzz::interrupt_transfer(u32 buf_size, u8* buf, u32 endpoint, Us const auto handler = pad::get_current_handler(); const auto& pads = handler->GetPads(); - for (int index = 0; index < 4; index++) + for (int index = 0; index <= (last_controller - first_controller); index++) { - auto pad = pads[index]; + const auto pad = pads[first_controller + index]; + if (!(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) continue; diff --git a/rpcs3/Emu/Io/Buzz.h b/rpcs3/Emu/Io/Buzz.h index fd5023b6a4f2..ef9df8d4c058 100644 --- a/rpcs3/Emu/Io/Buzz.h +++ b/rpcs3/Emu/Io/Buzz.h @@ -4,8 +4,11 @@ class usb_device_buzz : public usb_device_emulated { + int first_controller; + int last_controller; + public: - usb_device_buzz(); + usb_device_buzz(int first_controller, int last_controller); ~usb_device_buzz(); void control_transfer(u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, u16 wLength, u32 buf_size, u8* buf, UsbTransfer* transfer) override;