From 519eb51206036098d8e63e62735b003efccaa0a5 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 25 Jan 2020 22:46:00 -0300 Subject: [PATCH] remove heap allocation for RunBuffers --- src/image.zig | 27 ++++++++++++++++----------- src/plugin.zig | 46 ++++++++++++++++------------------------------ 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/image.zig b/src/image.zig index ad48f61..9541070 100644 --- a/src/image.zig +++ b/src/image.zig @@ -370,18 +370,25 @@ pub const Image = struct { var i: usize = seek_pos.start; std.debug.warn("\tseek pos start: {} end: {}\n", .{ seek_pos.start, seek_pos.end }); - var inbuf = rctx.buffers.in; - var outbuf = rctx.buffers.out; + var inbuf = &rctx.buffers.in; + var outbuf = &rctx.buffers.out; while (i <= seek_pos.end) : (i += 1) { - const read_bytes = c.sf_readf_float(self.sndfile, inbuf.ptr, 1); + inbuf[0] = 0; + inbuf[1] = 0; + + const read_bytes = c.sf_readf_float(self.sndfile, inbuf, 1); if (read_bytes == 0) { std.debug.warn("WARN! reached EOF at idx={}\n", .{i}); break; } + // trick plugins into having correct stereo signal from + // my mono input + inbuf[1] = inbuf[0]; + lv2.lilv_instance_run(rctx.instance, 1); - try swrite(out_file, outbuf.ptr, 1); + try swrite(out_file, outbuf, 1); } sseek(self.sndfile, seek_pos.end); @@ -439,9 +446,7 @@ pub const Image = struct { var out_fmt = mkSfInfo(); var out_file = try sopen(self.allocator, tmpnam, c.SFM_WRITE, &out_fmt); - var bufs = try plugins.RunBuffers.init(self.allocator); - defer bufs.deinit(); - + var bufs = plugins.RunBuffers{}; const seek_pos = self.getSeekPos(position); // make sure we start from 0 @@ -465,18 +470,18 @@ pub const Image = struct { var i: usize = seek_pos.start; std.debug.warn("\tseek pos start: {} end: {}\n", .{ seek_pos.start, seek_pos.end }); - var inbuf = bufs.in; - var outbuf = bufs.out; + var inbuf = &bufs.in; + var outbuf = &bufs.out; while (i <= seek_pos.end) : (i += 1) { - const read_bytes = c.sf_readf_float(self.sndfile, bufs.in.ptr, 1); + const read_bytes = c.sf_readf_float(self.sndfile, inbuf, 1); if (read_bytes == 0) { std.debug.warn("WARN! reached EOF at idx={}\n", .{i}); break; } plugin.run(&bufs); - try swrite(out_file, bufs.out.ptr, 1); + try swrite(out_file, outbuf, 1); } sseek(self.sndfile, seek_pos.end); diff --git a/src/plugin.zig b/src/plugin.zig index 6c98336..b979833 100644 --- a/src/plugin.zig +++ b/src/plugin.zig @@ -61,29 +61,11 @@ pub const Context = struct { /// Specific run context for non-plugins. pub const RunBuffers = struct { - allocator: *std.mem.Allocator, - - in: []f32, - out: []f32, - - pub fn init(allocator: *std.mem.Allocator) !RunBuffers { - // we allocate []f32 with size 2 to account for stereo plugins, however - // we only use &in_buf[0] and &out_buf[0], and don't use the - // (supposedly) right side of neither input or output. - var in_buf = try allocator.alloc(f32, 2); - std.mem.secureZero(f32, in_buf); - - return RunBuffers{ - .allocator = allocator, - .in = in_buf, - .out = try allocator.alloc(f32, 2), - }; - } - - pub fn deinit(self: *RunBuffers) void { - self.allocator.free(self.in); - self.allocator.free(self.out); - } + // we use [2]f32 to account for stereo plugins, however + // we only use in_buf[0] and out_buf[0], and don't use the + // (supposedly) right side of neither input or output. + in: [2]f32 = [_]f32{0} ** 2, + out: [2]f32 = [_]f32{0} ** 2, }; /// Represents the specific run context of plugin instantation. @@ -103,23 +85,19 @@ pub const RunContext = struct { } return RunContext{ - .buffers = try RunBuffers.init(allocator), + .buffers = RunBuffers{}, .instance = instance.?, }; } pub fn deinit(self: *RunContext) void { c.lilv_instance_free(self.instance); - self.buffers.deinit(); } pub fn connectPorts(self: *RunContext, ports: []lv2.Port) void { var i: usize = 0; var o: usize = 0; - var in_buf = self.buffers.in; - var out_buf = self.buffers.out; - for (ports) |_, p_idx| { var p = @intCast(u32, p_idx); var port: *lv2.Port = &ports[p_idx]; @@ -128,10 +106,18 @@ pub const RunContext = struct { .Control => lv2.lilv_instance_connect_port(self.instance, p, &port.value), .Audio => blk: { if (port.is_input) { - lv2.lilv_instance_connect_port(self.instance, p, &in_buf[i]); + lv2.lilv_instance_connect_port( + self.instance, + p, + &self.buffers.in[i], + ); i += 1; } else { - lv2.lilv_instance_connect_port(self.instance, p, &out_buf[o]); + lv2.lilv_instance_connect_port( + self.instance, + p, + &self.buffers.out[o], + ); o += 1; } },