diff src/sound.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents de805c49cfc1
children 11054d720c21
line wrap: on
line diff
--- a/src/sound.c	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/sound.c	Mon Aug 13 11:20:41 2007 +0200
@@ -25,7 +25,6 @@
    Hacked on quite a bit by various others. */
 
 #include <config.h>
-#include <time.h>
 #include "lisp.h"
 
 #include "buffer.h"
@@ -37,26 +36,25 @@
 #include "redisplay.h"
 #include "sysdep.h"
 
-#include "sysfile.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 #ifdef HAVE_NATIVE_SOUND
-# include "sysproc.h"
-# include "nativesound.h"
-#endif
-
-#ifdef HAVE_ESD_SOUND
-extern int esd_play_sound_file (char *file, int vol);
-extern int esd_play_sound_data (unsigned char *data, size_t length, int vol);
-# define DEVICE_CONNECTED_TO_ESD_P(x) 1 /* FIXME: better check */
+# include <netdb.h>
 #endif
 
 int bell_volume;
-int bell_inhibit_time;
 Lisp_Object Vsound_alist;
 Lisp_Object Vsynchronous_sounds;
 Lisp_Object Vnative_sound_only_on_console;
 Lisp_Object Q_volume, Q_pitch, Q_duration, Q_sound;
 
+/* These are defined in the appropriate file (sunplay.c, sgiplay.c,
+   or hpplay.c). */
+
+extern void play_sound_file (char *name, int volume);
+extern void play_sound_data (unsigned char *data, int length, int volume);
 
 #ifdef HAVE_NAS_SOUND
 extern int nas_play_sound_file (char *name, int volume);
