polygon intersector: added horizontal line reconstruction
[swftools.git] / lib / wav.c
index 17ca2a2..ff577c7 100644 (file)
--- a/lib/wav.c
+++ b/lib/wav.c
@@ -46,15 +46,16 @@ int getWAVBlock(FILE*fi, struct WAVBlock*block)
     return 1;
 }
 
-int wav_read(struct WAV*wav, char* filename)
+int wav_read(struct WAV*wav, const char* filename)
 {
     FILE*fi = fopen(filename, "rb");
     unsigned char b[16];
     long int filesize;
     struct WAVBlock block;
     long int pos;
+    
     if(!fi)
-       return 0;
+        return 0;
     fseek(fi, 0, SEEK_END);
     filesize = ftell(fi);
     fseek(fi, 0, SEEK_SET);
@@ -62,69 +63,95 @@ int wav_read(struct WAV*wav, char* filename)
     //printf("Filesize: %d\n", filesize);
 
     if(!getWAVBlock (fi, &block))
-       return 0;
-    if(strncmp(block.id,"RIFF",4)) {
-       fprintf(stderr, "wav_read: not a WAV file\n");
-       return 0;
+    {
+        fclose(fi);
+        return 0;
+    }
+    if(strncmp(block.id,"RIFF",4))
+    {
+        fprintf(stderr, "wav_read: not a WAV file\n");
+        fclose(fi);
+        return 0;
     }
     if(block.size + 8 < filesize)
-       fprintf(stderr, "wav_read: warning - more tags (%d extra bytes)\n",
-               filesize - block.size - 8);
+        fprintf(stderr, "wav_read: warning - more tags (%d extra bytes)\n",
+    filesize - block.size - 8);
 
-    if(block.size == filesize) {
+    if(block.size == filesize)
        /* some buggy software doesn't generate the right tag length */
-       block.size = filesize - 8;
-    }
+        block.size = filesize - 8;
 
     if(block.size + 8 > filesize)
-       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, "wav_read: not a WAV file (2)\n");
-       return 0;
-    }
-    do
+        fprintf(stderr, "wav_read: warning - short file (%d bytes missing)\n",
+    block.size + 8 -  filesize);
+    if(fread(b, 1, 4, fi) < 4)
     {
-       getWAVBlock(fi, &block);
-       pos = ftell(fi);
-       if(!strncmp(block.id, "fmt ", 4)) {
-           if(fread(&b, 1, 16, fi)<16)
-               return 0;
-           wav->tag = b[0]|b[1]<<8;
-           wav->channels = b[2]|b[3]<<8;
-           wav->sampsPerSec = b[4]|b[5]<<8|b[6]<<16|b[7]<<24;
-           wav->bytesPerSec = b[8]|b[9]<<8|b[10]<<16|b[11]<<24;
-           wav->align = b[12]|b[13]<<8;
-           wav->bps = b[14]|b[15]<<8;
-       } 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);
+        fclose(fi);
                return 0;
-           }
-           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);
+    }
+    if(strncmp((const char*)b, "WAVE", 4))
+    {
+        fprintf(stderr, "wav_read: not a WAV file (2)\n");
+        fclose(fi);
                return 0;
-           }
-           wav->size = block.size;
        }
-       pos+=block.size;
-       fseek(fi, pos, SEEK_SET);
+    do
+    {
+        getWAVBlock(fi, &block);
+        pos = ftell(fi);
+        if(!strncmp(block.id, "fmt ", 4))
+        {
+            if(fread(&b, 1, 16, fi)<16)
+            {
+                fclose(fi);
+                return 0;
+            }
+            wav->tag = b[0]|b[1]<<8;
+            wav->channels = b[2]|b[3]<<8;
+            wav->sampsPerSec = b[4]|b[5]<<8|b[6]<<16|b[7]<<24;
+            wav->bytesPerSec = b[8]|b[9]<<8|b[10]<<16|b[11]<<24;
+            wav->align = b[12]|b[13]<<8;
+            wav->bps = b[14]|b[15]<<8;
+        }
+        else
+            if (!strncmp(block.id, "LIST", 4))
+            {
+        // subchunk ICMT (comment) may exist
+            }
+            else
+                if (!strncmp(block.id, "data", 4))
+                {
+                    int l;
+                    wav->data = (unsigned char*)malloc(block.size);
+                    if(!wav->data)
+                    {
+                        fprintf(stderr, "Out of memory (%d bytes needed)", block.size);
+                        fclose(fi);
+                        return 0;
+                    }
+                    l = fread(wav->data, 1, block.size, fi);
+                    if(l<=0) {
+                        fprintf(stderr, "Error: Couldn't read WAV data block\n");
+                        fclose(fi);
+                        return 0;
+                    } else if(l < block.size)
+                    {
+                        fprintf(stderr, "Warning: data block of size %d is only %d bytes (%d bytes missing)\n", block.size, l, block.size-l);
+                        wav->size = l;
+                    } else {
+                        wav->size = block.size;
+                    }
+                }
+                pos+=block.size;
+                fseek(fi, pos, SEEK_SET);
     }
     while (pos < filesize);
-
+    fclose(fi);
     return 1;
 }
 
-int wav_write(struct WAV*wav, char*filename)
+int wav_write(struct WAV*wav, const char*filename)
 {
     FILE*fi = fopen(filename, "wb");
     char*b="RIFFWAVEfmt \x10\0\0\0data";