Skip to content

Commit de09ca4

Browse files
committed
move state serialization to core
1 parent 23cc761 commit de09ca4

File tree

7 files changed

+90
-83
lines changed

7 files changed

+90
-83
lines changed

src/clap/build.zig

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,13 @@ pub fn build(b: *std.Build) !void {
1717
.optimize = optimize,
1818
});
1919

20-
const msgpack = b.dependency("msgpack", .{
21-
.target = target,
22-
.optimize = optimize,
23-
});
24-
2520
const module = b.addModule("clap", .{
2621
.target = target,
2722
.optimize = optimize,
2823
.root_source_file = b.path("root.zig"),
2924
.imports = &.{
3025
.{ .name = "zigplug", .module = root.module("zigplug") },
3126
.{ .name = "clap_c", .module = clap_c.createModule() },
32-
.{ .name = "msgpack", .module = msgpack.module("msgpack") },
3327
},
3428
});
3529

src/clap/build.zig.zon

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
.url = "https://github.com/free-audio/clap/archive/refs/tags/1.2.6.tar.gz",
1111
.hash = "N-V-__8AABAqOwDxKlwerqbiBlg183KUY751DdoGwZ9N-ZuE",
1212
},
13-
.msgpack = .{
14-
.url = "https://github.com/zigcc/zig-msgpack/archive/refs/tags/0.0.16.tar.gz",
15-
.hash = "zig_msgpack-0.0.14-evvueHImBQA5zzdD7c4Sl9yJ4JECWb4JaWgvbInsk7Zt",
16-
},
1713
},
1814

1915
.paths = .{"."},

src/clap/extensions/state.zig

Lines changed: 4 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
const c = @import("clap_c");
22
const clap = @import("clap");
3-
const msgpack = @import("msgpack");
43

54
const std = @import("std");
65
const log = std.log.scoped(.zigplug_clap_state);
@@ -76,82 +75,19 @@ pub fn extension(comptime _: type) *const c.clap_plugin_state {
7675
pub fn save(clap_plugin: [*c]const c.clap_plugin, stream: [*c]const c.clap_ostream) callconv(.c) bool {
7776
const data = clap.Data.fromClap(clap_plugin);
7877

79-
var clap_writer = Writer.init(stream);
80-
const writer = &clap_writer.writer;
81-
82-
var reader = std.Io.Reader.failing;
83-
var packer = msgpack.packIO(&reader, writer);
84-
85-
var map = msgpack.Payload.mapPayload(data.plugin.allocator);
86-
defer map.free(data.plugin.allocator);
87-
88-
for (data.plugin.parameters.?.slice) |parameter| {
89-
const id = switch (parameter.*) {
90-
inline else => |*p| p.options.id.?,
91-
};
92-
93-
map.mapPut(id, switch (parameter.*) {
94-
.bool => |p| .boolToPayload(p.get()),
95-
.float => |p| .floatToPayload(p.get()),
96-
.int => |p| .intToPayload(p.get()),
97-
.uint => |p| .uintToPayload(p.get()),
98-
}) catch {
99-
switch (parameter.*) {
100-
inline else => |p| {
101-
log.err("failed to save parameter '{s}' = {any}", .{ p.options.name, p.get() });
102-
return false;
103-
},
104-
}
105-
};
106-
107-
switch (parameter.*) {
108-
inline else => |p| log.debug("saved parameter '{s}' = {any}", .{ id, p.get() }),
109-
}
110-
}
111-
112-
packer.write(map) catch |e| {
78+
var writer = Writer.init(stream);
79+
data.plugin.parameters.?.serialize(&writer.writer) catch |e|
11380
log.err("failed to save parameters: {}", .{e});
114-
return false;
115-
};
11681

11782
return true;
11883
}
11984

12085
pub fn load(clap_plugin: [*c]const c.clap_plugin, stream: [*c]const c.clap_istream) callconv(.c) bool {
12186
const data = clap.Data.fromClap(clap_plugin);
122-
var clap_reader = Reader.init(stream);
123-
const reader = &clap_reader.reader;
124-
125-
var writer = std.Io.Writer.failing;
126-
var packer = msgpack.packIO(reader, &writer);
12787

128-
const decoded = packer.read(data.plugin.allocator) catch |e| {
88+
var reader = Reader.init(stream);
89+
data.plugin.parameters.?.deserialize(&reader.reader) catch |e|
12990
log.err("failed to read parameters: {}", .{e});
130-
return false;
131-
};
132-
defer decoded.free(data.plugin.allocator);
133-
134-
for (data.plugin.parameters.?.slice) |parameter| {
135-
const id = switch (parameter.*) {
136-
inline else => |*p| p.options.id.?,
137-
};
138-
139-
if (decoded.mapGet(id) catch |e| {
140-
log.err("failed to read parameter '{s}': {}", .{ id, e });
141-
return false;
142-
}) |value| {
143-
switch (parameter.*) {
144-
.bool => |*p| p.set(value.bool),
145-
.float => |*p| p.set(value.float),
146-
.int => |*p| p.set(value.int),
147-
.uint => |*p| p.set(value.uint),
148-
}
149-
}
150-
151-
switch (parameter.*) {
152-
inline else => |p| log.debug("read parameter '{s}' = {any}", .{ id, p.get() }),
153-
}
154-
}
15591

15692
return true;
15793
}

src/core/build.zig

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ pub fn build(b: *std.Build) !void {
88
.root_source_file = b.path("root.zig"),
99
.target = target,
1010
.optimize = optimize,
11-
.imports = &.{},
11+
.imports = &.{.{
12+
.name = "msgpack",
13+
.module = b.dependency("msgpack", .{
14+
.target = target,
15+
.optimize = optimize,
16+
}).module("msgpack"),
17+
}},
1218
});
1319

