diff src/linuxplay.c @ 272:c5d627a313b1 r21-0b34

Import from CVS: tag r21-0b34
author cvs
date Mon, 13 Aug 2007 10:28:48 +0200
parents 52952cbfc5b5
children c42ec1d1cded
line wrap: on
line diff
--- a/src/linuxplay.c	Mon Aug 13 10:27:41 2007 +0200
+++ b/src/linuxplay.c	Mon Aug 13 10:28:48 2007 +0200
@@ -77,10 +77,11 @@
 #else
 #include "lisp.h"
 #include "syssignal.h"
+#include "sysfile.h"
 #define perror(str) message("audio: %s, %s ",str,strerror(errno))
 #define warn(str)   message("audio: %s ",GETTEXT(str))
 #endif
- 
+
 #ifdef __GNUC__
 #define UNUSED(x) ((void)(x))
 #else
@@ -95,11 +96,20 @@
    is set to zero before the first invocation of the parser. The use of a
    global variable prevents multiple concurrent executions of this code, but
    this does not happen anyways... */
+enum wvState
+{ wvMain,
+  wvSubchunk,
+  wvOutOfBlock,
+  wvSkipChunk,
+  wvSoundChunk,
+  wvFatal,
+  wvFatalNotify
+};
+
 static union {
   struct {
     int           align;
-    enum {wvMain,wvSubchunk,wvOutOfBlock,wvSkipChunk,
-	  wvSoundChunk,wvFatal,wvFatalNotify} state;
+    enum wvState state;
     size_t        left;
     unsigned char leftover[HEADERSZ];
     signed long   chunklength;
@@ -186,9 +196,9 @@
   if (rq > *sz) {rq = *sz; rc = 0;}
   memcpy(parsestate.wave.leftover+parsestate.wave.left,
 	 *data,rq);
-  parsestate.wave.left     += rq;
-  ((unsigned char *)*data) += rq;
-  *sz                      -= rq;
+  parsestate.wave.left      += rq;
+  (*(unsigned char **)data) += rq;
+  *sz                       -= rq;
   return(rc);
 }
 
@@ -258,7 +268,7 @@
       else {
 	if (parsestate.wave.chunklength > 0 && *sz > 0) {
 	  *sz -= parsestate.wave.chunklength;
-	  ((unsigned char *)*data) += parsestate.wave.chunklength; }
+	  (*(unsigned char **)data) += parsestate.wave.chunklength; }
 	parsestate.wave.state = wvOutOfBlock; }
       break;
     case wvSoundChunk: {
@@ -267,7 +277,7 @@
 				     alignment operation */
 	count = parsestate.wave.left;
 	rq    = HEADERSZ-count;
-	if (rq > parsestate.wave.chunklength)
+	if (rq > (size_t) parsestate.wave.chunklength)
 	  rq = parsestate.wave.chunklength;
 	if (!waverequire(data,sz,rq)) {
 	  parsestate.wave.chunklength -= parsestate.wave.left - count;
@@ -276,15 +286,15 @@
 	*outbuf                      = parsestate.wave.leftover;
 	parsestate.wave.left         = 0;
 	return(rq); }
-      if (*sz >= parsestate.wave.chunklength) {
+      if (*sz >= (size_t) parsestate.wave.chunklength) {
 	count  = parsestate.wave.chunklength;
 	rq     = 0; }
       else {
 	count  = *sz;
 	count -= rq = count % parsestate.wave.align; }
       *outbuf                   = *data;
-      ((unsigned char *)*data) += count;
-      *sz                      -= count;
+      (*(unsigned char **)data) += count;
+      *sz                       -= count;
       if ((parsestate.wave.chunklength -= count) < parsestate.wave.align) {
 	parsestate.wave.state = wvOutOfBlock;
 	/* Some broken software (e.g. SOX) attaches junk to the end of a sound
@@ -317,7 +327,7 @@
      it with the new data and return a sound chunk that is as big as a
      single entry */
   if (parsestate.audio.left) {
-    if (parsestate.audio.left + *sz > parsestate.audio.align) {
+    if (parsestate.audio.left + *sz > (size_t) parsestate.audio.align) {
       int  count;
       memmove(parsestate.audio.leftover + parsestate.audio.left,
 	      *data,
@@ -354,7 +364,7 @@
      header information and determine how many bytes we need to skip until
      the start of the sound chunk */
   if (!parsestate.audio.skipping) {
-    unsigned char *header = *data;
+    unsigned char *header = (unsigned char *) *data;
     if (*sz < 8) {
       warn("Irrecoverable error while parsing Sun/DEC audio file");
       return(0); }
@@ -373,7 +383,7 @@
      creation date. Make sure that we do not return less than one single sound
      sample entry to the caller; if this happens, rather decide to move those
      few bytes into the leftover buffer and deal with it later */
-  if (*sz >= parsestate.audio.skipping) {
+  if (*sz >= (size_t) parsestate.audio.skipping) {
     /* Skip just the header information and return the sound chunk */
     int rc = *sz - parsestate.audio.skipping;
     *outbuf = (char *)*data + parsestate.audio.skipping;
@@ -415,12 +425,12 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--)
-    *dest++ = (unsigned char)(((int)*((unsigned char *)src)++ +
-			       (int)*((unsigned char *)src)++) / 2);
+    *dest++ = (unsigned char)(((int)*(src)++ +
+			       (int)*(src)++) / 2);
   *data   = src;
   return(rc);
 }
@@ -430,18 +440,18 @@
 {
   REGISTER unsigned char *src;
   REGISTER unsigned char *dest;
-  int rc,count;
+  int rc, count;
 
   count = *sz / 2;
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--)
-    *dest++ = (unsigned char)(((int)*((signed char *)src)++ +
-			       (int)*((signed char *)src)++) / 2);
+    *dest++ = (unsigned char)(((int)*((signed char *)(src++)) +
+			       (int)*((signed char *)(src++))) / 2);
   *data   = src;
   return(rc);
 }
@@ -457,12 +467,12 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--)
-    *dest++ = (unsigned char)(((int)*((signed char *)src)++ +
-			       (int)*((signed char *)src)++) / 2) ^ 0x80;
+    *dest++ = (unsigned char)(((int)*((signed char *)(src++)) +
+			       (int)*((signed char *)(src++))) / 2) ^ 0x80;
   *data   = src;
   return(rc);
 }
@@ -478,11 +488,11 @@
   if (count > SNDBUFSZ) { *sz  -= SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--)
-    *dest++ = *((unsigned char *)src)++ ^ 0x80;
+    *dest++ = *(src)++ ^ 0x80;
   *data   = src;
   return(rc);
 }
@@ -557,16 +567,16 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--)
     /* it is not possible to directly interpolate between two ulaw encoded
        data bytes, thus we need to convert to linear format first and later
        we convert back to ulaw format */
-    *dest++ = int2ulaw(ulaw2int[*((unsigned char *)src)++] +
-		       ulaw2int[*((unsigned char *)src)++]);
-  *data   = src;
+    *dest++ = int2ulaw(ulaw2int[*(src)++] +
+		       ulaw2int[*(src)++]);
+  *data = src;
   return(rc);
 }
 
@@ -583,18 +593,18 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   for (count /= 2; count--; ) {
-    i = ((int)(((unsigned char *)src)[0]) +
-        256*(int)(((unsigned char *)src)[1]) +
-	(int)(((unsigned char *)src)[2]) +
-	256*(int)(((unsigned char *)src)[3])) / 2;
+    i = ((int)(src[0]) +
+        256*(int)(src[1]) +
+	(int)(src[2]) +
+	256*(int)(src[3])) / 2;
     src += 4;
     *dest++ = (unsigned char)(i & 0xFF);
     *dest++ = (unsigned char)((i / 256) & 0xFF); }
-  *data   = src;
+  *data = src;
   return(rc);
 }
 
@@ -611,18 +621,18 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   for (count /= 2; count--; ) {
-    i = ((int)(((unsigned char *)src)[1]) +
-        256*(int)(((unsigned char *)src)[0]) +
-	(int)(((unsigned char *)src)[3]) +
-	256*(int)(((unsigned char *)src)[2])) / 2;
+    i = ((int)(src[1]) +
+        256*(int)(src[0]) +
+	(int)(src[3]) +
+	256*(int)(src[2])) / 2;
     src += 4;
     *dest++ = (unsigned char)((i / 256) & 0xFF);
     *dest++ = (unsigned char)(i & 0xFF); }
-  *data   = src;
+  *data = src;
   return(rc);
 }
 
