/*$Author: DCODY $*/ /*$Date: 08 Dec 1992 16:38:42 $*/ /*$Header: X:/sccs/pcmapps/fixwave.c_v 1.3 08 Dec 1992 16:38:42 DCODY $*/ /*$Log: X:/sccs/pcmapps/fixwave.c_v $ * * Rev 1.3 08 Dec 1992 16:38:42 DCODY * removed some warning messages by doing explicit type casting. * * Rev 1.2 06 Oct 1992 15:19:20 DCODY * fixwave now just reports the contents of the file, it doesn't fix the file * unless the user explicitly requests it. * * Rev 1.1 23 Jun 1992 16:09:36 DCODY * pas2 update... * * Rev 1.0 15 Jun 1992 09:26:32 BCRANE * Initial revision. */ /*$Logfile: X:/sccs/pcmapps/fixwave.c_v $*/ /*$Modtimes$*/ /*$Revision: 1.3 $*/ /*$Workfile: fixwave.c $*/ ; /*\ ;---|*|----====< FIXWAVE.C >====---- ;---|*| ;---|*| This program Corrects the average # of samples in a stereo file. ;---|*| ; \*/ #include #include #include #include "play.h" ; /*\ ;---|*|----====< Global Variables >====---- ; \*/ #define TRUE -1 #define FALSE 0 struct find_t w_file; /* wave file stuff */ static FILE *inf; /* user input file */ fpos_t pos1; fpos_t pos2; fpos_t pos3; fpos_t pos4; RiffWave fhd = { { "RIFF", 0L }, { "WAVE", { "fmt ", sizeof(WaveInfo) , { 1, 1, 11025L, 11025L, 1, 8}, }, { "data", 0L }, } }; int align; int fixed; int rdhead; int bitspersample; unsigned long rate; unsigned long ave; int DoSave = FALSE; // save-the-changes flag ; /*\ ;---|*| ;---|*|----====< Main >====---- ;---|*| ;---|*| Play the voice file out to the PCM hardware ;---|*| ; \*/ main(argc,argv) int argc; char *argv[]; { int n,ch,work; unsigned long lwork; unsigned long l; char c; /* we have not fixed any fields */ fixed = FALSE; /* Check parameters */ CommandLine (argc,argv); /* get the 1st 2 characters in the file */ n = fgetc(inf) & 0xff; n = n + ((fgetc(inf) & 0xff) << 8); fseek (inf,0L,SEEK_SET); /* rewind to the start */ /* special case a .WAV file */ if (n != 0x4952) { printf ("this is not a .wav file!\n"); exit(1); } /* print the RIFF portion of the header */ printf ("RIFF header information:\n\n"); for (n=4;n;n--) putch (fgetc(inf)); printf ("\n"); fgetpos (inf,&pos3); l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; l += ((unsigned long) fgetc(inf) & 0xff) <<16; l += ((unsigned long) fgetc(inf) & 0xff) <<24; fhd.riff.length = l; printf (" length=%lu\n",l); /* pas up the wave block header name */ if ((unsigned long) fgetc(inf) != 'W') { printf ("\aUnknown header in the .WAV file! (should be 'WAVE')\n"); exit(1); } putch ('W'); for (n=3;n;n--) putch ((unsigned long) fgetc(inf)); printf ("\n"); /* pass up the format section name */ c = (unsigned long) fgetc(inf); if (c != 'f') { printf ("\aUnknown header in the .WAV file! (should be 'fmt ')\n"); exit(1); } putch (c); for (n=3;n;n--) putch((unsigned long) fgetc(inf)); /* move past the data */ printf ("\n"); // fmt l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; l += ((unsigned long) fgetc(inf) & 0xff) <<16; l += ((unsigned long) fgetc(inf) & 0xff) <<24; printf (" length =%lu\n",l); // format tag l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; printf (" format =%lu\n",l); // # of channel ch = (unsigned long) fgetc(inf) & 0xff; ch += ((unsigned long) fgetc(inf) & 0xff) << 8; printf (" channel=%d\n",ch); // Samples per second l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; l += ((unsigned long) fgetc(inf) & 0xff) <<16; l += ((unsigned long) fgetc(inf) & 0xff) <<24; rate = l; printf (" s-rate =%lu\n",rate); fgetpos (inf,&pos1); l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; l += ((unsigned long) fgetc(inf) & 0xff) <<16; l += ((unsigned long) fgetc(inf) & 0xff) <<24; // Average Samples per second ave = l; printf (" average=%lu\n",ave); // Block Alignment fgetpos (inf,&pos2); align = (unsigned long) fgetc(inf) & 0xff; align += ((unsigned long) fgetc(inf) & 0xff) << 8; printf (" align =%d\n",align); // Bits per sample l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; bitspersample = l & 0xff; printf (" bits =%lu\n",l); c = (unsigned long) fgetc(inf); if (c != 'd') { printf ("\aUnknown header in the .WAV file! (should be 'fmt ')\n"); exit(1); } putch (c); for (n=3;n;n--) putch((unsigned long) fgetc(inf)); /* move past the data */ printf ("\n"); fgetpos (inf,&pos4); l = (unsigned long) fgetc(inf) & 0xff; l += ((unsigned long) fgetc(inf) & 0xff) << 8; l += ((unsigned long) fgetc(inf) & 0xff) <<16; l += ((unsigned long) fgetc(inf) & 0xff) <<24; fhd.wave.data.length = l; printf (" length =%lu\n\n",l); ///// This is the average sample count for stereo file errors ///// if (ch == 2) { lwork = rate << (((bitspersample==16)?1:0) + ch-1); if (lwork != ave) { printf ("This stereo file average sample count is incorrect,\n"); if (DoSave) { printf ("now saving the average samples as %lu\n",lwork ); fsetpos (inf,&pos1); fputc ((int)( lwork & 0xff),inf); fputc ((int)((lwork>> 8) & 0xff),inf); fputc ((int)((lwork>>16) & 0xff),inf); fputc ((int)((lwork>>24) & 0xff),inf); fixed = TRUE; } } else printf ("This stereo file average sample count is correct...\n"); } else printf ("This is a mono file. The average sample count is correct...\n"); ///// This is the alignment size error created by FIXWAVE.EXE ///// if (bitspersample == 16) { work = 1 << (((ch == 1) ? 0 : 1) + 1); if (align != work) { align = work & 0xff; printf ("This file's sample alignment is incorrect,\n"); if (DoSave) { printf ("now saving the alignment as %d\n",work); fsetpos (inf,&pos2); fputc (( work & 0xff),inf); fputc (((work >> 8) & 0xff),inf); fixed = TRUE; } } else printf ("This file's alignment is correct...\n"); } ///// This is the alignment size error ///// if (ch == 2) { work = 1 << (((bitspersample == 8) ? 0 : 1) + ch-1); if (align != work) { printf ("This stereo file alignment is incorrect,\n"); if (DoSave) { printf ("now saving the alignment as %d\n",work); fsetpos (inf,&pos2); fputc (( work & 0xff),inf); fputc (((work >> 8) & 0xff),inf); fixed = TRUE; } } else printf ("This stereo file alignment count is correct...\n"); } else printf ("This is a mono file. The alignment count sample count is correct...\n"); ///// This is the 2-off error in the RIFF and DATA lengths ///// rdhead = 0; if ((w_file.size - fhd.riff.length) == 6) { printf ("The RIFF and DATA lengths are incorrect,\n"); if (DoSave) { printf ("now correcting...\n"); // correct the RIFF size l = fhd.riff.length - 2; fsetpos (inf,&pos3); fputc ((int)( l & 0xff),inf); fputc ((int)((l >> 8) & 0xff),inf); fputc ((int)((l >>16) & 0xff),inf); fputc ((int)((l >>24) & 0xff),inf); // correct the DATA size l = fhd.wave.data.length - 2; fsetpos (inf,&pos4); fputc ((int)( l & 0xff),inf); fputc ((int)((l >> 8) & 0xff),inf); fputc ((int)((l >>16) & 0xff),inf); fputc ((int)((l >>24) & 0xff),inf); rdhead = fixed = TRUE; } } if (w_file.size < fhd.riff.length) { printf ("The RIFF and DATA lengths are greater than the file length,\n"); if (DoSave) { printf ("now correcting...\n"); // correct the RIFF size l = w_file.size - sizeof (RiffHeader); fsetpos (inf,&pos3); fputc ((int)( l & 0xff),inf); fputc ((int)((l >> 8) & 0xff),inf); fputc ((int)((l >>16) & 0xff),inf); fputc ((int)((l >>24) & 0xff),inf); rdhead = fixed = TRUE; if (w_file.size < fhd.wave.data.length) { // correct the DATA size l = w_file.size - (sizeof (RiffHeader) + sizeof(WaveHeader) - sizeof (long)); fsetpos (inf,&pos4); fputc ((int)( l & 0xff),inf); fputc ((int)((l >> 8) & 0xff),inf); fputc ((int)((l >>16) & 0xff),inf); fputc ((int)((l >>24) & 0xff),inf); } } } if (!rdhead) printf ("This RIFF and DATA size are correct...\n"); /* save the changes, if any were made... */ if (fixed) fclose (inf); } ; /*\ ;---|*|----====< CommandLine >====---- ;---|*| ;---|*| Check the parameters ;---|*| ; \*/ CommandLine (argc,argv) int argc; char *argv[]; { int n; char *s; // say hello... printf ("\nFIXWAVE, Version 1.04 - Checks/Fixes .WAV header errors from RECFILE.EXE.\n"); printf ("Courtesy of Media Vision, Inc.\n\n"); // stop if there are no more parameters if (argc < 2) { printf ("To Use: DOS>FIXWAVE FILE.WAV [/C] \n\n"); printf ("Where: [/C] corrects detected errors.\n\n"); exit(1); } // open the file and get the file size. if ((inf = fopen(argv[1],"r+b")) == 0) { printf ("\aBad File Name, \"%s\" Try Again!\n",argv[1]); exit(1); } _dos_findfirst (argv[1],_A_ARCH|_A_NORMAL,&w_file); // process any switches n = 2; while (n < argc) { s = argv[n++]; if (*s == '/') s++; if (*s == '-') s++; switch (*s & 0x5f) { case 'C': DoSave = TRUE; break; default: break; } } } ; /*\ ;---|*| end of FIXWAVE.C ; \*/