cd5ae45d184943aa918448f7075dc2f1024dbebc
[terminatorX.git] / src / tX_vtt.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999, 2000  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 #ifdef DONT_USE_FLASH
32 #undef USE_FLASH
33 #else
34 #define USE_FLASH 1
35 #endif
36
37 #include <list>
38 #include "tX_types.h"
39 #include "tX_vttgui.h"
40 #include <pthread.h>
41 #include <float.h>
42 #include <stdio.h>
43 #include "tX_audiofile.h"
44 #include "tX_seqpar.h"
45 #include "tX_vttfx.h"
46 #include "tX_ladspa.h"
47
48 #ifdef USE_3DNOW
49 #include "3dnow.h"
50 #endif
51
52 #define EC_MAX_BUFFER 256000
53
54 #define CONTROL_NOTHING 0
55 #define CONTROL_SCRATCH 1
56 #define CONTROL_VOLUME 2
57 #define CONTROL_CUTOFF 3
58 #define CONTROL_FEEDBACK 4
59
60 #define NEED_FADE_OUT 0
61 #define NEED_FADE_IN 1
62
63 #define SAMPLE_MAX    32760.0
64 #define SAMPLE_BORDER 30000.0
65
66
67 class vtt_class
68 {
69         public:
70         /* class vars */
71         static int vtt_amount;
72         static list <vtt_class *> main_list;
73         static list <vtt_class *> render_list;
74
75         static f_prec *mix_buffer;
76         static f_prec *mix_buffer_end;
77         
78         static int16_t *mix_out_buffer;
79         static f_prec mix_max;
80         static int samples_in_mix_buffer;
81         static pthread_mutex_t render_lock;
82         static pthread_mutex_t main_lock;
83         
84         static f_prec master_volume;
85         static f_prec res_master_volume;
86         static f_prec vol_channel_adjust;
87
88         static f_prec saturate_fac;
89         static int do_saturate; 
90         
91         static vtt_class * sync_master;
92         static int master_triggered;
93         static int master_triggered_at;
94         static vtt_class * focused_vtt;
95         
96         /* the gui */
97         vtt_gui gui;
98         int have_gui;
99         
100         /* main object vars */
101         char name[256]; // Turntable's name
102         char filename[PATH_MAX]; // The corresponding audiofile
103         
104         int is_playing;
105         int is_sync_master;
106         int is_sync_client;
107         int sync_cycles;
108         int sync_countdown;
109         int want_stop;
110         int sense_cycles;
111         
112         /* builtin fx */
113         vtt_fx* lp_fx;
114         vtt_fx* ec_fx;
115
116 #ifdef USE_FLASH
117         f_prec max_value;
118 #endif
119         
120         int16_t *buffer;        // Actual audio data
121         int samples_in_buffer;  // No. of samples in audio data
122         int do_scratch;
123         
124         f_prec *output_buffer; 
125         f_prec *end_of_outputbuffer;
126         f_prec samples_in_outputbuffer;
127         f_prec inv_samples_in_outputbuffer;
128         
129         /* main playback vars */
130         f_prec rel_volume; // The (user-selected) relative volume
131         f_prec res_volume; // The resulting volume
132 #ifdef USE_3DNOW
133         mmx_t mm_res_volume;
134 #endif  
135         f_prec rel_pitch; // The (user-selected) relative pitch
136         f_prec res_pitch;
137         
138         int autotrigger;
139         int loop;
140         
141         d_prec speed;
142         d_prec speed_real;
143         d_prec speed_target;
144         d_prec speed_step;
145         d_prec speed_last;
146         int fade_in;
147         int fade_out;
148         int do_mute;
149                 
150         d_prec pos_f;
151         unsigned int pos_i;
152         d_prec maxpos;
153         
154         int mute;
155         int mute_old;
156         int fade;
157         
158         /* input control vars */
159         int x_control;
160         int y_control;
161
162         /* seq par mapping for x/y axis */
163         tX_seqpar *x_par;
164         tX_seqpar *y_par;
165         
166         /* lp vars */
167         int lp_enable;
168         f_prec lp_gain;
169         f_prec lp_reso;
170         f_prec lp_freq;
171         
172         f_prec lp_buf0;
173         f_prec lp_buf1;
174         f_prec lp_a;
175         f_prec lp_b;
176         f_prec lp_last;
177         f_prec lp_autogain;
178         f_prec lp_resgain;
179         
180         /* echo vars */
181         f_prec ec_buffer[EC_MAX_BUFFER];
182         f_prec *ec_delay;
183         f_prec *ec_ptr;
184         int ec_enable;
185         f_prec ec_length;
186         f_prec ec_res_length;
187         f_prec ec_feedback;
188         
189         /* sequenceable parameters */
190         tX_seqpar_vtt_speed sp_speed;
191         tX_seqpar_vtt_volume sp_volume;
192         tX_seqpar_vtt_pitch sp_pitch;
193         tX_seqpar_vtt_trigger sp_trigger;
194         tX_seqpar_vtt_loop sp_loop;
195         tX_seqpar_vtt_sync_client sp_sync_client;
196         tX_seqpar_vtt_sync_cycles sp_sync_cycles;
197         tX_seqpar_vtt_lp_enable sp_lp_enable;
198         tX_seqpar_vtt_lp_gain sp_lp_gain;
199         tX_seqpar_vtt_lp_reso sp_lp_reso;
200         tX_seqpar_vtt_lp_freq sp_lp_freq;
201         tX_seqpar_vtt_ec_enable sp_ec_enable;
202         tX_seqpar_vtt_ec_length sp_ec_length;
203         tX_seqpar_vtt_ec_feedback sp_ec_feedback;
204         tX_seqpar_vtt_mute sp_mute;
205         tX_seqpar_spin sp_spin;
206
207         tx_audiofile *audiofile;
208
209         list <vtt_fx *> fx_list;
210                 
211         public:
212         /* Methods */           
213         vtt_class(int);
214         ~vtt_class();
215         
216         /* Parameter setup methods */
217         void set_name(char *);
218 /*      Obsolete        
219         void set_file_data(char *, int16_t *, int);
220 */      
221         int set_output_buffer_size(int);
222
223         void set_volume(f_prec);
224         void recalc_volume();
225         
226         void set_pitch(f_prec);
227         void recalc_pitch();
228         
229         void set_autotrigger(int);
230         void set_loop(int);
231         
232         void set_mute(int);
233         
234         void set_controls(int, int);
235         void set_y_input_parameter(tX_seqpar *);
236         void set_x_input_parameter(tX_seqpar *);
237         
238         void lp_set_enable(int);
239         void lp_set_gain(f_prec);
240         void lp_set_reso(f_prec);
241         void lp_set_freq(f_prec);
242         void lp_setup(f_prec, f_prec, f_prec);
243         
244         void ec_set_enable(int);
245         void ec_set_length(f_prec);     
246         void ec_set_feedback(f_prec);
247         void ec_clear_buffer();
248         
249         void set_sync_master(int);              
250         void set_sync_client(int, int);
251         void set_sync_client_ug(int, int); // and update gui
252         
253         void set_scratch(int);
254         void xy_input(f_prec, f_prec);
255         void handle_input(int, f_prec);
256
257         vtt_fx_ladspa * add_effect(LADSPA_Plugin *);
258         
259         void calc_speed();
260         void render();
261         void forward_turntable();       
262         
263         static int16_t *render_all_turntables();
264         static void forward_all_turntables();
265         
266         static int set_mix_buffer_size(int);
267         static void set_master_volume(f_prec);
268         static void set_master_pitch(f_prec);
269         static void enable_saturate(int);
270         static void focus_no(int);
271         static void focus_next();
272         static void unfocus();  
273         int trigger();
274         
275         int stop();
276         int stop_nolock();
277         
278         int save(FILE *);
279         int load_10(FILE *);
280         int load_11(FILE *);
281         int load_12(FILE *);
282         
283         static int load_all_10(FILE *, char *fname); /* fname is for display only*/
284         static int load_all_11(FILE *, char *fname); /* fname is for display only*/
285         static int load_all_12(FILE *, char *fname); /* fname is for display only*/
286         static int save_all(FILE *);
287         int load_file(char *name);      
288
289         void render_scratch();
290         void render_lp();
291         void render_ec();
292         
293         void effect_up(vtt_fx *effect);
294         void effect_down(vtt_fx *effect);
295         void effect_remove(vtt_fx_ladspa *effect);
296 };
297
298 #endif