diff options
Diffstat (limited to 'src/control.zig')
| -rw-r--r-- | src/control.zig | 37 |
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; |
