Mercurial > hg > xemacs-beta
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.