1 ardour { ["type"] = "Snippet", name = "VCA Slave Examples",
3 author = "Ardour Team",
6 function factory () return function ()
7 -- find possible masters & slave, allow selection in dropdown menu
10 local have_masters = false
11 local have_slaves = false
13 for v in Session:vca_manager ():vcas() :iter () do -- for each VCA
14 sources [v:name ()] = v
18 for s in Session:get_stripables ():iter () do -- for every track/bus/vca
19 if s:is_monitor () or s:is_auditioner () then goto nextroute end -- skip special routes
20 targets [s:name ()] = s
25 -- bail out if there are no parameters
26 if not have_slaves then
27 LuaDialog.Message ("VCA Slave Example", "No Slavables found", LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run ()
32 if not have_masters then
33 LuaDialog.Message ("VCA Slave Example", "No VCA masters found", LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run ()
39 -- create a dialog, ask user which master to assign to which slave
40 local dialog_options = {
41 { type = "dropdown", key = "master", title = "Control Master", values = sources },
42 { type = "dropdown", key = "slave", title = "Control Slave", values = targets }
44 local rv = LuaDialog.Dialog ("Select VCA assignment", dialog_options):run ()
46 targets = nil -- drop references (the table holds shared-pointer references to all strips)
47 collectgarbage () -- and release the references immediately
49 if not rv then return end -- user canceled the operation
51 -- parse user response
52 local mst = rv["master"]
53 local slv = rv["slave"]
54 assert (not slv:to_slavable ():isnil ())
56 -- test if mst is already controlled by slv (directly or indirectly)
57 -- if so, don't allow the connection
58 if (not slv:to_slavable ():assigned_to (Session:vca_manager(), mst)) then
59 -- if slv is a VCA and is controlled by master, disconnect it
60 if (not slv:to_vca ():isnil () and slv:to_vca ():slaved_to (mst)) then
61 slv:to_slavable ():unassign (mst)
63 slv:to_slavable ():assign (mst)
66 LuaDialog.Message ("VCA Slave Example", "Recursive VCA assignment ignored", LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run ()