Generated from configure.in
[swftools.git] / lib / wav.c
index 1d6c67a..17ca2a2 100644 (file)
--- a/lib/wav.c
+++ b/lib/wav.c
@@ -25,7 +25,7 @@
 #include "wav.h"
 
 struct WAVBlock {
-    char id[4];
+    char id[5];
     unsigned int size;
 };
 
@@ -35,6 +35,7 @@ int getWAVBlock(FILE*fi, struct WAVBlock*block)
     unsigned char b[4];
     if(fread(block->id,1,4,fi)<4)
        return 0;
+    block->id[4] = 0;
     if(fread(b,1,4,fi)<4)
        return 0;
     block->size = b[0]|b[1]<<8|b[2]<<16|b[3]<<24;
@@ -45,7 +46,7 @@ int getWAVBlock(FILE*fi, struct WAVBlock*block)
     return 1;
 }
 
-int readWAV(char* filename, struct WAV*wav)
+int wav_read(struct WAV*wav, char* filename)
 {
     FILE*fi = fopen(filename, "rb");
     unsigned char b[16];
@@ -63,20 +64,26 @@ int readWAV(char* filename, struct WAV*wav)
     if(!getWAVBlock (fi, &block))
        return 0;
     if(strncmp(block.id,"RIFF",4)) {
-       fprintf(stderr, "readWAV: not a WAV file\n");
+       fprintf(stderr, "wav_read: not a WAV file\n");
        return 0;
     }
     if(block.size + 8 < filesize)
-       fprintf(stderr, "readWAV: warning - more tags (%d extra bytes)\n",
+       fprintf(stderr, "wav_read: warning - more tags (%d extra bytes)\n",
                filesize - block.size - 8);
+
+    if(block.size == filesize) {
+       /* some buggy software doesn't generate the right tag length */
+       block.size = filesize - 8;
+    }
+
     if(block.size + 8 > filesize)
-       fprintf(stderr, "readWAV: warning - short file (%d bytes missing)\n",
+       fprintf(stderr, "wav_read: warning - short file (%d bytes missing)\n",
                block.size + 8 -  filesize);
     if(fread(b, 1, 4, fi) < 4) {
        return 0;
     }
     if(strncmp(b, "WAVE", 4)) {
-       fprintf(stderr, "readWAV: not a WAV file (2)\n");
+       fprintf(stderr, "wav_read: not a WAV file (2)\n");
        return 0;
     }
  
@@ -96,13 +103,17 @@ int readWAV(char* filename, struct WAV*wav)
        } else if (!strncmp(block.id, "LIST", 4)) {
            // subchunk ICMT (comment) may exist
        } else if (!strncmp(block.id, "data", 4)) {
+           int l;
            wav->data = malloc(block.size);
            if(!wav->data) {
                fprintf(stderr, "Out of memory (%d bytes needed)", block.size);
                return 0;
            }
-           if(fread(wav->data, 1, block.size, fi) < block.size)
+           l = fread(wav->data, 1, block.size, fi);
+           if(l < block.size) {
+               fprintf(stderr, "Error while reading data block of size %d (%d bytes missing)", block.size, block.size-l);
                return 0;
+           }
            wav->size = block.size;
        }
        pos+=block.size;
@@ -113,7 +124,7 @@ int readWAV(char* filename, struct WAV*wav)
     return 1;
 }
 
-int writeWAV(char*filename, struct WAV*wav)
+int wav_write(struct WAV*wav, char*filename)
 {
     FILE*fi = fopen(filename, "wb");
     char*b="RIFFWAVEfmt \x10\0\0\0data";
@@ -158,14 +169,14 @@ int writeWAV(char*filename, struct WAV*wav)
     return 1;
 }
 
-void printWAVInfo(struct WAV*wav)
+void wav_print(struct WAV*wav)
 {
     printf("tag:%04x channels:%d samples/sec:%d bytes/sec:%d align:%d bits/sample:%d size:%d\n",
            wav->tag, wav->channels, wav->sampsPerSec, wav->bytesPerSec, 
            wav->align, wav->bps, wav->size);
 }
 
-int convertWAV2mono(struct WAV*src, struct WAV*dest, int rate)
+int wav_convert2mono(struct WAV*src, struct WAV*dest, int rate)
 {
     int samplelen=src->size/src->align;
     int bps=src->bps;
@@ -248,6 +259,8 @@ int convertWAV2mono(struct WAV*src, struct WAV*dest, int rate)
                pos += ratio;
            }
        }
+    } else {
+       fprintf(stderr, "Unsupported bitspersample value: %d\n", bps);
     }
     return 1;
 }