Fixed bug #52
Integrated most of the NetBSD and DragonFly patches at:
ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/devel/SDL/patches/
Thanks to Thomas Klausner for defailed information on the patches
--- a/configure.in Tue Mar 21 07:02:34 2006 +0000
+++ b/configure.in Tue Mar 21 08:54:50 2006 +0000
@@ -50,10 +50,13 @@
fi
dnl Set up the compiler and linker flags
-INCLUDE="-I$srcdir/include"
+INCLUDE="-I$srcdir/include $INCLUDE"
if test x$srcdir != x.; then
INCLUDE="-Iinclude $INCLUDE"
fi
+if test -d /usr/local/include; then
+ INCLUDE="$INCLUDE -I/usr/local/include"
+fi
case "$host" in
*-*-cygwin*)
# We build SDL on cygwin without the UNIX emulation layer
@@ -284,7 +287,7 @@
SOURCES="$SOURCES $srcdir/src/audio/dma/*.c"
have_audio=yes
- # OpenBSD needs linking with ossaudio emulation library
+ # We may need to link with ossaudio emulation library
case "$host" in
*-*-openbsd*|*-*-netbsd*)
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lossaudio";;
@@ -1499,7 +1502,7 @@
# causes Carbon.p complaints?
# pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
;;
- *-*-freebsd*)
+ *-*-freebsd*|*-*-dragonfly*)
pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
pthread_lib="-pthread"
;;
@@ -1761,14 +1764,17 @@
CheckUSBHID()
{
if test x$enable_joystick = xyes; then
- AC_CHECK_HEADER(usb.h, [USB_CFLAGS="-DHAVE_USB_H"])
- AC_CHECK_HEADER(usbhid.h, [USB_CFLAGS="-DHAVE_USBHID_H"])
- AC_CHECK_HEADER(libusb.h, [USB_CFLAGS="-DHAVE_LIBUSB_H"])
- AC_CHECK_HEADER(libusbhid.h, [USB_CFLAGS="-DHAVE_LIBUSBHID_H"])
+ AC_CHECK_LIB(usbhid, hid_init, have_libusbhid=yes)
+ if test x$have_libusbhid = xyes; then
+ AC_CHECK_HEADER(usbhid.h, [USB_CFLAGS="-DHAVE_USBHID_H"])
+ AC_CHECK_HEADER(libusbhid.h, [USB_CFLAGS="-DHAVE_LIBUSBHID_H"])
+ USB_LIBS="$USB_LIBS -lusbhid"
+ else
+ AC_CHECK_HEADER(usb.h, [USB_CFLAGS="-DHAVE_USB_H"])
+ AC_CHECK_HEADER(libusb.h, [USB_CFLAGS="-DHAVE_LIBUSB_H"])
+ AC_CHECK_LIB(usb, hid_init, [USB_LIBS="$USB_LIBS -lusb"])
+ fi
- AC_CHECK_LIB(usbhid, hid_init, [USB_LIBS="$USB_LIBS -lusbhid"])
- AC_CHECK_LIB(usb, hid_init, [USB_LIBS="$USB_LIBS -lusb"])
-
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $USB_CFLAGS"
@@ -1779,8 +1785,13 @@
#if defined(HAVE_USB_H)
#include <usb.h>
#endif
- #include <dev/usb/usb.h>
- #include <dev/usb/usbhid.h>
+ #ifdef __DragonFly__
+ # include <bus/usb/usb.h>
+ # include <bus/usb/usbhid.h>
+ #else
+ # include <dev/usb/usb.h>
+ # include <dev/usb/usbhid.h>
+ #endif
#if defined(HAVE_USBHID_H)
#include <usbhid.h>
#elif defined(HAVE_LIBUSB_H)
@@ -1805,8 +1816,13 @@
#if defined(HAVE_USB_H)
#include <usb.h>
#endif
- #include <dev/usb/usb.h>
- #include <dev/usb/usbhid.h>
+ #ifdef __DragonFly__
+ # include <bus/usb/usb.h>
+ # include <bus/usb/usbhid.h>
+ #else
+ # include <dev/usb/usb.h>
+ # include <dev/usb/usbhid.h>
+ #endif
#if defined(HAVE_USBHID_H)
#include <usbhid.h>
#elif defined(HAVE_LIBUSB_H)
@@ -1852,6 +1868,20 @@
fi
AC_MSG_RESULT($have_usbhid_new)
+ AC_MSG_CHECKING(for struct joystick in machine/joystick.h)
+ have_machine_joystick=no
+ AC_TRY_COMPILE([
+ #include <machine/joystick.h>
+ ],[
+ struct joystick t;
+ ],[
+ have_machine_joystick=yes
+ ])
+ if test x$have_machine_joystick = xyes; then
+ AC_DEFINE(SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H)
+ fi
+ AC_MSG_RESULT($have_machine_joystick)
+
AC_DEFINE(SDL_JOYSTICK_USBHID)
SOURCES="$SOURCES $srcdir/src/joystick/bsd/*.c"
EXTRA_CFLAGS="$EXTRA_CFLAGS $USB_CFLAGS"
@@ -1862,6 +1892,7 @@
fi
}
+
dnl Check for clock_gettime()
CheckClockGettime()
{
@@ -1907,7 +1938,7 @@
have_timers=yes
fi
;;
- *-*-linux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
+ *-*-linux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
case "$host" in
*-*-linux*) ARCH=linux ;;
*-*-kfreebsd*-gnu) ARCH=kfreebsd-gnu ;;
@@ -1916,6 +1947,7 @@
*-*-gnu*) ARCH=gnu ;; # must be last of the gnu variants
*-*-bsdi*) ARCH=bsdi ;;
*-*-freebsd*) ARCH=freebsd ;;
+ *-*-dragonfly*) ARCH=freebsd ;;
*-*-netbsd*) ARCH=netbsd ;;
*-*-openbsd*) ARCH=openbsd ;;
*-*-sysv5*) ARCH=sysv5 ;;
@@ -1961,12 +1993,12 @@
# Set up files for the audio library
if test x$enable_audio = xyes; then
case $ARCH in
- netbsd|sysv5|solaris|hpux)
+ sysv5|solaris|hpux)
AC_DEFINE(SDL_AUDIO_DRIVER_SUNAUDIO)
SOURCES="$SOURCES $srcdir/src/audio/sun/*.c"
have_audio=yes
;;
- openbsd)
+ netbsd|openbsd)
AC_DEFINE(SDL_AUDIO_DRIVER_OPENBSD)
SOURCES="$SOURCES $srcdir/src/audio/openbsd/*.c"
have_audio=yes
@@ -2388,7 +2420,7 @@
# Set runtime shared library paths as needed
if test "x$enable_rpath" = "xyes"; then
- if test $ARCH = linux -o $ARCH = freebsd -o $ARCH = bsdi -o $ARCH = irix; then
+ if test $ARCH = bsdi -o $ARCH = freebsd -o $ARCH = irix -o $ARCH = linux -o $ARCH = netbsd; then
SDL_RLD_FLAGS="-Wl,-rpath,\${exec_prefix}/lib"
fi
if test $ARCH = solaris; then
--- a/include/SDL_config.h.in Tue Mar 21 07:02:34 2006 +0000
+++ b/include/SDL_config.h.in Tue Mar 21 08:54:50 2006 +0000
@@ -208,6 +208,7 @@
#undef SDL_JOYSTICK_RISCOS
#undef SDL_JOYSTICK_WINMM
#undef SDL_JOYSTICK_USBHID
+#undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
/* Enable various shared object loading systems */
#undef SDL_LOADSO_BEOS
--- a/include/SDL_platform.h Tue Mar 21 07:02:34 2006 +0000
+++ b/include/SDL_platform.h Tue Mar 21 08:54:50 2006 +0000
@@ -45,7 +45,7 @@
#undef __DREAMCAST__
#define __DREAMCAST__ 1
#endif
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__DragonFly__)
#undef __FREEBSD__
#define __FREEBSD__ 1
#endif
--- a/src/audio/openbsd/SDL_openbsdaudio.c Tue Mar 21 07:02:34 2006 +0000
+++ b/src/audio/openbsd/SDL_openbsdaudio.c Tue Mar 21 08:54:50 2006 +0000
@@ -42,8 +42,12 @@
#include "../SDL_audiodev_c.h"
#include "SDL_openbsdaudio.h"
-/* The tag name used by OpenBSD audio */
+/* The tag name used by NetBSD/OpenBSD audio */
+#ifdef __NETBSD__
+#define OBSD_DRIVER_NAME "netbsd"
+#else
#define OBSD_DRIVER_NAME "openbsd"
+#endif
/* Open the audio device for playback, and don't block if busy */
/* #define USE_BLOCKING_WRITES */
@@ -128,7 +132,11 @@
}
AudioBootStrap OPENBSD_AUDIO_bootstrap = {
+#ifdef __NETBSD__
+ OBSD_DRIVER_NAME, "Native NetBSD audio",
+#else
OBSD_DRIVER_NAME, "Native OpenBSD audio",
+#endif
Audio_Available, Audio_CreateDevice
};
@@ -136,18 +144,6 @@
static void
OBSD_WaitAudio(_THIS)
{
- /* Check to see if the thread-parent process is still alive */
- { static int cnt = 0;
- /* Note that this only works with thread implementations
- that use a different process id for each thread.
- */
- if (parent && (((++cnt)%10) == 0)) { /* Check every 10 loops */
- if ( kill(parent, 0) < 0 ) {
- this->enabled = 0;
- }
- }
- }
-
#ifndef USE_BLOCKING_WRITES /* Not necessary when using blocking writes */
/* See if we need to use timed audio synchronization */
if ( frame_ticks ) {
@@ -384,6 +380,9 @@
spec->channels = 1;
AUDIO_INITINFO(&info);
info.play.sample_rate = spec->freq;
+ info.blocksize = spec->size;
+ info.hiwat = 5;
+ info.lowat = 3;
(void)ioctl(audio_fd, AUDIO_SETINFO, &info);
(void)ioctl(audio_fd, AUDIO_GETINFO, &info);
spec->freq = info.play.sample_rate;
--- a/src/joystick/bsd/SDL_sysjoystick.c Tue Mar 21 07:02:34 2006 +0000
+++ b/src/joystick/bsd/SDL_sysjoystick.c Tue Mar 21 08:54:50 2006 +0000
@@ -37,8 +37,13 @@
#if defined(HAVE_USB_H)
#include <usb.h>
#endif
+#ifdef __DragonFly__
+#include <bus/usb/usb.h>
+#include <bus/usb/usbhid.h>
+#else
#include <dev/usb/usb.h>
#include <dev/usb/usbhid.h>
+#endif
#if defined(HAVE_USBHID_H)
#include <usbhid.h>
@@ -49,11 +54,13 @@
#endif
#ifdef __FREEBSD__
+#ifndef __DragonFly__
#include <osreldate.h>
+#endif
#include <sys/joystick.h>
#endif
-#if defined(__NETBSD__) || (defined(__OPENBSD__) && defined(__i386__))
+#if SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
#include <machine/joystick.h>
#endif
@@ -231,6 +238,7 @@
struct hid_data *hdata;
struct report *rep;
int fd;
+ int i;
fd = open(path, O_RDONLY);
if (fd == -1) {
@@ -297,6 +305,8 @@
joy->nbuttons = 0;
joy->nhats = 0;
joy->nballs = 0;
+ for (i=0; i<JOYAXE_count; i++)
+ hw->axis_map[i] = -1;
while (hid_get_item(hdata, &hitem) > 0) {
char *sp;
@@ -323,8 +333,7 @@
unsigned usage = HID_USAGE(hitem.usage);
int joyaxe = usage_to_joyaxe(usage);
if (joyaxe >= 0) {
- hw->axis_map[joyaxe] = joy->naxes;
- joy->naxes++;
+ hw->axis_map[joyaxe] = 1;
} else if (usage == HUG_HAT_SWITCH) {
joy->nhats++;
}
@@ -342,6 +351,9 @@
}
}
hid_end_parse(hdata);
+ for (i=0; i<JOYAXE_count; i++)
+ if (hw->axis_map[i] > 0)
+ hw->axis_map[i] = joy->naxes++;
usbend:
/* The poll blocks the event thread. */
@@ -364,7 +376,7 @@
int nbutton, naxe = -1;
Sint32 v;
-#if defined(__FREEBSD__) || defined(__NETBSD__) || (defined(__OPENBSD__) && defined(__i386__))
+#if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H
struct joystick gameport;
static int x, y, xmin = 0xffff, ymin = 0xffff, xmax = 0, ymax = 0;
@@ -413,7 +425,7 @@
}
return;
}
-#endif /* defined(__FREEBSD__) || defined(__NETBSD__) || defined(__OPENBSD__) */
+#endif /* defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H */
rep = &joy->hwdata->inreport;
@@ -451,7 +463,8 @@
} else if (usage == HUG_HAT_SWITCH) {
v = (Sint32)hid_get_data(REP_BUF_DATA(rep),
&hitem);
- SDL_PrivateJoystickHat(joy, 0, hatval_to_sdl(v));
+ SDL_PrivateJoystickHat(joy, 0,
+ hatval_to_sdl(v)-hitem.logical_minimum);
}
break;
}
@@ -512,7 +525,9 @@
{
int len;
-#ifdef __FREEBSD__
+#ifdef __DragonFly__
+ len = hid_report_size(rd, r->rid, repinfo[repind].kind);
+#elif __FREEBSD__
# if (__FreeBSD_version >= 460000)
# if (__FreeBSD_version <= 500111)
len = hid_report_size(rd, r->rid, repinfo[repind].kind);
@@ -521,12 +536,12 @@
# endif
# else
len = hid_report_size(rd, repinfo[repind].kind, &r->rid);
-#endif
+# endif
#else
# ifdef USBHID_NEW
- len = hid_report_size(rd, repinfo[repind].kind, &r->rid);
+ len = hid_report_size(rd, repinfo[repind].kind, r->rid);
# else
- len = hid_report_size(rd, repinfo[repind].kind, r->rid);
+ len = hid_report_size(rd, repinfo[repind].kind, &r->rid);
# endif
#endif
--- a/src/video/vgl/SDL_vglvideo.c Tue Mar 21 07:02:34 2006 +0000
+++ b/src/video/vgl/SDL_vglvideo.c Tue Mar 21 08:54:50 2006 +0000
@@ -555,7 +555,7 @@
case V_INFO_MM_VGAX:
vminfop->Type = VIDBUF8X;
break;
-#if defined(__FREEBSD__) && __FreeBSD_version >= 500000
+#if defined(__FREEBSD__) && (defined(__DragonFly__) || __FreeBSD_version >= 500000)
case V_INFO_MM_DIRECT:
vminfop->PixelBytes = minfo.vi_pixel_size;
switch (vminfop->PixelBytes) {