From 9b0b3d9d19f5adbf73423f9146974bf9213624d5 Mon Sep 17 00:00:00 2001 From: steven-na Date: Fri, 31 Jul 2026 20:40:49 -0700 Subject: Wav funcs mostly complete --- src/wav.c | 38 ++++++++++++++++++++------------------ src/wav.h | 8 +++++--- 2 files changed, 25 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/wav.c b/src/wav.c index 665998d..9698001 100644 --- a/src/wav.c +++ b/src/wav.c @@ -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; } diff --git a/src/wav.h b/src/wav.h index 773cc2a..7e3c861 100644 --- a/src/wav.h +++ b/src/wav.h @@ -3,6 +3,8 @@ #include "common.h" #include "smrt_arena.h" +#include + #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); -- cgit v1.2.3