changeset 2179:64d8ef561763

[gaim-migrate @ 2189] Tom Dyas' patch for Arts ability in Gaim. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Mon, 27 Aug 2001 22:39:17 +0000
parents a22f18ae43c1
children e8faca8a2d69
files acconfig.h configure.ac m4/artsc.m4 src/sound.c
diffstat 4 files changed, 268 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/acconfig.h	Mon Aug 27 21:56:29 2001 +0000
+++ b/acconfig.h	Mon Aug 27 22:39:17 2001 +0000
@@ -14,6 +14,7 @@
 #undef USE_PERL
 #undef NAS_SOUND
 #undef ESD_SOUND
+#undef ARTSC_SOUND
 #undef _REENTRANT
 #undef NEED_GNOMESUPPORT_H
 #undef NEED_SOCKLEN_T
--- a/configure.ac	Mon Aug 27 21:56:29 2001 +0000
+++ b/configure.ac	Mon Aug 27 22:39:17 2001 +0000
@@ -81,6 +81,7 @@
 AM_CONDITIONAL(GNOMEAPPLET, test "x$enable_panel" = "xyes")
 AC_ARG_ENABLE(esd,     [  --disable-esd           Turn off ESD (default=auto)],,enable_esd=yes)
 AC_ARG_ENABLE(nas,     [  --enable-nas            Enable NAS (Network Audio System) support],,enable_nas=no)
+AC_ARG_ENABLE(artsc,   [  --disable-artsc         Turn off ArtsC (default=auto)],,enable_artsc=yes)
 
 AC_ARG_ENABLE(plugins, [  --disable-plugins       compile without plugin support],,enable_plugins=yes)
 AC_ARG_ENABLE(perl,    [  --disable-perl          compile without perl scripting],,enable_perl=yes)
@@ -221,13 +222,37 @@
 if test "$enable_esd" = yes ; then
 	AM_PATH_GESD
         if test "$no_esd" != yes ; then
+		old_CFLAGS="$CFLAGS"
         	CFLAGS="$CFLAGS $ESD_CFLAGS"
-		AC_DEFINE(ESD_SOUND)
-                SOUND_LIBS="$SOUND_LIBS $ESD_LIBS"
+		AC_CHECK_HEADER(esd.h,
+			[
+				AC_DEFINE(ESD_SOUND)
+				SOUND_LIBS="$SOUND_LIBS $ESD_LIBS"
+			],[
+				enable_esd=no
+				CFLAGS="$old_CFLAGS"
+			])
 	else
 		enable_esd=no
         fi
 fi
+if test "x$enable_artsc" = "xyes"; then
+	AM_PATH_ARTSC
+	if test "x$no_artsc" != "xyes" ; then
+		old_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $ARTSC_CFLAGS"
+		AC_CHECK_HEADER(artsc.h,
+			[
+				AC_DEFINE(ARTSC_SOUND)
+				SOUND_LIBS="$SOUND_LIBS $ARTSC_LIBS"
+			],[
+				enable_artsc=no
+				CFLAGS="$old_CFLAGS"
+			])
+	else
+		enable_artsc=no
+	fi
+fi
 AC_SUBST(SOUND_LIBS)
 
 if test "$ac_cv_cygwin" = yes ; then
@@ -352,6 +377,7 @@
 echo
 echo Build with ESD.............. : $enable_esd
 echo Build with NAS.............. : $enable_nas
