X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fwav.c;h=17ca2a2b8ccff635e57f82924473d9c4d6363976;hb=614fcba9c0d591fc7c3521f24fcd00836dbc72ae;hp=1d6c67a97c823ea63f41359523e95b181058cc07;hpb=96f6f939bc6a9cf64967842d5e13f949110b2d22;p=swftools.git diff --git a/lib/wav.c b/lib/wav.c index 1d6c67a..17ca2a2 100644 --- 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; }