summaryrefslogtreecommitdiff
path: root/share/scripts/_find_nonzero_sample.lua
diff options
context:
space:
mode:
Diffstat (limited to 'share/scripts/_find_nonzero_sample.lua')
-rw-r--r--share/scripts/_find_nonzero_sample.lua74
1 files changed, 74 insertions, 0 deletions
diff --git a/share/scripts/_find_nonzero_sample.lua b/share/scripts/_find_nonzero_sample.lua
new file mode 100644
index 0000000000..c23d2b0b4d
--- /dev/null
+++ b/share/scripts/_find_nonzero_sample.lua
@@ -0,0 +1,74 @@
+ardour {
+ ["type"] = "EditorAction",
+ name = "Find non zero audio sample",
+ author = "Ardour Team",
+ description = [[Find the position of first non-zero audio sample in selected regions.]]
+}
+
+function factory () return function ()
+ -- get Editor GUI Selection
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+ local sel = Editor:get_selection ()
+
+ -- allocate a buffer (float* in C)
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:DspShm
+ local cmem = ARDOUR.DSP.DspShm (8192)
+ local msg = ""
+
+ -- iterate over selected regions
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
+ for r in sel.regions:regionlist ():iter () do
+ -- test if it's an audio region
+ if r:to_audioregion ():isnil () then
+ goto next
+ end
+
+ -- to read the Region data, we use the Readable interface of the Region
+ -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Readable
+ local rd = r:to_readable ()
+
+ local n_samples = rd:readable_length ()
+ local n_channels = rd:n_channels ()
+
+ local nonzeropos = -1
+
+ -- iterate over all channels in Audio Region
+ for c = 0, n_channels -1 do
+ local pos = 0
+ repeat
+ -- read at most 8K samples of channel 'c' starting at 'pos'
+ local s = rd:read (cmem:to_float (0), pos, 8192, c)
+ -- access the raw audio data
+ -- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+ local d = cmem:to_float (0):array()
+ -- iterate over the audio sample data
+ for i = 0, s do
+ if math.abs (d[i]) > 0 then
+ if (nonzeropos < 0 or pos + i < nonzeropos) then
+ nonzeropos = pos + i
+ end
+ break
+ end
+ end
+ pos = pos + s
+ if (nonzeropos >= 0 and pos > nonzeropos) then
+ break
+ end
+ until s < 8192
+ end
+
+ if (nonzeropos >= 0) then
+ msg = msg .. string.format("%s: %d\n", r:name (), nonzeropos + r:position())
+ else
+ msg = msg .. "Region: '%s' is silent\n"
+ end
+
+ ::next::
+ end
+
+ if (msg ~= "") then
+ local md = LuaDialog.Message ("First Non Zero Sample", msg, LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close)
+ md:run()
+ end
+
+end end