diff --git a/app/src/main/java/com/limelight/binding/input/driver/Xbox360Controller.java b/app/src/main/java/com/limelight/binding/input/driver/Xbox360Controller.java index 3b098861..80c1d5f2 100644 --- a/app/src/main/java/com/limelight/binding/input/driver/Xbox360Controller.java +++ b/app/src/main/java/com/limelight/binding/input/driver/Xbox360Controller.java @@ -10,56 +10,38 @@ import com.limelight.nvstream.input.ControllerPacket; import java.nio.ByteBuffer; public class Xbox360Controller extends AbstractXboxController { + private static final int XB360_IFACE_SUBCLASS = 93; + private static final int XB360_IFACE_PROTOCOL = 1; // Wired only - // This list is taken from the Xpad driver in the Linux kernel. - // I've excluded the devices that aren't "controllers" in the traditional sense, but - // if people really want to use their dancepads or fight sticks with Moonlight, I can - // put them in. - private static final DeviceIdTuple[] supportedDeviceTuples = { - new DeviceIdTuple(0x045e, 0x028e, "Microsoft X-Box 360 pad"), - new DeviceIdTuple(0x044f, 0xb326, "Thrustmaster Gamepad GP XID"), - new DeviceIdTuple(0x046d, 0xc21d, "Logitech Gamepad F310"), - new DeviceIdTuple(0x046d, 0xc21e, "Logitech Gamepad F510"), - new DeviceIdTuple(0x046d, 0xc21f, "Logitech Gamepad F710"), - new DeviceIdTuple(0x046d, 0xc242, "Logitech Chillstream Controller"), - new DeviceIdTuple(0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller"), - new DeviceIdTuple(0x0738, 0x4726, "Mad Catz Xbox 360 Controller"), - new DeviceIdTuple(0x0738, 0xb726, "Mad Catz Xbox controller - MW2"), - new DeviceIdTuple(0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad"), - new DeviceIdTuple(0x0738, 0xcb02, "Saitek Cyborg Rumble Pad - PC/Xbox 360"), - new DeviceIdTuple(0x0738, 0xcb03, "Saitek P3200 Rumble Pad - PC/Xbox 360"), - new DeviceIdTuple(0x0e6f, 0x0113, "Afterglow AX.1 Gamepad for Xbox 360"), - new DeviceIdTuple(0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller"), - new DeviceIdTuple(0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360"), - new DeviceIdTuple(0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360"), - new DeviceIdTuple(0x0e6f, 0x0301, "Logic3 Controller"), - new DeviceIdTuple(0x0e6f, 0x0401, "Logic3 Controller"), - new DeviceIdTuple(0x12ab, 0x0301, "PDP AFTERGLOW AX.1"), - new DeviceIdTuple(0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller"), - new DeviceIdTuple(0x1532, 0x0037, "Razer Sabertooth"), - new DeviceIdTuple(0x15e4, 0x3f00, "Power A Mini Pro Elite"), - new DeviceIdTuple(0x15e4, 0x3f0a, "Xbox Airflo wired controller"), - new DeviceIdTuple(0x15e4, 0x3f10, "Batarang Xbox 360 controller"), - new DeviceIdTuple(0x162e, 0xbeef, "Joytech Neo-Se Take2"), - new DeviceIdTuple(0x1689, 0xfd00, "Razer Onza Tournament Edition"), - new DeviceIdTuple(0x1689, 0xfd01, "Razer Onza Classic Edition"), - new DeviceIdTuple(0x24c6, 0x5d04, "Razer Sabertooth"), - new DeviceIdTuple(0x1bad, 0xf016, "Mad Catz Xbox 360 Controller"), - new DeviceIdTuple(0x1bad, 0xf023, "MLG Pro Circuit Controller (Xbox)"), - new DeviceIdTuple(0x1bad, 0xf900, "Harmonix Xbox 360 Controller"), - new DeviceIdTuple(0x1bad, 0xf901, "Gamestop Xbox 360 Controller"), - new DeviceIdTuple(0x1bad, 0xf903, "Tron Xbox 360 controller"), - new DeviceIdTuple(0x24c6, 0x5300, "PowerA MINI PROEX Controller"), - new DeviceIdTuple(0x24c6, 0x5303, "Xbox Airflo wired controller"), + private static final int[] SUPPORTED_VENDORS = { + 0x044f, // Thrustmaster + 0x045e, // Microsoft + 0x046d, // Logitech + 0x0738, // Mad Catz + 0x0e6f, // Unknown + 0x12ab, // Unknown + 0x1430, // RedOctane + 0x146b, // BigBen + 0x1bad, // Harmonix + 0x0f0d, // Hori + 0x1689, // Razer Onza + 0x24c6, // PowerA + 0x1532, // Razer Sabertooth + 0x15e4, // Numark + 0x162e, // Joytech }; public static boolean canClaimDevice(UsbDevice device) { - for (DeviceIdTuple tuple : supportedDeviceTuples) { - if (device.getVendorId() == tuple.vid && device.getProductId() == tuple.pid) { - LimeLog.info("XB360 can claim device: " + tuple.name); + for (int supportedVid : SUPPORTED_VENDORS) { + if (device.getVendorId() == supportedVid && + device.getInterfaceCount() >= 1 && + device.getInterface(0).getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && + device.getInterface(0).getInterfaceSubclass() == XB360_IFACE_SUBCLASS && + device.getInterface(0).getInterfaceProtocol() == XB360_IFACE_PROTOCOL) { return true; } } + return false; } @@ -151,16 +133,4 @@ public class Xbox360Controller extends AbstractXboxController { // No need to fail init if the LED command fails return true; } - - private static class DeviceIdTuple { - public final int vid; - public final int pid; - public final String name; - - public DeviceIdTuple(int vid, int pid, String name) { - this.vid = vid; - this.pid = pid; - this.name = name; - } - } } diff --git a/app/src/main/java/com/limelight/binding/input/driver/XboxOneController.java b/app/src/main/java/com/limelight/binding/input/driver/XboxOneController.java index 284e2e8a..58582e9c 100644 --- a/app/src/main/java/com/limelight/binding/input/driver/XboxOneController.java +++ b/app/src/main/java/com/limelight/binding/input/driver/XboxOneController.java @@ -15,10 +15,17 @@ import java.nio.ByteOrder; public class XboxOneController extends AbstractXboxController { - private static final int MICROSOFT_VID = 0x045e; private static final int XB1_IFACE_SUBCLASS = 71; private static final int XB1_IFACE_PROTOCOL = 208; + private static final int[] SUPPORTED_VENDORS = { + 0x045e, // Microsoft + 0x0738, // Mad Catz + 0x0e6f, // Unknown + 0x0f0d, // Hori + 0x24c6, // PowerA + }; + // FIXME: odata_serial private static final byte[] XB1_INIT_DATA = {0x05, 0x20, 0x00, 0x01, 0x00}; @@ -78,11 +85,17 @@ public class XboxOneController extends AbstractXboxController { } public static boolean canClaimDevice(UsbDevice device) { - return device.getVendorId() == MICROSOFT_VID && - device.getInterfaceCount() >= 1 && - device.getInterface(0).getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && - device.getInterface(0).getInterfaceSubclass() == XB1_IFACE_SUBCLASS && - device.getInterface(0).getInterfaceProtocol() == XB1_IFACE_PROTOCOL; + for (int supportedVid : SUPPORTED_VENDORS) { + if (device.getVendorId() == supportedVid && + device.getInterfaceCount() >= 1 && + device.getInterface(0).getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && + device.getInterface(0).getInterfaceSubclass() == XB1_IFACE_SUBCLASS && + device.getInterface(0).getInterfaceProtocol() == XB1_IFACE_PROTOCOL) { + return true; + } + } + + return false; } @Override