summaryrefslogtreecommitdiff
path: root/share/scripts/stop_at_marker.lua
diff options
context:
space:
mode:
Diffstat (limited to 'share/scripts/stop_at_marker.lua')
-rw-r--r--share/scripts/stop_at_marker.lua49
1 files changed, 49 insertions, 0 deletions
diff --git a/share/scripts/stop_at_marker.lua b/share/scripts/stop_at_marker.lua
new file mode 100644
index 0000000000..35de3510c4
--- /dev/null
+++ b/share/scripts/stop_at_marker.lua
@@ -0,0 +1,49 @@
+ardour {
+ ["type"] = "session",
+ name = "Stop at Marker",
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[An example session script which stops the transport on every location marker when rolling forward.]]
+}
+
+function factory ()
+ return function (n_samples)
+ if (not Session:transport_rolling ()) then
+ -- not rolling, nothing to do.
+ return
+ end
+
+ local pos = Session:transport_sample () -- current playhead position
+ local loc = Session:locations () -- all marker locations
+
+ -- find first marker after the current playhead position, ignore loop + punch ranges
+ -- (this only works when rolling forward, to extend this example see
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Locations )
+ --
+ local m = loc:first_mark_after (pos, false)
+
+ if (m == -1) then
+ -- no marker was found
+ return
+ end
+
+ -- due to `first_mark_after(pos)` "m" is always > "pos":
+ -- assert(pos < m)
+ --
+ -- This callback happens from within the process callback:
+ --
+ -- this cycle's end = next cycle start = pos + n_samples.
+ --
+ -- Note that if "m" is exactly at cycle's end, that marker
+ -- will be at "pos" in the next cycle. Since we ask for
+ -- "first_mark_after pos", the marker would not be found.
+ --
+ -- So even though "pos + n_samples" is barely reached,
+ -- we need to stop at "m" in the cycle that crosses or ends at "m".
+ if (pos + n_samples >= m) then
+ -- asking to locate to "m" ensures that playback continues at "m"
+ -- and the same marker will not be taken into account.
+ Session:request_locate (m, ARDOUR.LocateTransportDisposition.MustStop, ARDOUR.TransportRequestSource.TRS_Engine)
+ end
+ end
+end