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