Only show user-presets in favorite sidebar
[ardour.git] / scripts / _vca_slave_assign.lua
1 ardour { ["type"] = "Snippet", name = "VCA Slave Examples",
2         license     = "MIT",
3         author      = "Ardour Team",
4 }
5
6 function factory () return function ()
7         -- find possible masters & slave, allow selection in dropdown menu
8         local targets = {}
9         local sources = {}
10         local have_masters = false
11         local have_slaves = false
12
13         for v in Session:vca_manager ():vcas() :iter () do -- for each VCA
14                 sources [v:name ()] = v
15                 have_masters = true
16         end
17
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
21                 have_slaves = true;
22                 ::nextroute::
23         end
24
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 ()
28                 sources = nil
29                 collectgarbage ()
30                 return
31         end
32         if not have_masters then
33                 LuaDialog.Message ("VCA Slave Example", "No VCA masters found", LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run ()
34                 targets = nil
35                 collectgarbage ()
36                 return
37         end
38
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 }
43         }
44         local rv = LuaDialog.Dialog ("Select VCA assignment", dialog_options):run ()
45
46         targets = nil -- drop references (the table holds shared-pointer references to all strips)
47         collectgarbage () -- and release the references immediately
48
49         if not rv then return end -- user canceled the operation
50
51         -- parse user response
52         local mst = rv["master"]
53         local slv = rv["slave"]
54         assert (not slv:to_slavable ():isnil ())
55
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)
62                 else
63                         slv:to_slavable ():assign (mst)
64                 end
65         else
66                 LuaDialog.Message ("VCA Slave Example", "Recursive VCA assignment ignored", LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run ()
67         end
68
69         -- drop references
70         mst = nil slv = nil
71         collectgarbage ()
72 end end
73