aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralaric <alaric@netmythos.org>2024-04-19 14:36:45 -0700
committeralaric <alaric@netmythos.org>2024-04-19 14:36:45 -0700
commit02525ad89c7012b4ed875f38d69142b001b6f034 (patch)
tree29a2ba730beb95a3d1d21ce6651d7c6cfa3ad11b
parent20ebeac9a56c70ffa57356ce8403caf101ee4ba8 (diff)
downloadengine-audio.tar.gz
engine-audio.zip
fix: audio thread now uses a separate stack from the main threadaudio
-rw-r--r--src/wasm.zig23
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),
+ );
+}