add main plugin run loop

This commit is contained in:
Luna 2019-07-09 18:34:05 -03:00
parent 32699a55a5
commit 9e43367111
2 changed files with 52 additions and 0 deletions

View File

@ -41,6 +41,24 @@ fn sopen(
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 {
var file = try std.fs.File.openRead(path);
defer file.close();
@ -204,5 +222,35 @@ pub const Image = struct {
std.debug.warn("file end: {}\n", end_pos);
const seek_pos = position.seekPos(end_pos);
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);
}
};

View File

@ -21,6 +21,10 @@ pub const ParamList = std.ArrayList(Param);
pub const SeekPos = struct {
start: 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