Mercurial > hg > xemacs-beta
diff src/sound.c @ 398:74fd4e045ea6 r21-2-29
Import from CVS: tag r21-2-29
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:13:30 +0200 |
parents | 6719134a07c2 |
children | 2f8bb876ab1d |
line wrap: on
line diff
--- a/src/sound.c Mon Aug 13 11:12:06 2007 +0200 +++ b/src/sound.c Mon Aug 13 11:13:30 2007 +0200 @@ -25,6 +25,7 @@ Hacked on quite a bit by various others. */ #include <config.h> +#include <time.h> #include "lisp.h" #include "buffer.h" @@ -44,7 +45,14 @@ # include <netdb.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 */ +#endif + int bell_volume; +int bell_inhibit_time; Lisp_Object Vsound_alist; Lisp_Object Vsynchronous_sounds; Lisp_Object Vnative_sound_only_on_console; @@ -77,7 +85,8 @@ { /* This function can call lisp */ int vol; -#if defined (HAVE_NATIVE_SOUND) || defined (HAVE_NAS_SOUND) +#if defined (HAVE_NATIVE_SOUND) || defined (HAVE_NAS_SOUND) \ + || defined (HAVE_ESD_SOUND) struct device *d = decode_device (device); #endif struct gcpro gcpro1; @@ -117,19 +126,36 @@ { char *fileext; - GET_C_STRING_FILENAME_DATA_ALLOCA (file, fileext); + TO_EXTERNAL_FORMAT (LISP_STRING, file, + C_STRING_ALLOCA, fileext, + Qfile_name); /* #### 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; + + TO_EXTERNAL_FORMAT (LISP_STRING, file, + C_STRING_ALLOCA, fileext, + Qfile_name); + if (esd_play_sound_file (fileext, vol)) + 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; - GET_C_STRING_FILENAME_DATA_ALLOCA (file, fileext); + TO_EXTERNAL_FORMAT (LISP_STRING, file, + C_STRING_ALLOCA, fileext, + Qfile_name); /* The sound code doesn't like getting SIGIO interrupts. Unix sucks! */ stop_interrupts (); @@ -291,23 +317,40 @@ #ifdef HAVE_NAS_SOUND if (DEVICE_CONNECTED_TO_NAS_P (d) && STRINGP (sound)) { - CONST Extbyte *soundext; + const Extbyte *soundext; Extcount soundextlen; - GET_STRING_BINARY_DATA_ALLOCA (sound, soundext, soundextlen); + TO_EXTERNAL_FORMAT (LISP_STRING, sound, + ALLOCA, (soundext, soundextlen), + Qbinary); 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; + + TO_EXTERNAL_FORMAT (LISP_STRING, sound, ALLOCA, (soundext, soundextlen), + Qbinary); + if (esd_play_sound_data (soundext, soundextlen, vol)) + 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; - GET_STRING_BINARY_DATA_ALLOCA (sound, soundext, soundextlen); + TO_EXTERNAL_FORMAT (LISP_STRING, sound, + ALLOCA, (soundext, soundextlen), + Qbinary); /* The sound code doesn't like getting SIGIO interrupts. Unix sucks! */ stop_interrupts (); play_sound_data ((unsigned char*)soundext, soundextlen, vol); @@ -347,25 +390,28 @@ */ (arg, sound, device)) { - struct device *d = decode_device (device); + static time_t last_bell_time; + static struct device *last_bell_device; + time_t now; + 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 (visible_bell && DEVMETH (d, flash, (d))) ; else Fplay_sound (sound, Qnil, device); - - return Qnil; + + last_bell_time = now; + last_bell_device = d; + return Qnil; } DEFUN ("wait-for-sounds", Fwait_for_sounds, 0, 1, 0, /* @@ -527,11 +573,19 @@ #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. @@ -559,8 +613,8 @@ load-sound-file. Caveats: - - You can only play audio data if running on the console screen of a - Sun SparcStation, SGI, or HP9000s700. + - XEmacs must be built with sound support for your system. Not all + systems support sound. - The pitch, duration, and volume options are available everywhere, but many X servers ignore the `pitch' option.