/* Tickler Code related to file operations. */ #include /* FILE, fopen(), fclose() */ /* printf(), fprintf() */ /* scanf(), fscanf() */ #include /* EXIT_SUCCESS, EXIT_FAILURE, exit() */ #include /* INT_MAX */ #include /* sin() */ #define FALSE (0) #define TRUE (!FALSE) #define READ (0) #define WRITE (1) #define TEXT (0) #define BINARY (1) #define PI (3.141592654) #define FREQUENCY (1000.0) #define SAMPLESperSEC (44200.0) #define SAMPLES (1024) FILE *OpenFile(char *filename, int mode, int type) { char modestr[3]; switch (mode) { case READ : modestr[0] = 'r'; break; case WRITE: modestr[0] = 'w'; break; } switch (type) { case TEXT : modestr[1] = 't'; break; case BINARY: modestr[1] = 'b'; break; } modestr[2] = '\0'; return fopen(filename, modestr); } int main(void) { FILE *fp; char *filename; double freq_Hz; int v; double time, value; long int sample; long int RiffMarker, DataMarker, EndMarker; long int v_long; int v_int; filename = "sine1000.wav"; if (NULL == (fp = OpenFile(filename, WRITE, BINARY))) { printf("Failed to open file <%s>\n"); exit(EXIT_FAILURE); } /* RIFF HEADER */ fwrite("RIFF", 4, 1, fp); fwrite("Size", 4, 1, fp); /* Will update with value later */ RiffMarker = ftell(fp); fwrite("WAVE", 4, 1, fp); /* FORMAT CHUNK */ fwrite("fmt ", 4, 1, fp); v_long = 16; fwrite(&v_long, 4, 1, fp); /* SubChunkSize (16 for PCM) */ v_int = 1; fwrite(&v_int, 2, 1, fp); /* 1 = PMC (no compression) */ v_int = 1; fwrite(&v_int, 2, 1, fp); /* Number of Channels */ v_long = 44100L; fwrite(&v_long, 4, 1, fp); /* Sample Rate */ v_long = 88200L; fwrite(&v_long, 4, 1, fp); /* ByteRate */ v_int = 2; fwrite(&v_int, 2, 1, fp); /* Block Alignment */ v_int = 16; fwrite(&v_int, 2, 1, fp); /* Bits Per Sample */ /* DATA CHUNK */ fwrite("data", 4, 1, fp); fwrite("Size", 4, 1, fp); /* Will update with value later */ DataMarker = ftell(fp); /* WRITING SINUSOID TO TEXT FILE */ freq_Hz = FREQUENCY; for (sample = 0; sample < SAMPLES; sample++) { time = (double) sample / SAMPLESperSEC; value = sin(2.0*PI*freq_Hz*time); v = INT_MAX * value; fwrite(&v, 2, 1, fp); } EndMarker = ftell(fp); fseek(fp, RiffMarker-4, SEEK_SET); v_long = EndMarker - RiffMarker; fwrite(&v_long, 4, 1, fp); /* ByteRate */ fseek(fp, DataMarker-4, SEEK_SET); v_long = EndMarker - DataMarker; fwrite(&v_long, 4, 1, fp); /* ByteRate */ fclose(fp); return EXIT_SUCCESS; }