diff options
Diffstat (limited to 'scripts/_dsp_plugin_communication.lua')
-rw-r--r-- | scripts/_dsp_plugin_communication.lua | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/scripts/_dsp_plugin_communication.lua b/scripts/_dsp_plugin_communication.lua new file mode 100644 index 0000000000..0df16a7ab0 --- /dev/null +++ b/scripts/_dsp_plugin_communication.lua @@ -0,0 +1,71 @@ +ardour { ["type"] = "dsp", name = "DSP Plugin Communication" } +function dsp_ioconfig () return { { audio_in = -1, audio_out = -1} } end + +function dsp_init (rate) + self:shmem ():allocate (1) +end + +function dsp_configure (ins, outs) +end + +function dsp_params () + return + { + { ["type"] = "output", name = "self", min = 0, max = 8}, + { ["type"] = "output", name = "gain", min = 0, max = 2}, + } +end + +function dsp_run (ins, outs, n_samples) + local ctrl = CtrlPorts:array () + local route = self:route () + local shmem = self:shmem () + + local i = 0; + local l = 0; + local s = -1; + + -- iterate overall plugins on this track, + -- find all LuaProc instances of this plugin (unique_id), + repeat + local proc = route:nth_plugin (i) + if not proc:isnil () + and not proc:to_insert():plugin (0):to_luaproc():isnil () + and proc:to_insert():plugin (0):unique_id () == self:unique_id () then + if (self:id ():to_s() == proc:to_insert():plugin (0):id ():to_s()) then + s = l; -- this plugin instance + end + if l == 0 then + shmem = proc:to_insert():plugin (0):to_luaproc():shmem () + end + l = l + 1 -- count total instances of this plugin + end + i = i + 1 + until proc:isnil () + + assert (s >= 0) + ctrl[1] = s; + + -- calculate digital peak of all channels + local peak = 0 + for c = 1,#ins do + if not ins[c]:sameinstance (outs[c]) then + ARDOUR.DSP.copy_vector (outs[c], ins[c], n_samples) + end + peak = ARDOUR.DSP.compute_peak(outs[c], n_samples, peak) + end + + local a = shmem:to_float (0):array () + if s == 0 then + -- the first plugin saves the peak + a[0] = peak + ctrl[2] = -1 + else + -- all later plugins display the difference to the first. + if (a[0] == 0) then + ctrl[2] = 1 + else + ctrl[2] = peak / a[0] + end + end +end |