From b66070c4e4fdba9c7bf67da4e0522243db09f9d5 Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 13 Aug 2019 10:19:39 -0300 Subject: [PATCH 1/7] lang: use std.mem.startsWith --- src/lang.zig | 2 +- src/main.zig | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lang.zig b/src/lang.zig index 1007cf8..2952525 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -332,7 +332,7 @@ pub const Lang = struct { stmt = std.mem.trimLeft(u8, stmt, "\n"); if (stmt.len == 0) continue; - if (stmt[0] == '#') continue; + if (std.mem.startsWith(u8, stmt, "#")) continue; // TODO better tokenizer instead of just tokenize(" "); var tok_it = std.mem.tokenize(stmt, " "); diff --git a/src/main.zig b/src/main.zig index 9296189..9d4480d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -21,9 +21,7 @@ pub fn main() !void { var args_it = std.process.args(); - const exe_name = try (args_it.next(allocator) orelse @panic("expected exe name")); - - // args[1] is the path to scri file + _ = try (args_it.next(allocator) orelse @panic("expected exe name")); const scri_path = try (args_it.next(allocator) orelse @panic("expected scri path")); var file = try std.fs.File.openRead(scri_path); From 0ad1c882747b3da6f05b4df47f243c072ab617ba Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 13 Aug 2019 10:33:08 -0300 Subject: [PATCH 2/7] free some things in runner --- src/runner.zig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/runner.zig b/src/runner.zig index f3d617c..625c1f1 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -115,6 +115,7 @@ pub const Runner = struct { "{}_g", basename[0..period_idx], ); + defer self.allocator.free(starts_with); var max: usize = 0; @@ -328,6 +329,8 @@ pub const Runner = struct { .Mbeq => blk: { const pos = try cmd.consumePosition(); const bands = try cmd.floatArgMany(self.allocator, 2, 15, f32(0)); + defer self.allocator.free(bands); + try self.mbeqCmd(pos, bands); }, From f8d8ed067de6e96710b8a199bc34684555f44910 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 14 Aug 2019 09:10:09 -0300 Subject: [PATCH 3/7] add deinit() calls to custom plugins --- src/custom.zig | 22 +++++++++++++++++----- src/image.zig | 1 + src/plugin.zig | 1 + 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/custom.zig b/src/custom.zig index 2fc5a09..1b8b3a6 100644 --- a/src/custom.zig +++ b/src/custom.zig @@ -9,7 +9,8 @@ const RunBuffers = plugins.RunBuffers; pub const RandomNoise = struct { r: std.rand.DefaultPrng, - rand_buf: ?[]f32, + rand_buf: ?[]f32 = null, + allocator: ?*std.mem.Allocator = null, cnt: usize = 0, pub fn init( @@ -30,16 +31,22 @@ pub const RandomNoise = struct { return RandomNoise{ .r = r, + .allocator = allocator, .rand_buf = rand_buf, }; } else { return RandomNoise{ .r = r, - .rand_buf = null, }; } } + pub fn deinit(self: *RandomNoise) void { + if (self.allocator == null) return; + if (self.rand_buf == null) return; + self.allocator.?.free(self.rand_buf.?); + } + pub fn run(self: *RandomNoise, bufs: *RunBuffers) void { if (self.rand_buf) |rand_buf| { if (self.cnt >= rand_buf.len) self.cnt = 0; @@ -53,7 +60,8 @@ pub const RandomNoise = struct { pub const WildNoise = struct { r: std.rand.DefaultPrng, - rand_buf: ?[]f32, + rand_buf: ?[]f32 = null, + allocator: ?*std.mem.Allocator = null, cnt: usize = 0, pub fn init( @@ -79,11 +87,16 @@ pub const WildNoise = struct { } else { return WildNoise{ .r = r, - .rand_buf = null, }; } } + pub fn deinit(self: *RandomNoise) void { + if (self.allocator == null) return; + if (self.rand_buf == null) return; + self.allocator.?.free(self.rand_buf.?); + } + pub fn run(self: *WildNoise, bufs: *RunBuffers) void { if (self.rand_buf) |rand_buf| { if (self.cnt >= rand_buf.len) self.cnt = 0; @@ -107,7 +120,6 @@ pub const Write = struct { params: *plugins.ParamMap, ) Write { const data = params.get("data").?; - return Write{ .data = data.value, }; diff --git a/src/image.zig b/src/image.zig index 1898f28..e42bca7 100644 --- a/src/image.zig +++ b/src/image.zig @@ -69,6 +69,7 @@ fn sf_tell(file: *c.SNDFILE) i64 { return -frames; } +/// Caller owns the returned memory. pub fn temporaryName(allocator: *std.mem.Allocator) ![]u8 { const template_start = "/temp/temp_"; const template = "/tmp/temp_XXXXXXXXXXX"; diff --git a/src/plugin.zig b/src/plugin.zig index c403eb7..1de854f 100644 --- a/src/plugin.zig +++ b/src/plugin.zig @@ -141,6 +141,7 @@ pub const RunContext = struct { pub fn makeContext(allocator: *std.mem.Allocator, plugin_uri: []const u8) !Context { const cstr_plugin_uri = try std.cstr.addNullByte(allocator, plugin_uri); + defer allocator.free(cstr_plugin_uri); var world: *c.LilvWorld = c.lilv_world_new().?; errdefer c.lilv_world_free(world); From e142285a32302f4c6c9092d0b24e033f9fb79170 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 14 Aug 2019 09:10:54 -0300 Subject: [PATCH 4/7] use Plugin.deinit() --- src/image.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/image.zig b/src/image.zig index e42bca7..0189882 100644 --- a/src/image.zig +++ b/src/image.zig @@ -376,6 +376,7 @@ pub const Image = struct { } var plugin = plugin_opt.?; + defer plugin.deinit(); // the code here is a copypaste of runPlugin() without the specific // lilv things. From a33db9f060567af4e83fe05703d70fb5bffab08a Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 14 Aug 2019 09:13:06 -0300 Subject: [PATCH 5/7] custom: add Write.deinit and fix WildNoise.deinit --- src/custom.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/custom.zig b/src/custom.zig index 1b8b3a6..3f57a4b 100644 --- a/src/custom.zig +++ b/src/custom.zig @@ -91,7 +91,7 @@ pub const WildNoise = struct { } } - pub fn deinit(self: *RandomNoise) void { + pub fn deinit(self: *WildNoise) void { if (self.allocator == null) return; if (self.rand_buf == null) return; self.allocator.?.free(self.rand_buf.?); @@ -125,6 +125,8 @@ pub const Write = struct { }; } + pub fn deinit(self: *Write) void {} + pub fn run(self: *Write, bufs: *RunBuffers) void { bufs.out[0] = self.data; } From 1d86abff5b30e9583802d1fbafa20d05ff0188d2 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 14 Aug 2019 16:11:09 -0300 Subject: [PATCH 6/7] main: use direct allocator --- src/main.zig | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main.zig b/src/main.zig index 9d4480d..156855e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -8,10 +8,7 @@ test "scritcher" { } pub fn main() !void { - var arena = std.heap.ArenaAllocator.init(std.heap.c_allocator); - defer arena.deinit(); - - const allocator = &arena.allocator; + const allocator = std.heap.direct_allocator; var lang = langs.Lang.init(allocator); defer lang.deinit(); From cfec45eb6cff229a356046e9c25866de57b12bd0 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 14 Aug 2019 22:35:22 -0300 Subject: [PATCH 7/7] make internal ports a slice of Port structs --- src/image.zig | 2 +- src/lv2_helpers.zig | 12 +++++------- src/plugin.zig | 5 +++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/image.zig b/src/image.zig index 0189882..16e682f 100644 --- a/src/image.zig +++ b/src/image.zig @@ -285,7 +285,7 @@ pub const Image = struct { idx, param.value, ); - ports[idx].value = param.value; + (&ports[idx]).value = param.value; } // now we need to generate a temporary file and put the output of diff --git a/src/lv2_helpers.zig b/src/lv2_helpers.zig index 50f99a1..d9a89f5 100644 --- a/src/lv2_helpers.zig +++ b/src/lv2_helpers.zig @@ -59,14 +59,14 @@ pub const Port = struct { /// Setup ports for a given plugin. Gives an array to pointers of Port structs. /// This setup is required so we link the plugin to the ports later on, and /// also link our buffers, and control values. -pub fn setupPorts(ctx: *plugin.Context) ![]*Port { +pub fn setupPorts(ctx: *plugin.Context) ![]Port { var world = ctx.world; const n_ports: u32 = c.lilv_plugin_get_num_ports(ctx.plugin); - var ports = try ctx.allocator.alloc(*Port, n_ports); + var ports = try ctx.allocator.alloc(Port, n_ports); - for (ports) |port_ptr, idx| { - var port = try ctx.allocator.create(Port); + for (ports) |_, idx| { + var port: *Port = &ports[idx]; port.* = Port{ .lilv_port = null, .ptype = .Control, @@ -75,8 +75,6 @@ pub fn setupPorts(ctx: *plugin.Context) ![]*Port { .is_input = false, .optional = false, }; - - ports[idx] = port; } var values: []f32 = try ctx.allocator.alloc(f32, n_ports); @@ -100,7 +98,7 @@ pub fn setupPorts(ctx: *plugin.Context) ![]*Port { var i: u32 = 0; while (i < n_ports) : (i += 1) { - var port: *Port = ports[i]; + var port: *Port = &ports[i]; const lport = c.lilv_plugin_get_port_by_index(ctx.plugin, i).?; diff --git a/src/plugin.zig b/src/plugin.zig index 1de854f..daf8023 100644 --- a/src/plugin.zig +++ b/src/plugin.zig @@ -112,15 +112,16 @@ pub const RunContext = struct { self.buffers.deinit(); } - pub fn connectPorts(self: *RunContext, ports: []*lv2.Port) void { + 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) |port, p_idx| { + for (ports) |_, p_idx| { var p = @intCast(u32, p_idx); + var port: *lv2.Port = &ports[p_idx]; switch (port.ptype) { .Control => lv2.lilv_instance_connect_port(self.instance, p, &port.value),