+
+ 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 = 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);
+ fclose(fi);
+ return 0;
+ }
+ wav->size = block.size;
+ }
+ pos+=block.size;
+ fseek(fi, pos, SEEK_SET);