Robin Gareus
1a69bc4a96
Lua arrays (tables) start counting at one. Also `for i = a, b do .. end` is inclusive: a <= i <= b
48 lines
1.2 KiB
Lua
48 lines
1.2 KiB
Lua
ardour { ["type"] = "Snippet", name = "Readable Test" }
|
|
|
|
function factory () return function ()
|
|
|
|
local file = "/tmp/reverbs/Large Wide Echo Hall.wav"
|
|
local rl = ARDOUR.Readable.load (Session, file)
|
|
local cmem = ARDOUR.DSP.DspShm (8192)
|
|
|
|
local d = cmem:to_float (0):array()
|
|
for i = 1, 8192 do d[i] = 0 end
|
|
d[1] = .5
|
|
|
|
local ar = ARDOUR.AudioRom.new_rom (cmem:to_float (0), 8192)
|
|
|
|
rl:push_back (ar)
|
|
|
|
local c = 1
|
|
for rd in rl:iter () do
|
|
local n_samples = rd:readable_length ()
|
|
assert (rd:n_channels () == 1)
|
|
|
|
local peak = 0
|
|
local pos = 0
|
|
repeat
|
|
-- read at most 8K samples starting at 'pos'
|
|
local s = rd:read (cmem:to_float (0), pos, 8192, 0)
|
|
pos = pos + s
|
|
-- 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 = 1, s do
|
|
if math.abs (d[i]) > peak then
|
|
peak = math.abs (d[i])
|
|
end
|
|
end
|
|
until s < 8192
|
|
assert (pos == n_samples)
|
|
|
|
if (peak > 0) then
|
|
print ("File:", file, "channel", c, "peak:", 20 * math.log (peak) / math.log(10), "dBFS")
|
|
else
|
|
print ("File:", file, "channel", c, " is silent")
|
|
end
|
|
c = c + 1;
|
|
end
|
|
end end
|