@@ -79,8 +77,7 @@
 {
   /* This function can call lisp */
   int vol;
-#if defined (HAVE_NATIVE_SOUND) || defined (HAVE_NAS_SOUND) \
-       || defined (HAVE_ESD_SOUND)
+#if defined (HAVE_NATIVE_SOUND) || defined (HAVE_NAS_SOUND)
   struct device *d = decode_device (device);
 #endif
   struct gcpro gcpro1;
@@ -120,42 +117,19 @@
     {
       char *fileext;
 
-      TO_EXTERNAL_FORMAT (LISP_STRING, file,
-			  C_STRING_ALLOCA, fileext,
-			  Qfile_name);
+      GET_C_STRING_FILENAME_DATA_ALLOCA (file, fileext);
       /* #### NAS code should allow specification of a device. */
       if (nas_play_sound_file (fileext, vol))
 	return Qnil;
     }
 #endif /* HAVE_NAS_SOUND */
 
-#ifdef HAVE_ESD_SOUND
-  if (DEVICE_CONNECTED_TO_ESD_P (d))
-    {
-      char *fileext;
-      int result;
-
-      TO_EXTERNAL_FORMAT (LISP_STRING, file,
-			  C_STRING_ALLOCA, fileext,
-			  Qfile_name);
-
-      /* #### ESD uses alarm(). But why should we also stop SIGIO? */
-      stop_interrupts ();
-      result = esd_play_sound_file (fileext, vol);
-      start_interrupts ();
-      if (result)
-       return Qnil;
-    }
-#endif /* HAVE_ESD_SOUND */
-
 #ifdef HAVE_NATIVE_SOUND
   if (NILP (Vnative_sound_only_on_console) || DEVICE_ON_CONSOLE_P (d))
     {
-      const char *fileext;
+      CONST char *fileext;
 
-      TO_EXTERNAL_FORMAT (LISP_STRING, file,
-			  C_STRING_ALLOCA, fileext,
-			  Qfile_name);
+      GET_C_STRING_FILENAME_DATA_ALLOCA (file, fileext);
       /* The sound code doesn't like getting SIGIO interrupts.
 	 Unix sucks! */
       stop_interrupts ();
@@ -317,55 +291,29 @@
 #ifdef HAVE_NAS_SOUND
   if (DEVICE_CONNECTED_TO_NAS_P (d) && STRINGP (sound))
     {
-      const Extbyte *soundext;
+      CONST Extbyte *soundext;
       Extcount soundextlen;
 
-      TO_EXTERNAL_FORMAT (LISP_STRING, sound,
-			  ALLOCA, (soundext, soundextlen),
-			  Qbinary);
+      GET_STRING_BINARY_DATA_ALLOCA (sound, soundext, soundextlen);
       if (nas_play_sound_data ((unsigned char*)soundext, soundextlen, vol))
 	return Qnil;
     }
 #endif /* HAVE_NAS_SOUND */
 
-#ifdef HAVE_ESD_SOUND
-  if (DEVICE_CONNECTED_TO_ESD_P (d) && STRINGP (sound))
-    {
-      Extbyte *soundext;
-      Extcount soundextlen;
-      int succes;
-
-      TO_EXTERNAL_FORMAT (LISP_STRING, sound, ALLOCA, (soundext, soundextlen),
-			  Qbinary);
-      
-      /* #### ESD uses alarm(). But why should we also stop SIGIO? */
-      stop_interrupts ();
-      succes = esd_play_sound_data (soundext, soundextlen, vol);
-      start_interrupts ();
-      QUIT;
-      if(succes)
-        return Qnil;
-    }
-#endif /* HAVE_ESD_SOUND */
-
 #ifdef HAVE_NATIVE_SOUND
   if ((NILP (Vnative_sound_only_on_console) || DEVICE_ON_CONSOLE_P (d))
       && STRINGP (sound))
     {
-      const Extbyte *soundext;
+      CONST Extbyte *soundext;
       Extcount soundextlen;
-      int succes;
 
-      TO_EXTERNAL_FORMAT (LISP_STRING, sound,
-			  ALLOCA, (soundext, soundextlen),
-			  Qbinary);
+      GET_STRING_BINARY_DATA_ALLOCA (sound, soundext, soundextlen);
       /* The sound code doesn't like getting SIGIO interrupts. Unix sucks! */
       stop_interrupts ();
-      succes = play_sound_data ((unsigned char*)soundext, soundextlen, vol);
+      play_sound_data ((unsigned char*)soundext, soundextlen, vol);
       start_interrupts ();
       QUIT;
-      if (succes)
-        return Qnil;
+      return Qnil;
     }
 #endif  /* HAVE_NATIVE_SOUND */
 
@@ -399,28 +347,25 @@
 */
        (arg, sound, device))
 {
-  static time_t last_bell_time;
-  static struct device *last_bell_device;
-  time_t now;
-  struct device *d = decode_device (device);     
+  struct device *d = decode_device (device);
 
   XSETDEVICE (device, d);
-  now = time (0);
 
+  /* #### This is utterly disgusting, and is probably a remnant from
+     legacy code that used `ding'+`message' to signal error instead
+     calling `error'.  As a result, there is no way to beep from Lisp
+     directly, without also invoking this aspect.  Maybe we should
+     define a `ring-bell' function that simply beeps on the console,
+     which `ding' should invoke?  --hniksic */
   if (NILP (arg) && !NILP (Vexecuting_macro))
     /* Stop executing a keyboard macro. */
     error ("Keyboard macro terminated by a command ringing the bell");
-  
-  if (d == last_bell_device && now-last_bell_time < bell_inhibit_time)
-    return Qnil;
-  else if (!NILP (Vvisible_bell) && DEVMETH (d, flash, (d)))
+  else if (visible_bell && DEVMETH (d, flash, (d)))
     ;
   else
     Fplay_sound (sound, Qnil, device);
-  
-  last_bell_time = now;
-  last_bell_device = d;
-  return Qnil;    
+
+  return Qnil;
 }
 
 DEFUN ("wait-for-sounds", Fwait_for_sounds, 0, 1, 0, /*
@@ -456,11 +401,13 @@
 static void
 init_nas_sound (struct device *d)
 {
+  char *error;
+
 #ifdef HAVE_X_WINDOWS
   if (DEVICE_X_P (d))
     {
-      char *err_message = nas_init_play (DEVICE_X_DISPLAY (d));
-      DEVICE_CONNECTED_TO_NAS_P (d) = !err_message;
+      error = nas_init_play (DEVICE_X_DISPLAY (d));
+      DEVICE_CONNECTED_TO_NAS_P (d) = !error;
       /* Print out the message? */
     }
 #endif /* HAVE_X_WINDOWS */
@@ -580,19 +527,11 @@
 #ifdef HAVE_NAS_SOUND
   Fprovide (intern ("nas-sound"));
 #endif
-#ifdef HAVE_ESD_SOUND
-  Fprovide (intern ("esd-sound"));
-#endif
 
   DEFVAR_INT ("bell-volume", &bell_volume /*
 *How loud to be, from 0 to 100.
 */ );
   bell_volume = 50;
-  
-  DEFVAR_INT ("bell-inhibit-time", &bell_inhibit_time /*
-*Don't ring the bell on the same device more than once within this many seconds.
-*/ );
-  bell_inhibit_time = 0;
 
   DEFVAR_LISP ("sound-alist", &Vsound_alist /*
 An alist associating names with sounds.
@@ -620,8 +559,8 @@
 load-sound-file.
 
 Caveats:
- - XEmacs must be built with sound support for your system.  Not all
-   systems support sound. 
+ - You can only play audio data if running on the console screen of a
+   Sun SparcStation, SGI, or HP9000s700.
 
  - The pitch, duration, and volume options are available everywhere, but
    many X servers ignore the `pitch' option.