From 7a05ccb484a36b58b33fa2e3f6de07262ccb45c1 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 20 Aug 2017 19:15:37 +0200 Subject: Tweak generic audio-track template * Demo Factory method producing different functions * Allow to run interactively as Action script --- scripts/_route_template_generic_audio.lua | 99 ++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 27 deletions(-) (limited to 'scripts') diff --git a/scripts/_route_template_generic_audio.lua b/scripts/_route_template_generic_audio.lua index a3642bf54d..7dabce8aef 100644 --- a/scripts/_route_template_generic_audio.lua +++ b/scripts/_route_template_generic_audio.lua @@ -1,7 +1,7 @@ ardour { ["type"] = "EditorAction", name = "Generic Audio Track", - description = [[Example ]] + description = [[Add Audio tracks, by default as many as there are physical inputs]] } -- If a route_setup function is present in an Editor Action Script @@ -28,8 +28,9 @@ function route_setup () } end --- The Script can be used as EditorAction in which case it can --- optionally provide instantiation parmaters +-- The Script can be used as EditorAction in which case it *could* +-- optionally provide instantiation parmaters.. +--[[ function action_params () return { @@ -37,38 +38,82 @@ function action_params () ["name"] = { title = "Track Name Prefix", default = "Audio" }, } end +--]] -function factory (params) return function () - -- When called from the AddRouteDialog, 'params' will be a table with - -- keys as described in route_setup() above. +function factory (p) + -- when used from the AddRouteDialog (or w/action_params) + if type (p) == 'table' and p['how_many'] ~= nil then + return function () + -- When called from the AddRouteDialog, 'p' will be a table with + -- keys as described in route_setup() above. + local name = p["name"] or 'Audio' + local how_many = p["how_many"] or 1 + local channels = p["channels"] or 1 + local insert_at = p["insert_at"] or ARDOUR.PresentationInfo.max_order; + local group = p["group"] or nil + local mode = p["track_mode"] or ARDOUR.TrackMode.Normal + local strict_io = p["strict_io"] or false + local chan_out = 0 - local p = params or route_setup () - local name = p["name"] or 'Audio' - local how_many = p["how_many"] or 1 - local channels = p["channels"] or 1 - local insert_at = p["insert_at"] or ARDOUR.PresentationInfo.max_order; - local group = p["group"] or nil - local mode = p["track_mode"] or ARDOUR.TrackMode.Normal - local strict_io = p["strict_io"] or false - local chan_out = 0 + if ARDOUR.config():get_output_auto_connect() == ARDOUR.AutoConnectOption.AutoConnectMaster then + if not Session:master_out():isnil() then + chan_out = Session:master_out():n_inputs ():n_audio () + end + end - if ARDOUR.config():get_output_auto_connect() == ARDOUR.AutoConnectOption.AutoConnectMaster then - if not Session:master_out():isnil() then - chan_out = Session:master_out():n_inputs ():n_audio () + if chan_out == 0 then + chan_out = channels; + end + + local tl = Session:new_audio_track (channels, chan_out, group, how_many, name, insert_at, mode) + + if strict_io then + for t in tl:iter() do + t:set_strict_io (true) + end + end end end + -- when used as standalone (no action parameters): interactive + return function () + local e = Session:engine() + local _, t = e:get_backend_ports ("", ARDOUR.DataType("audio"), ARDOUR.PortFlags.IsOutput | ARDOUR.PortFlags.IsPhysical, C.StringVector()) + local tracks = t[4]:size(); - if chan_out == 0 then - chan_out = channels; - end + local dialog_options = { + { type = "number", key = "tracks", title = "Create Tracks", min = 1, max = 128, step = 1, digits = 0, default = tracks }, + { type = "entry", key = "name", default = 'Audio', title = "Name Prefix" }, + { type = "checkbox", key = "stereo", default = false, title = "Stereo" }, + { type = "checkbox", key = "recarm", default = false, title = "Record Arm Tracks" }, + } - local tl = Session:new_audio_track (channels, chan_out, group, how_many, name, insert_at, mode) + local dlg = LuaDialog.Dialog ("Create Audio Tracks", dialog_options) + local rv = dlg:run() + if (not rv or rv['tracks'] == 0) then + return + end + + local chan_in = stereo and 2 or 1 + local chan_out = 0 - if strict_io then - for t in tl:iter() do - t:set_strict_io (true) + if ARDOUR.config():get_output_auto_connect() == ARDOUR.AutoConnectOption.AutoConnectMaster then + if not Session:master_out():isnil() then + chan_out = Session:master_out():n_inputs ():n_audio () + end end - end -end end + if chan_out == 0 then + chan_out = chan_in; + end + + -- create tracks + local tl = Session:new_audio_track (chan_in, chan_out, nil, rv['tracks'], "", ARDOUR.PresentationInfo.max_order, ARDOUR.TrackMode.Normal) + -- and optionally record-arm them + if rv['recarm'] then + for track in tl:iter() do + track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup) + end + end + end +end -- cgit v1.2.3