From 9cd09b36e066af8a2e605812372824c4f29f00d1 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Tue, 4 Jul 2017 20:05:03 +0200 Subject: [PATCH 1/9] Use lowercase true --- src/video/egl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/egl.c b/src/video/egl.c index bed03e7..901a5d2 100644 --- a/src/video/egl.c +++ b/src/video/egl.c @@ -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); From 76cf6f633949c35a6e4d99c201b45f990c411400 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Tue, 4 Jul 2017 20:06:29 +0200 Subject: [PATCH 2/9] Fix xbox 360 wireless fallback mapping --- src/input/evdev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/input/evdev.c b/src/input/evdev.c index fa4da73..e87dc0f 100644 --- a/src/input/evdev.c +++ b/src/input/evdev.c @@ -453,12 +453,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); From eb2bdad5358dae91c83924e7c56318dac5b13dad Mon Sep 17 00:00:00 2001 From: Adrian Cuzman Date: Tue, 25 Jul 2017 18:01:08 +0000 Subject: [PATCH 3/9] added missing #ifdefs for HAVE_VAAPI & HAVE_VDPAU --- src/video/x11.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/video/x11.c b/src/video/x11.c index 552e42c..5309b3d 100644 --- a/src/video/x11.c +++ b/src/video/x11.c @@ -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; From 1b8ac983e515c4a8200497594c201372acfbda7d Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Sun, 6 Aug 2017 22:06:55 +0200 Subject: [PATCH 4/9] Check status code for GS api requests --- libgamestream/client.c | 35 ++++++++++++++++++++++++++++------- libgamestream/errors.h | 3 ++- libgamestream/xml.c | 35 +++++++++++++++++++++++++++++++++++ libgamestream/xml.h | 1 + src/main.c | 7 ++++++- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/libgamestream/client.c b/libgamestream/client.c index 4d17332..a296f5e 100644 --- a/libgamestream/client.c +++ b/libgamestream/client.c @@ -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) { diff --git a/libgamestream/errors.h b/libgamestream/errors.h index f657ae7..6de44a9 100644 --- a/libgamestream/errors.h +++ b/libgamestream/errors.h @@ -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; diff --git a/libgamestream/xml.c b/libgamestream/xml.c index 4e5e86e..d7076bc 100644 --- a/libgamestream/xml.c +++ b/libgamestream/xml.c @@ -23,6 +23,8 @@ #include #include +#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; +} diff --git a/libgamestream/xml.h b/libgamestream/xml.h index aee4214..fb19477 100644 --- a/libgamestream/xml.h +++ b/libgamestream/xml.h @@ -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); diff --git a/src/main.c b/src/main.c index 651cfd1..e111e88 100644 --- a/src/main.c +++ b/src/main.c @@ -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); From c1c0e54345832310fcc0c2979d005299d63a8bf6 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Sun, 6 Aug 2017 22:31:19 +0200 Subject: [PATCH 5/9] Add warning for invalid mappings --- src/input/evdev.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/input/evdev.c b/src/input/evdev.c index e87dc0f..e160015 100644 --- a/src/input/evdev.c +++ b/src/input/evdev.c @@ -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) { @@ -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) { From d7e6313a555651082380ad14c703ece16fa41da6 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Thu, 10 Aug 2017 20:13:51 +0200 Subject: [PATCH 6/9] Remove unneeded swscale header --- src/video/ffmpeg.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/video/ffmpeg.c b/src/video/ffmpeg.c index 8fcf9f8..ad8311c 100644 --- a/src/video/ffmpeg.c +++ b/src/video/ffmpeg.c @@ -29,7 +29,6 @@ #include #include -#include #include #include #include From c7e0e91e48a06f160ab035a3bf85e8dbcca6f0e4 Mon Sep 17 00:00:00 2001 From: Aardappelsch Date: Mon, 3 Jul 2017 21:58:04 +0200 Subject: [PATCH 7/9] Update gamecontrollerdb.txt This one works better than the other, had some issues with the analog stick buttons --- gamecontrollerdb.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/gamecontrollerdb.txt b/gamecontrollerdb.txt index d1cde5d..e7010ae 100644 --- a/gamecontrollerdb.txt +++ b/gamecontrollerdb.txt @@ -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, From 76f4699bba3f3793311e04ff7bfb349fcbe9ea62 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Wed, 16 Aug 2017 20:08:19 +0200 Subject: [PATCH 8/9] Better explain unsupported option --- docs/README.pod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.pod b/docs/README.pod index 7a6ccc3..5eb375e 100644 --- a/docs/README.pod +++ b/docs/README.pod @@ -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> From b6b47d30048c36ab0ca9b50359692fe2511fa32a Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Wed, 16 Aug 2017 20:08:40 +0200 Subject: [PATCH 9/9] Update version number to 2.4.3 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d10df6e..28f9cd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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)