diff --git a/OpenAL.cabal b/OpenAL.cabal
--- a/OpenAL.cabal
+++ b/OpenAL.cabal
@@ -1,21 +1,22 @@
 name:		OpenAL
-version:	1.3.1.2
+version:	1.3.1.3
 license:	BSD3
 license-file:	LICENSE
 maintainer:	Sven Panne <sven.panne@aedion.de>
 bug-reports:	mailto:sven.panne@aedion.de
+homepage:	http://connect.creativelabs.com/openal/
 category:	Sound
 synopsis:	A binding to the OpenAL cross-platform 3D audio API
 description:
 	A Haskell binding for the OpenAL cross-platform 3D audio API,
 	appropriate for use with gaming applications and many other
 	types of audio applications.  For more information about OpenAL,
-	please see: <http://www.openal.org/>.
+	please see: <http://connect.creativelabs.com/openal/>.
 build-type:     Configure
 extra-source-files:
-	config.guess config.sub install-sh
-	configure.ac configure OpenAL.buildinfo.in
-	include/HsOpenALConfig.h.in include/HsOpenAL.h.in
+	OpenAL.buildinfo.in README aclocal.m4 config.guess config.sub configure
+	configure.ac examples/test/TestDevice.hs include/HsOpenAL.h.in
+	include/HsOpenALConfig.h.in install-sh
 extra-tmp-files:
 	config.log config.status autom4te.cache
 	OpenAL.buildinfo include/HsOpenALConfig.h include/HsOpenAL.h
diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,4 @@
+To build this package using Cabal directly from darcs, you must run
+"autoreconf" before the usual Cabal build steps (configure/build/install).
+autoreconf is included in the GNU autoconf tools.  There is no need to run
+the "configure" script: the "setup configure" step will do this for you.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,318 @@
+# FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE, [, VALUE-FOR-CROSS-COMPILATION])
+#
+# This test should *really* be rewritten!!!
+AC_DEFUN([FPTOOLS_CHECK_HTYPE],
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))dnl
+define(<<AC_CV_NAME_supported>>, translit(fptools_cv_htype_sup_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(Haskell type for $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[AC_CV_NAME_supported=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef $1 testing;
+
+main() {
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+    fprintf(f, "%s%d\n",
+           ((testing)(-1) < (testing)0) ? "Int" : "Word",
+           sizeof(testing)*8);
+  } else {
+    fprintf(f,"%s\n",
+           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
+           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
+  }
+  fclose(f);
+  exit(0);
+}]])],[AC_CV_NAME=`cat conftestval`],
+[ifelse([$2], , [AC_CV_NAME=NotReallyAType; AC_CV_NAME_supported=no], [AC_CV_NAME=$2])],
+[ifelse([$3], , [AC_CV_NAME=NotReallyATypeCross; AC_CV_NAME_supported=no], [AC_CV_NAME=$3])])
+CPPFLAGS="$fp_check_htype_save_cppflags"]) dnl
+if test "$AC_CV_NAME_supported" = yes; then
+  AC_MSG_RESULT($AC_CV_NAME)
+  AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [Define to Haskell type for $1])
+else
+  AC_MSG_RESULT([not supported])
+fi
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+undefine([AC_CV_NAME_supported])dnl
+])
+
+
+# FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
+# ---------------------------------------------------------
+# Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
+# compilation. Execute IF-FAILS when unable to determine the value. Works for
+# cross-compilation, too.
+#
+# Implementation note: We are lazy and use an internal autoconf macro, but it
+# is supported in autoconf versions 2.50 up to the actual 2.57, so there is
+# little risk.
+AC_DEFUN([FP_COMPUTE_INT],
+[_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
+])# FP_COMPUTE_INT
+
+
+# FP_CHECK_CONST(EXPRESSION, [INCLUDES = DEFAULT-INCLUDES], [VALUE-IF-FAIL = -1])
+# -------------------------------------------------------------------------------
+# Defines CONST_EXPRESSION to the value of the compile-time EXPRESSION, using
+# INCLUDES. If the value cannot be determined, use VALUE-IF-FAIL.
+AC_DEFUN([FP_CHECK_CONST],
+[AS_VAR_PUSHDEF([fp_Cache], [fp_cv_const_$1])[]dnl
+AC_CACHE_CHECK([value of $1], fp_Cache,
+[FP_COMPUTE_INT([$1], fp_check_const_result, [AC_INCLUDES_DEFAULT([$2])],
+                [fp_check_const_result=m4_default([$3], ['-1'])])
+AS_VAR_SET(fp_Cache, [$fp_check_const_result])])[]dnl
+AC_DEFINE_UNQUOTED(AS_TR_CPP([CONST_$1]), AS_VAR_GET(fp_Cache), [The value of $1.])[]dnl
+AS_VAR_POPDEF([fp_Cache])[]dnl
+])# FP_CHECK_CONST
+
+
+# FP_CHECK_CONSTS_TEMPLATE(EXPRESSION...)
+# ---------------------------------------
+# autoheader helper for FP_CHECK_CONSTS
+m4_define([FP_CHECK_CONSTS_TEMPLATE],
+[AC_FOREACH([fp_Const], [$1],
+  [AH_TEMPLATE(AS_TR_CPP(CONST_[]fp_Const),
+               [The value of ]fp_Const[.])])[]dnl
+])# FP_CHECK_CONSTS_TEMPLATE
+
+
+# FP_CHECK_CONSTS(EXPRESSION..., [INCLUDES = DEFAULT-INCLUDES], [VALUE-IF-FAIL = -1])
+# -----------------------------------------------------------------------------------
+# List version of FP_CHECK_CONST
+AC_DEFUN([FP_CHECK_CONSTS],
+[FP_CHECK_CONSTS_TEMPLATE([$1])dnl
+for fp_const_name in $1
+do
+FP_CHECK_CONST([$fp_const_name], [$2], [$3])
+done
+])# FP_CHECK_CONSTS
+
+
+# FP_ARG_OPENAL
+# -------------
+AC_DEFUN([FP_ARG_OPENAL],
+[AC_ARG_ENABLE([openal],
+  [AC_HELP_STRING([--enable-openal],
+    [build a Haskell binding for OpenAL (default=autodetect)])],
+  [enable_openal=$enableval],
+  [enable_openal=yes])
+])# FP_ARG_OPENAL
+
+
+# FP_CHECK_OPENAL
+# -------------
+AC_DEFUN([FP_CHECK_OPENAL],
+[AC_REQUIRE([AC_CANONICAL_TARGET])
+AL_CFLAGS=
+case $target_os in
+darwin*)
+  AL_LIBS=
+  AL_FRAMEWORKS=OpenAL
+  ;;
+*)
+  AC_SEARCH_LIBS([alGenSources], [openal openal32], [AL_LIBS="$ac_cv_search_alGenSources"])
+  test x"$AL_LIBS" = x"none required" && AL_LIBS=
+  AC_SUBST([AL_LIBS])
+  AL_FRAMEWORKS=
+  ;;
+esac
+AC_SUBST([AL_CFLAGS])
+AC_SUBST([AL_FRAMEWORKS])
+])# FP_CHECK_OPENAL
+
+
+# FP_HEADER_AL
+# ------------
+# Check for an AL header, setting the variable fp_found_al_header to no/yes,
+# depending on the outcome.
+AC_DEFUN([FP_HEADER_AL],
+[if test -z "$fp_found_al_header"; then
+  fp_found_al_header=no
+  AC_CHECK_HEADERS([AL/al.h OpenAL/al.h], [fp_found_al_header=yes; break])
+fi
+]) # FP_HEADER_AL
+
+
+# FP_HEADER_ALC
+# -------------
+# Check for an ALC header, setting the variable fp_found_alc_header to no/yes,
+# depending on the outcome.
+AC_DEFUN([FP_HEADER_ALC],
+[if test -z "$fp_found_alc_header"; then
+  fp_found_alc_header=no
+  AC_CHECK_HEADERS([AL/alc.h OpenAL/alc.h], [fp_found_alc_header=yes; break])
+fi
+]) # FP_HEADER_ALC
+
+
+# FP_FUNC_ALCCLOSEDEVICE_VOID
+# ---------------------------
+# Defines ALCCLOSEDEVICE_VOID to 1 if `alcCloseDevice' returns void.
+AC_DEFUN([FP_FUNC_ALCCLOSEDEVICE_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcCloseDevice returns void],
+  [fp_cv_func_alcclosedevice_void],
+  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcCloseDevice(NULL);]])],
+ [fp_cv_func_alcclosedevice_void=no],
+ [fp_cv_func_alcclosedevice_void=yes])])
+if test x"$fp_cv_func_alcclosedevice_void" = xyes; then
+  AC_DEFINE([ALCCLOSEDEVICE_VOID], [1], [Define to 1 if `alcCloseDevice' returns void.])
+fi
+]) # FP_FUNC_ALCCLOSEDEVICE_VOID
+
+
+# FP_FUNC_ALCMAKECONTEXTCURRENT_VOID
+# ----------------------------------
+# Defines ALCMAKECONTEXTCURRENT_VOID to 1 if `alcMakeContextCurrent' returns void.
+AC_DEFUN([FP_FUNC_ALCMAKECONTEXTCURRENT_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcMakeContextCurrent returns void],
+  [fp_cv_func_alcmakecontextcurrent_void],
+  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcMakeContextCurrent(NULL);]])],
+ [fp_cv_func_alcmakecontextcurrent_void=no],
+ [fp_cv_func_alcmakecontextcurrent_void=yes])])
+if test x"$fp_cv_func_alcmakecontextcurrent_void)" = xyes; then
+  AC_DEFINE([ALCMAKECONTEXTCURRENT_VOID], [1], [Define to 1 if `alcMakeContextCurrent' returns void.])
+fi
+]) # FP_FUNC_ALCMAKECONTEXTCURRENT_VOID
+
+
+# FP_FUNC_ALCPROCESSCONTEXT_VOID
+# ------------------------------
+# Defines ALCPROCESSCONTEXT_VOID to 1 if `alcProcessContext' returns void.
+AC_DEFUN([FP_FUNC_ALCPROCESSCONTEXT_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcProcessContext returns void],
+  [fp_cv_func_alcprocesscontext_void],
+  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcProcessContext(NULL);]])],
+ [fp_cv_func_alcprocesscontext_void=no],
+ [fp_cv_func_alcprocesscontext_void=yes])])
+if test x"$fp_cv_func_alcprocesscontext_void" = xyes; then
+  AC_DEFINE([ALCPROCESSCONTEXT_VOID], [1], [Define to 1 if `alcProcessContext' returns void.])
+fi
+]) # FP_FUNC_ALCPROCESSCONTEXT_VOID
+
+
+# FP_FUNC_ALCDESTROYCONTEXT_VOID
+# ------------------------------
+# Defines ALCDESTROYCONTEXT_VOID to 1 if `alcDestroyContext' returns void.
+AC_DEFUN([FP_FUNC_ALCDESTROYCONTEXT_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcDestroyContext returns void],
+  [fp_cv_func_alcdestroycontext_void],
+  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcDestroyContext(NULL);]])],
+ [fp_cv_func_alcdestroycontext_void=no],
+ [fp_cv_func_alcdestroycontext_void=yes])])
+if test x"$fp_cv_func_alcdestroycontext_void" = xyes; then
+  AC_DEFINE([ALCDESTROYCONTEXT_VOID], [1], [Define to 1 if `alcDestroyContext' returns void.])
+fi
+]) # FP_FUNC_ALCDESTROYCONTEXT_VOID
+
+
+# FP_ARG_COMPILER
+# -------------
+AC_DEFUN([FP_ARG_COMPILER],
+[AC_ARG_WITH([compiler],
+  [AC_HELP_STRING([--with-compiler@<:@=HC@:>@],
+    [use the given Haskell compiler (default=ghc)])],
+  [with_compiler=$withval],
+  [with_compiler=ghc])
+])# FP_ARG_COMPILER
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for Haskell HOpenAL package 1.3.1.2.
+# Generated by GNU Autoconf 2.63 for Haskell HOpenAL package 1.3.1.3.
 #
 # Report bugs to <sven.panne@aedion.de>.
 #
@@ -596,8 +596,8 @@
 # Identity of this package.
 PACKAGE_NAME='Haskell HOpenAL package'
 PACKAGE_TARNAME='OpenAL'
-PACKAGE_VERSION='1.3.1.2'
-PACKAGE_STRING='Haskell HOpenAL package 1.3.1.2'
+PACKAGE_VERSION='1.3.1.3'
+PACKAGE_STRING='Haskell HOpenAL package 1.3.1.3'
 PACKAGE_BUGREPORT='sven.panne@aedion.de'
 
 ac_unique_file="include/HsOpenAL.h.in"
@@ -1270,7 +1270,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Haskell HOpenAL package 1.3.1.2 to adapt to many kinds of systems.
+\`configure' configures Haskell HOpenAL package 1.3.1.3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1336,7 +1336,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Haskell HOpenAL package 1.3.1.2:";;
+     short | recursive ) echo "Configuration of Haskell HOpenAL package 1.3.1.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1428,7 +1428,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Haskell HOpenAL package configure 1.3.1.2
+Haskell HOpenAL package configure 1.3.1.3
 generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1442,7 +1442,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Haskell HOpenAL package $as_me 1.3.1.2, which was
+It was created by Haskell HOpenAL package $as_me 1.3.1.3, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
@@ -8047,6 +8047,12 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
@@ -8178,6 +8184,12 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
@@ -8326,6 +8338,12 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
@@ -8457,6 +8475,12 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
@@ -8615,6 +8639,12 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
@@ -8759,6 +8789,12 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
@@ -9386,7 +9422,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Haskell HOpenAL package $as_me 1.3.1.2, which was
+This file was extended by Haskell HOpenAL package $as_me 1.3.1.3, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -9445,7 +9481,7 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-Haskell HOpenAL package config.status 1.3.1.2
+Haskell HOpenAL package config.status 1.3.1.3
 configured by $0, generated by GNU Autoconf 2.63,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([Haskell HOpenAL package], [1.3.1.2], [sven.panne@aedion.de], [OpenAL])
+AC_INIT([Haskell HOpenAL package], [1.3.1.3], [sven.panne@aedion.de], [OpenAL])
 
 # Safety check: Ensure that we are in the correct source directory.
 AC_CONFIG_SRCDIR([include/HsOpenAL.h.in])
@@ -71,6 +71,12 @@
 FPTOOLS_CHECK_HTYPE([ALCdouble], [Double])
 
 FP_CHECK_CONSTS([AL_FALSE AL_TRUE AL_NO_ERROR AL_INVALID_NAME AL_INVALID_ENUM AL_INVALID_VALUE AL_INVALID_OPERATION AL_OUT_OF_MEMORY AL_DOPPLER_FACTOR AL_SPEED_OF_SOUND AL_DISTANCE_MODEL AL_VERSION AL_RENDERER AL_VENDOR AL_EXTENSIONS AL_NONE AL_INVERSE_DISTANCE AL_INVERSE_DISTANCE_CLAMPED AL_LINEAR_DISTANCE AL_LINEAR_DISTANCE_CLAMPED AL_EXPONENT_DISTANCE AL_EXPONENT_DISTANCE_CLAMPED AL_POSITION AL_VELOCITY AL_GAIN AL_ORIENTATION AL_SOURCE_RELATIVE AL_SOURCE_TYPE AL_LOOPING AL_BUFFER AL_BUFFERS_QUEUED AL_BUFFERS_PROCESSED AL_MIN_GAIN AL_MAX_GAIN AL_REFERENCE_DISTANCE AL_ROLLOFF_FACTOR AL_MAX_DISTANCE AL_PITCH AL_DIRECTION AL_CONE_INNER_ANGLE AL_CONE_OUTER_ANGLE AL_CONE_OUTER_GAIN AL_SEC_OFFSET AL_SAMPLE_OFFSET AL_BYTE_OFFSET AL_SOURCE_STATE AL_UNDETERMINED AL_STATIC AL_STREAMING AL_INITIAL AL_PLAYING AL_PAUSED AL_STOPPED AL_FREQUENCY AL_SIZE AL_BITS AL_CHANNELS AL_FORMAT_MONO8 AL_FORMAT_MONO16 AL_FORMAT_STEREO8 AL_FORMAT_STEREO16 ALC_FALSE ALC_TRUE ALC_FREQUENCY ALC_REFRESH ALC_SYNC ALC_MONO_SOURCES ALC_STEREO_SOURCES ALC_NO_ERROR ALC_INVALID_DEVICE ALC_INVALID_CONTEXT ALC_INVALID_ENUM ALC_INVALID_VALUE ALC_INVALID_OPERATION ALC_OUT_OF_MEMORY ALC_DEFAULT_DEVICE_SPECIFIER ALC_DEVICE_SPECIFIER ALC_EXTENSIONS ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER ALC_CAPTURE_DEVICE_SPECIFIER ALC_ATTRIBUTES_SIZE ALC_ALL_ATTRIBUTES ALC_MAJOR_VERSION ALC_MINOR_VERSION ALC_CAPTURE_SAMPLES], [#include <stdio.h>
+#if defined(HAVE_AL_AL_H)
+#include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+#include <OpenAL/al.h>
+#endif
+
 #if defined(HAVE_AL_ALC_H)
 #include <AL/alc.h>
 #elif defined(HAVE_OPENAL_ALC_H)
diff --git a/examples/test/TestDevice.hs b/examples/test/TestDevice.hs
new file mode 100644
--- /dev/null
+++ b/examples/test/TestDevice.hs
@@ -0,0 +1,15 @@
+import Control.Monad ( unless )
+import System.IO ( hPutStrLn, stderr )
+import System.Posix.Unistd ( sleep )
+import Sound.OpenAL
+
+main :: IO ()
+main = do
+   maybeDevice <- openDevice (Just "'( ( devices '( native null ) ) )")
+   case maybeDevice of
+      Nothing -> hPutStrLn stderr "openDevice failed"
+      Just device -> do
+         sleep 1
+         ok <- closeDevice device
+         unless ok $
+            hPutStrLn stderr "closeDevice failed"