+echo Build with ArtsC............ : $enable_artsc
 echo
 echo Print debugging messages.... : $enable_debug
 echo
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m4/artsc.m4	Mon Aug 27 22:39:17 2001 +0000
@@ -0,0 +1,142 @@
+dnl Test for the ArtsC interface.
+
+AC_DEFUN([AM_PATH_ARTSC],
+[
+AC_ARG_ENABLE(artsc-test,
+[  --disable-artsc-test      Do not compile and run a test ArtsC program.],
+[artsc_test="yes"],
+[artsc_test="no"])
+
+dnl Search for the arts-config program.
+AC_PATH_PROG(ARTSC_CONFIG, artsc-config, no)
+min_artsc_version=ifelse([$1],,0.9.5,$1)
+AC_MSG_CHECKING(for ArtsC - version >= $min_artsc_version)
+
+no_artsc=""
+if test "x$ARTSC_CONFIG" != "xno"; then
+  ARTSC_CFLAGS=`$ARTSC_CONFIG --cflags`
+  ARTSC_LIBS=`$ARTSC_CONFIG --libs`
+
+  artsc_major_version=`$ARTSC_CONFIG $artsc_args --version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+  artsc_minor_version=`$ARTSC_CONFIG $artsc_args --version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+  artsc_micro_version=`$ARTSC_CONFIG $artsc_config_args --version | \
+         sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+
+  # Test if a simple ArtsC program can be created.
+  if test "x$artsc_test" = "xyes"; then
+    ac_save_CFLAGS="$CFLAGS"
+    ac_save_LIBS="$LIBS"
+    CFLAGS="$CFLAGS $ARTSC_CFLAGS"
+    LIBS="$LIBS $ARTSC_LIBS"
+
+    rm -f conf.artsc
+    AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <artsc.h>
+
+char*
+my_strdup(char *str)
+{
+  char *new_str;
+ 
+  if (str) {
+    new_str = malloc((strlen(str) + 1) * sizeof(char));
+    strcpy(new_str, str);
+  } else {
+    new_str = NULL;
+  }
+
+  return new_str;
+}
+ 
+int main()
+{
+  int major, minor, micro;
+  char *tmp_version;
+ 
+  system ("touch conf.artsc");
+
+  /* HP/UX 9 writes to sscanf strings */
+  tmp_version = my_strdup("$min_artsc_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_artsc_version");
+     exit(1);
+  }
+ 
+  if (($artsc_major_version > major) ||
+     (($artsc_major_version == major) && ($artsc_minor_version > minor)) ||
+     (($artsc_major_version == major) && ($artsc_minor_version == minor)
+                                    && ($artsc_micro_version >= micro))) {
+    return 0;
+  } else {
+    printf("\n*** 'artsc-config --version' returned %d.%d.%d, but the minimum version\n", $artsc_major_version, $artsc_minor_version, $artsc_micro_version);
+    printf("*** of ARTSC required is %d.%d.%d. If artsc-config is correct, then it is\n", major, minor, micro);
+    printf("*** best to upgrade to the required version.\n");
+    printf("*** If artsc-config was wrong, set the environment variable ARTSC_CONFIG\n");
+    printf("*** to point to the correct copy of artsc-config, and remove the file\n");
+    printf("*** config.cache before re-running configure\n");
+    return 1;
+  }
+}
+],, no_artsc=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+   CFLAGS="$ac_save_CFLAGS"
+   LIBS="$ac_save_LIBS"
+  fi
+else
+  no_artsc=yes
+fi
+
+if test "x$no_artsc" != "xyes"; then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], , :, [$2])
+else
+  AC_MSG_RESULT(no)
+
+  if test "x$ARTSC_CONFIG" = "xno" ; then
+    echo "*** The artsc-config script installed by ArtsC could not be found"
+    echo "*** If ArtsC was installed in PREFIX, make sure PREFIX/bin is in"
+    echo "*** your path, or set the ARTSC_CONFIG environment variable to the"
+    echo "*** full path to artsc-config."
+  else
+    if test -f conf.artsc ; then
+      :
+    else
+      echo "*** Could not run ArtsC test program, checking why..."
+      CFLAGS="$CFLAGS $ARTSC_CFLAGS"
+      LIBS="$LIBS $ARTSC_LIBS"
+      AC_TRY_LINK([
+#include <stdio.h>
+#include <artsc.h>
+],[return 0;],
+[ echo "*** The test program compiled, but did not run. This usually means"
+  echo "*** that the run-time linker is not finding ArtsC or finding the wrong"
+  echo "*** version of ArtsC. If it is not finding ArtsC, you'll need to set your"
+  echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+  echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+  echo "*** is required on your system"
+  echo "***"
+  echo "*** If you have an old version installed, it is best to remove it, although"
+  echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+  [ echo "*** The test program failed to compile or link. See the file config.log for the"
+  echo "*** exact error that occured. This usually means ArtsC was incorrectly installed"
+  echo "*** or that you have moved ArtsC since it was installed. In the latter case, you"
+  echo "*** may want to edit the artsc-config script: $ARTSC_CONFIG" ])
+      CFLAGS="$ac_save_CFLAGS"
+      LIBS="$ac_save_LIBS"
+    fi
+  fi
+  ARTSC_CFLAGS=""
+  ARTSC_LIBS=""
+  ifelse([$3], , :, [$3])
+fi
+
+AC_SUBST(ARTSC_CFLAGS)
+AC_SUBST(ARTSC_LIBS)
+rm -f conf.artsc
+
+])
--- a/src/sound.c	Mon Aug 27 21:56:29 2001 +0000
+++ b/src/sound.c	Mon Aug 27 22:39:17 2001 +0000
@@ -39,6 +39,10 @@
 #include <esd.h>
 #endif
 
+#ifdef ARTSC_SOUND
+#include <artsc.h>
+#endif
+
 #ifdef NAS_SOUND
 #include <audio/audiolib.h>
 #endif
@@ -120,7 +124,8 @@
 }
 
 
-#ifdef ESD_SOUND
+#if defined(ESD_SOUND) || defined(ARTSC_SOUND)
+
 /*
 ** This routine converts from ulaw to 16 bit linear.
 **
@@ -154,6 +159,9 @@
 	return (sample);
 }
 
+#endif
+
+#ifdef ESD_SOUND
 
 int esd_fd;
 
@@ -191,6 +199,86 @@
 
 #endif
 
+#ifdef ARTSC_SOUND
+
+static int play_artsc(unsigned char *data, int size)
+{
+	arts_stream_t stream;
+	guint16* lineardata;
+	int result = 1;
+	int error;
+	int i;
+
+	lineardata = g_malloc(size * 2);
+
+	for (i = 0; i < size; i++) {
+		lineardata[i] = _af_ulaw2linear(data[i]);
+	}
+
+	stream = arts_play_stream(8012, 16, 1, "gaim");
+
+	error = arts_write(stream, lineardata, size);
+	if (error < 0) {
+		result = 0;
+	}
+
+	arts_close_stream(stream);
+
+	g_free(lineardata);
+
+	arts_free();
+
+	return result;
+}
+
+static int can_play_artsc()
+{
+	int error;
+
+	error = artsc_init();
+	if (error < 0)
+		return 0;
+
+	return 1;
+}
+
+static int play_artsc_file(char *file)
+{
+	struct stat stat_buf;
+	unsigned char* buf = NULL;
+	int result = 0;
+	int fd = -1;
+
+	fd = open(file, O_RDONLY);
+	if (fd < 0)
+		goto out;
+
+	if (!can_play_artsc())
+		goto out;
+
+	if (fstat(fd, &stat_buf))
+		goto out;
+
+	if (!stat_buf.st_size)
+		goto out;
+
+	buf = g_malloc(stat_buf.st_size);
+	if (!buf)
+		goto out;
+	
+	if (read(fd, buf, stat_buf.st_size) < 0)
+		goto out;
+
+	result = play_artsc(buf, stat_buf.st_size);
+
+	out:
+	if (buf) g_free(buf);
+	if (fd != -1) close(fd);
+	return result;
+}
+
+#endif /* ARTSC_SOUND */
+
 #ifdef NAS_SOUND
 
 char nas_server[] = "localhost";
@@ -365,6 +453,14 @@
 		}
 #endif
 
+#ifdef ARTSC_SOUND
+		/* ArtsC is the new second choice. */
+		if (can_play_artsc()) {
+			if (play_artsc(data, size))
+				_exit(0);
+		}
+#endif
+
 #ifdef NAS_SOUND
 		/* NAS is our second choice setup. */
 		if (can_play_nas()) {