File 80_fix_wav_length.dpatch of Package gramofile

# Add post-recording fixup of length fields in wav header to reflect
# correct file size when recording was stopped prematurely by the user.

--- bplaysrc/bplay.c	2011-08-14 13:27:16.377717882 +0200
+++ bplaysrc/bplay.c	2011-08-14 13:27:16.605717839 +0200
@@ -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... */