aboutsummaryrefslogtreecommitdiffstats
path: root/src/control.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/control.zig')
-rw-r--r--src/control.zig37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/control.zig b/src/control.zig
index d36ce01..ed2531e 100644
--- a/src/control.zig
+++ b/src/control.zig
@@ -165,7 +165,12 @@ pub const ControlServer = struct {
// _ = c.lo_server_add_method(self.server, "/reload", "", handle_reload, @as(*anyopaque, @ptrCast(self)));
_ = c.lo_server_add_method(self.server, "/uniform/*", null, wrapCallback(handle_uniform), @as(*anyopaque, @ptrCast(self)));
- _ = c.lo_server_add_method(self.server, "/texture/*", "ss", wrapCallback(handle_load_texture), @as(*anyopaque, @ptrCast(self)));
+ if (build_config.have_ffmpeg) {
+ _ = c.lo_server_add_method(self.server, "/texture/*/video", "ss", wrapCallback(handle_texture_video), @as(*anyopaque, @ptrCast(self)));
+ }
+ if (build_config.have_tsv) {
+ _ = c.lo_server_add_method(self.server, "/texture/*/tsv", "ss", wrapCallback(handle_texture_tsv), @as(*anyopaque, @ptrCast(self)));
+ }
_ = c.lo_server_add_method(self.server, "/texture/*/destroy", "", wrapCallback(handle_destroy_texture), @as(*anyopaque, @ptrCast(self)));
return self;
@@ -300,10 +305,29 @@ pub const ControlServer = struct {
return true;
}
- fn handle_load_texture(self: *ControlServer, path: []const u8, types: []const u8, argv: []const [*c]c.lo_arg) !bool {
- if (!build_config.have_ffmpeg) return error.supportDisabled;
+ fn handle_texture_video(self: *ControlServer, path: []const u8, types: []const u8, argv: []const [*c]c.lo_arg) !bool {
+ _ = types;
+
+ var parts = std.mem.tokenizeScalar(u8, path, '/');
+ _ = parts.next();
+ const name = parts.next() orelse unreachable;
+ if (self.cache.textures.contains(name)) return error.textureNameTaken;
+
+ const texture_typeZ: [*:0]const u8 = @ptrCast(&argv[0].*.s);
+ const texture_type = std.meta.stringToEnum(gl.Texture.Type, std.mem.span(texture_typeZ)) orelse return error.invalidType;
+ const filenameZ: [*:0]const u8 = @ptrCast(&argv[1].*.s);
+
const ffmpeg = @import("ffmpeg.zig");
+ const source = try ffmpeg.VideoSource.init(self.cache.allocator, self.progress, filenameZ, texture_type);
+
+ const key = try self.cache.allocator.dupe(u8, name);
+ errdefer self.cache.allocator.free(key);
+ try self.cache.textures.put(key, source);
+
+ return true;
+ }
+ fn handle_texture_tsv(self: *ControlServer, path: []const u8, types: []const u8, argv: []const [*c]c.lo_arg) !bool {
_ = types;
var parts = std.mem.tokenizeScalar(u8, path, '/');
@@ -313,12 +337,13 @@ pub const ControlServer = struct {
const texture_typeZ: [*:0]const u8 = @ptrCast(&argv[0].*.s);
const texture_type = std.meta.stringToEnum(gl.Texture.Type, std.mem.span(texture_typeZ)) orelse return error.invalidType;
+ const tsv_nameZ: [*:0]const u8 = @ptrCast(&argv[1].*.s);
+
+ const tsv = @import("tsv.zig");
+ const source = try tsv.TSVSource.init(self.cache.allocator, tsv_nameZ, texture_type);
- const filenameZ: [*:0]const u8 = @ptrCast(&argv[1].*.s);
const key = try self.cache.allocator.dupe(u8, name);
errdefer self.cache.allocator.free(key);
-
- const source = try ffmpeg.VideoSource.init(self.cache.allocator, self.progress, filenameZ, texture_type);
try self.cache.textures.put(key, source);
return true;