summaryrefslogtreecommitdiff
path: root/src/wav.h
blob: 7e3c8612ed56157e9ab69c15019a8ca03675ae2d (plain)
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);