1 /*
2  * JACK Rack
3  *
4  * Original:
5  * Copyright (C) Robert Ham 2002, 2003 (node@users.sourceforge.net)
6  *
7  * Modification for MLT:
8  * Copyright (C) 2004-2014 Meltytech, LLC
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24 
25 #ifndef _GNU_SOURCE
26 #define _GNU_SOURCE
27 #endif
28 #include <math.h>
29 
30 #include "plugin_settings.h"
31 
32 
33 static void
settings_set_to_default(settings_t * settings,guint32 sample_rate)34 settings_set_to_default (settings_t * settings, guint32 sample_rate)
35 {
36   unsigned long control;
37   guint copy;
38   LADSPA_Data value;
39 
40   for (control = 0; control < settings->desc->control_port_count; control++)
41     {
42       value = plugin_desc_get_default_control_value (settings->desc, control, sample_rate);
43 
44       for (copy = 0; copy < settings->copies; copy++)
45         {
46           settings->control_values[copy][control] = value;
47         }
48 
49       settings->locks[control] = TRUE;
50     }
51 }
52 
53 settings_t *
settings_new(plugin_desc_t * desc,unsigned long channels,guint32 sample_rate)54 settings_new     (plugin_desc_t * desc, unsigned long channels, guint32 sample_rate)
55 {
56   settings_t * settings;
57   unsigned long channel;
58   guint copies;
59 
60   settings = g_malloc (sizeof (settings_t));
61   copies = plugin_desc_get_copies (desc, channels);
62 
63   settings->sample_rate = sample_rate;
64   settings->desc = desc;
65   settings->copies = copies;
66   settings->channels = channels;
67   settings->lock_all = TRUE;
68   settings->enabled = FALSE;
69   settings->locks = NULL;
70   settings->control_values = NULL;
71   settings->wet_dry_enabled = FALSE;
72   settings->wet_dry_locked = TRUE;
73 
74   /* control settings */
75   if (desc->control_port_count > 0)
76     {
77       guint copy;
78 
79       settings->locks = g_malloc (sizeof (gboolean) * desc->control_port_count);
80 
81       settings->control_values = g_malloc (sizeof (LADSPA_Data *) * copies);
82       for (copy = 0; copy < copies; copy++)
83         {
84           settings->control_values[copy] = g_malloc (sizeof (LADSPA_Data) * desc->control_port_count);
85         }
86 
87       settings_set_to_default (settings, sample_rate);
88     }
89 
90   /* wet/dry settings */
91   settings->wet_dry_values = g_malloc (sizeof (LADSPA_Data) * channels);
92   for (channel = 0; channel < channels; channel++)
93     settings->wet_dry_values[channel] = 1.0;
94 
95   return settings;
96 }
97 
98 settings_t *
settings_dup(settings_t * other)99 settings_dup     (settings_t * other)
100 {
101   settings_t * settings;
102   plugin_desc_t * desc;
103   unsigned long channel;
104 
105   settings = g_malloc (sizeof (settings_t));
106 
107   settings->sample_rate     = other->sample_rate;
108   settings->desc            = other->desc;
109   settings->copies          = settings_get_copies (other);
110   settings->channels        = settings_get_channels (other);
111   settings->wet_dry_enabled = settings_get_wet_dry_enabled (other);
112   settings->wet_dry_locked  = settings_get_wet_dry_locked (other);
113   settings->lock_all        = settings_get_lock_all (other);
114   settings->enabled         = settings_get_enabled (other);
115   settings->locks           = NULL;
116   settings->control_values  = NULL;
117 
118   desc = other->desc;
119 
120   if (desc->control_port_count > 0)
121     {
122       guint copy;
123       unsigned long control;
124 
125       settings->locks = g_malloc (sizeof (gboolean) * desc->control_port_count);
126       for (control = 0; control < desc->control_port_count; control++)
127         settings_set_lock (settings, control, settings_get_lock (other, control));
128 
129       settings->control_values = g_malloc (sizeof (LADSPA_Data *) * settings->copies);
130       for (copy = 0; copy < settings->copies; copy++)
131         {
132           settings->control_values[copy] = g_malloc (sizeof (LADSPA_Data) * desc->control_port_count);
133 
134           for (control = 0; control < desc->control_port_count; control++)
135             {
136               settings->control_values[copy][control] = settings_get_control_value (other, copy, control);
137             }
138         }
139     }
140 
141   settings->wet_dry_values = g_malloc (sizeof (LADSPA_Data) * settings->channels);
142   for (channel = 0; channel < settings->channels; channel++)
143     settings->wet_dry_values[channel] = settings_get_wet_dry_value (other, channel);
144 
145   return settings;
146 }
147 
148 void
settings_destroy(settings_t * settings)149 settings_destroy (settings_t * settings)
150 {
151   if (settings->desc->control_port_count > 0)
152     {
153       guint i;
154       for (i = 0; i < settings->copies; i++)
155         g_free (settings->control_values[i]);
156 
157       g_free (settings->control_values);
158       g_free (settings->locks);
159     }
160 
161   g_free (settings->wet_dry_values);
162 
163   g_free (settings);
164 }
165 
166 static void
settings_set_copies(settings_t * settings,guint copies)167 settings_set_copies (settings_t * settings, guint copies)
168 {
169   guint copy;
170   guint last_copy;
171   unsigned long control;
172 
173   if (copies <= settings->copies)
174     return;
175 
176   last_copy = settings->copies - 1;
177 
178   settings->control_values = g_realloc (settings->control_values,
179                                         sizeof (LADSPA_Data *) * copies);
180 
181   /* copy over the last settings to the new copies */
182   for (copy = settings->copies; copy < copies; copy++)
183     {
184       for (control = 0; control < settings->desc->control_port_count; control++)
185         {
186           settings->control_values[copy][control] =
187             settings->control_values[last_copy][control];
188         }
189     }
190 
191   settings->copies = copies;
192 }
193 
194 static void
settings_set_channels(settings_t * settings,unsigned long channels)195 settings_set_channels (settings_t * settings, unsigned long channels)
196 {
197   unsigned long channel;
198   LADSPA_Data last_value;
199 
200   if (channels <= settings->channels)
201     return;
202 
203   settings->wet_dry_values = g_realloc (settings->wet_dry_values, sizeof (LADSPA_Data) * channels);
204 
205   last_value = settings->wet_dry_values[settings->channels - 1];
206 
207   for (channel = settings->channels; channel < channels; channel++)
208     settings->wet_dry_values[channel] = last_value;
209 
210   settings->channels = channels;
211 }
212 
213 void
settings_set_sample_rate(settings_t * settings,guint32 sample_rate)214 settings_set_sample_rate (settings_t * settings, guint32 sample_rate)
215 {
216   LADSPA_Data old_sample_rate;
217   LADSPA_Data new_sample_rate;
218 
219   g_return_if_fail (settings != NULL);
220 
221   if (settings->sample_rate == sample_rate)
222     return;
223 
224   if (settings->desc->control_port_count > 0)
225     {
226       unsigned long control;
227       guint copy;
228 
229       new_sample_rate = (LADSPA_Data) sample_rate;
230       old_sample_rate = (LADSPA_Data) settings->sample_rate;
231 
232       for (control = 0; control < settings->desc->control_port_count; control++)
233         {
234           for (copy = 0; copy < settings->copies; copy++)
235             {
236               if (LADSPA_IS_HINT_SAMPLE_RATE (settings->desc->port_range_hints[control].HintDescriptor))
237                 {
238                   settings->control_values[copy][control] =
239                     (settings->control_values[copy][control] / old_sample_rate) * new_sample_rate;
240                 }
241             }
242         }
243     }
244 
245   settings->sample_rate = sample_rate;
246 }
247 
248 void
settings_set_control_value(settings_t * settings,guint copy,unsigned long control_index,LADSPA_Data value)249 settings_set_control_value (settings_t * settings, guint copy, unsigned long control_index, LADSPA_Data value)
250 {
251   g_return_if_fail (settings != NULL);
252   g_return_if_fail (control_index < settings->desc->control_port_count);
253 
254   if (copy >= settings->copies)
255     settings_set_copies (settings, copy + 1);
256 
257   settings->control_values[copy][control_index] = value;
258 }
259 
260 void
settings_set_lock(settings_t * settings,unsigned long control_index,gboolean locked)261 settings_set_lock          (settings_t * settings, unsigned long control_index, gboolean locked)
262 {
263   g_return_if_fail (settings != NULL);
264   g_return_if_fail (control_index < settings->desc->control_port_count);
265 
266   settings->locks[control_index] = locked;
267 }
268 
269 void
settings_set_lock_all(settings_t * settings,gboolean lock_all)270 settings_set_lock_all (settings_t * settings, gboolean lock_all)
271 {
272   g_return_if_fail (settings != NULL);
273 
274   settings->lock_all = lock_all;
275 }
276 
277 void
settings_set_enabled(settings_t * settings,gboolean enabled)278 settings_set_enabled (settings_t * settings, gboolean enabled)
279 {
280   g_return_if_fail (settings != NULL);
281 
282   settings->enabled = enabled;
283 }
284 
285 void
settings_set_wet_dry_enabled(settings_t * settings,gboolean enabled)286 settings_set_wet_dry_enabled (settings_t * settings, gboolean enabled)
287 {
288   g_return_if_fail (settings != NULL);
289 
290   settings->wet_dry_enabled = enabled;
291 }
292 
293 void
settings_set_wet_dry_locked(settings_t * settings,gboolean locked)294 settings_set_wet_dry_locked  (settings_t * settings, gboolean locked)
295 {
296   g_return_if_fail (settings != NULL);
297 
298   settings->wet_dry_locked = locked;
299 }
300 
301 void
settings_set_wet_dry_value(settings_t * settings,unsigned long channel,LADSPA_Data value)302 settings_set_wet_dry_value   (settings_t * settings, unsigned long channel, LADSPA_Data value)
303 {
304   g_return_if_fail (settings != NULL);
305 
306   if (channel >= settings->channels)
307     settings_set_channels (settings, channel + 1);
308 
309   settings->wet_dry_values[channel] = value;
310 }
311 
312 
313 LADSPA_Data
settings_get_control_value(settings_t * settings,guint copy,unsigned long control_index)314 settings_get_control_value (settings_t * settings, guint copy, unsigned long control_index)
315 {
316   g_return_val_if_fail (settings != NULL, NAN);
317   g_return_val_if_fail (control_index < settings->desc->control_port_count, NAN);
318 
319   if (copy >= settings->copies)
320     settings_set_copies (settings, copy - 1);
321 
322   return settings->control_values[copy][control_index];
323 }
324 
325 gboolean
settings_get_lock(const settings_t * settings,unsigned long control_index)326 settings_get_lock          (const settings_t * settings, unsigned long control_index)
327 {
328   g_return_val_if_fail (settings != NULL, FALSE);
329 
330   return settings->locks[control_index];
331 }
332 
333 gboolean
settings_get_lock_all(const settings_t * settings)334 settings_get_lock_all      (const settings_t * settings)
335 {
336   g_return_val_if_fail (settings != NULL, FALSE);
337 
338   return settings->lock_all;
339 }
340 
341 gboolean
settings_get_enabled(const settings_t * settings)342 settings_get_enabled      (const settings_t * settings)
343 {
344   g_return_val_if_fail (settings != NULL, FALSE);
345 
346   return settings->enabled;
347 }
348 
349 guint
settings_get_copies(const settings_t * settings)350 settings_get_copies        (const settings_t * settings)
351 {
352   g_return_val_if_fail (settings != NULL, 0);
353 
354   return settings->copies;
355 }
356 
357 
358 unsigned long
settings_get_channels(const settings_t * settings)359 settings_get_channels        (const settings_t * settings)
360 {
361   g_return_val_if_fail (settings != NULL, 0);
362 
363   return settings->channels;
364 }
365 
366 gboolean
settings_get_wet_dry_enabled(const settings_t * settings)367 settings_get_wet_dry_enabled (const settings_t * settings)
368 {
369   g_return_val_if_fail (settings != NULL, FALSE);
370 
371   return settings->wet_dry_enabled;
372 }
373 
374 gboolean
settings_get_wet_dry_locked(const settings_t * settings)375 settings_get_wet_dry_locked  (const settings_t * settings)
376 {
377   g_return_val_if_fail (settings != NULL, FALSE);
378 
379   return settings->wet_dry_locked;
380 }
381 
382 LADSPA_Data
settings_get_wet_dry_value(settings_t * settings,unsigned long channel)383 settings_get_wet_dry_value   (settings_t * settings, unsigned long channel)
384 {
385   g_return_val_if_fail (settings != NULL, NAN);
386 
387   if (channel >= settings->channels)
388     settings_set_channels (settings, channel + 1);
389 
390   return settings->wet_dry_values[channel];
391 }
392 
393 
394 
395 /* EOF */
396