/* *** wavout.c */ #include "wav.h" static int file_size; /* size of file (bytes) */ static int format_size; /* size of format chunk (bytes) */ static int data_size; /* size of data chunk (bytes) */ static int nfile, nchunk; static fpos_t file_pos, format_pos, data_pos; static int dummy = 0; void * revb(seq, n) /* reverse byte order */ unsigned char *seq; int n; { int i; static unsigned char rev[8]; for (i=0; iDataID), 2); putrev(&(fmt->Channels), 2); putrev(&(fmt->SamplingRate), 4); putrev(&(fmt->BytesPerSec), 4); putrev(&(fmt->BytesPerUnit), 2); putrev(&(fmt->BitsPerSample), 2); format_size = nchunk; /* data chunk header */ putbytes("data", 4); fgetpos(fd, &data_pos); putbytes(&dummy, 4); nchunk = 0; } void wavclose(fd) FILE *fd; { file_size = nfile; data_size = nchunk; fsetpos(fd, &file_pos); putrev(&file_size, 4); fsetpos(fd, &format_pos); putrev(&format_size, 4); fsetpos(fd, &data_pos); putrev(&data_size, 4); fclose(fd); } void wavdata(fd, data, sz) FILE *fd; int data, sz; { if (sz == 1) { unsigned char b = data + 128; putbytes(&b, 1); } else if (sz == 2) { short s = data; putrev(&s, 2); } } void default_format(fmt) WAVFMT *fmt; { fmt->DataID = F_PCM; fmt->Channels = 1; fmt->SamplingRate = 44100; fmt->BytesPerSec = 44100*2; fmt->BytesPerUnit = 2; fmt->BitsPerSample = 16; }