aboutsummaryrefslogtreecommitdiffstats
path: root/src/wavfile.c
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2016-09-02 17:43:32 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2016-09-07 21:20:24 +0200
commit4809f3c042a99a639542b1e6cd22657871113260 (patch)
treedc0ec0f256eaceb79d63daa09591d4a6ef08cb73 /src/wavfile.c
parent5542c8ecff635f9abc05b6b2ff255db02c2c9c46 (diff)
downloadetisnoop-4809f3c042a99a639542b1e6cd22657871113260.tar.gz
etisnoop-4809f3c042a99a639542b1e6cd22657871113260.tar.bz2
etisnoop-4809f3c042a99a639542b1e6cd22657871113260.zip
Move all sources to src/
Diffstat (limited to 'src/wavfile.c')
-rw-r--r--src/wavfile.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/wavfile.c b/src/wavfile.c
new file mode 100644
index 0000000..9ea231b
--- /dev/null
+++ b/src/wavfile.c
@@ -0,0 +1,82 @@
+/*
+A simple sound library for CSE 20211 by Douglas Thain
+For course assignments, you should not change this file.
+For complete documentation, see:
+http://www.nd.edu/~dthain/courses/cse20211/fall2013/wavfile
+*/
+
+#include "wavfile.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct wavfile_header {
+ char riff_tag[4];
+ int riff_length;
+ char wave_tag[4];
+ char fmt_tag[4];
+ int fmt_length;
+ short audio_format;
+ short num_channels;
+ int sample_rate;
+ int byte_rate;
+ short block_align;
+ short bits_per_sample;
+ char data_tag[4];
+ int data_length;
+};
+
+FILE * wavfile_open( const char *filename, int rate )
+{
+ struct wavfile_header header;
+
+ int samples_per_second = rate;
+ int bits_per_sample = 16;
+
+ strncpy(header.riff_tag,"RIFF",4);
+ strncpy(header.wave_tag,"WAVE",4);
+ strncpy(header.fmt_tag,"fmt ",4);
+ strncpy(header.data_tag,"data",4);
+
+ header.riff_length = 0;
+ header.fmt_length = 16;
+ header.audio_format = 1;
+ header.num_channels = 2;
+ header.sample_rate = samples_per_second;
+ header.byte_rate = samples_per_second*(bits_per_sample/8);
+ header.block_align = bits_per_sample/8;
+ header.bits_per_sample = bits_per_sample;
+ header.data_length = 0;
+
+ FILE * file = fopen(filename,"w+");
+ if(!file) return 0;
+
+ fwrite(&header,sizeof(header),1,file);
+
+ fflush(file);
+
+ return file;
+
+}
+
+void wavfile_write( FILE *file, short data[], int length )
+{
+ fwrite(data,sizeof(short),length,file);
+}
+
+void wavfile_close( FILE *file )
+{
+ int file_length = ftell(file);
+
+ int data_length = file_length - sizeof(struct wavfile_header);
+ fseek(file,sizeof(struct wavfile_header) - sizeof(int),SEEK_SET);
+ fwrite(&data_length,sizeof(data_length),1,file);
+
+ int riff_length = file_length - 8;
+ fseek(file,4,SEEK_SET);
+ fwrite(&riff_length,sizeof(riff_length),1,file);
+
+ fclose(file);
+}
+