mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2026-04-23 16:39:09 +00:00
Add multiple controller support
This commit is contained in:
@@ -26,6 +26,7 @@ typedef struct _PACKET_HOLDER {
|
||||
NV_MOUSE_MOVE_PACKET mouseMove;
|
||||
NV_MOUSE_BUTTON_PACKET mouseButton;
|
||||
NV_CONTROLLER_PACKET controller;
|
||||
NV_MULTI_CONTROLLER_PACKET multiController;
|
||||
NV_SCROLL_PACKET scroll;
|
||||
} packet;
|
||||
} PACKET_HOLDER, *PPACKET_HOLDER;
|
||||
@@ -259,41 +260,80 @@ int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers) {
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sendControllerEventInternal(short controllerNumber, short buttonFlags, char leftTrigger, char rightTrigger,
|
||||
short leftStickX, short leftStickY, short rightStickX, short rightStickY)
|
||||
{
|
||||
PPACKET_HOLDER holder;
|
||||
int err;
|
||||
|
||||
if (!initialized) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
holder = malloc(sizeof(*holder));
|
||||
if (holder == NULL) {
|
||||
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->packet.controller.header.packetType = htonl(PACKET_TYPE_CONTROLLER);
|
||||
holder->packet.controller.headerA = C_HEADER_A;
|
||||
holder->packet.controller.headerB = C_HEADER_B;
|
||||
holder->packet.controller.buttonFlags = buttonFlags;
|
||||
holder->packet.controller.leftTrigger = leftTrigger;
|
||||
holder->packet.controller.rightTrigger = rightTrigger;
|
||||
holder->packet.controller.leftStickX = leftStickX;
|
||||
holder->packet.controller.leftStickY = leftStickY;
|
||||
holder->packet.controller.rightStickX = rightStickX;
|
||||
holder->packet.controller.rightStickY = rightStickY;
|
||||
holder->packet.controller.tailA = C_TAIL_A;
|
||||
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);
|
||||
if (err != LBQ_SUCCESS) {
|
||||
free(holder);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
PPACKET_HOLDER holder;
|
||||
int err;
|
||||
return sendControllerEventInternal(0, buttonFlags, leftTrigger, rightTrigger,
|
||||
leftStickX, leftStickY, rightStickX, rightStickY);
|
||||
}
|
||||
|
||||
if (!initialized) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
holder = malloc(sizeof(*holder));
|
||||
if (holder == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
holder->packetLength = sizeof(NV_CONTROLLER_PACKET);
|
||||
holder->packet.controller.header.packetType = htonl(PACKET_TYPE_CONTROLLER);
|
||||
holder->packet.controller.headerA = HEADER_A;
|
||||
holder->packet.controller.headerB = HEADER_B;
|
||||
holder->packet.controller.buttonFlags = buttonFlags;
|
||||
holder->packet.controller.leftTrigger = leftTrigger;
|
||||
holder->packet.controller.rightTrigger = rightTrigger;
|
||||
holder->packet.controller.leftStickX = leftStickX;
|
||||
holder->packet.controller.leftStickY = leftStickY;
|
||||
holder->packet.controller.rightStickX = rightStickX;
|
||||
holder->packet.controller.rightStickY = rightStickY;
|
||||
holder->packet.controller.tailA = TAIL_A;
|
||||
holder->packet.controller.tailB = TAIL_B;
|
||||
err = LbqOfferQueueItem(&packetQueue, holder);
|
||||
if (err != LBQ_SUCCESS) {
|
||||
free(holder);
|
||||
}
|
||||
|
||||
return err;
|
||||
/* 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 */
|
||||
|
||||
Reference in New Issue
Block a user