1420
const test_step = b.step("test", "Run unit tests");

src/core/build.zig.zon

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.{
2+
.name = .zigplug_core,
3+
.fingerprint = 0x81c6ac4865198e28,
4+
.version = "0.0.0",
5+
.minimum_zig_version = "0.15.1",
6+
7+
.dependencies = .{
8+
.msgpack = .{
9+
.url = "https://github.com/zigcc/zig-msgpack/archive/refs/tags/0.0.16.tar.gz",
10+
.hash = "zig_msgpack-0.0.14-evvueHImBQA5zzdD7c4Sl9yJ4JECWb4JaWgvbInsk7Zt",
11+
},
12+
},
13+
14+
.paths = .{""},
15+
}

src/core/parameters.zig

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,67 @@
11
const zigplug = @import("root.zig");
22

33
const std = @import("std");
4+
const msgpack = @import("msgpack");
5+
6+
pub const State = struct {
7+
context: *anyopaque,
8+
slice: []*Parameter,
9+
allocator: std.mem.Allocator,
10+
11+
pub fn serialize(self: *const State, writer: *std.Io.Writer) !void {
12+
var reader = std.Io.Reader.failing;
13+
var packer = msgpack.packIO(&reader, writer);
14+
15+
var map = msgpack.Payload.mapPayload(self.allocator);
16+
defer map.free(self.allocator);
17+
18+
for (self.slice) |parameter| {
19+
const id = switch (parameter.*) {
20+
inline else => |*p| p.options.id.?,
21+
};
22+
23+
try map.mapPut(id, switch (parameter.*) {
24+
.bool => |p| .boolToPayload(p.get()),
25+
.float => |p| .floatToPayload(p.get()),
26+
.int => |p| .intToPayload(p.get()),
27+
.uint => |p| .uintToPayload(p.get()),
28+
});
29+
30+
switch (parameter.*) {
31+
inline else => |p| zigplug.log.debug("saved parameter '{s}' = {any}", .{ id, p.get() }),
32+
}
33+
}
34+
35+
try packer.write(map);
36+
}
37+
38+
pub fn deserialize(self: *State, reader: *std.Io.Reader) !void {
39+
var writer = std.Io.Writer.failing;
40+
var packer = msgpack.packIO(reader, &writer);
41+
42+
const decoded = try packer.read(self.allocator);
43+
defer decoded.free(self.allocator);
44+
45+
for (self.slice) |parameter| {
46+
const id = switch (parameter.*) {
47+
inline else => |*p| p.options.id.?,
48+
};
49+
50+
if (try decoded.mapGet(id)) |value| {
51+
switch (parameter.*) {
52+
.bool => |*p| p.set(value.bool),
53+
.float => |*p| p.set(value.float),
54+
.int => |*p| p.set(value.int),
55+
.uint => |*p| p.set(value.uint),
56+
}
57+
}
58+
59+
switch (parameter.*) {
60+
inline else => |p| zigplug.log.debug("read parameter '{s}' = {any}", .{ id, p.get() }),
61+
}
62+
}
63+
}
64+
};
465

566
pub fn Options(comptime T: type) type {
667
return struct {

src/core/root.zig

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub const Meta = struct {
7373
sample_accurate_automation: bool = false,
7474
};
7575

76+
7677
pub const Plugin = struct {
7778
context: *anyopaque,
7879
vtable: struct {
@@ -81,10 +82,7 @@ pub const Plugin = struct {
8182
},
8283

8384
allocator: std.mem.Allocator,
84-
parameters: ?struct {
85-
context: *anyopaque,
86-
slice: []*Parameter,
87-
},
85+
parameters: ?parameters.State,
8886
sample_rate_hz: u32 = 0,
8987

9088
pub fn init(comptime T: type) !Plugin {
@@ -152,6 +150,7 @@ pub const Plugin = struct {
152150
break :blk .{
153151
.context = parameters_context,
154152
.slice = parameters_slice,
153+
.allocator = allocator,
155154
};
156155
} else null,
157156
};

0 commit comments

Comments
 (0)