diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/wav.c | 38 | ||||
| -rw-r--r-- | src/wav.h | 8 |
2 files changed, 25 insertions, 21 deletions
@@ -7,7 +7,7 @@ b32 seek_to_chunk(FILE *file, char const *chunk_name) { char cur_name[4]; - u32 chunk_size; + u32 chunk_size; fseek(file, 0, SEEK_END); const i64 max_pos = ftell(file); @@ -29,11 +29,9 @@ b32 seek_to_chunk(FILE *file, char const *chunk_name) { return true; } -wav_data_t load_wav_file(smrt_arena_t *arena, char *filename, wav_master_chunk_t *master_o, wav_fmt_chunk_t *format_o) { +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) { wav_data_t data = { 0 }; - FILE *wav_file = fopen(filename, "rb"); - if (!wav_file) return data; fread(master_o, sizeof(wav_master_chunk_t), 1, wav_file); @@ -41,6 +39,11 @@ wav_data_t load_wav_file(smrt_arena_t *arena, char *filename, wav_master_chunk_t if (seek_to_chunk(wav_file, "fmt ") == false) return data; fread(format_o, sizeof(wav_fmt_chunk_t), 1, wav_file); + if (format_o->audio_format != 1) { + perror("Attempted to read non pcm integer wave file."); + return data; + } + if (seek_to_chunk(wav_file, "data") == false) return data; fseek(wav_file, 4, SEEK_CUR); @@ -56,39 +59,38 @@ wav_data_t load_wav_file(smrt_arena_t *arena, char *filename, wav_master_chunk_t return data; } -b32 write_wav_file(char *filename, wav_fmt_chunk_t *fmt_chunk_i, wav_data_t data_i) { - FILE *wav_file = fopen(filename, "wb"); - +b32 write_wav_file(FILE *wav_file, wav_fmt_chunk_t *fmt_chunk_i, wav_data_t data_i) { if (!wav_file) return false; - u64 data_size_bytes = data_i.sample_count * fmt_chunk_i->bytes_per_block; + u32 data_size_bytes = data_i.sample_count * fmt_chunk_i->bytes_per_block; - wav_master_chunk_t mchunk = { - .file_size = sizeof(wav_master_chunk_t) + sizeof(wav_fmt_chunk_t) + sizeof(wav_data_t) + data_size_bytes + wav_master_chunk_t mchunk = { // MASTER + FMT + "data" + sizeof(data_size_bytes) + data_size_bytes (-8 bytes) + .file_size = sizeof(wav_master_chunk_t) + sizeof(wav_fmt_chunk_t) + data_size_bytes }; - memcpy(&mchunk.chunk_id, "RIFF", 4); memcpy(&mchunk.file_format_id, "WAVE", 4); fwrite(&mchunk, sizeof(wav_master_chunk_t), 1, wav_file); - fwrite(fmt_chunk_i, sizeof(wav_data_t), 1, wav_file); + fwrite(fmt_chunk_i, sizeof(wav_fmt_chunk_t), 1, wav_file); + + fwrite("data", 4, 1, wav_file); + fwrite(&data_size_bytes, 4, 1, wav_file); fwrite(data_i.samples, sizeof(u8), data_size_bytes, wav_file); return true; } -wav_fmt_chunk_t make_wav_fmt_chunk(u32 num_channels, u32 sample_rate, u16 bits_per_sample, wav_data_t data_i) { - u64 data_size_bytes = data_i.sample_count * (num_channels * (bits_per_sample / 8)); +wav_fmt_chunk_t make_wav_fmt_chunk(u32 num_channels, u32 sample_rate, u16 bits_per_sample) { wav_fmt_chunk_t o = { - .chunk_size = sizeof(wav_fmt_chunk_t) + data_size_bytes - 8, .bits_per_sample = bits_per_sample, .num_channels = num_channels, .sample_rate = sample_rate, - .bytes_per_block = num_channels * (bits_per_sample / 8), .audio_format = 1, + .bytes_per_block = num_channels * (bits_per_sample / 8), + .chunk_size = sizeof(wav_fmt_chunk_t) - 8, }; - o.bytes_per_sec = o.bytes_per_block * sample_rate; - memcpy(&o.chunk_id, "data", 4); + o.bytes_per_sec = (u32)o.bytes_per_block * sample_rate; + memcpy(&o.chunk_id, "fmt ", 4); return o; } @@ -3,6 +3,8 @@ #include "common.h" #include "smrt_arena.h" +#include <stdio.h> + #define WAV_DATA_BASE_POS sizeof(wav_data_t) typedef struct { @@ -42,6 +44,6 @@ typedef struct { } wav_fmt_chunk_t; #pragma pack(pop) - wav_data_t load_wav_file(smrt_arena_t *arena, char *filename, wav_master_chunk_t *master_o, wav_fmt_chunk_t *format_o); - b32 write_wav_file(char *filename, 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, wav_data_t data_i); + 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); |