diff --git a/src/Input.h b/src/Input.h index b300ba5..4e17f13 100644 --- a/src/Input.h +++ b/src/Input.h @@ -55,7 +55,6 @@ typedef struct _NV_CONTROLLER_PACKET { #define PACKET_TYPE_MULTI_CONTROLLER 0x1E #define MC_HEADER_A 0x0000000D #define MC_HEADER_B 0x001A -#define MC_ACTIVE_CONTROLLER_FLAGS 0x000F #define MC_MID_B 0x0014 #define MC_TAIL_A 0x0000009C #define MC_TAIL_B 0x0055 @@ -64,7 +63,7 @@ typedef struct _NV_MULTI_CONTROLLER_PACKET { int headerA; short headerB; short controllerNumber; - short midA; + short activeGamepadMask; short midB; short buttonFlags; unsigned char leftTrigger; diff --git a/src/InputStream.c b/src/InputStream.c index f88e034..c88f312 100644 --- a/src/InputStream.c +++ b/src/InputStream.c @@ -241,6 +241,7 @@ static void inputSendThreadProc(void* context) { newPkt = &controllerBatchHolder->packet.multiController; if (newPkt->buttonFlags != origPkt->buttonFlags || newPkt->controllerNumber != origPkt->controllerNumber || + newPkt->activeGamepadMask != origPkt->activeGamepadMask || !checkDirs(origPkt->leftTrigger, newPkt->leftTrigger, &dirs[0]) || !checkDirs(origPkt->rightTrigger, newPkt->rightTrigger, &dirs[1]) || !checkDirs(origPkt->leftStickX, newPkt->leftStickX, &dirs[2]) || @@ -500,7 +501,8 @@ int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers) { return err; } -static int sendControllerEventInternal(short controllerNumber, short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, +static int sendControllerEventInternal(short controllerNumber, short activeGamepadMask, + short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, short leftStickX, short leftStickY, short rightStickX, short rightStickY) { PPACKET_HOLDER holder; @@ -543,7 +545,7 @@ static int sendControllerEventInternal(short controllerNumber, short buttonFlags } holder->packet.multiController.headerB = MC_HEADER_B; holder->packet.multiController.controllerNumber = controllerNumber; - holder->packet.multiController.midA = MC_ACTIVE_CONTROLLER_FLAGS; + holder->packet.multiController.activeGamepadMask = activeGamepadMask; holder->packet.multiController.midB = MC_MID_B; holder->packet.multiController.buttonFlags = buttonFlags; holder->packet.multiController.leftTrigger = leftTrigger; @@ -568,15 +570,17 @@ static int sendControllerEventInternal(short controllerNumber, short buttonFlags int LiSendControllerEvent(short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, short leftStickX, short leftStickY, short rightStickX, short rightStickY) { - return sendControllerEventInternal(0, buttonFlags, leftTrigger, rightTrigger, + return sendControllerEventInternal(0, 0x1, buttonFlags, leftTrigger, rightTrigger, leftStickX, leftStickY, rightStickX, rightStickY); } // Send a controller event to the streaming machine -int LiSendMultiControllerEvent(short controllerNumber, short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, +int LiSendMultiControllerEvent(short controllerNumber, short activeGamepadMask, + short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, short leftStickX, short leftStickY, short rightStickX, short rightStickY) { - return sendControllerEventInternal(controllerNumber, buttonFlags, leftTrigger, rightTrigger, + return sendControllerEventInternal(controllerNumber, activeGamepadMask, + buttonFlags, leftTrigger, rightTrigger, leftStickX, leftStickY, rightStickX, rightStickY); } diff --git a/src/Limelight.h b/src/Limelight.h index f8579ae..6f6eba7 100644 --- a/src/Limelight.h +++ b/src/Limelight.h @@ -288,8 +288,10 @@ int LiSendControllerEvent(short buttonFlags, unsigned char leftTrigger, unsigned // This function queues a controller event to be sent to the remote server. The controllerNumber // parameter is a zero-based index of which controller this event corresponds to. The largest legal // controller number is 3 (for a total of 4 controllers, the Xinput maximum). On generation 3 servers (GFE 2.1.x), -// these will be sent as controller 0 regardless of the controllerNumber parameter. -int LiSendMultiControllerEvent(short controllerNumber, short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, +// these will be sent as controller 0 regardless of the controllerNumber parameter. The activeGamepadMask +// parameter is a bitfield with bits set for each controller present up to a maximum of 4 (0xF). +int LiSendMultiControllerEvent(short controllerNumber, short activeGamepadMask, + short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, short leftStickX, short leftStickY, short rightStickX, short rightStickY); // This function queues a vertical scroll event to the remote server.