diff src/sunplay.c @ 442:abe6d1db359e r21-2-36

Import from CVS: tag r21-2-36
author cvs
date Mon, 13 Aug 2007 11:35:02 +0200
parents 3ecd8885ac67
children 183866b06e0b
line wrap: on
line diff
--- a/src/sunplay.c	Mon Aug 13 11:33:40 2007 +0200
+++ b/src/sunplay.c	Mon Aug 13 11:35:02 2007 +0200
@@ -33,20 +33,15 @@
 #include <sys/fcntl.h>
 #include <sys/file.h>
 
-/* libaudio.h includes a header which defines CONST.  We temporarily
-   undefine it in order to eliminate a compiler warning.  Yes, this is
-   a gross hack. */
-#undef CONST
 #include <multimedia/libaudio.h>
 #include <multimedia/audio_device.h>
-#undef CONST
-#define CONST const
 
 #ifdef emacs
 # include <config.h>
 # include "lisp.h"
 # include "sysdep.h"
 # include <errno.h>
+# include "nativesound.h"
 #include "syssignal.h"
 # define perror(string) \
     message("audio: %s, %s ", string, strerror (errno))
@@ -63,13 +58,11 @@
 
 #define audio_open()	open ("/dev/audio", (O_WRONLY | O_NONBLOCK), 0)
 
+static int initialized_device_p;
 static int reset_volume_p, reset_device_p;
 static double old_volume;
 static Audio_hdr dev_hdr;
 
-void play_sound_file (char *name, int volume);
-void play_sound_data (unsigned char *data, int length, int volume);
-
 static int
 init_device (int volume, unsigned char *data, int fd,
 	     unsigned int *header_length)
@@ -104,11 +97,12 @@
 
   audio_flush_play (audio_fd);
 
-  if (0 != audio_cmp_hdr (&dev_hdr, &file_hdr))
+  if (!initialized_device_p || (0 != audio_cmp_hdr (&dev_hdr, &file_hdr)))
     {
       Audio_hdr new_hdr;
       new_hdr = file_hdr;
       reset_device_p = 1;
+      initialized_device_p = 1;
       if (AUDIO_SUCCESS != audio_set_play_config (audio_fd, &new_hdr))
 	{
 	  char buf1 [100], buf2 [100], buf3 [250];
@@ -233,15 +227,16 @@
 }
 
 
-void
+int
 play_sound_data (unsigned char *data, int length, int volume)
 {
   int wrtn, start = 0;
   unsigned int ilen;
+  int result = 0;
 
   audio_fd = -1;
 
-  if (length == 0) return;
+  if (length == 0) return 0;
 
   /* this is just to get a better error message */
   if (strncmp (".snd\0", (char *) data, 4))
@@ -257,10 +252,7 @@
 
   audio_fd = audio_open ();
   if (audio_fd < 0)
-    {
-      perror ("open /dev/audio");
-      return;
-    }
+      return 0;
 
   /* where to find the proto for signal()... */
   sighup_handler = (SIGTYPE (*) (int)) signal (SIGHUP, sighandler);
@@ -298,6 +290,8 @@
       goto END_OF_PLAY;
     }
 
+ result = 1;
+  
  END_OF_PLAY:
 
   if (audio_fd > 0)
@@ -308,11 +302,13 @@
 
   signal (SIGHUP, sighup_handler);
   signal (SIGINT, sigint_handler);
+
+  return result;
 }
 
 /* #### sigcontext doesn't exist in Solaris.  This should be updated
    to be correct for Solaris. */
-static void
+static SIGTYPE
 sighandler (int sig)
 {
   if (audio_fd > 0)