summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-07-17 09:44:16 +0200
committerRobin Gareus <robin@gareus.org>2018-07-17 09:44:34 +0200
commit3a64d355b788b6a46513d0d22db5c77bc60356c9 (patch)
treea485939f17ce18db88625aba358eb2980c61c16d /scripts
parentbd4571eeae9da1c5fc6ad1edfa57453336cb6b64 (diff)
Lua DSP LTC decoder plugin
Diffstat (limited to 'scripts')
-rw-r--r--scripts/ltc_reader.lua82
1 files changed, 82 insertions, 0 deletions
diff --git a/scripts/ltc_reader.lua b/scripts/ltc_reader.lua
new file mode 100644
index 0000000000..be1490ca09
--- /dev/null
+++ b/scripts/ltc_reader.lua
@@ -0,0 +1,82 @@
+ardour {
+ ["type"] = "dsp",
+ name = "LTC Reader",
+ category = "Utility",
+ author = "Ardour team",
+ license = "MIT",
+ description = [[Linear Timecode Decoder with mixer strip inline display]]
+}
+
+function dsp_ioconfig ()
+ return { { audio_in = 1, audio_out = 1}, }
+end
+
+function dsp_init (rate)
+ timeout = rate
+ samplerate = rate
+ ltc_reader = ARDOUR.DSP.LTCReader (rate / 25, ARDOUR.DSP.LTC_TV_STANDARD.LTC_TV_FILM_24)
+ self:shmem():allocate(5)
+end
+
+function dsp_run (ins, outs, n_samples)
+ if ins[1] ~= outs[1] then
+ ARDOUR.DSP.copy_vector (outs[1]:offset (0), ins[1]:offset (0), n_samples)
+ end
+ ltc_reader:write (ins[1]:offset (0), n_samples, -1)
+ timeout = timeout + n_samples
+ local to_ui = self:shmem():to_int(0):array()
+ local rv
+ repeat
+ local tc
+ rv, tc = ltc_reader:read (0, 0, 0, 0)
+ if rv then
+ timeout = 0
+ self:shmem():atomic_set_int (0, 1)
+ self:shmem():atomic_set_int (1, tc[1])
+ self:shmem():atomic_set_int (2, tc[2])
+ self:shmem():atomic_set_int (3, tc[3])
+ self:shmem():atomic_set_int (4, tc[4])
+ self:queue_draw ()
+ end
+ until not rv
+ if timeout > samplerate then
+ if 0 ~= self:shmem():atomic_get_int (0) then
+ self:shmem():atomic_set_int (0, 0)
+ self:queue_draw ()
+ end
+ end
+end
+
+-------------------------------------------------------------------------------
+-- inline UI
+--
+local txt = nil -- a pango context
+local vpadding = 2
+
+function render_inline (ctx, displaywidth, max_h)
+ if not txt then
+ txt = Cairo.PangoLayout (ctx, "Mono 10px")
+ end
+
+ local d = self:shmem():to_int(0):array()
+ if d[1] == 0 then
+ txt:set_text("--:--:--:--")
+ else
+ txt:set_text(string.format("%02d:%02d:%02d:%02d", d[2], d[3], d[4], d[5]))
+ end
+
+ -- compute the size of the display
+ local txtwidth, lineheight = txt:get_pixel_size()
+ local displayheight = math.min(vpadding + (lineheight + vpadding), max_h)
+
+ -- clear background
+ ctx:rectangle (0, 0, displaywidth, displayheight)
+ ctx:set_source_rgba (.2, .2, .2, 1.0)
+ ctx:fill ()
+ ctx:set_source_rgba (.8, .8, .8, 1.0)
+ ctx:move_to ((displaywidth - txtwidth) / 2, 1)
+ txt:show_in_cairo_context (ctx)
+
+ return {displaywidth, displayheight}
+end
+