main wave.c
 1/*
 2 Copyright 2013 Michael Pavone
 3 This file is part of BlastEm.
 4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
 5*/
 6#include "wave.h"
 7#include <stddef.h>
 8#include <string.h>
 9
10int wave_init(FILE * f, uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels)
11{
12	wave_header header;
13	memcpy(header.chunk.id, "RIFF", 4);
14	memcpy(header.chunk.format, "WAVE", 4);
15	header.chunk.size = 0; //This will be filled in later
16	memcpy(header.format_header.id, "fmt ", 4);
17	header.format_header.size = sizeof(wave_header) - (sizeof(header.chunk) + sizeof(header.data_header) + sizeof(header.format_header));
18	header.audio_format = 1;
19	header.num_channels = num_channels;
20	header.sample_rate = sample_rate;
21	header.byte_rate = sample_rate * num_channels * (bits_per_sample/8);
22	header.block_align = num_channels * (bits_per_sample/8);
23	header.bits_per_sample = bits_per_sample;
24	memcpy(header.data_header.id, "data", 4);
25	header.data_header.size = 0;//This will be filled in later;
26	return fwrite(&header, 1, sizeof(header), f) == sizeof(header);
27}
28
29int wave_finalize(FILE * f)
30{
31	uint32_t size = ftell(f);
32	fseek(f, offsetof(wave_header, chunk.size), SEEK_SET);
33	size -= 8;
34	if (fwrite(&size, sizeof(size), 1, f) != 1) {
35		fclose(f);
36		return 0;
37	}
38	fseek(f, offsetof(wave_header, data_header.size), SEEK_SET);
39	size -= 36;
40	if (fwrite(&size, sizeof(size), 1, f) != 1) {
41		fclose(f);
42		return 0;
43	}
44	fclose(f);
45	return 1;
46}