Patch for dynamic loading of ALSA

Hi

A few months ago, I submitted a patch to Sam, for dynamic loading of ALSA,
which made it to the CVS. Later on, I improved my original patch a bit (I
think the original patch could break some configurations), and sent it to
Sam. It didn’t ever get any reply to that one though, so I try to repost
it here. :wink:

The configure script hacks aren’t really too good though, and could be
improved by someone who knows autoconf/automake/m4 better than me.

// Martin
-------------- next part --------------
diff -ur SDL12-orig/acinclude.m4 SDL12/acinclude.m4
— SDL12-orig/acinclude.m4 2004-05-06 18:55:06.000000000 +0300
+++ SDL12/acinclude.m4 2004-06-01 13:49:37.000000000 +0300
@@ -20,6 +20,153 @@
])#
+# — alsa.m4 —
+#
+dnl Configure Paths for Alsa
+dnl Some modifications by Richard Boulton
+dnl Christopher Lansdown
+dnl Jaroslav Kysela
+dnl Last modification: alsa.m4,v 1.22 2002/05/27 11:14:20 tiwai Exp
+dnl AM_PATH_ALSA([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for libasound, and define ALSA_CFLAGS and ALSA_LIBS as appropriate.
+dnl enables arguments --with-alsa-prefix=
+dnl --with-alsa-enc-prefix=
+dnl --disable-alsatest (this has no effect, as yet)
+dnl
+dnl For backwards compatibility, if ACTION_IF_NOT_FOUND is not specified,
+dnl and the alsa libraries are not found, a fatal AC_MSG_ERROR() will result.
+dnl
+AC_DEFUN(AM_PATH_ALSA,
+[dnl Save the original CFLAGS, LDFLAGS, and LIBS
+alsa_save_CFLAGS="$CFLAGS"
+alsa_save_LDFLAGS="$LDFLAGS"
+alsa_save_LIBS="$LIBS"
+alsa_found=yes
+
+dnl
+dnl Get the cflags and libraries for alsa
+dnl
+AC_ARG_WITH(alsa-prefix,
+[ --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional)],
+[alsa_prefix="$withval"], [alsa_prefix=""])
+
+AC_ARG_WITH(alsa-inc-prefix,
+[ --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional)],
+[alsa_inc_prefix="$withval"], [alsa_inc_prefix=""])
+
+dnl FIXME: this is not yet implemented
+AC_ARG_ENABLE(alsatest,
+[ --disable-alsatest Do not try to compile and run a test Alsa program],
+[enable_alsatest=no],
+[enable_alsatest=yes])
+
+dnl Add any special include directories
+AC_MSG_CHECKING(for ALSA CFLAGS)
+if test “$alsa_inc_prefix” != “” ; then

  • ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix"
  • CFLAGS="$CFLAGS -I$alsa_inc_prefix"
    +fi
    +AC_MSG_RESULT($ALSA_CFLAGS)

+dnl add any special lib dirs
+AC_MSG_CHECKING(for ALSA LDFLAGS)
+if test “$alsa_prefix” != “” ; then

  • ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix"
  • LDFLAGS="$LDFLAGS $ALSA_LIBS"
    +fi

+dnl add the alsa library
+ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread"
+LIBS=echo $LIBS | sed 's/-lm//'
+LIBS=echo $LIBS | sed 's/-ldl//'
+LIBS=echo $LIBS | sed 's/-lpthread//'
+LIBS=echo $LIBS | sed 's/ //'
+LIBS="$ALSA_LIBS $LIBS"
+AC_MSG_RESULT($ALSA_LIBS)
+
+dnl Check for a working version of libasound that is of the right version.
+min_alsa_version=ifelse([$1], ,0.1.1,$1)
+AC_MSG_CHECKING(for libasound headers version >= $min_alsa_version)
+no_alsa=""

  • alsa_min_major_version=`echo $min_alsa_version | \
  •       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
    
  • alsa_min_minor_version=`echo $min_alsa_version | \
  •       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
    
  • alsa_min_micro_version=`echo $min_alsa_version | \
  •       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
    

+AC_LANG_SAVE
+AC_LANG_C
+AC_TRY_COMPILE([
+#include <alsa/asoundlib.h>
+], [
+/* ensure backward compatibility */
+#if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR)
+#define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR
+#endif
+#if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR)
+#define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR
+#endif
+#if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR)
+#define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR
+#endif
+
+# if(SND_LIB_MAJOR > $alsa_min_major_version)

  • exit(0);
    +# else
    +# if(SND_LIB_MAJOR < $alsa_min_major_version)
    +# error not present
    +# endif

+# if(SND_LIB_MINOR > $alsa_min_minor_version)

  • exit(0);
    +# else
    +# if(SND_LIB_MINOR < $alsa_min_minor_version)
    +# error not present
    +# endif

+# if(SND_LIB_SUBMINOR < $alsa_min_micro_version)
+# error not present
+# endif
+# endif
+# endif
+exit(0);
+],

  • [AC_MSG_RESULT(found.)],
  • [AC_MSG_RESULT(not present.)
  • ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)])
  • alsa_found=no]
    +)
    +AC_LANG_RESTORE

+dnl Now that we know that we have the right version, let’s see if we have the library and not just the headers.
+AC_CHECK_LIB([asound], [snd_ctl_open],

  • [ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)])
  • alsa_found=no]
    +)

+CFLAGS="$alsa_save_CFLAGS"
+LDFLAGS="$alsa_save_LDFLAGS"
+LIBS="$alsa_save_LIBS"
+if test “x$alsa_found” = “xyes” ; then

  • ifelse([$2], , :, [$2])
    +else
  • ifelse([$3], , :, [$3])
  • CFLAGS="$alsa_save_CFLAGS"
  • LDFLAGS="$alsa_save_LDFLAGS"
  • LIBS="$alsa_save_LIBS"
  • ALSA_CFLAGS=""
  • ALSA_LIBS=""
    +fi

+dnl That should be it. Now just export out symbols:
+AC_SUBST(ALSA_CFLAGS)
+AC_SUBST(ALSA_LIBS)
+])
+
+
+
+#

— esd.m4 —

Configure paths for ESD

diff -ur SDL12-orig/configure.in SDL12/configure.in
— SDL12-orig/configure.in 2004-05-06 18:55:06.000000000 +0300
+++ SDL12/configure.in 2004-05-06 18:55:06.000000000 +0300
@@ -282,39 +282,53 @@
[ --enable-alsa support the ALSA audio API [default=yes]],
, enable_alsa=yes)
if test x$enable_audio = xyes -a x$enable_alsa = xyes; then

  •    AC_MSG_CHECKING(for ALSA audio support)
       have_alsa=no
    
  •    AC_TRY_COMPILE([
    
  •      #include <alsa/asoundlib.h>
    
  •    ],[
    
  •      #if SND_LIB_VERSION < ((0<<16)|(9<<8)|0)
    
  •      #error Your version of ALSA is too old
    
  •      #endif
    
  •      snd_pcm_t *pcm_handle;
    
  •    ],[
    
  •    AC_CHECK_LIB(asound, snd_pcm_open, have_alsa=yes)
    
  •    ])
    
  •    AM_PATH_ALSA(0.9.0, have_alsa=yes)
       if test x$have_alsa = xyes; then
           AC_ARG_ENABLE(alsa-shared,
    

[ --enable-alsa-shared dynamically load ALSA audio support [default=yes]],
, enable_alsa_shared=yes)

  •        alsa_lib=`ls /usr/lib/libasound.so.* | sed 's/.*\/\(.*\)/\1/; q'`
    
  •        if test "x`echo $ALSA_LIBS | grep -- -L`" = "x"; then
    
  •            if test "x`ls /usr/lib/libasound.so.* 2> /dev/null`" != "x"; then
    
  •                ALSA_LIBS="-L/usr/lib $ALSA_LIBS"
    
  •            else if test "x`ls /usr/local/lib/libasound.so.* 2> /dev/null`" != "x"; then
    
  •                ALSA_LIBS="-L/usr/local/lib $ALSA_LIBS"
    
  •            fi; fi
    
  •        fi
    
  •        alsa_lib_spec=`echo $ALSA_LIBS | sed 's/.*-L\([[^ ]]*\).*/\1\/libasound.so.*/'`
    
  •        alsa_lib=`ls $alsa_lib_spec | sed 's/.*\/\(.*\)/\1/; q'`
    
  •        echo "-- $alsa_lib_spec -> $alsa_lib"
    
  •        if test x$use_dlopen != xyes && \
              test x$enable_alsa_shared = xyes; then
               AC_MSG_ERROR([You must have dlopen() support and use the --enable-dlopen option])
           fi
           if test x$use_dlopen = xyes && \
              test x$enable_alsa_shared = xyes && test x$alsa_lib != x; then
    
  •            CFLAGS="$CFLAGS -DALSA_SUPPORT -DALSA_DYNAMIC=\$(alsa_lib)"
    
  •            CFLAGS="$CFLAGS -DALSA_SUPPORT -DALSA_DYNAMIC=\$(alsa_lib) $ALSA_CFLAGS"
               AC_SUBST(alsa_lib)
    
  •            AC_MSG_CHECKING(for dlvsym)
    
  •            use_dlvsym=no
    
  •            AC_TRY_COMPILE([
    
  •              #include <stdio.h>
    
  •              #define __USE_GNU
    
  •              #include <dlfcn.h>
    
  •            ],[
    
  •              dlvsym(NULL,"","");
    
  •            ],[
    
  •            use_dlvsym=yes
    
  •            ])
    
  •            AC_MSG_RESULT($use_dlvsym);
    
  •            if test x$use_dlvsym = xyes; then
    
  •                CFLAGS="$CFLAGS -DUSE_DLVSYM"
    
  •            fi
           else
    
  •            CFLAGS="$CFLAGS -DALSA_SUPPORT"
    
  •            SYSTEM_LIBS="$SYSTEM_LIBS -lasound"
    
  •            CFLAGS="$CFLAGS -DALSA_SUPPORT $ALSA_CFLAGS"
    
  •            SYSTEM_LIBS="$SYSTEM_LIBS $ALSA_LIBS"
           fi
           AUDIO_SUBDIRS="$AUDIO_SUBDIRS alsa"
           AUDIO_DRIVERS="$AUDIO_DRIVERS alsa/libaudio_alsa.la"
    
  •    else
    
  •        AC_MSG_RESULT($have_alsa)
       fi
    
    fi
    }
    diff -ur SDL12-orig/src/audio/alsa/SDL_alsa_audio.c SDL12/src/audio/alsa/SDL_alsa_audio.c
    — SDL12-orig/src/audio/alsa/SDL_alsa_audio.c 2004-03-02 14:49:16.000000000 +0200
    +++ SDL12/src/audio/alsa/SDL_alsa_audio.c 2004-06-01 13:50:25.000000000 +0300
    @@ -42,7 +42,9 @@
    #include “SDL_alsa_audio.h”

#ifdef ALSA_DYNAMIC
+#ifdef USE_DLVSYM
#define __USE_GNU
+#endif
#include <dlfcn.h>
#include “SDL_name.h”
#include “SDL_loadso.h”
@@ -134,7 +136,11 @@
retval = 0;
for (i = 0; i < SDL_TABLESIZE(alsa_functions); i++) {
/* alsa_functions[i].func = SDL_LoadFunction(alsa_handle,alsa_functions[i].name);/
+#ifdef USE_DLVSYM
*alsa_functions[i].func = dlvsym(alsa_handle,alsa_functions[i].name,“ALSA_0.9”);

  •   	if (!*alsa_functions[i].func)
    

+#endif

  •   		*alsa_functions[i].func = dlsym(alsa_handle,alsa_functions[i].name);
      	if (!*alsa_functions[i].func) {
      		retval = -1;
      		UnloadALSALibrary();

This patch is already in CVS.

See ya,
-Sam Lantinga, Software Engineer, Blizzard Entertainment