summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsteven-na <noreply.github@stvnc.dev>2026-07-31 20:40:49 -0700
committersteven-na <noreply.github@stvnc.dev>2026-07-31 20:40:49 -0700
commit9b0b3d9d19f5adbf73423f9146974bf9213624d5 (patch)
tree34740bbb10bc49c4cb739a7dc74fb3333ae6e3bf /src
parent90cc196e4d2c263ee2898162eddc691aac672d7f (diff)
Wav funcs mostly complete
Diffstat (limited to 'src')
-rw-r--r--src/wav.c38
-rw-r--r--src/wav.h8
2 files changed, 25 insertions, 21 deletions
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 <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);