add main plugin run loop
This commit is contained in:
parent
32699a55a5
commit
9e43367111
2 changed files with 52 additions and 0 deletions
|
@ -41,6 +41,24 @@ fn sopen(
|
||||||
return file.?;
|
return file.?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///Read a single frame from a file into an interleaved buffer.
|
||||||
|
///If more channels are required than are available in the file, the remaining
|
||||||
|
///channels are distributed in a round-robin fashion (LRLRL).
|
||||||
|
fn sread(file_opt: ?*c.SNDFILE, file_chans: c_int, buf: []f32) bool {
|
||||||
|
var file = file_opt.?;
|
||||||
|
|
||||||
|
const n_read: c.sf_count_t = c.sf_readf_float(file, buf.ptr, 1);
|
||||||
|
const buf_chans = @intCast(c_int, buf.len);
|
||||||
|
|
||||||
|
var i = file_chans - 1;
|
||||||
|
while (i < buf_chans) : (i += 1) {
|
||||||
|
//buf[@intCast(usize, i)] = buf[i % file_chans];
|
||||||
|
buf[@intCast(usize, i)] = buf[@intCast(usize, @mod(i, file_chans))];
|
||||||
|
}
|
||||||
|
|
||||||
|
return n_read == 1;
|
||||||
|
}
|
||||||
|
|
||||||
fn getEndPos(path: []const u8) !usize {
|
fn getEndPos(path: []const u8) !usize {
|
||||||
var file = try std.fs.File.openRead(path);
|
var file = try std.fs.File.openRead(path);
|
||||||
defer file.close();
|
defer file.close();
|
||||||
|
@ -204,5 +222,35 @@ pub const Image = struct {
|
||||||
std.debug.warn("file end: {}\n", end_pos);
|
std.debug.warn("file end: {}\n", end_pos);
|
||||||
const seek_pos = position.seekPos(end_pos);
|
const seek_pos = position.seekPos(end_pos);
|
||||||
std.debug.warn("start {} end {}\n", seek_pos.start, seek_pos.end);
|
std.debug.warn("start {} end {}\n", seek_pos.start, seek_pos.end);
|
||||||
|
|
||||||
|
var i: usize = 0;
|
||||||
|
|
||||||
|
while (i < end_pos) : (i += 1) {
|
||||||
|
// if we're still on the bmp header phase, copy bytes
|
||||||
|
// if we aren't in the range from seek_pos, copy bytes
|
||||||
|
// if we are in the range, run lilv plugin
|
||||||
|
|
||||||
|
// TODO speed this up by not reading byte-by-byte.
|
||||||
|
// TODO check value of this
|
||||||
|
_ = c.sf_readf_float(self.sndfile, rctx.in_buf.ptr, 1);
|
||||||
|
|
||||||
|
if (i < BMPHeaderSize or !seek_pos.contains(i)) {
|
||||||
|
_ = c.sf_writef_float(out_file, rctx.in_buf.ptr, 1);
|
||||||
|
} else {
|
||||||
|
lv2.lilv_instance_run(rctx.instance, 1);
|
||||||
|
|
||||||
|
var count = c.sf_writef_float(out_file, rctx.out_buf.ptr, 1);
|
||||||
|
if (count != 1) {
|
||||||
|
std.debug.warn(
|
||||||
|
"Failed to write to output file at idx {}.\n",
|
||||||
|
i,
|
||||||
|
);
|
||||||
|
|
||||||
|
// maybe we return an error?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = c.sf_close(out_file);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,6 +21,10 @@ pub const ParamList = std.ArrayList(Param);
|
||||||
pub const SeekPos = struct {
|
pub const SeekPos = struct {
|
||||||
start: usize,
|
start: usize,
|
||||||
end: usize,
|
end: usize,
|
||||||
|
|
||||||
|
pub fn contains(self: SeekPos, idx: usize) bool {
|
||||||
|
return (self.start <= idx) and (idx <= self.end);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Represents a relative position in the image
|
/// Represents a relative position in the image
|
||||||
|
|
Loading…
Reference in a new issue