From c1bba2ee48baed91af11846fe91f8eeaa736431e Mon Sep 17 00:00:00 2001 From: Katajisto Date: Tue, 29 Sep 2026 21:00:52 +0300 Subject: [PATCH] Add ogg_vorbis loading from packs --- src/assets/asset_manager.jai | 3 +++ src/assets/loaders.jai | 23 +++++++++++++++++++++++ src/entities.jai | 1 + 3 files changed, 27 insertions(+) diff --git a/src/assets/asset_manager.jai b/src/assets/asset_manager.jai index f7e8bb6..e559717 100644 --- a/src/assets/asset_manager.jai +++ b/src/assets/asset_manager.jai @@ -306,6 +306,9 @@ add_resources_from_pack :: (pack: *Loaded_Pack) { case "wav"; audio := load_wav_from_memory(v.data); table_set(*pack.audio, name, audio); + case "ogg"; + audio := load_ogg_from_memory(v.data); + table_set(*pack.audio, name, audio); case "json"; if name == "particles" { s := create_string_from_memory(v.data); diff --git a/src/assets/loaders.jai b/src/assets/loaders.jai index 9743e0d..10a2c5d 100644 --- a/src/assets/loaders.jai +++ b/src/assets/loaders.jai @@ -64,6 +64,29 @@ load_hex_palette_from_memory :: (data: []u8) -> [..]Palette_Entry { return entries; } +// Decoded in full up front, so the mixer sees the same float samples as from a wav; +// only the pack stays small. +load_ogg_from_memory :: (data: []u8) -> Audio_Data { + Vorbis :: #import "stb_vorbis"; + audio : Audio_Data; + error : s32; + v := Vorbis.stb_vorbis_open_memory(data.data, cast(s32) data.count, *error, null); + if !v { + log_error("Failed to load ogg file! (stb_vorbis error %)", error); + return audio; + } + defer Vorbis.stb_vorbis_close(v); + + info := Vorbis.stb_vorbis_get_info(v); + frames := cast(s64) Vorbis.stb_vorbis_stream_length_in_samples(v); + array_resize(*audio.data, frames * info.channels); + got := Vorbis.stb_vorbis_get_samples_float_interleaved(v, info.channels, audio.data.data, cast(s32) audio.data.count); + audio.data.count = got * info.channels; + audio.channels = cast(s16) info.channels; + audio.sample_rate = cast(s32) info.sample_rate; + return audio; +} + load_wav_from_memory :: (data: []u8) -> Audio_Data { Wav :: #import "Wav_File"; audio : Audio_Data; diff --git a/src/entities.jai b/src/entities.jai index 006e3b6..f5a9a8e 100644 --- a/src/entities.jai +++ b/src/entities.jai @@ -302,6 +302,7 @@ entity_saved_members :: (type: Type) -> []Type_Info_Struct_Member { result.allocator = temp; for (cast(*Type_Info_Struct) type).members { if it.flags & (.CONSTANT | .USING) continue; + if array_find(it.notes, "NoSave") continue; array_add(*result, it); } return result;