svn commit: r389607 - in head/devel/sdl12: . files

Marcus von Appen mva at FreeBSD.org
Sun Jun 14 08:58:08 UTC 2015


Author: mva
Date: Sun Jun 14 08:58:07 2015
New Revision: 389607
URL: https://svnweb.freebsd.org/changeset/ports/389607

Log:
  - Fix delayed inputs for joysticks with high sampling rates
  
  PR:		200173
  Submitted by:	kikuchan98 at gmail.com

Modified:
  head/devel/sdl12/Makefile
  head/devel/sdl12/files/patch-src_joystick_bsd_SDL_sysjoystick.c

Modified: head/devel/sdl12/Makefile
==============================================================================
--- head/devel/sdl12/Makefile	Sun Jun 14 08:44:44 2015	(r389606)
+++ head/devel/sdl12/Makefile	Sun Jun 14 08:58:07 2015	(r389607)
@@ -3,7 +3,7 @@
 
 PORTNAME=	sdl
 PORTVERSION=	1.2.15
-PORTREVISION=	6
+PORTREVISION=	7
 PORTEPOCH=	2
 CATEGORIES=	devel
 MASTER_SITES=	http://www.libsdl.org/release/

Modified: head/devel/sdl12/files/patch-src_joystick_bsd_SDL_sysjoystick.c
==============================================================================
--- head/devel/sdl12/files/patch-src_joystick_bsd_SDL_sysjoystick.c	Sun Jun 14 08:44:44 2015	(r389606)
+++ head/devel/sdl12/files/patch-src_joystick_bsd_SDL_sysjoystick.c	Sun Jun 14 08:58:07 2015	(r389607)
@@ -1,5 +1,5 @@
 --- src/joystick/bsd/SDL_sysjoystick.c.orig	2012-01-19 07:30:06.000000000 +0100
-+++ src/joystick/bsd/SDL_sysjoystick.c	2012-07-21 10:09:16.000000000 +0200
++++ src/joystick/bsd/SDL_sysjoystick.c	2015-05-06 22:52:50.648504057 +0900
 @@ -82,7 +82,9 @@
  #define MAX_JOYS	(MAX_UHID_JOYS + MAX_JOY_JOYS)
  
@@ -23,7 +23,203 @@
  #elif (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063))
  #define REP_BUF_DATA(rep) ((rep)->buf->ugd_data)
  #else
