diff options
author | alaric <alaric@netmythos.org> | 2024-04-19 14:36:45 -0700 |
---|---|---|
committer | alaric <alaric@netmythos.org> | 2024-04-19 14:36:45 -0700 |
commit | 02525ad89c7012b4ed875f38d69142b001b6f034 (patch) | |
tree | 29a2ba730beb95a3d1d21ce6651d7c6cfa3ad11b | |
parent | 20ebeac9a56c70ffa57356ce8403caf101ee4ba8 (diff) | |
download | engine-audio.tar.gz engine-audio.zip |
fix: audio thread now uses a separate stack from the main threadaudio
-rw-r--r-- | src/wasm.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/wasm.zig b/src/wasm.zig index 92d8c36..98b1fff 100644 --- a/src/wasm.zig +++ b/src/wasm.zig @@ -76,12 +76,18 @@ fn dummyAudioCallback(_: *const AudioInfo) void {} const AudioCallbackFn = fn (*const AudioInfo) void; const audioCallback: AudioCallbackFn = if (@hasDecl(root, "audioCallback")) root.audioCallback else dummyAudioCallback; +const stack_size = 16 * 1024 * 1024; +const stack_offset = std.mem.alignForward(usize, std.wasm.page_size, 16); + const max_channels = 8; const max_samples_per_call = 256; var samples: [max_samples_per_call]f32 = [1]f32{0} ** max_samples_per_call; var info: AudioInfo = undefined; var write_slices: [max_channels][]f32 = undefined; export fn getAudioSamples(sample_rate: u32, channels: u32, samples_per_channel: u32) *const [*]f32 { + const og_pointer = getStackPointer(); + const fwd = og_pointer + stack_offset; + setStackPointer(fwd); engine.assert(channels <= max_channels); engine.assert(channels * samples_per_channel <= max_samples_per_call); @@ -98,3 +104,20 @@ export fn getAudioSamples(sample_rate: u32, channels: u32, samples_per_channel: return @ptrCast(&samples); } + +inline fn getStackPointer() [*]u8 { + return asm ( + \\ global.get __stack_pointer + \\local.set %[stack_ptr] + : [stack_ptr] "=r" (-> [*]u8), + ); +} + +inline fn setStackPointer(addr: [*]u8) void { + asm volatile ( + \\ local.get %[ptr] + \\ global.set __stack_pointer + : + : [ptr] "r" (addr), + ); +} |