diff --git a/examples/middle_amp.scri b/examples/middle_amp.scri index f159c8e..a1ed655 100644 --- a/examples/middle_amp.scri +++ b/examples/middle_amp.scri @@ -1,3 +1,8 @@ load :0; -amp 3 1 10; +amp 80 70 10; +amp 80 73 20; +amp 80 75 20; +amp 80 76 20; +amp 7 4 2; +amp 5 1 8; quicksave; diff --git a/src/image.zig b/src/image.zig index 00b83b8..020d893 100644 --- a/src/image.zig +++ b/src/image.zig @@ -54,6 +54,12 @@ fn swrite(file: *c.SNDFILE, buf: [*]f32, frames: i64) !void { } } +fn getEndPos(path: []const u8) !usize { + var file = try std.fs.File.openRead(path); + defer file.close(); + return file.getEndPos(); +} + fn temporaryName(allocator: *std.mem.Allocator) ![]u8 { const template_start = "/temp/temp_"; const template = "/tmp/temp_XXXXXXXX"; @@ -102,31 +108,24 @@ pub const Image = struct { /// Pointer to the underlying libsndfile's SNDFILE struct. sndfile: *c.SNDFILE, - /// Current sound file's framecount. - frames: usize, - /// The original image file path. path: []const u8, /// Represents the current path being worked on. curpath: []const u8, - /// Open a BMP image for later. + /// Open a BMP file. pub fn open(allocator: *std.mem.Allocator, path: []const u8) !*Image { var in_fmt = mkSfInfo(); var sndfile = try sopen(allocator, path, c.SFM_READ, &in_fmt); var image = try allocator.create(Image); - std.debug.assert(in_fmt.frames > i64(0)); - std.debug.assert(in_fmt.seekable == i32(1)); - image.* = Image{ .allocator = allocator, .sndfile = sndfile, .path = path, .curpath = path, - .frames = @intCast(usize, in_fmt.frames), }; return image; @@ -162,12 +161,10 @@ pub const Image = struct { fn copyBytes( self: *Image, out_file: *c.SNDFILE, + buf: []f32, start: usize, end: usize, ) !void { - var buf = try self.allocator.alloc(f32, BufferSize); - defer self.allocator.free(buf); - const total_bytes = end - start; var i: usize = start; @@ -200,13 +197,6 @@ pub const Image = struct { _ = c.sf_seek(self.sndfile, @intCast(i64, end), c.SEEK_SET); } - fn getSeekPos(self: *Image, position: plugins.Position) plugins.SeekPos { - const file_end = self.frames; - var seek_pos = position.seekPos(file_end); - std.debug.warn("\tstart {} end {}\n", seek_pos.start, seek_pos.end); - return seek_pos; - } - /// Run a plugin over the image. /// This setups a new lilv world/plugin among other things. /// The internal SNDFILE pointer is modified to point to the output of the @@ -273,7 +263,9 @@ pub const Image = struct { // just copy the original image and the part where we run the plugin // over the image. - const seek_pos = self.getSeekPos(position); + const file_end = try getEndPos(self.curpath); + const seek_pos = position.seekPos(file_end); + std.debug.warn("\tstart {} end {}\n", seek_pos.start, seek_pos.end); // make sure we start from 0 _ = c.sf_seek(self.sndfile, 0, c.SEEK_SET); @@ -284,11 +276,15 @@ pub const Image = struct { // - plugin // - post-plugin + var file_copy_buf = try self.allocator.alloc(f32, BufferSize); + defer self.allocator.free(file_copy_buf); + // pre-plugin copy, merged with bmp header copy try self.copyBytes( out_file, + file_copy_buf, usize(0), - seek_pos.start, + seek_pos.start + @mod(seek_pos.start, BufferSize), ); _ = c.sf_seek(self.sndfile, @intCast(i64, seek_pos.start), c.SEEK_SET); @@ -315,8 +311,9 @@ pub const Image = struct { // post-plugin copy try self.copyBytes( out_file, + file_copy_buf, seek_pos.end + 1, - self.frames, + file_end + @mod(file_end, BufferSize), ); c.sf_write_sync(out_file); @@ -352,7 +349,9 @@ pub const Image = struct { var bufs = try plugins.RunBuffers.init(self.allocator); defer bufs.deinit(); - const seek_pos = self.getSeekPos(position); + const file_end = try getEndPos(self.curpath); + const seek_pos = position.seekPos(file_end); + std.debug.warn("\tstart {} end {}\n", seek_pos.start, seek_pos.end); // make sure we start from 0 _ = c.sf_seek(self.sndfile, 0, c.SEEK_SET); @@ -363,11 +362,15 @@ pub const Image = struct { // - CUSTOM plugin // - post-plugin + var file_copy_buf = try self.allocator.alloc(f32, BufferSize); + defer self.allocator.free(file_copy_buf); + // pre-plugin copy, merged with bmp header copy try self.copyBytes( out_file, + file_copy_buf, usize(0), - seek_pos.start, + seek_pos.start + @mod(seek_pos.start, BufferSize), ); _ = c.sf_seek(self.sndfile, @intCast(i64, seek_pos.start), c.SEEK_SET); @@ -394,8 +397,9 @@ pub const Image = struct { // post-plugin copy try self.copyBytes( out_file, + file_copy_buf, seek_pos.end + 1, - self.frames, + file_end + @mod(file_end, BufferSize), ); c.sf_write_sync(out_file);