/* sine_wav.c sine_wav train.wav */ #include #include #include int main(int argc, char * argv[]) { int i; FILE * inp; FILE * outp; char riff[4]; int sread, swrite; /* bytes read/written */ int fsize; char wave[4]; char fmt[4]; int nbytes; short ccode; short channels; int rate; int avgrate; /* average rate in samples per second */ short blockalign; short bps; /* bits per sample */ char data[4]; int csize; char sbyte; /* byte of sound */ int ibyte; char more[4]; int smin; int smax; int savg; int bad; /* flags bad data in read */ int nbread; /* number of bytes read */ double twopi, x, sinx; printf("sine_wav.c running \n"); if(argc<2) { printf("no file to open, use sin_wav train.wav \n"); exit(1); } inp = fopen(argv[1], "rb"); if(inp == NULL) { printf("can not open %s for reading. \n", argv[1]); exit(1); } if(argc<3) { printf("no output file given, opening junk.wav \n"); outp = fopen("junk.wav","wb"); if(outp == NULL) { printf("can not open junk.wav for writing. \n"); exit(1); } } else /* open users output file */ { outp = fopen(argv[2], "wb"); if(outp == NULL) { printf("can not open %s for writing. \n", argv[2]); exit(1); } } printf("reading %s \n", argv[1]); sread = fread(&riff[0], 1, 4, inp); swrite = fwrite(&riff[0], 1, 4, outp); printf("first 4 bytes should be RIFF, <%c%c%c%c>\n", riff[0],riff[1],riff[2],riff[3]); sread = fread(&fsize, 1, 4, inp); swrite = fwrite(&fsize, 1, 4, outp); printf("file has %d +8 bytes \n", fsize); sread = fread(&wave[0], 1, 4, inp); swrite = fwrite(&wave[0], 1, 4, outp); printf("should be WAVE, <%c%c%c%c>\n",wave[0],wave[1],wave[2],wave[3]); sread = fread(&fmt[0], 1, 4, inp); swrite = fwrite(&fmt[0], 1, 4, outp); printf("should be fmt, <%c%c%c%c>\n",fmt[0],fmt[1],fmt[2],fmt[3]); sread = fread(&nbytes, 1, 4, inp); swrite = fwrite(&nbytes, 1, 4, outp); printf("block has %d bytes \n", nbytes); sread = fread(&ccode, 1, 2, inp); swrite = fwrite(&ccode, 1, 2, outp); printf("compression code = %d \n", ccode); sread = fread(&channels, 1, 2, inp); swrite = fwrite(&channels, 1, 2, outp); printf("channels = %d \n", channels); sread = fread(&rate, 1, 4, inp); swrite = fwrite(&rate, 1, 4, outp); printf("rate = %d \n", rate); sread = fread(&avgrate, 1, 4, inp); swrite = fwrite(&avgrate, 1, 4, outp); printf("avg rate = %d \n", avgrate); sread = fread(&blockalign, 1, 2, inp); swrite = fwrite(&blockalign, 1, 2, outp); printf("blockalign = %d \n", blockalign); sread = fread(&bps, 1, 2, inp); swrite = fwrite(&bps, 1, 2, outp); printf("bits per sample = %d \n", bps); sread = fread(&data[0], 1, 4, inp); swrite = fwrite(&data[0], 1, 4, outp); printf("should be data, <%c%c%c%c>\n",data[0],data[1],data[2],data[3]); sread = fread(&csize, 1, 4, inp); swrite = fwrite(&csize, 1, 4, outp); printf("chunk has %d bytes \n", csize); nbread = 44; printf("%d bytes read so far \n", nbread); bad = 0; savg = 0; twopi = 2.0*3.14159265358979323846; for(i=0; ismax?ibyte:smax; if(i<20 || i>csize-20) printf("x=%g, sinx=%g, sbyte=%d \n", x, sinx, sbyte); } savg = savg / csize; printf("smin=%d, smax=%d, savg=%d \n", smin, smax, savg); nbread = nbread+csize; printf("%d bytes read so far \n", nbread); while(1) /* just copy remaining chunks */ { sread = fread(&more[0], 1, 4, inp); if(sread != 4) goto done; swrite = fwrite(&more[0], 1, 4, outp); printf("could be , <%c%c%c%c>\n",more[0],more[1],more[2],more[3]); sread = fread(&csize, 1, 4, inp); /* check for more chunks */ if(sread != 4) goto done; swrite = fwrite(&csize, 1, 4, outp); printf("chunk has %d bytes \n", csize); for(i=0; i