mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2026-02-16 10:30:47 +00:00
Merge tag 'v2.4.3' into raspbian/jessie
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
project(moonlight-embedded VERSION 2.4.1 LANGUAGES C)
|
||||
project(moonlight-embedded VERSION 2.4.3 LANGUAGES C)
|
||||
SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||
include(${CMAKE_ROOT}/Modules/GNUInstallDirs.cmake)
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ Select platform for audio and video output and input.
|
||||
|
||||
=item B<-unsupported>
|
||||
|
||||
Try streaming if GFE version is unsupported
|
||||
Try streaming if GFE version or options are unsupported
|
||||
|
||||
=item B<-verbose>
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ xwc,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12
|
||||
030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||
030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||
030000005e040000dd02000003020000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,
|
||||
030000005e040000ea02000001030000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,
|
||||
03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13,
|
||||
030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,
|
||||
030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux,
|
||||
|
||||
@@ -203,6 +203,11 @@ static int load_server_status(PSERVER_DATA server) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (xml_status(data->memory, data->size) == GS_ERROR) {
|
||||
ret = GS_ERROR;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (xml_search(data->memory, data->size, "currentgame", ¤tGameText) != GS_OK) {
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -408,7 +413,9 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
||||
else if ((ret = http_request(url, data)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (strcmp(result, "1") != 0) {
|
||||
@@ -464,7 +471,9 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
||||
|
||||
free(result);
|
||||
result = NULL;
|
||||
if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (strcmp(result, "1") != 0) {
|
||||
@@ -521,7 +530,9 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
||||
|
||||
free(result);
|
||||
result = NULL;
|
||||
if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (strcmp(result, "1") != 0) {
|
||||
@@ -570,7 +581,9 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
||||
|
||||
free(result);
|
||||
result = NULL;
|
||||
if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (strcmp(result, "1") != 0) {
|
||||
@@ -587,7 +600,9 @@ int gs_pair(PSERVER_DATA server, char* pin) {
|
||||
|
||||
free(result);
|
||||
result = NULL;
|
||||
if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "paired", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (strcmp(result, "1") != 0) {
|
||||
@@ -624,6 +639,8 @@ int gs_applist(PSERVER_DATA server, PAPP_LIST *list) {
|
||||
sprintf(url, "https://%s:47984/applist?uniqueid=%s&uuid=%s", server->serverInfo.address, unique_id, uuid_str);
|
||||
if (http_request(url, data) != GS_OK)
|
||||
ret = GS_IO_ERROR;
|
||||
else if (xml_status(data->memory, data->size) == GS_ERROR)
|
||||
ret = GS_ERROR;
|
||||
else if (xml_applist(data->memory, data->size, list) != GS_OK)
|
||||
ret = GS_INVALID;
|
||||
|
||||
@@ -679,7 +696,9 @@ int gs_start_app(PSERVER_DATA server, STREAM_CONFIGURATION *config, int appId, b
|
||||
else
|
||||
goto cleanup;
|
||||
|
||||
if ((ret = xml_search(data->memory, data->size, "gamesession", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "gamesession", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (!strcmp(result, "0")) {
|
||||
@@ -711,7 +730,9 @@ int gs_quit_app(PSERVER_DATA server) {
|
||||
if ((ret = http_request(url, data)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if ((ret = xml_search(data->memory, data->size, "cancel", &result)) != GS_OK)
|
||||
if ((ret = xml_status(data->memory, data->size) != GS_OK))
|
||||
goto cleanup;
|
||||
else if ((ret = xml_search(data->memory, data->size, "cancel", &result)) != GS_OK)
|
||||
goto cleanup;
|
||||
|
||||
if (strcmp(result, "0") == 0) {
|
||||
|
||||
@@ -28,5 +28,6 @@
|
||||
#define GS_NOT_SUPPORTED_4K -6
|
||||
#define GS_UNSUPPORTED_VERSION -7
|
||||
#define GS_NOT_SUPPORTED_MODE -8
|
||||
#define GS_ERROR -9
|
||||
|
||||
const char* gs_error;
|
||||
extern const char* gs_error;
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <expat.h>
|
||||
#include <string.h>
|
||||
|
||||
#define STATUS_OK 200
|
||||
|
||||
static XML_Parser parser;
|
||||
|
||||
struct xml_query {
|
||||
@@ -110,6 +112,23 @@ static void XMLCALL _xml_end_mode_element(void *userData, const char *name) {
|
||||
}
|
||||
}
|
||||
|
||||
static void XMLCALL _xml_start_status_element(void *userData, const char *name, const char **atts) {
|
||||
if (strcmp("root", name) == 0) {
|
||||
int* status = (int*) userData;
|
||||
for (int i = 0; atts[i]; i += 2) {
|
||||
if (strcmp("status_code", atts[i]) == 0)
|
||||
*status = atoi(atts[i + 1]);
|
||||
else if (*status != STATUS_OK && strcmp("status_message", atts[i]) == 0) {
|
||||
gs_error = malloc(strlen(atts[i + 1]));
|
||||
if (gs_error)
|
||||
strcpy((char*) gs_error, atts[i + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void XMLCALL _xml_end_status_element(void *userData, const char *name) { }
|
||||
|
||||
static void XMLCALL _xml_write_data(void *userData, const XML_Char *s, int len) {
|
||||
struct xml_query *search = (struct xml_query*) userData;
|
||||
if (search->start > 0) {
|
||||
@@ -193,3 +212,19 @@ int xml_modelist(char* data, size_t len, PDISPLAY_MODE *mode_list) {
|
||||
return GS_OK;
|
||||
|
||||
}
|
||||
|
||||
int xml_status(char* data, size_t len) {
|
||||
int status = 0;
|
||||
XML_Parser parser = XML_ParserCreate("UTF-8");
|
||||
XML_SetUserData(parser, &status);
|
||||
XML_SetElementHandler(parser, _xml_start_status_element, _xml_end_status_element);
|
||||
if (!XML_Parse(parser, data, len, 1)) {
|
||||
int code = XML_GetErrorCode(parser);
|
||||
gs_error = XML_ErrorString(code);
|
||||
XML_ParserFree(parser);
|
||||
return GS_INVALID;
|
||||
}
|
||||
|
||||
XML_ParserFree(parser);
|
||||
return status == STATUS_OK ? GS_OK : GS_ERROR;
|
||||
}
|
||||
|
||||
@@ -36,3 +36,4 @@ typedef struct _DISPLAY_MODE {
|
||||
int xml_search(char* data, size_t len, char* node, char** result);
|
||||
int xml_applist(char* data, size_t len, PAPP_LIST *app_list);
|
||||
int xml_modelist(char* data, size_t len, PDISPLAY_MODE *mode_list);
|
||||
int xml_status(char* data, size_t len);
|
||||
|
||||
@@ -103,15 +103,21 @@ static int evdev_get_map_key(int* map, int length, int value) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void evdev_init_parms(struct input_device *dev, struct input_abs_parms *parms, int code) {
|
||||
static bool evdev_init_parms(struct input_device *dev, struct input_abs_parms *parms, int code) {
|
||||
int abs = evdev_get_map_key(dev->abs_map, ABS_MAX, code);
|
||||
|
||||
parms->flat = libevdev_get_abs_flat(dev->dev, abs);
|
||||
parms->min = libevdev_get_abs_minimum(dev->dev, abs);
|
||||
parms->max = libevdev_get_abs_maximum(dev->dev, abs);
|
||||
parms->avg = (parms->min+parms->max)/2;
|
||||
parms->range = parms->max - parms->avg;
|
||||
parms->diff = parms->max - parms->min;
|
||||
if (abs >= 0) {
|
||||
parms->flat = libevdev_get_abs_flat(dev->dev, abs);
|
||||
parms->min = libevdev_get_abs_minimum(dev->dev, abs);
|
||||
parms->max = libevdev_get_abs_maximum(dev->dev, abs);
|
||||
if (parms->flat == 0 && parms->min == 0 && parms->max == 0)
|
||||
return false;
|
||||
|
||||
parms->avg = (parms->min+parms->max)/2;
|
||||
parms->range = parms->max - parms->avg;
|
||||
parms->diff = parms->max - parms->min;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static void evdev_remove(int devindex) {
|
||||
@@ -453,12 +459,12 @@ void evdev_create(const char* device, struct mapping* mappings, bool verbose) {
|
||||
} else if (strncmp("default", mappings->guid, 32) == 0)
|
||||
default_mapping = mappings;
|
||||
else if (strncmp("xwc", mappings->guid, 32) == 0)
|
||||
default_mapping = mappings;
|
||||
xwc_mapping = mappings;
|
||||
|
||||
mappings = mappings->next;
|
||||
}
|
||||
|
||||
if (mappings != NULL && strstr(name, "Xbox 360 Wireless Receiver") != NULL)
|
||||
if (mappings == NULL && strstr(name, "Xbox 360 Wireless Receiver") != NULL)
|
||||
mappings = xwc_mapping;
|
||||
|
||||
bool is_keyboard = libevdev_has_event_code(evdev, EV_KEY, KEY_Q);
|
||||
@@ -512,12 +518,14 @@ void evdev_create(const char* device, struct mapping* mappings, bool verbose) {
|
||||
devices[dev].controllerId = -1;
|
||||
|
||||
if (devices[dev].map != NULL) {
|
||||
evdev_init_parms(&devices[dev], &(devices[dev].xParms), devices[dev].map->abs_leftx);
|
||||
evdev_init_parms(&devices[dev], &(devices[dev].yParms), devices[dev].map->abs_lefty);
|
||||
evdev_init_parms(&devices[dev], &(devices[dev].zParms), devices[dev].map->abs_lefttrigger);
|
||||
evdev_init_parms(&devices[dev], &(devices[dev].rxParms), devices[dev].map->abs_rightx);
|
||||
evdev_init_parms(&devices[dev], &(devices[dev].ryParms), devices[dev].map->abs_righty);
|
||||
evdev_init_parms(&devices[dev], &(devices[dev].rzParms), devices[dev].map->abs_righttrigger);
|
||||
bool valid = evdev_init_parms(&devices[dev], &(devices[dev].xParms), devices[dev].map->abs_leftx);
|
||||
valid &= evdev_init_parms(&devices[dev], &(devices[dev].yParms), devices[dev].map->abs_lefty);
|
||||
valid &= evdev_init_parms(&devices[dev], &(devices[dev].zParms), devices[dev].map->abs_lefttrigger);
|
||||
valid &= evdev_init_parms(&devices[dev], &(devices[dev].rxParms), devices[dev].map->abs_rightx);
|
||||
valid &= evdev_init_parms(&devices[dev], &(devices[dev].ryParms), devices[dev].map->abs_righty);
|
||||
valid &= evdev_init_parms(&devices[dev], &(devices[dev].rzParms), devices[dev].map->abs_righttrigger);
|
||||
if (!valid)
|
||||
fprintf(stderr, "Mapping for %s (%s) on %s is incorrect\n", name, str_guid, device);
|
||||
}
|
||||
|
||||
if (grabbingDevices) {
|
||||
|
||||
@@ -96,6 +96,8 @@ static void stream(PSERVER_DATA server, PCONFIGURATION config, enum platform sys
|
||||
fprintf(stderr, "Server doesn't support 4K\n");
|
||||
else if (ret == GS_NOT_SUPPORTED_MODE)
|
||||
fprintf(stderr, "Server doesn't support %dx%d (%d fps) or try --unsupported option\n", config->stream.width, config->stream.height, config->stream.fps);
|
||||
else if (ret == GS_ERROR)
|
||||
fprintf(stderr, "Gamestream error: %s\n", gs_error);
|
||||
else
|
||||
fprintf(stderr, "Errorcode starting app: %d\n", ret);
|
||||
exit(-1);
|
||||
@@ -219,8 +221,11 @@ int main(int argc, char* argv[]) {
|
||||
if ((ret = gs_init(&server, config.address, config.key_dir, config.debug_level, config.unsupported)) == GS_OUT_OF_MEMORY) {
|
||||
fprintf(stderr, "Not enough memory\n");
|
||||
exit(-1);
|
||||
} else if (ret == GS_ERROR) {
|
||||
fprintf(stderr, "Gamestream error: %s\n", gs_error);
|
||||
exit(-1);
|
||||
} else if (ret == GS_INVALID) {
|
||||
fprintf(stderr, "Invalid data received from server: %s\n", config.address, gs_error);
|
||||
fprintf(stderr, "Invalid data received from server: %s\n", gs_error);
|
||||
exit(-1);
|
||||
} else if (ret == GS_UNSUPPORTED_VERSION) {
|
||||
fprintf(stderr, "Unsupported version: %s\n", gs_error);
|
||||
|
||||
@@ -173,7 +173,7 @@ void egl_init(EGLNativeDisplayType native_display, NativeWindowType native_windo
|
||||
void egl_draw(uint8_t* image[3]) {
|
||||
if (!current) {
|
||||
eglMakeCurrent(display, surface, surface, context);
|
||||
current = True;
|
||||
current = true;
|
||||
}
|
||||
|
||||
glUseProgram(shader_program);
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include <Limelight.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <libswscale/swscale.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
@@ -58,10 +58,14 @@ static int frame_handle(int pipefd) {
|
||||
if (frame) {
|
||||
if (ffmpeg_decoder == SOFTWARE)
|
||||
egl_draw(frame->data);
|
||||
#ifdef HAVE_VAAPI
|
||||
else if (ffmpeg_decoder == VAAPI)
|
||||
vaapi_queue(frame, window, display_width, display_height);
|
||||
#endif
|
||||
#ifdef HAVE_VDPAU
|
||||
else if (ffmpeg_decoder == VDPAU)
|
||||
vdpau_queue(frame);
|
||||
#endif
|
||||
}
|
||||
|
||||
return LOOP_OK;
|
||||
|
||||
Reference in New Issue
Block a user