@@ -637,13 +647,14 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--) {
     *dest++ = (unsigned char)(((signed char *)src)[1] ^ (signed char)0x80);
-    ((char *)src) += 2; }
-  *data   = src;
+    src += 2;
+  }
+  *data = src;
   return(rc);
 }
 
@@ -658,13 +669,14 @@
   if (count > SNDBUFSZ) { *sz  -= 2*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--) {
     *dest++ = (unsigned char)(((signed char *)src)[0] ^ (signed char)0x80);
-    ((char *)src) += 2; }
-  *data   = src;
+    src += 2;
+  }
+  *data = src;
   return(rc);
 }
 
@@ -680,14 +692,15 @@
   if (count > SNDBUFSZ) { *sz  -= 4*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--) {
     *dest++ = (unsigned char)(((int)((signed char *)src)[1] +
 			       (int)((signed char *)src)[3]) / 2 ^ 0x80);
-    ((char *)src) += 4; }
-  *data   = src;
+    src += 4;
+  }
+  *data = src;
   return(rc);
 }
 
@@ -703,14 +716,15 @@
   if (count > SNDBUFSZ) { *sz  -= 4*SNDBUFSZ; count = SNDBUFSZ; }
   else                    *sz   = 0;
   rc      = count;
-  src     = *data;
+  src     = (unsigned char *) *data;
   *outbuf =
   dest    = linuxplay_sndbuf;
   while (count--) {
     *dest++ = (unsigned char)(((int)((signed char *)src)[0] +
 			       (int)((signed char *)src)[2]) / 2 ^ 0x80);
-    ((char *)src) += 4; }
-  *data   = src;
+    src += 4;
+  }
+  *data = src;
   return(rc);
 }
 
