Adding support for writing zlib compressed set files and fixing audio
[terminatorX.git] / src / tX_vtt.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2003  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, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: tX_vtt.h
20  
21     Description: Header to tX_vtt.cc
22     
23     08 Dec 1999 - added audiofile support
24 */    
25
26 #ifndef _h_tx_vtt
27 #define _h_tx_vtt 1
28
29 #include <config.h>
30
31 #include <list>
32 #include "tX_types.h"
33 #include "tX_vttgui.h"
34 #include <pthread.h>
35 #include <float.h>
36 #include <stdio.h>
37 #include "tX_audiofile.h"
38 #include "tX_seqpar.h"
39 #include "tX_vttfx.h"
40 #include "tX_ladspa.h"
41
42 #define EC_MAX_BUFFER 256000
43
44 #define NEED_FADE_OUT 0
45 #define NEED_FADE_IN 1
46
47 #define SAMPLE_MAX    32760.0
48 #define SAMPLE_BORDER 30000.0
49
50 #include <libxml/xmlmemory.h>
51 #include <libxml/parser.h>
52
53 class vtt_class
54 {
55         public:
56         /* class vars */
57         static int vtt_amount;
58         static list <vtt_class *> main_list;
59         static list <vtt_class *> render_list;
60
61         static f_prec *mix_buffer;
62         static f_prec *mix_buffer_end;
63         
64         static int16_t *mix_out_buffer;
65         static f_prec mix_max_l;
66         static f_prec mix_max_r;
67         static int samples_in_mix_buffer;
68         static pthread_mutex_t render_lock;
69         
70         static f_prec master_volume;
71         static f_prec res_master_volume;
72         static f_prec vol_channel_adjust;
73
74         static f_prec saturate_fac;
75         static int do_saturate; 
76         
77         static vtt_class * sync_master;
78         static int master_triggered;
79         static int master_triggered_at;
80         static vtt_class * focused_vtt;
81         static int solo_ctr;
82         static int mix_buffer_size;
83         static int last_sample_rate;
84         
85         /* the gui */
86         vtt_gui gui;
87         bool have_gui;
88         
89         /* main object vars */
90         char name[256]; // Turntable's name
91         char filename[PATH_MAX]; // The corresponding audiofile
92         
93         int is_playing;
94         bool is_sync_master;
95         bool is_sync_client;
96         int sync_cycles;
97         int sync_countdown;
98         bool want_stop;
99         int sense_cycles;
100         
101         bool control_hidden;
102         bool audio_hidden;
103         
104         /* builtin fx */
105         vtt_fx* lp_fx;
106         vtt_fx* ec_fx;
107
108         f_prec max_value;
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         f_prec samples_in_outputbuffer;
117         f_prec inv_samples_in_outputbuffer;
118         
119         /* main playback vars */
120         f_prec rel_volume; // The (user-selected) relative volume
121         f_prec res_volume; // The resulting volume
122         f_prec rel_pitch; // The (user-selected) relative pitch
123         f_prec res_pitch;
124         
125         
126         f_prec pan; // The logical pan value -1 left, 0 center, 1 right
127         f_prec res_volume_left;
128         f_prec res_volume_right;
129         
130         int autotrigger;
131         int loop;
132         
133         d_prec speed;
134         d_prec speed_real;
135         d_prec speed_target;
136         d_prec speed_step;
137         d_prec speed_last;
138         int fade_in;
139         int fade_out;
140         bool do_mute;
141                 
142         d_prec pos_f;
143         unsigned int pos_i;
144         d_prec maxpos;
145         
146         bool mute;
147         bool res_mute;
148         bool res_mute_old;
149         
150         bool mix_mute;
151         bool mix_solo;
152         int fade;
153         
154         /* seq par mapping for x/y axis */
155         tX_seqpar *x_par;
156         tX_seqpar *y_par;
157         
158         /* lp vars */
159         int lp_enable;
160         f_prec lp_gain;
161         f_prec lp_reso;
162         f_prec lp_freq;
163         
164         f_prec lp_buf0;
165         f_prec lp_buf1;
166         f_prec lp_a;
167         f_prec lp_b;
168         f_prec lp_last;
169         f_prec lp_autogain;
170         f_prec lp_resgain;
171         
172         /* echo vars */
173         f_prec ec_buffer[EC_MAX_BUFFER];
174         f_prec *ec_output_buffer;
175         f_prec *ec_delay;
176         f_prec *ec_ptr;
177         int ec_enable;
178         f_prec ec_length;
179         f_prec ec_res_length;
180         f_prec ec_feedback;
181         f_prec ec_pan;
182         f_prec ec_volume;
183         f_prec ec_volume_left;
184         f_prec ec_volume_right;
185         
186         /* sequenceable parameters */
187         tX_seqpar_vtt_speed sp_speed;
188         tX_seqpar_vtt_volume sp_volume;
189         tX_seqpar_vtt_pitch sp_pitch;
190         tX_seqpar_vtt_pan sp_pan;
191         tX_seqpar_vtt_trigger sp_trigger;
192         tX_seqpar_vtt_loop sp_loop;
193         tX_seqpar_vtt_sync_client sp_sync_client;
194         tX_seqpar_vtt_sync_cycles sp_sync_cycles;
195         tX_seqpar_vtt_lp_enable sp_lp_enable;
196         tX_seqpar_vtt_lp_gain sp_lp_gain;
197         tX_seqpar_vtt_lp_reso sp_lp_reso;
198         tX_seqpar_vtt_lp_freq sp_lp_freq;
199         tX_seqpar_vtt_ec_enable sp_ec_enable;
200         tX_seqpar_vtt_ec_length sp_ec_length;
201         tX_seqpar_vtt_ec_feedback sp_ec_feedback;
202         tX_seqpar_vtt_ec_pan sp_ec_pan;
203         tX_seqpar_vtt_ec_volume sp_ec_volume;
204         tX_seqpar_vtt_mute sp_mute;
205         tX_seqpar_spin sp_spin;
206
207         tx_audiofile *audiofile;
208         f_prec audiofile_pitch_correction;
209
210         list <vtt_fx *> fx_list;
211                 
212         public:
213         /* Methods */           
214         vtt_class(int);
215         ~vtt_class();
216         
217         static int get_mix_buffer_size() { return mix_buffer_size; }
218         
219         /* Parameter setup methods */
220         void set_name(char *);
221         int set_output_buffer_size(int);
222
223         void set_volume(f_prec);
224         void recalc_volume();
225         
226         void set_pan(f_prec);
227         
228         void set_pitch(f_prec);
229         void recalc_pitch();
230         
231         void set_autotrigger(int);
232         void set_loop(int);
233         
234         void set_mute(int);
235         
236         void set_y_input_parameter(tX_seqpar *);
237         void set_x_input_parameter(tX_seqpar *);
238         
239         void lp_reset();
240         void lp_set_enable(int);
241         void lp_set_gain(f_prec);
242         void lp_set_reso(f_prec);
243         void lp_set_freq(f_prec);
244         void lp_setup(f_prec, f_prec, f_prec);
245         
246         void ec_set_enable(int);
247         void ec_set_length(f_prec);     
248         void ec_set_feedback(f_prec);
249         void ec_set_volume(f_prec);
250         void ec_set_pan(f_prec);
251         void ec_clear_buffer();
252         
253         void set_sync_master(int);              
254         void set_sync_client(int, int);
255         void set_sync_client_ug(int, int); // and update gui
256         
257         void set_scratch(int);
258         void xy_input(f_prec, f_prec);
259
260         vtt_fx_ladspa * add_effect(LADSPA_Plugin *);
261         
262         void calc_speed();
263         void render();
264         void forward_turntable();       
265         
266         static int16_t *render_all_turntables();
267         static void forward_all_turntables();
268         
269         static int set_mix_buffer_size(int);
270         static void set_master_volume(f_prec);
271         static void set_master_pitch(f_prec);
272         static void enable_saturate(int);
273         static void focus_no(int);
274         static void focus_next();
275         static void unfocus();
276         static void set_sample_rate(int samplerate);
277         int trigger();
278         
279         int stop();
280         int stop_nolock();
281         
282         int save(FILE *, gzFile rz, char *indent);
283         static int save_all(FILE *, gzFile rz);
284         int load(xmlDocPtr, xmlNodePtr);
285         static int load_all(xmlDocPtr doc, char *fname);
286         static void delete_all();
287
288 #ifdef ENABLE_TX_LEGACY
289         int load_10(FILE *);
290         int load_11(FILE *);
291         int load_12(FILE *);
292         int load_13(FILE *);
293         int load_14(FILE *);
294         
295         static int load_all_10(FILE *, char *fname); /* fname is for display only*/
296         static int load_all_11(FILE *, char *fname); /* fname is for display only*/
297         static int load_all_12(FILE *, char *fname); /* fname is for display only*/
298         static int load_all_13(FILE *, char *fname); /* fname is for display only*/
299         static int load_all_14(FILE *, char *fname); /* fname is for display only*/
300 #endif  
301         
302         tX_audio_error load_file(char *name);   
303
304         void render_scratch();
305         void render_lp();
306         void render_ec();
307         
308         void effect_up(vtt_fx *effect);
309         void effect_down(vtt_fx *effect);
310         void effect_remove(vtt_fx_ladspa *effect);
311         
312         void hide_audio(bool);
313         void hide_control(bool);
314         
315         void set_mix_mute(int newstate);
316         void set_mix_solo(int newstate);
317         static int get_last_sample_rate() { return last_sample_rate; }
318         
319         void calc_mute()
320         {
321                 res_mute=((mute) || (mix_mute && (!mix_solo)) || ((solo_ctr>0)&&(!mix_solo)));
322         }
323 };
324
325 #endif