1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#pragma once
#include "common.h"
#include "smrt_arena.h"
#include <stdio.h>
#define WAV_DATA_BASE_POS sizeof(wav_data_t)
typedef struct {
u64 sample_count;
u8 *samples;
} wav_data_t;
// [Master RIFF chunk]
// FileTypeBlocID (4 bytes) : Identifier « RIFF » (0x52, 0x49, 0x46, 0x46)
// FileSize (4 bytes) : Overall file size minus 8 bytes
// FileFormatID (4 bytes) : Format = « WAVE » (0x57, 0x41, 0x56, 0x45)
#pragma pack(push, 1)
typedef struct {
u8 chunk_id[4];
u32 file_size;
u8 file_format_id[4];
} wav_master_chunk_t;
// [Chunk describing the data format]
// FormatBlocID (4 bytes) : Identifier « fmt␣ » (0x66, 0x6D, 0x74, 0x20)
// BlocSize (4 bytes) : Chunk size minus 8 bytes
// AudioFormat (2 bytes) : Audio format (1: PCM integer, 3: IEEE 754 float)
// NbrChannels (2 bytes) : Number of channels
// Frequency (4 bytes) : Sample rate (in hertz)
// BytePerSec (4 bytes) : Number of bytes to read per second (Frequency * BytePerBloc).
// BytePerBloc (2 bytes) : Number of bytes per block (NbrChannels * BitsPerSample / 8).
// BitsPerSample (2 bytes) : Number of bits per sample
typedef struct {
u8 chunk_id[4];
u32 chunk_size;
u16 audio_format;
u16 num_channels;
u32 sample_rate;
u32 bytes_per_sec;
u16 bytes_per_block;
u16 bits_per_sample;
} wav_fmt_chunk_t;
#pragma pack(pop)
wav_data_t load_wav_file(smrt_arena_t *arena, FILE *wav_file, wav_master_chunk_t *master_o, wav_fmt_chunk_t *format_o);
b32 write_wav_file(FILE *wav_file, wav_fmt_chunk_t *fmt_chunk_i, wav_data_t data_i);
wav_fmt_chunk_t make_wav_fmt_chunk(u32 num_channels, u32 sample_rate, u16 bits_per_sample);
|