@@ -807,7 +821,7 @@
     return(0); }
 
   /* Initialize sound hardware with prefered parameters */
-  
+
   /* If the sound hardware cannot support 16 bit format or requires a
      different byte sex then try to drop to 8 bit format */
 
@@ -839,7 +853,7 @@
       return(0); } }
 
   /* The PCSP driver does not support reading of the sampling rate via the
-     SOUND_PCM_READ_RATE ioctl; determine "the_speed" here */     
+     SOUND_PCM_READ_RATE ioctl; determine "the_speed" here */
   the_speed = speed; ioctl(audio_fd,SNDCTL_DSP_SPEED,&the_speed);
   /* The PCSP driver does not support reading of the mono/stereo flag, thus
      we assume, that failure to change this mode means we are in mono mode  */
@@ -905,7 +919,7 @@
     sprintf(buffer,"SNDCTL_DSP_SPEED (req: %d, rtn: %d)",speed,the_speed);
     perror(buffer);
     return(0); }
-  
+
   /* Use the mixer device for setting the playback volume */
   if (mixx_fd > 0) {
     int vol = *volume & 0xFF;
@@ -1005,9 +1019,9 @@
                device; repeat until all data has been processed */
   rrtn = length;
   do {
-    for (pptr = data; (prtn = parsesndfile((void **)&pptr,&rrtn,
+    for (pptr = data; (prtn = parsesndfile((void **)&pptr,(size_t *)&rrtn,
 					   (void **)&optr)) > 0; )
-      for (cptr = optr; (crtn = sndcnv((void **)&cptr,&prtn,
+      for (cptr = optr; (crtn = sndcnv((void **)&cptr,(size_t *) &prtn,
 				       (void **)&sptr)) > 0; ) {
 	for (;;) {
 	  if ((wrtn = write(audio_fd,sptr,crtn)) < 0) {