2 terminatorX - realtime audio scratching software
3 Copyright (C) 1999-2002 Alexander König
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.
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.
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.
21 Description: This implements the new virtual turntable class. It replaces
22 the old turntable.c from terminatorX 3.2 and earlier. The lowpass
23 filter is based on some sample code by Paul Kellett
24 <paul.kellett@maxim.abel.co.uk>
26 08 Dec 1999 - Switched to the new audiofile class
30 #include "tX_global.h"
34 #include "tX_mastergui.h"
35 #include "tX_sequencer.h"
48 #define tX_freemem(ptr, varname, comment); fprintf(stderr, "** free() [%s] at %08x. %s.\n", varname, ptr, comment); free(ptr);
49 #define tX_malloc(ptr, varname, comment, size, type); fprintf(stderr, "**[1/2] malloc() [%s]. Size: %i. %s.\n", varname, size, comment); ptr=type malloc(size); fprintf(stderr, "**[2/2] malloc() [%s]. ptr: %08x.\n", varname, ptr);
51 #define tX_freemem(ptr, varname, comment); free(ptr);
52 #define tX_malloc(ptr, varname, comment, size, type); ptr=type malloc(size);
55 #include "tX_loaddlg.h"
57 #define USE_PREFETCH 1
60 #define my_prefetch(base, index); __asm__ __volatile__ ("prefetch index(%0)\n" : : "r" (base));
61 #define my_prefetchw(base, index); __asm__ __volatile__ ("prefetchw index(%0)\n" : : "r" (base));
63 #define my_prefetch(base, index); /* NOP */;
64 #define my_prefetchw(base, index); /* NOP */;
67 extern void build_vtt_gui(vtt_class *);
68 extern void gui_set_name(vtt_class *vtt, char *newname);
69 extern void gui_set_filename(vtt_class *vtt, char *newname);
70 extern void delete_gui(vtt_class *vtt);
71 extern void gui_update_display(vtt_class *vtt);
72 extern void gui_clear_master_button(vtt_class *vtt);
73 extern void cleanup_vtt(vtt_class *vtt);
74 extern int vg_get_current_page(vtt_class *vtt);
76 int vtt_class::vtt_amount=0;
77 list <vtt_class *> vtt_class::main_list;
78 list <vtt_class *> vtt_class::render_list;
79 int16_t* vtt_class::mix_out_buffer=NULL;
80 f_prec * vtt_class::mix_buffer=NULL;
81 f_prec * vtt_class::mix_buffer_end=NULL;
82 int vtt_class::solo_ctr=0;
84 int vtt_class::samples_in_mix_buffer=0;
85 pthread_mutex_t vtt_class::render_lock=PTHREAD_MUTEX_INITIALIZER;
86 f_prec vtt_class::master_volume=1.0;
87 f_prec vtt_class::res_master_volume=1.0;
88 f_prec vtt_class::saturate_fac=0.1;
89 int vtt_class::do_saturate=0;
90 vtt_class * vtt_class::sync_master=NULL;
91 int vtt_class::master_triggered=0;
92 int vtt_class::master_triggered_at=0;
93 vtt_class * vtt_class::focused_vtt=NULL;
94 f_prec vtt_class::mix_max_l=0;
95 f_prec vtt_class::mix_max_r=0;
96 f_prec vtt_class::vol_channel_adjust=1.0;
98 #define GAIN_AUTO_ADJUST 0.8
100 vtt_class :: vtt_class (int do_create_gui)
103 sprintf (name, "Turntable %i", vtt_amount);
104 strcpy(filename, "NONE");
124 lp_setup(lp_gain, lp_reso, lp_freq);
135 main_list.push_back(this);
137 /* "connecting" the seq-parameters */
139 sp_speed.set_vtt((void *) this);
140 sp_volume.set_vtt((void *) this);
141 sp_pitch.set_vtt((void *) this);
142 sp_pan.set_vtt((void *) this);
143 sp_trigger.set_vtt((void *) this);
144 sp_loop.set_vtt((void *) this);
145 sp_sync_client.set_vtt((void *) this);
146 sp_sync_cycles.set_vtt((void *) this);
147 sp_lp_enable.set_vtt((void *) this);
148 sp_lp_gain.set_vtt((void *) this);
149 sp_lp_reso.set_vtt((void *) this);
150 sp_lp_freq.set_vtt((void *) this);
151 sp_ec_enable.set_vtt((void *) this);
152 sp_ec_length.set_vtt((void *) this);
153 sp_ec_pan.set_vtt((void *) this);
154 sp_ec_volume.set_vtt((void *) this);
155 sp_ec_feedback.set_vtt((void *) this);
156 sp_mute.set_vtt((void *) this);
157 sp_spin.set_vtt((void *) this);
162 lp_fx=new vtt_fx_lp();
163 lp_fx->set_vtt((void *) this);
164 fx_list.push_back(lp_fx);
166 ec_fx=new vtt_fx_ec();
167 ec_fx->set_vtt((void *) this);
168 fx_list.push_back(ec_fx);
173 lp_fx->set_panel_widget(gui.lp_panel->get_widget());
174 ec_fx->set_panel_widget(gui.ec_panel->get_widget());
179 set_master_volume(globals.volume);
180 set_output_buffer_size(samples_in_mix_buffer/2);
183 audiofile_pitch_correction=0;
190 control_hidden=false;
\r
193 vtt_class :: ~vtt_class()
198 main_list.remove(this);
199 if (audiofile) delete audiofile;
200 //if (buffer) free(buffer);
201 if (output_buffer) tX_freemem(output_buffer, "output_buffer", "vtt Destructor");
204 while (fx_list.size())
206 effect=(*fx_list.begin());
207 fx_list.remove(effect);
214 void vtt_class :: set_name(char *newname)
216 strcpy(name, newname);
217 gui_set_name(this, name);
220 int vtt_class :: load_file(char *fname)
223 int was_playing=is_playing;
225 if (is_playing) stop();
227 if (audiofile) delete(audiofile);
234 audiofile=new tx_audiofile();
235 res=audiofile->load(fname);
237 if (res==TX_AUDIO_SUCCESS) {
238 buffer=audiofile->get_buffer();
239 double file_rate=audiofile->get_sample_rate();
240 audiofile_pitch_correction=file_rate/44100.0;
242 samples_in_buffer=audiofile->get_no_samples();
243 maxpos=audiofile->get_no_samples();
244 strcpy(filename, fname);
245 if (was_playing) trigger();
246 // printf("Successfully loaded %s, %08x, %i\n", fname, buffer, samples_in_buffer);
251 gui_update_display(this);
253 ec_set_length(ec_length);
258 int vtt_class :: set_output_buffer_size(int newsize)
260 list <vtt_fx *> :: iterator effect;
262 if (ec_output_buffer) tX_freemem(ec_output_buffer, "ec_output_buffer", "vtt set_output_buffer_size()");
263 tX_malloc(ec_output_buffer, "ec_output_buffer", "vtt set_output_buffer_size()", sizeof(float)*newsize, (float *));
265 if (output_buffer) tX_freemem(output_buffer, "output_buffer", "vtt set_output_buffer_size()");
266 tX_malloc(output_buffer, "output_buffer", "vtt set_output_buffer_size()", sizeof(float)*newsize, (float *));
268 end_of_outputbuffer = output_buffer + newsize; //size_t(sizeof(float)*(newsize));
270 samples_in_outputbuffer=newsize;
271 inv_samples_in_outputbuffer=1.0/samples_in_outputbuffer;
273 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
275 (*effect)->reconnect_buffer();
278 if (output_buffer) return(0);
282 void vtt_class :: set_volume(f_prec newvol)
288 void vtt_class :: recalc_volume()
290 res_volume=rel_volume*res_master_volume;
291 f_prec ec_res_volume=res_volume*ec_volume;
295 res_volume_left=(1.0-pan)*res_volume;
296 res_volume_right=res_volume;
300 res_volume_left=res_volume;
301 res_volume_right=(1.0+pan)*res_volume;
305 res_volume_left=res_volume_right=res_volume;
310 ec_volume_left=(1.0-ec_pan)*ec_res_volume;
311 ec_volume_right=ec_res_volume;
315 ec_volume_left=ec_res_volume;
316 ec_volume_right=(1.0+ec_pan)*ec_res_volume;
320 ec_volume_left=ec_volume_right=ec_res_volume;
322 // printf("vtt_volume: %f, %f, l: %f, r: %f\n", rel_volume, res_volume, res_volume_left, res_volume_right);
325 mm_res_volume.s[0]=mm_res_volume.s[1]=res_volume;
329 void vtt_class :: set_pan(f_prec newpan)
335 void vtt_class :: set_pitch(f_prec newpitch)
338 // res_pitch=fabs(globals.pitch)*rel_pitch;
339 res_pitch=globals.pitch*rel_pitch;
341 ec_set_length(ec_length);
344 void vtt_class :: recalc_pitch()
346 // res_pitch=fabs(globals.pitch)*rel_pitch;
347 res_pitch=globals.pitch*rel_pitch;
348 res_pitch*=audiofile_pitch_correction;
350 ec_set_length(ec_length);
353 void vtt_class :: set_autotrigger(int newstate)
355 autotrigger=newstate;
358 void vtt_class :: set_loop(int newstate)
363 void vtt_class :: set_mute(int newstate)
369 void vtt_class :: set_mix_mute(int newstate)
375 void vtt_class :: set_mix_solo(int newstate)
377 if (mix_solo && !newstate)
383 else if (!mix_solo && newstate)
392 list <vtt_class *> :: iterator vtt;
394 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++)
400 void vtt_class :: lp_set_enable (int newstate)
406 void vtt_class :: lp_reset()
411 void vtt_class :: lp_set_gain (f_prec gain)
414 lp_resgain=lp_gain*lp_autogain;
417 void vtt_class :: lp_set_reso(f_prec reso)
421 lp_b=reso*(1.0+(1.0/lp_a));
422 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
423 lp_resgain=lp_gain*lp_autogain;
426 void vtt_class :: lp_set_freq(f_prec freq)
431 lp_b=lp_reso*(1.0+(1.0/lp_a));
434 void vtt_class :: lp_setup(f_prec gain, f_prec reso, f_prec freq)
440 lp_b=reso*(1.0+(1.0/lp_a));
442 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
443 lp_resgain=lp_gain*lp_autogain;
446 void vtt_class :: ec_set_enable(int newstate)
453 void vtt_class :: ec_set_pan(f_prec pan)
460 /* Max length is 1.0 */
462 void vtt_class :: ec_set_length(f_prec length)
469 ec_res_length=length*samples_in_buffer;
473 ec_res_length=length*samples_in_buffer/res_pitch;
476 if (ec_res_length<0) ec_res_length*=-1;
478 if (ec_res_length>=EC_MAX_BUFFER)
480 ec_res_length=EC_MAX_BUFFER*length;
483 delay=(int )floor(ec_res_length);
485 ec_delay=&ec_buffer[delay];
488 void vtt_class :: ec_set_feedback(f_prec feedback)
490 ec_feedback=feedback;
494 void vtt_class :: ec_set_volume(f_prec volume)
500 void vtt_class :: ec_clear_buffer()
504 for (ptr=ec_buffer; ptr<=ec_delay; ptr++)
511 void vtt_class :: render()
513 list <vtt_fx *> :: iterator effect;
520 if (sense_cycles==0) sp_speed.receive_input_value(0);
525 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
527 if ((*effect)->isEnabled()) (*effect)->run();
531 extern void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin);
533 vtt_fx_ladspa * vtt_class :: add_effect (LADSPA_Plugin *plugin)
535 vtt_fx_ladspa *new_effect;
537 new_effect = new vtt_fx_ladspa (plugin, this);
538 pthread_mutex_lock(&render_lock);
539 fx_list.push_back(new_effect);
540 if (is_playing) new_effect->activate();
541 pthread_mutex_unlock(&render_lock);
542 vg_create_fx_gui(this, new_effect, plugin);
547 void vtt_class :: calc_speed()
549 do_mute=fade_out=fade_in=0;
551 if (speed != speed_target)
554 speed_step=speed_target-speed_real;
558 if (speed_target != speed_real)
560 speed_real+=speed_step;
561 if ((speed_step<0) && (speed_real<speed_target)) speed_real=speed_target;
563 if ((speed_step>0) && (speed_real>speed_target)) speed_real=speed_target;
568 if ((speed_last==0) && (speed_real !=0))
576 if ((speed_last!=0) && (speed_real==0))
583 speed_last = speed_real;
585 if (res_mute != res_mute_old)
589 fade_out=1; fade_in=0;
594 fade_in=1; fade_out=0;
597 res_mute_old=res_mute;
601 if (res_mute) do_mute=1;
605 void vtt_class :: render_scratch()
626 for (sample =0,out=output_buffer, fade_vol=0.0; sample < samples_in_outputbuffer;sample++, out++, fade_vol+=inv_samples_in_outputbuffer)
628 if ((speed_real!=0) || (fade_out))
643 master_triggered_at=sample;
663 master_triggered_at=sample;
673 pos_a_f=floor(pos_f);
674 pos_i=(unsigned int) pos_a_f;
676 amount_b=pos_f-pos_a_f;
677 amount_a=1.0-amount_b;
686 sample_a=(f_prec) *ptr;
688 if (pos_i == samples_in_buffer)
695 sample_b=(f_prec) *ptr;
698 sample_res=(sample_a*amount_a)+(sample_b*amount_b);
702 sample_res*=fade_vol;
707 sample_res*=1.0-fade_vol;
720 void vtt_class :: forward_turntable()
731 if ((speed_real==0) && (!fade_out)) return;
734 /* following code is problematic as adding speed_real*n is
735 different from adding speed_real n times to pos_f.
737 well it speeds things up quite a bit and double precision
738 seems to do a satisfying job.
740 #define pos_f_test to prove that.
743 pos_f_tmp=pos_f+speed_real*samples_in_outputbuffer;
745 if ((pos_f_tmp > 0) && (pos_f_tmp < maxpos))
755 /* now the slow way ;) */
757 for (sample =0; sample < samples_in_outputbuffer; sample++)
771 master_triggered_at=sample;
791 master_triggered_at=sample;
805 diff=pos_f_tmp-pos_f;
806 if (diff!=0) printf("fast: %f, slow: %f, diff: %f, tt: %s\n", pos_f_tmp, pos_f, diff, name);
812 The following lowpass filter is based on some sample code by
813 Paul Kellett <paul.kellett@maxim.abel.co.uk>
816 void vtt_class :: render_lp()
820 for (sample = output_buffer; sample<end_of_outputbuffer; sample++)
822 lp_buf0 = lp_a * lp_buf0 + lp_freq * ((*sample)*lp_resgain + lp_b * (lp_buf0 - lp_buf1));
823 lp_buf1 = lp_a * lp_buf1 + lp_freq * lp_buf0;
829 void vtt_class :: render_ec()
835 for (i=0, sample = output_buffer, ec_sample=ec_output_buffer; i<samples_in_outputbuffer; i++, ec_sample++,sample++, ec_ptr++)
837 if (ec_ptr>ec_delay) ec_ptr=ec_buffer;
838 *ec_sample=(*ec_ptr) *ec_feedback;
839 *ec_ptr=*sample+*ec_sample;
843 int vtt_class :: set_mix_buffer_size(int no_samples)
845 list <vtt_class *> :: iterator vtt;
848 // printf("vtt_class::set_mix_buffer_size(), mix_buffer: %12x, mix_out: %12x, samples: %i\n", mix_buffer, mix_out_buffer, no_samples);
850 if (mix_buffer) tX_freemem(mix_buffer, "mix_buffer", "vtt set_mix_buffer_size()");
851 samples_in_mix_buffer=no_samples*2;
853 tX_malloc(mix_buffer, "mix_buffer", "vtt set_mix_buffer_size()", sizeof(float)*samples_in_mix_buffer, (float *));
854 mix_buffer_end=mix_buffer+samples_in_mix_buffer;
856 // printf("mix_buffer: %12x\n", mix_buffer);
857 // printf("mix_samples: %i, out_samples: %i", samples_in_mix_buffer, no_samples);
859 if (mix_out_buffer) tX_freemem(mix_out_buffer, "mix_out_buffer", "vtt set_mix_buffer_size()");
860 tX_malloc(mix_out_buffer, "mix_out_buffer", "vtt set_mix_buffer_size()", sizeof(int16_t)*samples_in_mix_buffer + 4, (int16_t *));
862 // printf("mix_out_buffer: %12x\n", mix_out_buffer);
864 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
866 res|=(*vtt)->set_output_buffer_size(no_samples);
869 if ((!mix_buffer) || (!mix_out_buffer) || res) return(1);
873 int16_t * vtt_class :: render_all_turntables()
875 list <vtt_class *> :: iterator vtt, next;
896 #ifndef OVERRIDE_MOVQ_AUTODETECT
898 #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
899 #endif /* GCC_VERSION */
901 #if (GCC_VERSION < 2096)
902 #warning "*************************"
903 #warning "* gcc < 2.96 *"
904 #warning "* assuming working movq *"
905 #warning "*************************"
906 #undef GCC_MOVQ_BUG_WORKAROUND
908 #warning "*************************"
909 #warning "* gcc >= 2.96 *"
910 #warning "* using movq-workaround *"
911 #warning "*************************"
912 #define GCC_MOVQ_BUG_WORKAROUND 1
913 #endif /* GCC < 2.96 */
914 #endif /* OVERRIDE MOVQ AUTODETECVT */
916 #ifdef GCC_MOVQ_BUG_WORKAROUND
917 /* REQUIRED DUE TO GCC BUG (2.96-3.0.2) */
918 mmx_t *mm_src1_ptr=&mm_src1;
919 mmx_t *mm_src2_ptr=&mm_src2;
920 mmx_t *mm_volume_ptr=&mm_volume;
921 mmx_t *mm_max_ptr=&mm_max;
922 mmx_t *mm_min_ptr=&mm_min;
924 #define MM_VAR_ACC(var) (* var ## _ptr)
925 #define MM_VAR_MOVQ(var) * var ## _ptr
927 #define MM_VAR_ACC(var) var
928 #define MM_VAR_MOVQ(var) var
930 int32_t *temp_int=&mm_max.d[1];
934 pthread_mutex_lock(&render_lock);
936 if (render_list.size()==0)
938 for (sample=0; sample<samples_in_mix_buffer; sample++)
940 mix_out_buffer[sample]=0;
945 vtt=render_list.begin();
947 max=(*vtt)->max_value;
951 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
953 temp=(*vtt)->output_buffer[sample];
954 mix_buffer[mix_sample]=temp*(*vtt)->res_volume_left;
956 mix_buffer[mix_sample]=temp*(*vtt)->res_volume_right;
959 if (temp>max) max=temp;
960 else if (temp<min) min=temp;
963 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->res_volume_left;
964 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->res_volume_right;
966 MM_VAR_ACC(mm_max).s[1]=MM_VAR_ACC(mm_max).s[0]=max;
967 MM_VAR_ACC(mm_min).s[1]=MM_VAR_ACC(mm_min).s[0]=min;
969 movq_m2r(MM_VAR_MOVQ(mm_max), mm1);
970 movq_m2r(MM_VAR_MOVQ(mm_min), mm2);
972 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
974 mix=(mmx_t*)mix_buffer;
976 for (f_prec* src=(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end;)
979 MM_VAR_ACC(mm_src1).s[0]=*src;
980 MM_VAR_ACC(mm_src1).s[1]=*src;
982 /* sample * l/r volume */
983 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
989 MM_VAR_ACC(mm_src2).s[0]=*src;
990 MM_VAR_ACC(mm_src2).s[1]=*src;
992 /* sample * l/r volume */
993 movq_m2r(MM_VAR_MOVQ(mm_src2), mm3);
997 /* calculating min/max */
998 MM_VAR_ACC(mm_src1).s[1]=MM_VAR_ACC(mm_src2).s[0];
999 movq_m2r(mm_src1, mm3);
1000 pfmax_r2r(mm3, mm1);
1001 pfmin_r2r(mm3, mm2);
1006 movq_r2m(mm1, MM_VAR_MOVQ(mm_max));
1007 movq_r2m(mm2, MM_VAR_MOVQ(mm_min));
1011 if (MM_VAR_ACC(mm_max).s[0]>MM_VAR_ACC(mm_max).s[1]) max=MM_VAR_ACC(mm_max).s[0]; else max=MM_VAR_ACC(mm_max).s[1];
1012 if (MM_VAR_ACC(mm_min).s[0]<MM_VAR_ACC(mm_min).s[0]) min=MM_VAR_ACC(mm_min).s[0]; else min=MM_VAR_ACC(mm_min).s[1];
1016 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
1018 if ((*vtt)->ec_enable)
1021 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1023 temp=(*vtt)->ec_output_buffer[sample];
1025 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_left;
1027 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_right;
1031 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->ec_volume_left;
1032 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->ec_volume_right;
1034 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1035 mix =(mmx_t*)mix_buffer;
1037 for (f_prec* src=(*vtt)->ec_output_buffer; mix < (mmx_t*) mix_buffer_end; src++, mix++)
1040 MM_VAR_ACC(mm_src1).s[0]=*src;
1041 MM_VAR_ACC(mm_src1).s[1]=*src;
1043 /* sample * l/r volume */
1044 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1045 pfmul_r2r(mm0, mm3);
1047 /* accumulating complete mix */
1048 movq_m2r(*mix, mm4);
1049 pfadd_r2r(mm4, mm3);
1050 movq_r2m(mm3, *mix);
1056 if (master_triggered)
1058 pthread_mutex_unlock(&render_lock);
1059 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1061 if ((*vtt)->is_sync_client)
1063 if ((*vtt)->sync_countdown)
1065 (*vtt)->sync_countdown--;
1069 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1074 pthread_mutex_lock(&render_lock);
1077 vtt=render_list.begin();
1078 for (vtt++; vtt!=render_list.end(); vtt++)
1081 max=(*vtt)->max_value;
1085 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1087 temp=(*vtt)->output_buffer[sample];
1088 mix_buffer[mix_sample]+=temp*(*vtt)->res_volume_left;
1090 mix_buffer[mix_sample]+=temp*(*vtt)->res_volume_right;
1093 if (temp>max) max=temp;
1094 else if (temp<min) min=temp;
1097 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->res_volume_left;
1098 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->res_volume_right;
1100 MM_VAR_ACC(mm_max).s[1]=MM_VAR_ACC(mm_max).s[0]=max;
1101 MM_VAR_ACC(mm_min).s[1]=MM_VAR_ACC(mm_min).s[0]=min;
1103 movq_m2r(MM_VAR_MOVQ(mm_max), mm1);
1104 movq_m2r(MM_VAR_MOVQ(mm_min), mm2);
1106 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1107 mix=(mmx_t*)mix_buffer;
1109 for (f_prec* src=(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end;)
1112 MM_VAR_ACC(mm_src1).s[0]=*src;
1113 MM_VAR_ACC(mm_src1).s[1]=*src;
1115 /* sample * l/r volume */
1116 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1117 pfmul_r2r(mm0, mm3);
1119 /* accumulating complete mix */
1120 movq_m2r(*mix, mm4);
1121 pfadd_r2r(mm4, mm3);
1122 movq_r2m(mm3, *mix);
1126 MM_VAR_ACC(mm_src2).s[0]=*src;
1127 MM_VAR_ACC(mm_src2).s[1]=*src;
1129 /* sample * l/r volume */
1130 movq_m2r(MM_VAR_MOVQ(mm_src2), mm3);
1131 pfmul_r2r(mm0, mm3);
1133 /* accumulating complete mix */
1134 movq_m2r(*mix, mm4);
1135 pfadd_r2r(mm4, mm3);
1136 movq_r2m(mm3, *mix);
1138 /* calculating min/max */
1139 MM_VAR_ACC(mm_src1).s[1]=MM_VAR_ACC(mm_src2).s[0];
1140 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1141 pfmax_r2r(mm3, mm1);
1142 pfmin_r2r(mm3, mm2);
1147 movq_r2m(mm1, MM_VAR_MOVQ(mm_max));
1148 movq_r2m(mm2, MM_VAR_MOVQ(mm_min));
1152 if (MM_VAR_ACC(mm_max).s[0]>MM_VAR_ACC(mm_max).s[1]) max=MM_VAR_ACC(mm_max).s[0]; else max=MM_VAR_ACC(mm_max).s[1];
1153 if (MM_VAR_ACC(mm_min).s[0]<MM_VAR_ACC(mm_min).s[0]) min=MM_VAR_ACC(mm_min).s[0]; else min=MM_VAR_ACC(mm_min).s[1];
1157 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
1159 if ((*vtt)->ec_enable)
1162 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1164 temp=(*vtt)->ec_output_buffer[sample];
1166 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_left;
1168 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_right;
1172 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->ec_volume_left;
1173 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->ec_volume_right;
1175 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1176 mix =(mmx_t*)mix_buffer;
1178 for (f_prec* src=(*vtt)->ec_output_buffer; mix < (mmx_t*) mix_buffer_end; src++, mix++)
1181 MM_VAR_ACC(mm_src1).s[0]=*src;
1182 MM_VAR_ACC(mm_src1).s[1]=*src;
1184 /* sample * l/r volume */
1185 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1186 pfmul_r2r(mm0, mm3);
1188 /* accumulating complete mix */
1189 movq_m2r(*mix, mm4);
1190 pfadd_r2r(mm4, mm3);
1191 movq_r2m(mm3, *mix);
1204 for (sample=0; sample<samples_in_mix_buffer; sample+=2)
1206 temp=mix_buffer[sample];
1207 mix_out_buffer[sample]=(int16_t) temp;
1209 if (temp>max) max=temp;
1210 else if (temp<min) min=temp;
1214 if (min>max) mix_max_l=min; else mix_max_l=max;
1221 for (sample=1; sample<samples_in_mix_buffer; sample+=2)
1223 temp=mix_buffer[sample];
1224 mix_out_buffer[sample]=(int16_t) temp;
1226 if (temp>max) max=temp;
1227 else if (temp<min) min=temp;
1231 if (min>max) mix_max_r=min; else mix_max_r=max;
1236 vtt=render_list.begin();
1237 while (vtt!=render_list.end())
1242 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1245 pthread_mutex_unlock(&render_lock);
1247 return(mix_out_buffer);
1250 void vtt_class :: forward_all_turntables()
1252 list <vtt_class *> :: iterator vtt, next;
1254 if (render_list.size()>0)
1256 vtt=render_list.begin();
1257 (*vtt)->forward_turntable();
1259 if (master_triggered)
1261 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1263 if ((*vtt)->is_sync_client)
1265 if ((*vtt)->sync_countdown)
1267 (*vtt)->sync_countdown--;
1271 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1278 vtt=render_list.begin();
1279 for (vtt++; vtt!=render_list.end(); vtt++)
1281 (*vtt)->forward_turntable();
1286 vtt=render_list.begin();
1287 while (vtt!=render_list.end())
1292 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1298 int vtt_class :: trigger()
1300 list <vtt_fx *> :: iterator effect;
1302 if (!buffer) return (1);
1304 if (!is_playing) pthread_mutex_lock(&render_lock);
1306 if (res_pitch>=0) pos_f=0;
1310 speed_real=res_pitch;
1311 speed_target=res_pitch;
1314 /* activating plugins */
1315 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1317 (*effect)->activate();
1328 master_triggered_at=0;
1337 render_list.push_front(this);
1341 render_list.push_back(this);
1343 pthread_mutex_unlock(&render_lock);
1348 int vtt_class :: stop_nolock()
1350 list <vtt_fx *> :: iterator effect;
1354 pthread_mutex_unlock(&render_lock);
1357 render_list.remove(this);
1368 /* deactivating plugins */
1369 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1371 (*effect)->deactivate();
1377 int vtt_class :: stop()
1381 pthread_mutex_lock(&render_lock);
1385 pthread_mutex_unlock(&render_lock);
1390 void vtt_class :: set_sync_master(int master)
1394 if (sync_master) sync_master->set_sync_master(0);
1400 if (sync_master==this) sync_master=0;
1402 gui_clear_master_button(this);
1406 void vtt_class :: set_sync_client(int slave, int cycles)
1408 is_sync_client=slave;
1410 // sync_countdown=cycles;
1414 void vtt_class :: set_sync_client_ug(int slave, int cycles)
1416 set_sync_client(slave, cycles);
1419 void vtt_class :: set_master_volume(f_prec new_volume)
1421 list <vtt_class *> :: iterator vtt;
1423 master_volume=new_volume;
1424 globals.volume=new_volume;
1426 if (main_list.size()>0)
1428 vol_channel_adjust=sqrt((f_prec) main_list.size());
1429 res_master_volume=master_volume/vol_channel_adjust;
1432 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1434 (*vtt)->recalc_volume();
1438 void vtt_class :: set_master_pitch(f_prec new_pitch)
1440 list <vtt_class *> :: iterator vtt;
1442 globals.pitch=new_pitch;
1443 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1445 (*vtt)->recalc_pitch();
1449 void vtt_class :: enable_saturate (int newstate)
1451 do_saturate=newstate;
1454 void vtt_class :: focus_no(int no)
1456 list <vtt_class *> :: iterator vtt;
1459 for (i=0, vtt=main_list.begin(); vtt!=main_list.end(); vtt++, i++)
1468 void vtt_class :: focus_next()
1470 list <vtt_class *> :: iterator vtt;
1474 if (main_list.size())
1476 focused_vtt=(*main_list.begin());
1481 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++) {
1482 if ((*vtt)==focused_vtt) {
1483 /* Ok, we found ourselves.. */
1486 while ((vtt!=main_list.end()) && ((*vtt)->audio_hidden) ) {
1490 if (vtt==main_list.end()) {
1491 /* No other "focusable" after this vtt so we're looking for the next */
1493 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++) {
1494 if (! (*vtt)->audio_hidden) {
1499 /* When we get here there's no "focusable" vtt at all... damn */
1509 focused_vtt=(*main_list.begin());
1512 void vtt_class :: set_scratch(int newstate)
1516 sp_spin.receive_input_value(0);
1518 sense_cycles=globals.sense_cycles;
1522 sp_spin.receive_input_value(1);
1528 void vtt_class :: unfocus()
1533 void vtt_class :: set_x_input_parameter(tX_seqpar *sp)
1538 void vtt_class :: set_y_input_parameter(tX_seqpar *sp)
1543 void vtt_class :: xy_input(f_prec x_value, f_prec y_value)
1545 if (x_par) x_par->handle_mouse_input(x_value*globals.mouse_speed);
1546 if (y_par) y_par->handle_mouse_input(y_value*globals.mouse_speed);
1549 #define store(data); if (fwrite((void *) &data, sizeof(data), 1, output)!=1) res+=1;
1551 int vtt_class :: save(FILE * output)
1553 list <vtt_fx *> :: iterator effect;
1562 store(is_sync_master);
1563 store(is_sync_client);
1585 store(audio_hidden);
1586 store(control_hidden);
1588 pid=sp_speed.get_persistence_id();
1590 pid=sp_volume.get_persistence_id();
1592 pid=sp_pitch.get_persistence_id();
1594 pid=sp_trigger.get_persistence_id();
1596 pid=sp_loop.get_persistence_id();
1598 pid=sp_sync_client.get_persistence_id();
1600 pid=sp_sync_cycles.get_persistence_id();
1602 pid=sp_lp_enable.get_persistence_id();
1604 pid=sp_lp_gain.get_persistence_id();
1606 pid=sp_lp_reso.get_persistence_id();
1608 pid=sp_lp_freq.get_persistence_id();
1610 pid=sp_ec_enable.get_persistence_id();
1612 pid=sp_ec_length.get_persistence_id();
1614 pid=sp_ec_feedback.get_persistence_id();
1616 pid=sp_ec_volume.get_persistence_id();
1618 pid=sp_ec_pan.get_persistence_id();
1620 pid=sp_mute.get_persistence_id();
1622 pid=sp_spin.get_persistence_id();
1624 pid=sp_pan.get_persistence_id();
1627 counter=fx_list.size();
1630 for (effect=fx_list.begin(); effect!=fx_list.end(); effect++)
1632 (*effect)->save(output);
1639 pid=x_par->get_persistence_id();
1652 pid=y_par->get_persistence_id();
1661 hidden=gui.main_panel->is_hidden();
1664 hidden=gui.trigger_panel->is_hidden();
1667 hidden=gui.lp_panel->is_hidden();
1670 hidden=gui.ec_panel->is_hidden();
1676 #define atload(data); if (fread((void *) &data, sizeof(data), 1, input)!=1) res+=1;
1678 int vtt_class :: load_10(FILE * input)
1685 atload(is_sync_master);
1686 atload(is_sync_client);
1687 atload(sync_cycles);
1693 atload(autotrigger);
1697 atload(obsolete_int); //x_control
1698 atload(obsolete_int); //y_control
1704 lp_setup(lp_gain, lp_reso, lp_freq);
1708 ec_set_length(ec_length);
1709 atload(ec_feedback);
1710 ec_set_feedback(ec_feedback);
1716 int vtt_class :: load_11(FILE * input)
1725 atload(is_sync_master);
1726 atload(is_sync_client);
1727 atload(sync_cycles);
1733 atload(autotrigger);
1737 atload(obsolete_int); //x_control
1738 atload(obsolete_int); //y_control
1744 lp_setup(lp_gain, lp_reso, lp_freq);
1748 ec_set_length(ec_length);
1749 atload(ec_feedback);
1750 ec_set_feedback(ec_feedback);
1753 sp_speed.set_persistence_id(pid);
1755 sp_volume.set_persistence_id(pid);
1757 sp_pitch.set_persistence_id(pid);
1759 sp_trigger.set_persistence_id(pid);
1761 sp_loop.set_persistence_id(pid);
1763 sp_sync_client.set_persistence_id(pid);
1765 sp_sync_cycles.set_persistence_id(pid);
1767 sp_lp_enable.set_persistence_id(pid);
1769 sp_lp_gain.set_persistence_id(pid);
1771 sp_lp_reso.set_persistence_id(pid);
1773 sp_lp_freq.set_persistence_id(pid);
1775 sp_ec_enable.set_persistence_id(pid);
1777 sp_ec_length.set_persistence_id(pid);
1779 sp_ec_feedback.set_persistence_id(pid);
1781 sp_mute.set_persistence_id(pid);
1783 sp_spin.set_persistence_id(pid);
1790 int vtt_class :: load_12(FILE * input)
1799 LADSPA_Plugin *plugin;
1801 vtt_fx_ladspa *ladspa_effect;
1805 this->set_name(buffer);
1807 atload(is_sync_master);
1808 atload(is_sync_client);
1809 atload(sync_cycles);
1815 atload(autotrigger);
1824 lp_setup(lp_gain, lp_reso, lp_freq);
1828 ec_set_length(ec_length);
1829 atload(ec_feedback);
1830 ec_set_feedback(ec_feedback);
1833 sp_speed.set_persistence_id(pid);
1835 sp_volume.set_persistence_id(pid);
1837 sp_pitch.set_persistence_id(pid);
1839 sp_trigger.set_persistence_id(pid);
1841 sp_loop.set_persistence_id(pid);
1843 sp_sync_client.set_persistence_id(pid);
1845 sp_sync_cycles.set_persistence_id(pid);
1847 sp_lp_enable.set_persistence_id(pid);
1849 sp_lp_gain.set_persistence_id(pid);
1851 sp_lp_reso.set_persistence_id(pid);
1853 sp_lp_freq.set_persistence_id(pid);
1855 sp_ec_enable.set_persistence_id(pid);
1857 sp_ec_length.set_persistence_id(pid);
1859 sp_ec_feedback.set_persistence_id(pid);
1861 sp_mute.set_persistence_id(pid);
1863 sp_spin.set_persistence_id(pid);
1867 for (i=0; i<counter; i++)
1872 case TX_FX_BUILTINCUTOFF:
1873 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
1876 case TX_FX_BUILTINECHO:
1877 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
1882 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
1885 ladspa_effect=add_effect(plugin);
1886 ladspa_effect->load(input);
1890 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%li].", id);
1897 tx_note("Fatal Error loading set: unknown effect type!");
1907 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1909 else set_x_input_parameter(NULL);
1916 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1918 else set_y_input_parameter(NULL);
1921 gui.main_panel->hide(hidden);
1924 gui.trigger_panel->hide(hidden);
1927 gui.lp_panel->hide(hidden);
1930 gui.ec_panel->hide(hidden);
1935 int vtt_class :: load_13(FILE * input)
1944 LADSPA_Plugin *plugin;
1946 vtt_fx_ladspa *ladspa_effect;
1950 this->set_name(buffer);
1952 atload(is_sync_master);
1953 atload(is_sync_client);
1954 atload(sync_cycles);
1959 atload(autotrigger);
1969 lp_setup(lp_gain, lp_reso, lp_freq);
1973 ec_set_length(ec_length);
1974 atload(ec_feedback);
1975 ec_set_feedback(ec_feedback);
1979 ec_set_volume(ec_volume);
1984 sp_speed.set_persistence_id(pid);
1986 sp_volume.set_persistence_id(pid);
1988 sp_pitch.set_persistence_id(pid);
1990 sp_trigger.set_persistence_id(pid);
1992 sp_loop.set_persistence_id(pid);
1994 sp_sync_client.set_persistence_id(pid);
1996 sp_sync_cycles.set_persistence_id(pid);
1998 sp_lp_enable.set_persistence_id(pid);
2000 sp_lp_gain.set_persistence_id(pid);
2002 sp_lp_reso.set_persistence_id(pid);
2004 sp_lp_freq.set_persistence_id(pid);
2006 sp_ec_enable.set_persistence_id(pid);
2008 sp_ec_length.set_persistence_id(pid);
2010 sp_ec_feedback.set_persistence_id(pid);
2012 sp_ec_volume.set_persistence_id(pid);
2014 sp_ec_pan.set_persistence_id(pid);
2016 sp_mute.set_persistence_id(pid);
2018 sp_spin.set_persistence_id(pid);
2020 sp_pan.set_persistence_id(pid);
2024 for (i=0; i<counter; i++)
2029 case TX_FX_BUILTINCUTOFF:
2030 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
2033 case TX_FX_BUILTINECHO:
2034 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
2039 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
2042 ladspa_effect=add_effect(plugin);
2043 ladspa_effect->load(input);
2047 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%li].", id);
2054 tx_note("Fatal Error loading set: unknown effect type!");
2064 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2066 else set_x_input_parameter(NULL);
2073 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2075 else set_y_input_parameter(NULL);
2078 gui.main_panel->hide(hidden);
2081 gui.trigger_panel->hide(hidden);
2084 gui.lp_panel->hide(hidden);
2087 gui.ec_panel->hide(hidden);
2092 int vtt_class :: load_14(FILE * input)
2101 LADSPA_Plugin *plugin;
2103 vtt_fx_ladspa *ladspa_effect;
2107 this->set_name(buffer);
2109 atload(is_sync_master);
2110 atload(is_sync_client);
2111 atload(sync_cycles);
2116 atload(autotrigger);
2126 lp_setup(lp_gain, lp_reso, lp_freq);
2130 ec_set_length(ec_length);
2131 atload(ec_feedback);
2132 ec_set_feedback(ec_feedback);
2136 ec_set_volume(ec_volume);
2138 atload(audio_hidden);
2139 atload(control_hidden);
2144 sp_speed.set_persistence_id(pid);
2146 sp_volume.set_persistence_id(pid);
2148 sp_pitch.set_persistence_id(pid);
2150 sp_trigger.set_persistence_id(pid);
2152 sp_loop.set_persistence_id(pid);
2154 sp_sync_client.set_persistence_id(pid);
2156 sp_sync_cycles.set_persistence_id(pid);
2158 sp_lp_enable.set_persistence_id(pid);
2160 sp_lp_gain.set_persistence_id(pid);
2162 sp_lp_reso.set_persistence_id(pid);
2164 sp_lp_freq.set_persistence_id(pid);
2166 sp_ec_enable.set_persistence_id(pid);
2168 sp_ec_length.set_persistence_id(pid);
2170 sp_ec_feedback.set_persistence_id(pid);
2172 sp_ec_volume.set_persistence_id(pid);
2174 sp_ec_pan.set_persistence_id(pid);
2176 sp_mute.set_persistence_id(pid);
2178 sp_spin.set_persistence_id(pid);
2180 sp_pan.set_persistence_id(pid);
2184 for (i=0; i<counter; i++)
2189 case TX_FX_BUILTINCUTOFF:
2190 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
2193 case TX_FX_BUILTINECHO:
2194 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
2199 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
2202 ladspa_effect=add_effect(plugin);
2203 ladspa_effect->load(input);
2207 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%li].", id);
2214 tx_note("Fatal Error loading set: unknown effect type!");
2224 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2226 else set_x_input_parameter(NULL);
2233 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2235 else set_y_input_parameter(NULL);
2238 gui.main_panel->hide(hidden);
2241 gui.trigger_panel->hide(hidden);
2244 gui.lp_panel->hide(hidden);
2247 gui.ec_panel->hide(hidden);
2253 int vtt_class :: save_all(FILE* output)
2256 list <vtt_class *> :: iterator vtt;
2259 tX_seqpar :: create_persistence_ids();
2262 store(master_volume);
2263 store(globals.pitch);
2264 pid=sp_master_volume.get_persistence_id();
2266 pid=sp_master_pitch.get_persistence_id();
2269 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
2271 res+=(*vtt)->save(output);
2274 sequencer.save(output);
2279 int vtt_class :: load_all_10(FILE* input, char *fname)
2281 int res=0, restmp=0;
2282 unsigned int i, max;
2284 char ftmp[PATH_MAX];
2286 while (main_list.size())
2288 delete((*main_list.begin()));
2292 atload(master_volume);
2293 set_master_volume(master_volume);
2294 globals.volume=master_volume;
2295 atload(globals.pitch);
2296 set_master_pitch(globals.pitch);
2298 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2299 ld_set_setname(fname);
2301 for (i=0; i<max; i++)
2303 newvtt=new vtt_class(1);
2304 res+=newvtt->load_10(input);
2306 if (strlen(newvtt->filename))
2308 /* ftmp IS NECESSARY !!! */
2309 strcpy(ftmp, newvtt->filename);
2310 ld_set_filename(ftmp);
2312 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2313 restmp=newvtt->load_file(ftmp);
2316 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2317 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2328 int vtt_class :: load_all_11(FILE* input, char *fname)
2330 int res=0, restmp=0;
2331 unsigned int i, max;
2333 char ftmp[PATH_MAX];
2336 while (main_list.size())
2338 delete((*main_list.begin()));
2342 atload(master_volume);
2343 set_master_volume(master_volume);
2344 globals.volume=master_volume;
2345 atload(globals.pitch);
2346 set_master_pitch(globals.pitch);
2348 sp_master_volume.set_persistence_id(pid);
2350 sp_master_pitch.set_persistence_id(pid);
2352 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2353 ld_set_setname(fname);
2355 for (i=0; i<max; i++)
2357 newvtt=new vtt_class(1);
2358 res+=newvtt->load_11(input);
2360 if (strlen(newvtt->filename))
2362 /* ftmp IS NECESSARY !!! */
2363 strcpy(ftmp, newvtt->filename);
2364 ld_set_filename(ftmp);
2366 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2367 restmp=newvtt->load_file(ftmp);
2370 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2371 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2375 sequencer.load(input);
2383 int vtt_class :: load_all_12(FILE* input, char *fname)
2385 int res=0, restmp=0;
2386 unsigned int i, max;
2388 char ftmp[PATH_MAX];
2391 while (main_list.size())
2393 delete((*main_list.begin()));
2397 atload(master_volume);
2398 set_master_volume(master_volume);
2399 globals.volume=master_volume;
2400 atload(globals.pitch);
2401 set_master_pitch(globals.pitch);
2403 sp_master_volume.set_persistence_id(pid);
2405 sp_master_pitch.set_persistence_id(pid);
2407 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2408 ld_set_setname(fname);
2410 for (i=0; i<max; i++)
2412 newvtt=new vtt_class(1);
2413 res+=newvtt->load_12(input);
2415 if (strlen(newvtt->filename))
2417 /* ftmp IS NECESSARY !!! */
2418 strcpy(ftmp, newvtt->filename);
2419 ld_set_filename(ftmp);
2421 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2422 restmp=newvtt->load_file(ftmp);
2425 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2426 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2430 sequencer.load(input);
2437 int vtt_class :: load_all_13(FILE* input, char *fname)
2439 int res=0, restmp=0;
2440 unsigned int i, max;
2442 char ftmp[PATH_MAX];
2445 while (main_list.size())
2447 delete((*main_list.begin()));
2451 atload(master_volume);
2452 set_master_volume(master_volume);
2453 globals.volume=master_volume;
2454 atload(globals.pitch);
2455 set_master_pitch(globals.pitch);
2457 sp_master_volume.set_persistence_id(pid);
2459 sp_master_pitch.set_persistence_id(pid);
2461 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2462 ld_set_setname(fname);
2464 for (i=0; i<max; i++)
2466 newvtt=new vtt_class(1);
2467 res+=newvtt->load_13(input);
2469 if (strlen(newvtt->filename))
2471 /* ftmp IS NECESSARY !!! */
2472 strcpy(ftmp, newvtt->filename);
2473 ld_set_filename(ftmp);
2475 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2476 restmp=newvtt->load_file(ftmp);
2479 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2480 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2484 sequencer.load(input);
2491 int vtt_class :: load_all_14(FILE* input, char *fname)
2493 int res=0, restmp=0;
2494 unsigned int i, max;
2496 char ftmp[PATH_MAX];
2499 while (main_list.size())
2501 delete((*main_list.begin()));
2505 atload(master_volume);
2506 set_master_volume(master_volume);
2507 globals.volume=master_volume;
2508 atload(globals.pitch);
2509 set_master_pitch(globals.pitch);
2511 sp_master_volume.set_persistence_id(pid);
2513 sp_master_pitch.set_persistence_id(pid);
2515 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2516 ld_set_setname(fname);
2518 for (i=0; i<max; i++)
2520 newvtt=new vtt_class(1);
2521 res+=newvtt->load_14(input);
2523 if (strlen(newvtt->filename))
2525 /* ftmp IS NECESSARY !!! */
2526 strcpy(ftmp, newvtt->filename);
2527 ld_set_filename(ftmp);
2529 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2530 restmp=newvtt->load_file(ftmp);
2533 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2534 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2535 if (newvtt->audio_hidden) newvtt->hide_audio(newvtt->audio_hidden);
2536 if (newvtt->control_hidden) newvtt->hide_control(newvtt->control_hidden);
\r
2539 sequencer.load(input);
2547 void add_vtt(GtkWidget *ctrl, GtkWidget *audio, char *fn)
2550 hmmpg = new vtt_class(1);
2551 gtk_box_pack_start(GTK_BOX(ctrl), hmmpg->gui.control_box, TRUE, TRUE, 0);
2552 gtk_box_pack_start(GTK_BOX(audio), hmmpg->gui.audio_box, TRUE, TRUE, 0);
2553 if (fn) hmmpg->load_file(fn);
2556 extern void vg_move_fx_panel_up(GtkWidget *wid, vtt_class *vtt);
2557 extern void vg_move_fx_panel_down(GtkWidget *wid, vtt_class *vtt);
2559 //#define debug_fx_stack(); for (i=fx_list.begin(); i != fx_list.end(); i++) puts((*i)->get_info_string());
2560 #define debug_fx_stack();
2562 void vtt_class :: effect_up(vtt_fx *effect)
2564 list <vtt_fx *> :: iterator i;
2565 list <vtt_fx *> :: iterator previous;
2570 if ((*fx_list.begin())==effect) return;
2572 for (previous=i=fx_list.begin(); i != fx_list.end(); i++)
2584 pthread_mutex_lock(&render_lock);
2585 fx_list.remove(effect);
2586 fx_list.insert(previous, effect);
2587 pthread_mutex_unlock(&render_lock);
2589 vg_move_fx_panel_up(effect->get_panel_widget(), this);
2595 void vtt_class :: effect_down(vtt_fx *effect)
2597 list <vtt_fx *> :: iterator i;
2602 for (i=fx_list.begin(); i != fx_list.end(); i++)
2611 if ((ok) && (i!=fx_list.end()))
2614 if (i==fx_list.end()) return;
2617 pthread_mutex_lock(&render_lock);
2618 fx_list.remove(effect);
2620 fx_list.insert(i, effect);
2621 vg_move_fx_panel_down(effect->get_panel_widget(), this);
2622 pthread_mutex_unlock(&render_lock);
2628 void vtt_class :: effect_remove(vtt_fx_ladspa *effect)
2630 pthread_mutex_lock(&render_lock);
2631 fx_list.remove(effect);
2632 pthread_mutex_unlock(&render_lock);
2637 extern void gui_hide_control_panel(vtt_class *vtt, bool hide);
2638 extern void gui_hide_audio_panel(vtt_class *vtt, bool hide);
2640 void vtt_class :: hide_audio(bool hide) {
2642 gui_hide_audio_panel(this, hide);
2645 void vtt_class :: hide_control(bool hide) {
2646 control_hidden=hide;
2647 gui_hide_control_panel(this, hide);