summaryrefslogtreecommitdiff
path: root/share/scripts/reset_mixer.lua
blob: 6feabdf268fee5c95e620f1ac3fcaafc6381e02d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
ardour {
	["type"]    = "EditorAction",
	name        = "Reset Mixer",
	license     = "MIT",
	author      = "Ben Loftis, Nikolaus Gullotta, Maxime Lecoq",
	description = [[Resets key Mixer settings after user-prompt (warning: this cannot be undone)]]
}

function factory() return function()
	local sp_radio_buttons = {Bypass="bypass", Remove="remove", Nothing=false}
	local dlg = {
		{type="label", align="left", colspan="3", title="Please select below the items you want to reset:" },
		{type="label", align="left", colspan="3", title="(Warning: this cannot be undone!)\n" },

		{type="heading", align ="center", colspan="3", title = "Common Controls:" },
		{type="checkbox", key="fader", default=true, title="Fader"      },
		{type="checkbox", key="mute",  default=true, title="Mute"       },
		{type="checkbox", key="solo",  default=true, title="Solo"       },
		{type="checkbox", key="trim",  default=true, title="Trim"       },
		{type="checkbox", key="pan",   default=true, title="Pan (All)"  },
		{type="checkbox", key="phase", default=true, title="Phase"      },
		{type="checkbox", key="sends", default=true, title="Sends"      },
		{type="checkbox", key="eq",    default=true, title="EQ"         },
		{type="checkbox", key="comp",  default=true, title="Compressor" },

		{type="heading", align="center", colspan="3", title="Processors:" },
		{type="radio", key="plugins", title="Plug-ins",      values=sp_radio_buttons, default="Bypass" },
		{type="radio", key="io",      title="Sends/Inserts", values=sp_radio_buttons, default="Bypass" },

		{type="hseparator", title=""},

		{type="heading", align="center", colspan="3", title="Misc." },
		{type="checkbox", key="auto",    colspan="3", title = "Automation (switch to manual mode)" },
		{type="checkbox", key="rec",    colspan="3", title = "Disable Record" },
		{type="checkbox", key="groups",  colspan="3", title = "Groups"                             },
		{type="checkbox", key="vcas",    colspan="3", title = "VCAs (unassign all)"                },
	}

	function reset(ctrl, disp, auto)
		local disp = disp or PBD.GroupControlDisposition.NoGroup

		if not(ctrl:isnil()) then
			local pd = ctrl:desc()
			ctrl:set_value(pd.normal, disp)

			if auto then
				ctrl:set_automation_state(auto)
			end
		end
	end

	function reset_eq_controls(route, disp, auto)
		if route:isnil() then
			return
		end

		local disp = disp or PBD.GroupControlDisposition.NoGroup

		reset(route:eq_enable_controllable(), disp, auto)

		local i = 0
		repeat
			for _,ctrl in pairs({
				route:eq_freq_controllable(i),
				route:eq_gain_controllable(i),
				route:eq_q_controllable(i),
			}) do
				reset(ctrl, disp, auto)
			end
			i = i + 1
		until route:eq_freq_controllable(i):isnil()
	end

	function reset_comp_controls(route, disp, auto)
		if route:isnil() then
			return
		end

		local disp = disp or PBD.GroupControlDisposition.NoGroup

		for _,ctrl in pairs({
			route:comp_enable_controllable(),
			route:comp_makeup_controllable(),
			route:comp_mode_controllable(),
			route:comp_speed_controllable(),
			route:comp_threshold_controllable(),
		}) do
			reset(ctrl, disp, auto)
		end
	end

	function reset_send_controls(route, disp, auto)
		if route:isnil() then
			return
		end

		local disp = disp or PBD.GroupControlDisposition.NoGroup

		local i = 0
		repeat
			for _,ctrl in pairs({
				route:send_level_controllable(i),
				route:send_enable_controllable(i),
				route:send_pan_azimuth_controllable(i),
				route:send_pan_azimuth_enable_controllable(i),
			}) do
				reset(ctrl, disp, auto)
			end
			i = i + 1
		until route:send_enable_controllable(i):isnil()
	end

	function reset_plugin_automation(plugin, state)
		if plugin:to_insert():isnil() then
			return
		end

		local plugin = plugin:to_insert()
		local pc = plugin:plugin(0):parameter_count()
		for c = 0, pc do
			local ac = plugin:to_automatable():automation_control(Evoral.Parameter(ARDOUR.AutomationType.PluginAutomation, 0, c), false)
			if not(ac:isnil()) then
				ac:set_automation_state(state)
			end
		end
	end

	function reset_plugins(route, prefs, auto)
		if route:isnil() then
			return
		end

		local i = 0
		local queue = {}
		repeat
			-- Plugins are queued to not invalidate this loop
			local proc = route:nth_processor(i)
			if not(proc:isnil()) then
				if prefs["auto"] then
					reset_plugin_automation(proc, auto)
				end
				if prefs["plugins"] then
					local insert = proc:to_insert()
					if not(insert:isnil()) then
						if insert:is_channelstrip() or not(insert:display_to_user()) then
							ARDOUR.LuaAPI.reset_processor_to_default(insert)
						else
							queue[#queue + 1] = proc
						end
					end
				end
				if prefs["io"] then
					local io_proc = proc:to_ioprocessor()
					if not(io_proc:isnil()) then
						queue[#queue + 1] = proc
					end
				end
			end
			i = i + 1
		until proc:isnil()
		
		-- Deal with queue now
		for _, proc in pairs(queue) do
			if not(proc:to_insert():isnil()) then
				if prefs["plugins"] == "remove" then
					route:remove_processor(proc, nil, true)
				elseif prefs["plugins"] == "bypass" then
					proc:deactivate()
				end
			end
			if not(proc:to_ioprocessor():isnil()) then
				if prefs["io"] == "remove" then
					route:remove_processor(proc, nil, true)
				elseif prefs["io"] == "bypass" then
					proc:deactivate()
				end
			end
		end
	end

	local pref = LuaDialog.Dialog("Reset Mixer", dlg):run()

	if not(pref) then goto pass_script end
	assert(pref, "Dialog box was cancelled or is nil")

	for route in Session:get_routes():iter() do
		local disp = PBD.GroupControlDisposition.NoGroup
		local auto = nil

		if pref["auto"] then
			auto = ARDOUR.AutoState.Off
		end

		if pref["eq"]    then reset_eq_controls(route, disp, auto) end
		if pref["comp"]  then reset_comp_controls(route, disp, auto) end
		if pref["sends"] then 
			reset_send_controls(route, disp, auto)

			-- Can't use reset() on this becuase ctrl:desc().normal 
			-- for master_send_enable_controllable is 0, and we really 
			-- want 1.
			local msec = route:master_send_enable_controllable()
			if not(msec:isnil()) then
				msec:set_value(1, disp)
				if auto then
					ctrl:set_automation_state(auto)
				end
			end
		end
		
		reset_plugins(route, pref, auto)

		if pref["rec"] then
			reset(route:rec_enable_control(), disp, auto)
			reset(route:rec_safe_control(), disp, auto)
		end

		if pref["fader"] then
			reset(route:gain_control(), disp, auto)
		end

		if pref["phase"] then
			reset(route:phase_control(), disp, auto)
		end

		if pref["trim"] then
			reset(route:trim_control(), disp, auto)
		end

		if pref["mute"] then
			reset(route:mute_control(), disp, auto)
		end

		if pref["solo"] then
			reset(route:solo_control(), disp, auto)
		end

		if pref["pan"] then
			reset(route:pan_azimuth_control(), disp, auto)
			reset(route:pan_elevation_control(), disp, auto)
			reset(route:pan_frontback_control(), disp, auto)
			reset(route:pan_lfe_control(), disp, auto)
			reset(route:pan_width_control(), disp, auto)
		end

		if pref["vcas"] then
			local slave = route:to_slavable()
			if not(slave:isnil()) then
				for vca in Session:vca_manager():vcas():iter() do
					slave:unassign(vca)
				end
			end
		end
	end

	if pref["groups"] then
		for group in Session:route_groups():iter() do
			Session:remove_route_group(group)
		end
	end
	::pass_script::
end end