# Add post-recording fixup of length fields in wav header to reflect # correct file size when recording was stopped prematurely by the user. #PATCHOPTIONS: -p0 --- bplaysrc/bplay.c.orig 2005-03-01 19:17:34.000000000 +0100 +++ bplaysrc/bplay.c 2005-03-01 19:18:17.000000000 +0100 @@ -297,14 +297,14 @@ filetype = F_RAW; /* Change to change default */ switch(filetype) { + wavhead header; + case F_WAV: /* Spit out header here... */ #ifndef LP2CD fprintf(stderr, "Writing MS WAV sound file"); #endif { - wavhead header; - char *riff = "RIFF"; char *wave = "WAVE"; char *fmt = "fmt "; @@ -346,6 +346,25 @@ initsems(0, 1); shmrec(thefd, bcount, 1); + + /* Rewrite header with updated length fields now + * that we know the true file size. Writing is done + * in a separate process, so it's easiest to gather + * the number of bytes written from fstat(). [dk] + */ + if (filetype == F_WAV && + lseek(thefd, 0, SEEK_SET) != -1) { + struct stat st; + if (fstat(thefd, &st) != -1) { + header.length = cpu_to_le32( + (u_int32_t) (st.st_size - 8)); + header.data_length = cpu_to_le32( + (u_int32_t) (st.st_size - + sizeof(header))); + write(thefd, &header, sizeof(header)); + } + } + break; case F_VOC: /* Spit out header here... */