Add multiple controller support

This commit is contained in:
Cameron Gutman 2015-02-01 21:01:44 -05:00
parent 0fa1a02e0a
commit 975be33ff8
3 changed files with 101 additions and 34 deletions

View File

@ -33,10 +33,10 @@ typedef struct _NV_MOUSE_BUTTON_PACKET {
} NV_MOUSE_BUTTON_PACKET, *PNV_MOUSE_BUTTON_PACKET; } NV_MOUSE_BUTTON_PACKET, *PNV_MOUSE_BUTTON_PACKET;
#define PACKET_TYPE_CONTROLLER 0x18 #define PACKET_TYPE_CONTROLLER 0x18
#define HEADER_A 0x0000000A #define C_HEADER_A 0x0000000A
#define HEADER_B 0x1400 #define C_HEADER_B 0x1400
#define TAIL_A 0x0000009C #define C_TAIL_A 0x0000009C
#define TAIL_B 0x0055 #define C_TAIL_B 0x0055
typedef struct _NV_CONTROLLER_PACKET { typedef struct _NV_CONTROLLER_PACKET {
NV_INPUT_HEADER header; NV_INPUT_HEADER header;
int headerA; int headerA;
@ -52,6 +52,31 @@ typedef struct _NV_CONTROLLER_PACKET {
short tailB; short tailB;
} NV_CONTROLLER_PACKET, *PNV_CONTROLLER_PACKET; } NV_CONTROLLER_PACKET, *PNV_CONTROLLER_PACKET;
#define PACKET_TYPE_MULTI_CONTROLLER 0x1E
#define MC_HEADER_A 0x0000000D
#define MC_HEADER_B 0x001A
#define MC_MID_A 0x0007
#define MC_MID_B 0x0014
#define MC_TAIL_A 0x0000009C
#define MC_TAIL_B 0x0055
typedef struct _NV_MULTI_CONTROLLER_PACKET {
NV_INPUT_HEADER header;
int headerA;
short headerB;
short controllerNumber;
short midA;
short midB;
short buttonFlags;
char leftTrigger;
char rightTrigger;
short leftStickX;
short leftStickY;
short rightStickX;
short rightStickY;
int tailA;
short tailB;
} NV_MULTI_CONTROLLER_PACKET, *PNV_MULTI_CONTROLLER_PACKET;
#define PACKET_TYPE_SCROLL 0xA #define PACKET_TYPE_SCROLL 0xA
#define MAGIC_A 0x09 #define MAGIC_A 0x09
typedef struct _NV_SCROLL_PACKET { typedef struct _NV_SCROLL_PACKET {

View File

@ -26,6 +26,7 @@ typedef struct _PACKET_HOLDER {
NV_MOUSE_MOVE_PACKET mouseMove; NV_MOUSE_MOVE_PACKET mouseMove;
NV_MOUSE_BUTTON_PACKET mouseButton; NV_MOUSE_BUTTON_PACKET mouseButton;
NV_CONTROLLER_PACKET controller; NV_CONTROLLER_PACKET controller;
NV_MULTI_CONTROLLER_PACKET multiController;
NV_SCROLL_PACKET scroll; NV_SCROLL_PACKET scroll;
} packet; } packet;
} PACKET_HOLDER, *PPACKET_HOLDER; } PACKET_HOLDER, *PPACKET_HOLDER;
@ -259,8 +260,7 @@ int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers) {
return err; return err;
} }
/* Send a controller event to the streaming machine */ static int sendControllerEventInternal(short controllerNumber, short buttonFlags, char leftTrigger, char rightTrigger,
int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger,
short leftStickX, short leftStickY, short rightStickX, short rightStickY) short leftStickX, short leftStickY, short rightStickX, short rightStickY)
{ {
PPACKET_HOLDER holder; PPACKET_HOLDER holder;
@ -275,10 +275,13 @@ int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger
return -1; return -1;
} }
if (serverMajorVersion == 3) {
// Generation 3 servers don't support multiple controllers so we send
// the legacy packet
holder->packetLength = sizeof(NV_CONTROLLER_PACKET); holder->packetLength = sizeof(NV_CONTROLLER_PACKET);
holder->packet.controller.header.packetType = htonl(PACKET_TYPE_CONTROLLER); holder->packet.controller.header.packetType = htonl(PACKET_TYPE_CONTROLLER);
holder->packet.controller.headerA = HEADER_A; holder->packet.controller.headerA = C_HEADER_A;
holder->packet.controller.headerB = HEADER_B; holder->packet.controller.headerB = C_HEADER_B;
holder->packet.controller.buttonFlags = buttonFlags; holder->packet.controller.buttonFlags = buttonFlags;
holder->packet.controller.leftTrigger = leftTrigger; holder->packet.controller.leftTrigger = leftTrigger;
holder->packet.controller.rightTrigger = rightTrigger; holder->packet.controller.rightTrigger = rightTrigger;
@ -286,8 +289,29 @@ int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger
holder->packet.controller.leftStickY = leftStickY; holder->packet.controller.leftStickY = leftStickY;
holder->packet.controller.rightStickX = rightStickX; holder->packet.controller.rightStickX = rightStickX;
holder->packet.controller.rightStickY = rightStickY; holder->packet.controller.rightStickY = rightStickY;
holder->packet.controller.tailA = TAIL_A; holder->packet.controller.tailA = C_TAIL_A;
holder->packet.controller.tailB = TAIL_B; holder->packet.controller.tailB = C_TAIL_B;
}
else {
// Generation 4+ servers support passing the controller number
holder->packetLength = sizeof(NV_MULTI_CONTROLLER_PACKET);
holder->packet.multiController.header.packetType = htonl(PACKET_TYPE_MULTI_CONTROLLER);
holder->packet.multiController.headerA = MC_HEADER_A;
holder->packet.multiController.headerB = MC_HEADER_B;
holder->packet.multiController.controllerNumber = controllerNumber;
holder->packet.multiController.midA = MC_MID_A;
holder->packet.multiController.midB = MC_MID_B;
holder->packet.multiController.buttonFlags = buttonFlags;
holder->packet.multiController.leftTrigger = leftTrigger;
holder->packet.multiController.rightTrigger = rightTrigger;
holder->packet.multiController.leftStickX = leftStickX;
holder->packet.multiController.leftStickY = leftStickY;
holder->packet.multiController.rightStickX = rightStickX;
holder->packet.multiController.rightStickY = rightStickY;
holder->packet.multiController.tailA = MC_TAIL_A;
holder->packet.multiController.tailB = MC_TAIL_B;
}
err = LbqOfferQueueItem(&packetQueue, holder); err = LbqOfferQueueItem(&packetQueue, holder);
if (err != LBQ_SUCCESS) { if (err != LBQ_SUCCESS) {
free(holder); free(holder);
@ -296,6 +320,22 @@ int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger
return err; return err;
} }
/* Send a controller event to the streaming machine */
int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger,
short leftStickX, short leftStickY, short rightStickX, short rightStickY)
{
return sendControllerEventInternal(0, buttonFlags, leftTrigger, rightTrigger,
leftStickX, leftStickY, rightStickX, rightStickY);
}
/* Send a controller event to the streaming machine */
int LiSendMultiControllerEvent(short controllerNumber, short buttonFlags, char leftTrigger, char rightTrigger,
short leftStickX, short leftStickY, short rightStickX, short rightStickY)
{
return sendControllerEventInternal(controllerNumber, buttonFlags, leftTrigger, rightTrigger,
leftStickX, leftStickY, rightStickX, rightStickY);
}
/* Send a scroll event to the streaming machine */ /* Send a scroll event to the streaming machine */
int LiSendScrollEvent(char scrollClicks) { int LiSendScrollEvent(char scrollClicks) {
PPACKET_HOLDER holder; PPACKET_HOLDER holder;

View File

@ -143,6 +143,8 @@ int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers);
#define SPECIAL_FLAG 0x0400 #define SPECIAL_FLAG 0x0400
int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger, int LiSendControllerEvent(short buttonFlags, char leftTrigger, char rightTrigger,
short leftStickX, short leftStickY, short rightStickX, short rightStickY); short leftStickX, short leftStickY, short rightStickX, short rightStickY);
int LiSendMultiControllerEvent(short controllerNumber, short buttonFlags, char leftTrigger, char rightTrigger,
short leftStickX, short leftStickY, short rightStickX, short rightStickY);
int LiSendScrollEvent(char scrollClicks); int LiSendScrollEvent(char scrollClicks);