1
6
7
8
9
10
11
12
13
14
22
23
28
29
30
31
32
33
34
35
36
37
38
43
44
45
49
50
55
56
57
58
59
60
61
62
63
64
65
69
70
71
72
73
/* ... */
#pragma once
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ... */
typedef struct {
struct {
char chunk_id[4];
uint32_t chunk_size;
char chunk_format[4];
}{ ... } descriptor_chunk;
struct {
char subchunk_id[4];
uint32_t subchunk_size;
uint16_t audio_format;
uint16_t num_of_channels;
uint32_t sample_rate;
uint32_t byte_rate;
uint16_t block_align;
uint16_t bits_per_sample;
}{ ... } fmt_chunk;
struct {
char subchunk_id[4];
uint32_t subchunk_size;
int16_t data[0];
}{ ... } data_chunk;
}{ ... } wav_header_t;
/* ... */
#define WAV_HEADER_PCM_DEFAULT(wav_sample_size, wav_sample_bits, wav_sample_rate, wav_channel_num) { \
.descriptor_chunk = { \
.chunk_id = {'R', 'I', 'F', 'F'}, \
.chunk_size = (wav_sample_size) + sizeof(wav_header_t) - 8, \
.chunk_format = {'W', 'A', 'V', 'E'} \
}{...}, \
.fmt_chunk = { \
.subchunk_id = {'f', 'm', 't', ' '}, \
.subchunk_size = 16, \
.audio_format = 1, \
.num_of_channels = (wav_channel_num), \
.sample_rate = (wav_sample_rate), \
.byte_rate = (wav_sample_bits) * (wav_sample_rate) * (wav_channel_num) / 8, \
.block_align = (wav_sample_bits) * (wav_channel_num) / 8, \
.bits_per_sample = (wav_sample_bits)\
}{...}, \
.data_chunk = { \
.subchunk_id = {'d', 'a', 't', 'a'}, \
.subchunk_size = (wav_sample_size) \
}{...} \
}{...}
#ifdef __cplusplus
}{...}
#endif