Pretty colors everywhere!
[terminatorX.git] / src / tX_vtt.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2020  Alexander K├Ânig
4  
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  
18     File: tX_vtt.h
19  
20     Description: Header to tX_vtt.cc
21     
22     08 Dec 1999 - added audiofile support
23 */    
24
25 #ifndef _h_tx_vtt
26 #define _h_tx_vtt 1
27
28 #include <config.h>
29
30 #include <list>
31 #include "tX_types.h"
32 #include "tX_vttgui.h"
33 #include <pthread.h>
34 #include <float.h>
35 #include <stdio.h>
36 #include "tX_audiofile.h"
37 #include "tX_seqpar.h"
38 #include "tX_vttfx.h"
39 #include "tX_ladspa.h"
40
41 #define EC_MAX_BUFFER 256000
42
43 #define NEED_FADE_OUT 0
44 #define NEED_FADE_IN 1
45
46 #define SAMPLE_MAX    32760.0
47 #define SAMPLE_BORDER 30000.0
48
49 #include <libxml/xmlmemory.h>
50 #include <libxml/parser.h>
51
52 class vtt_class
53 {
54         public:
55         /* class vars */
56         static int vtt_amount;
57         static list <vtt_class *> main_list;
58         static list <vtt_class *> render_list;
59
60         static f_prec *mix_buffer;
61         static f_prec *mix_buffer_end;
62         
63         static int16_t *mix_out_buffer;
64         static f_prec mix_max_l;
65         static f_prec mix_max_r;
66         static unsigned int samples_in_mix_buffer;
67         static pthread_mutex_t render_lock;
68         
69         static f_prec master_volume;
70         static f_prec res_master_volume;
71         static f_prec vol_channel_adjust;
72
73         static vtt_class * sync_master;
74         static int master_triggered;
75         static int master_triggered_at;
76         static vtt_class * focused_vtt;
77         static int solo_ctr;
78         static int mix_buffer_size;
79         static int last_sample_rate;
80         
81         /* the gui */
82         vtt_gui gui;
83         bool have_gui;
84         
85         /* main object vars */
86         char name[256]; // Turntable's name
87         char filename[PATH_MAX]; // The corresponding audiofile
88         
89         GdkRGBA color;
90
91         int is_playing;
92         bool is_sync_master;
93         bool is_sync_client;
94         int sync_cycles;
95         int sync_countdown;
96         bool want_stop;
97         int sense_cycles;
98         
99         bool control_hidden;
100         bool audio_hidden;
101         double control_scroll_adjustment;
102         
103         /* builtin fx */
104         vtt_fx* lp_fx;
105         vtt_fx* ec_fx;
106
107         f_prec max_value;
108         f_prec max_value2;
109         
110         int16_t *buffer;        // Actual audio data
111         unsigned int samples_in_buffer;  // No. of samples in audio data
112         int do_scratch;
113         
114         f_prec *output_buffer; 
115         f_prec *end_of_outputbuffer;
116         
117         f_prec *output_buffer2; // 2nd audio channel
118         
119         f_prec samples_in_outputbuffer;
120         f_prec inv_samples_in_outputbuffer;
121         
122         /* main playback vars */
123         f_prec rel_volume; // The (user-selected) relative volume
124         f_prec res_volume; // The resulting volume
125         f_prec rel_pitch; // The (user-selected) relative pitch
126         f_prec res_pitch;
127         
128         
129         f_prec pan; // The logical pan value -1 left, 0 center, 1 right
130         f_prec res_volume_left;
131         f_prec res_volume_right;
132         
133         int autotrigger;
134         int loop;
135         
136         d_prec speed;
137         d_prec speed_real;
138         d_prec speed_target;
139         d_prec speed_step;
140         d_prec speed_last;
141         int fade_in;
142         int fade_out;
143         bool do_mute;
144                 
145         d_prec pos_f;
146         unsigned int pos_i;
147         unsigned int pos_i_max;
148         d_prec maxpos;
149         
150         bool mute;
151         bool res_mute;
152         bool res_mute_old;
153         
154         bool mix_mute;
155         bool mix_solo;
156         int fade;
157         
158         /* seq par mapping for x/y axis */
159         tX_seqpar *x_par;
160         tX_seqpar *y_par;
161         
162         /* lp vars */
163         int lp_enable;
164         f_prec lp_gain;
165         f_prec lp_reso;
166         f_prec lp_freq;
167         
168         f_prec lp_buf0;
169         f_prec lp_buf1;
170         f_prec lp_a;
171         f_prec lp_b;
172         f_prec lp_last;
173         f_prec lp_autogain;
174         f_prec lp_resgain;
175         
176         /* echo vars */
177         f_prec ec_buffer[EC_MAX_BUFFER];
178         f_prec *ec_output_buffer;
179         f_prec *ec_delay;
180         f_prec *ec_ptr;
181         int ec_enable;
182         f_prec ec_length;
183         f_prec ec_res_length;
184         f_prec ec_feedback;
185         f_prec ec_pan;
186         f_prec ec_volume;
187         f_prec ec_volume_left;
188         f_prec ec_volume_right;
189         
190         /* sequenceable parameters */
191         tX_seqpar_vtt_speed sp_speed;
192         tX_seqpar_vtt_volume sp_volume;
193         tX_seqpar_vtt_pitch sp_pitch;
194         tX_seqpar_vtt_pan sp_pan;
195         tX_seqpar_vtt_trigger sp_trigger;
196         tX_seqpar_vtt_loop sp_loop;
197         tX_seqpar_vtt_sync_client sp_sync_client;
198         tX_seqpar_vtt_sync_cycles sp_sync_cycles;
199         tX_seqpar_vtt_lp_enable sp_lp_enable;
200         tX_seqpar_vtt_lp_gain sp_lp_gain;
201         tX_seqpar_vtt_lp_reso sp_lp_reso;
202         tX_seqpar_vtt_lp_freq sp_lp_freq;
203         tX_seqpar_vtt_ec_enable sp_ec_enable;
204         tX_seqpar_vtt_ec_length sp_ec_length;
205         tX_seqpar_vtt_ec_feedback sp_ec_feedback;
206         tX_seqpar_vtt_ec_pan sp_ec_pan;
207         tX_seqpar_vtt_ec_volume sp_ec_volume;
208         tX_seqpar_vtt_mute sp_mute;
209         tX_seqpar_spin sp_spin;
210
211         tx_audiofile *audiofile;
212         f_prec audiofile_pitch_correction;
213
214         list <vtt_fx *> fx_list;
215         list <vtt_fx_stereo_ladspa *> stereo_fx_list;
216                 
217         public:
218         /* Methods */           
219         vtt_class(int);
220         ~vtt_class();
221         
222         static int get_mix_buffer_size() { return mix_buffer_size; }
223         
224         /* Parameter setup methods */
225         void set_name(char *);
226         int set_output_buffer_size(int);
227
228         GdkRGBA* get_color() { return &color; };
229
230         void set_volume(f_prec);
231         void recalc_volume();
232         
233         void set_pan(f_prec);
234         void adjust_to_master_pitch(int master_cycles, int cycles, bool create_event);
235         void set_pitch(f_prec);
236         void recalc_pitch();
237         
238         void set_autotrigger(int);
239         void set_loop(int);
240         
241         void set_mute(int);
242         
243         void set_y_input_parameter(tX_seqpar *);
244         void set_x_input_parameter(tX_seqpar *);
245         
246         void lp_reset();
247         void lp_set_enable(int);
248         void lp_set_gain(f_prec);
249         void lp_set_reso(f_prec);
250         void lp_set_freq(f_prec);
251         void lp_setup(f_prec, f_prec, f_prec);
252         
253         void ec_set_enable(int);
254         void ec_set_length(f_prec);     
255         void ec_set_feedback(f_prec);
256         void ec_set_volume(f_prec);
257         void ec_set_pan(f_prec);
258         void ec_clear_buffer();
259         
260         void set_sync_master(int);              
261         void set_sync_client(int, int);
262         void set_sync_client_ug(int, int); // and update gui
263         
264         void set_scratch(int);
265         void xy_input(f_prec, f_prec);
266
267         vtt_fx_ladspa * add_effect(LADSPA_Plugin *);
268         vtt_fx_stereo_ladspa * add_stereo_effect (LADSPA_Stereo_Plugin *plugin);
269         
270         void calc_speed();
271         void render();
272         void forward_turntable();       
273         
274         static int16_t *render_all_turntables();
275         static void forward_all_turntables();
276         
277         static int set_mix_buffer_size(int);
278         static void set_master_volume(f_prec);
279         static void set_master_pitch(f_prec);
280         static void focus_no(int);
281         static void focus_next();
282         static void unfocus();
283         static void set_sample_rate(int samplerate);
284         void retrigger();
285         int trigger(bool need_lock=true);
286         
287         int stop();
288         int stop_nolock();
289         bool cleanup_required;
290         bool needs_cleaning_up() { return cleanup_required; }
291         
292         int save(FILE *, gzFile rz, char *indent);
293         static int save_all(FILE *, gzFile rz);
294         int load(xmlDocPtr, xmlNodePtr);
295         static int load_all(xmlDocPtr doc, char *fname);
296         static void delete_all();
297
298 #ifdef ENABLE_TX_LEGACY
299         int load_10(FILE *);
300         int load_11(FILE *);
301         int load_12(FILE *);
302         int load_13(FILE *);
303         int load_14(FILE *);
304         
305         static int load_all_10(FILE *, char *fname); /* fname is for display only*/
306         static int load_all_11(FILE *, char *fname); /* fname is for display only*/
307         static int load_all_12(FILE *, char *fname); /* fname is for display only*/
308         static int load_all_13(FILE *, char *fname); /* fname is for display only*/
309         static int load_all_14(FILE *, char *fname); /* fname is for display only*/
310 #endif  
311         
312         tX_audio_error load_file(char *name);   
313
314         void render_scratch();
315         void render_lp();
316         void render_ec();
317         
318         vtt_fx *get_lp_effect() { return lp_fx; }
319         vtt_fx *get_ec_effect() { return ec_fx; }
320         void effect_up(vtt_fx *effect);
321         void effect_down(vtt_fx *effect);
322         void effect_move(vtt_fx *effect, int pos);
323         void effect_remove(vtt_fx_ladspa *effect);
324         
325         void hide_audio(bool);
326         void hide_control(bool);
327         
328         void set_mix_mute(int newstate);
329         void set_mix_solo(int newstate);
330         static int get_last_sample_rate() { return last_sample_rate; }
331         
332         void calc_mute() {
333                 res_mute=((mute) || (mix_mute && (!mix_solo)) || ((solo_ctr>0)&&(!mix_solo)));
334         }
335         
336         static f_prec *get_mix_buffer() { return mix_buffer; }
337 };
338
339 #endif