summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-10-10 17:30:51 +0200
committerRobin Gareus <robin@gareus.org>2016-10-10 17:34:18 +0200
commitecba48a1160c67d5be30da41641ea578e6193418 (patch)
tree34889f4e3fef266b85d3e37e9a0789c529b659aa /scripts
parent0517e186c70dac4123a198f5fbfd3ae6039f8c94 (diff)
Example Lua script for inter-plugin communication
Diffstat (limited to 'scripts')
-rw-r--r--scripts/_dsp_plugin_communication.lua71
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