-@@ -582,8 +586,12 @@
+@@ -411,47 +415,47 @@
+ 	struct joystick gameport;
+  
+ 	if (joy->hwdata->type == BSDJOY_JOY) {
+-		if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport)
+-			return;
+-		if (abs(joy->hwdata->x - gameport.x) > 8) {
+-			joy->hwdata->x = gameport.x;
+-			if (joy->hwdata->x < joy->hwdata->xmin) {
+-				joy->hwdata->xmin = joy->hwdata->x;
+-			}
+-			if (joy->hwdata->x > joy->hwdata->xmax) {
+-				joy->hwdata->xmax = joy->hwdata->x;
+-			}
+-			if (joy->hwdata->xmin == joy->hwdata->xmax) {
+-				joy->hwdata->xmin--;
+-				joy->hwdata->xmax++;
+-			}
+-			v = (Sint32)joy->hwdata->x;
+-			v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2;
+-			v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2);
+-			SDL_PrivateJoystickAxis(joy, 0, v);
+-		}
+-		if (abs(joy->hwdata->y - gameport.y) > 8) {
+-			joy->hwdata->y = gameport.y;
+-			if (joy->hwdata->y < joy->hwdata->ymin) {
+-				joy->hwdata->ymin = joy->hwdata->y;
++		while (read(joy->hwdata->fd, &gameport, sizeof gameport) == sizeof gameport) {
++			if (abs(joy->hwdata->x - gameport.x) > 8) {
++				joy->hwdata->x = gameport.x;
++				if (joy->hwdata->x < joy->hwdata->xmin) {
++					joy->hwdata->xmin = joy->hwdata->x;
++				}
++				if (joy->hwdata->x > joy->hwdata->xmax) {
++					joy->hwdata->xmax = joy->hwdata->x;
++				}
++				if (joy->hwdata->xmin == joy->hwdata->xmax) {
++					joy->hwdata->xmin--;
++					joy->hwdata->xmax++;
++				}
++				v = (Sint32)joy->hwdata->x;
++				v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2;
++				v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2);
++				SDL_PrivateJoystickAxis(joy, 0, v);
++			}
++			if (abs(joy->hwdata->y - gameport.y) > 8) {
++				joy->hwdata->y = gameport.y;
++				if (joy->hwdata->y < joy->hwdata->ymin) {
++					joy->hwdata->ymin = joy->hwdata->y;
++				}
++				if (joy->hwdata->y > joy->hwdata->ymax) {
++					joy->hwdata->ymax = joy->hwdata->y;
++				}
++				if (joy->hwdata->ymin == joy->hwdata->ymax) {
++					joy->hwdata->ymin--;
++					joy->hwdata->ymax++;
++				}
++				v = (Sint32)joy->hwdata->y;
++				v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2;
++				v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2);
++				SDL_PrivateJoystickAxis(joy, 1, v);
+ 			}
+-			if (joy->hwdata->y > joy->hwdata->ymax) {
+-				joy->hwdata->ymax = joy->hwdata->y;
++			if (gameport.b1 != joy->buttons[0]) {
++				SDL_PrivateJoystickButton(joy, 0, gameport.b1);
+ 			}
+-			if (joy->hwdata->ymin == joy->hwdata->ymax) {
+-				joy->hwdata->ymin--;
+-				joy->hwdata->ymax++;
++			if (gameport.b2 != joy->buttons[1]) {
++				SDL_PrivateJoystickButton(joy, 1, gameport.b2);
+ 			}
+-			v = (Sint32)joy->hwdata->y;
+-			v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2;
+-			v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2);
+-			SDL_PrivateJoystickAxis(joy, 1, v);
+-		}
+-		if (gameport.b1 != joy->buttons[0]) {
+-			SDL_PrivateJoystickButton(joy, 0, gameport.b1);
+-		}
+-		if (gameport.b2 != joy->buttons[1]) {
+-			SDL_PrivateJoystickButton(joy, 1, gameport.b2);
+ 		}
+ 		return;
+ 	}
+@@ -459,65 +463,61 @@
+ 	
+ 	rep = &joy->hwdata->inreport;
+ 
+-	if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) {
+-		return;
+-	}
++	while (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) == rep->size) {
+ #if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__)
+-	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
++		hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid);
+ #else
+-	hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
++		hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input);
+ #endif
+-	if (hdata == NULL) {
+-		fprintf(stderr, "%s: Cannot start HID parser\n",
+-		    joy->hwdata->path);
+-		return;
+-	}
++		if (hdata == NULL) {
++			/*fprintf(stderr, "%s: Cannot start HID parser\n", joy->hwdata->path);*/
++			continue;
++		}
+ 
+-	for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) {
+-		switch (hitem.kind) {
+-		case hid_input:
+-			switch (HID_PAGE(hitem.usage)) {
+-			case HUP_GENERIC_DESKTOP: {
+-			    unsigned usage = HID_USAGE(hitem.usage);
+-			    int joyaxe = usage_to_joyaxe(usage);
+-			    if (joyaxe >= 0) {
+-				naxe = joy->hwdata->axis_map[joyaxe];
+-				/* scaleaxe */
+-				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
+-							 &hitem);
+-				v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2;
+-				v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2);
+-				if (v != joy->axes[naxe]) {
+-				    SDL_PrivateJoystickAxis(joy, naxe, v);
++		for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) {
++			switch (hitem.kind) {
++			case hid_input:
++				switch (HID_PAGE(hitem.usage)) {
++				case HUP_GENERIC_DESKTOP: {
++					unsigned usage = HID_USAGE(hitem.usage);
++					int joyaxe = usage_to_joyaxe(usage);
++					if (joyaxe >= 0) {
++					naxe = joy->hwdata->axis_map[joyaxe];
++					/* scaleaxe */
++					v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
++								 &hitem);
++					v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2;
++					v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2);
++					if (v != joy->axes[naxe]) {
++						SDL_PrivateJoystickAxis(joy, naxe, v);
++					}
++					} else if (usage == HUG_HAT_SWITCH) {
++					v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
++								 &hitem);
++					SDL_PrivateJoystickHat(joy, 0,
++						hatval_to_sdl(v)-hitem.logical_minimum);
++					}
++					break;
+ 				}
+-			    } else if (usage == HUG_HAT_SWITCH) {
+-				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
+-							 &hitem);
+-				SDL_PrivateJoystickHat(joy, 0,
+-					hatval_to_sdl(v)-hitem.logical_minimum);
+-			    }
+-			    break;
+-			}
+-			case HUP_BUTTON:
+-				v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
+-				    &hitem);
+-				if (joy->buttons[nbutton] != v) {
+-					SDL_PrivateJoystickButton(joy,
+-					    nbutton, v);
++				case HUP_BUTTON:
++					v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
++						&hitem);
++					if (joy->buttons[nbutton] != v) {
++						SDL_PrivateJoystickButton(joy,
++							nbutton, v);
++					}
++					nbutton++;
++					break;
++				default:
++					continue;
+ 				}
+-				nbutton++;
+ 				break;
+ 			default:
+-				continue;
++				break;
+ 			}
+-			break;
+-		default:
+-			break;
+ 		}
++		hid_end_parse(hdata);
+ 	}
+-	hid_end_parse(hdata);
+-
+-	return;
+ }
+ 
+ /* Function to close a joystick after use */
+@@ -582,8 +582,12 @@
  	r->size = len;
  
  	if (r->size > 0) {


More information about the svn-ports-all mailing list