XEmacs 21.4.20 "Double Solitaire".
[chise/xemacs-chise.git.1] / src / nas.c
index ceba9a2..a0a5ddb 100644 (file)
--- a/src/nas.c
+++ b/src/nas.c
  *      4/11/94, rjc    Added wait_for_sounds to be called when user wants to
  *                     be sure all play has finished.
  *      1998-10-01 rlt  Added support for WAVE files.
+ *      2002-10-16      Jon Trulson modifed this to work with NAS releases
+ *                      1.5f and higher.  We were using the private variable
+ *                      SoundFileInfo that doesn't exist anymore.  But preserve
+ *                      backward compatibility.  This will not work for some
+ *                      versions of NAS around 1.5b to 1.5f or so.  Known to
+ *                      work on 1.2p5 and 1.6.
  */
 
 #ifdef emacs
 #include <unistd.h>
 #endif
 
+/* NAS <= 1.2p5 defines {BIG,LITTLE}_ENDIAN in <audio/fileutil.h>,
+   conflicting with GNU libc (at least); newer versions avoid this
+   name space pollution.
 
+   DO NOT USE THOSE MACROS in this file.  Use NAS_{BIG,LITTLE}_ENDIAN.
+
+   It would be slightly more reliable to do this via configure, but that
+   seems unnecessarily complex.
+*/
 #undef LITTLE_ENDIAN
 #undef BIG_ENDIAN
+
 #include <audio/audiolib.h>
 #include <audio/soundlib.h>
 #include <audio/snd.h>
 #include <audio/wave.h>
 #include <audio/fileutil.h>
 
+/* NAS <= 1.2p5 <audio/fileutil.h> doesn't define the NAS_ versions */
+#ifndef NAS_LITTLE_ENDIAN
+#define NAS_LITTLE_ENDIAN LITTLE_ENDIAN
+#define NAS_BIG_ENDIAN BIG_ENDIAN
+#endif
+
 #ifdef emacs
 
 #    define XTOOLKIT
@@ -682,7 +703,7 @@ SndOpenDataForReading (const char *data,
 
   memcpy (&si->h, data, sizeof (SndHeader));
 
-  if (LITTLE_ENDIAN)
+  if (NAS_LITTLE_ENDIAN)
     {
       char            n;
     
@@ -730,7 +751,7 @@ SndOpenDataForReading (const char *data,
 /* Stuff taken from wave.c from NAS.  Just like snd files, NAS can't
    read wave data from memory, so these functions do that for us. */
 
-#define Err()          { return NULL; }
+#define Err()          { free (wi); return NULL; }
 #define readFourcc(_f) dread(_f, sizeof(RIFF_FOURCC), 1)
 #define cmpID(_x, _y)                                                        \
     strncmp((char *) (_x), (char *) (_y), sizeof(RIFF_FOURCC))
@@ -834,7 +855,7 @@ readChunk (RiffChunk *c)
     char            n;
 
     if ((status = dread(c, sizeof(RiffChunk), 1)))
-       if (BIG_ENDIAN)
+       if (NAS_BIG_ENDIAN)
            swapl(&c->ckSize, n);
 
     return status;
@@ -869,7 +890,7 @@ WaveOpenDataForReading (const char *data,
 
     fileSize = PAD2(ck.ckSize) - sizeof(RIFF_FOURCC);
 
-    while (fileSize >= sizeof(RiffChunk))
+    while (fileSize >= (AuInt32) sizeof(RiffChunk))
     {
        if (!readChunk(&ck))
            Err();
@@ -920,18 +941,18 @@ WaveOpenDataForReading (const char *data,
        {
            AuInt32            dummy;
 
-           wi->format = DataReadS(BIG_ENDIAN);
-           wi->channels = DataReadS(BIG_ENDIAN);
-           wi->sampleRate = DataReadL(BIG_ENDIAN);
+           wi->format = DataReadS(NAS_BIG_ENDIAN);
+           wi->channels = DataReadS(NAS_BIG_ENDIAN);
+           wi->sampleRate = DataReadL(NAS_BIG_ENDIAN);
 
            /* we don't care about the next two fields */
-           dummy = DataReadL(BIG_ENDIAN);
-           dummy = DataReadS(BIG_ENDIAN);
+           dummy = DataReadL(NAS_BIG_ENDIAN);
+           dummy = DataReadS(NAS_BIG_ENDIAN);
 
            if (wi->format != RIFF_WAVE_FORMAT_PCM)
                Err();
 
-           wi->bitsPerSample = DataReadS(BIG_ENDIAN);
+           wi->bitsPerSample = DataReadS(NAS_BIG_ENDIAN);
 
            /* skip any other format specific fields */
            dseek(PAD2(ck.ckSize - 16), 1);
@@ -983,13 +1004,28 @@ SoundOpenDataForReading (unsigned char *data,
 
 {
   Sound s;
+#if (AudioLibraryVersionMajor >= 2 ) && (AudioLibraryVersionMinor >= 3)
+  SoundFileInfoProc toProc;
+#endif
 
   if (!(s = (Sound) malloc (sizeof (SoundRec))))
     return NULL;
 
   if ((s->formatInfo = SndOpenDataForReading ((char *) data, length)) != NULL)
     {
+#if (AudioLibraryVersionMajor >= 2 ) && (AudioLibraryVersionMinor >= 3)
+      if ((toProc = SoundFileGetProc(SoundFileFormatSnd, 
+                                    SoundFileInfoProcTo)) == NULL)
+       {
+         SndCloseFile ((SndInfo *) (s->formatInfo));
+         free (s);
+
+         return NULL;
+       }
+      if (!((*toProc)(s)))
+#else
       if (!((int(*)(Sound))(SoundFileInfo[SoundFileFormatSnd].toSound)) (s))
+#endif
        {
          SndCloseFile ((SndInfo *) (s->formatInfo));
          free (s);
@@ -998,7 +1034,19 @@ SoundOpenDataForReading (unsigned char *data,
     }
   else if ((s->formatInfo = WaveOpenDataForReading ((char *) data, length)) != NULL)
     {
+#if (AudioLibraryVersionMajor >= 2 ) && (AudioLibraryVersionMinor >= 3)
+      if ((toProc = SoundFileGetProc(SoundFileFormatWave, 
+                                    SoundFileInfoProcTo)) == NULL)
+       {
+         WaveCloseFile ((WaveInfo *) (s->formatInfo));
+         free (s);
+
+         return NULL;
+       }
+      if (!((*toProc)(s)))
+#else
       if (!((int(*)(Sound))(SoundFileInfo[SoundFileFormatWave].toSound)) (s))
+#endif
        {
          WaveCloseFile ((WaveInfo *) (s->formatInfo));
          free (s);