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");
120 x_control=CONTROL_SCRATCH;
121 y_control=CONTROL_CUTOFF;
127 lp_setup(lp_gain, lp_reso, lp_freq);
138 main_list.push_back(this);
140 /* "connecting" the seq-parameters */
142 sp_speed.set_vtt((void *) this);
143 sp_volume.set_vtt((void *) this);
144 sp_pitch.set_vtt((void *) this);
145 sp_pan.set_vtt((void *) this);
146 sp_trigger.set_vtt((void *) this);
147 sp_loop.set_vtt((void *) this);
148 sp_sync_client.set_vtt((void *) this);
149 sp_sync_cycles.set_vtt((void *) this);
150 sp_lp_enable.set_vtt((void *) this);
151 sp_lp_gain.set_vtt((void *) this);
152 sp_lp_reso.set_vtt((void *) this);
153 sp_lp_freq.set_vtt((void *) this);
154 sp_ec_enable.set_vtt((void *) this);
155 sp_ec_length.set_vtt((void *) this);
156 sp_ec_pan.set_vtt((void *) this);
157 sp_ec_volume.set_vtt((void *) this);
158 sp_ec_feedback.set_vtt((void *) this);
159 sp_mute.set_vtt((void *) this);
160 sp_spin.set_vtt((void *) this);
165 lp_fx=new vtt_fx_lp();
166 lp_fx->set_vtt((void *) this);
167 fx_list.push_back(lp_fx);
169 ec_fx=new vtt_fx_ec();
170 ec_fx->set_vtt((void *) this);
171 fx_list.push_back(ec_fx);
176 lp_fx->set_panel_widget(gui.lp_panel->get_widget());
177 ec_fx->set_panel_widget(gui.ec_panel->get_widget());
182 set_master_volume(globals.volume);
183 set_output_buffer_size(samples_in_mix_buffer/2);
192 vtt_class :: ~vtt_class()
197 main_list.remove(this);
198 if (audiofile) delete audiofile;
199 //if (buffer) free(buffer);
200 if (output_buffer) tX_freemem(output_buffer, "output_buffer", "vtt Destructor");
203 while (fx_list.size())
205 effect=(*fx_list.begin());
206 fx_list.remove(effect);
213 void vtt_class :: set_name(char *newname)
215 strcpy(name, newname);
216 gui_set_name(this, name);
219 int vtt_class :: load_file(char *fname)
222 int was_playing=is_playing;
224 if (is_playing) stop();
226 if (audiofile) delete(audiofile);
233 audiofile=new tx_audiofile();
234 res=audiofile->load(fname);
236 if (res==TX_AUDIO_SUCCESS)
238 buffer=audiofile->get_buffer();
239 samples_in_buffer=audiofile->get_no_samples();
240 maxpos=audiofile->get_no_samples();
241 strcpy(filename, fname);
242 if (was_playing) trigger();
243 // printf("Successfully loaded %s, %08x, %i\n", fname, buffer, samples_in_buffer);
248 gui_update_display(this);
250 ec_set_length(ec_length);
255 int vtt_class :: set_output_buffer_size(int newsize)
257 list <vtt_fx *> :: iterator effect;
259 if (ec_output_buffer) tX_freemem(ec_output_buffer, "ec_output_buffer", "vtt set_output_buffer_size()");
260 tX_malloc(ec_output_buffer, "ec_output_buffer", "vtt set_output_buffer_size()", sizeof(float)*newsize, (float *));
262 if (output_buffer) tX_freemem(output_buffer, "output_buffer", "vtt set_output_buffer_size()");
263 tX_malloc(output_buffer, "output_buffer", "vtt set_output_buffer_size()", sizeof(float)*newsize, (float *));
265 end_of_outputbuffer = output_buffer + newsize; //size_t(sizeof(float)*(newsize));
267 samples_in_outputbuffer=newsize;
268 inv_samples_in_outputbuffer=1.0/samples_in_outputbuffer;
270 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
272 (*effect)->reconnect_buffer();
275 if (output_buffer) return(0);
279 void vtt_class :: set_volume(f_prec newvol)
285 void vtt_class :: recalc_volume()
287 res_volume=rel_volume*res_master_volume;
288 f_prec ec_res_volume=res_volume*ec_volume;
292 res_volume_left=(1.0-pan)*res_volume;
293 res_volume_right=res_volume;
297 res_volume_left=res_volume;
298 res_volume_right=(1.0+pan)*res_volume;
302 res_volume_left=res_volume_right=res_volume;
307 ec_volume_left=(1.0-ec_pan)*ec_res_volume;
308 ec_volume_right=ec_res_volume;
312 ec_volume_left=ec_res_volume;
313 ec_volume_right=(1.0+ec_pan)*ec_res_volume;
317 ec_volume_left=ec_volume_right=ec_res_volume;
319 // printf("vtt_volume: %f, %f, l: %f, r: %f\n", rel_volume, res_volume, res_volume_left, res_volume_right);
322 mm_res_volume.s[0]=mm_res_volume.s[1]=res_volume;
326 void vtt_class :: set_pan(f_prec newpan)
332 void vtt_class :: set_pitch(f_prec newpitch)
335 // res_pitch=fabs(globals.pitch)*rel_pitch;
336 res_pitch=globals.pitch*rel_pitch;
338 ec_set_length(ec_length);
341 void vtt_class :: recalc_pitch()
343 // res_pitch=fabs(globals.pitch)*rel_pitch;
344 res_pitch=globals.pitch*rel_pitch;
346 ec_set_length(ec_length);
349 void vtt_class :: set_autotrigger(int newstate)
351 autotrigger=newstate;
354 void vtt_class :: set_loop(int newstate)
359 void vtt_class :: set_controls (int x, int y)
365 void vtt_class :: set_mute(int newstate)
371 void vtt_class :: set_mix_mute(int newstate)
377 void vtt_class :: set_mix_solo(int newstate)
379 if (mix_solo && !newstate)
385 else if (!mix_solo && newstate)
394 list <vtt_class *> :: iterator vtt;
396 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++)
402 void vtt_class :: lp_set_enable (int newstate)
408 void vtt_class :: lp_reset()
413 void vtt_class :: lp_set_gain (f_prec gain)
416 lp_resgain=lp_gain*lp_autogain;
419 void vtt_class :: lp_set_reso(f_prec reso)
423 lp_b=reso*(1.0+(1.0/lp_a));
424 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
425 lp_resgain=lp_gain*lp_autogain;
428 void vtt_class :: lp_set_freq(f_prec freq)
433 lp_b=lp_reso*(1.0+(1.0/lp_a));
436 void vtt_class :: lp_setup(f_prec gain, f_prec reso, f_prec freq)
442 lp_b=reso*(1.0+(1.0/lp_a));
444 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
445 lp_resgain=lp_gain*lp_autogain;
448 void vtt_class :: ec_set_enable(int newstate)
455 void vtt_class :: ec_set_pan(f_prec pan)
462 /* Max length is 1.0 */
464 void vtt_class :: ec_set_length(f_prec length)
472 ec_res_length=length*samples_in_buffer;
476 ec_res_length=length*samples_in_buffer/res_pitch;
479 if (ec_res_length<0) ec_res_length*=-1;
481 if (ec_res_length>=EC_MAX_BUFFER)
483 ec_res_length=EC_MAX_BUFFER*length;
486 delay=(int )floor(ec_res_length);
488 ec_delay=&ec_buffer[delay];
491 void vtt_class :: ec_set_feedback(f_prec feedback)
493 ec_feedback=feedback;
497 void vtt_class :: ec_set_volume(f_prec volume)
503 void vtt_class :: ec_clear_buffer()
507 for (ptr=ec_buffer; ptr<=ec_delay; ptr++)
514 void vtt_class :: render()
516 list <vtt_fx *> :: iterator effect;
523 if (sense_cycles==0) sp_speed.receive_input_value(0);
528 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
530 if ((*effect)->isEnabled()) (*effect)->run();
534 extern void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin);
536 vtt_fx_ladspa * vtt_class :: add_effect (LADSPA_Plugin *plugin)
538 vtt_fx_ladspa *new_effect;
540 new_effect = new vtt_fx_ladspa (plugin, this);
541 pthread_mutex_lock(&render_lock);
542 fx_list.push_back(new_effect);
543 if (is_playing) new_effect->activate();
544 pthread_mutex_unlock(&render_lock);
545 vg_create_fx_gui(this, new_effect, plugin);
550 void vtt_class :: calc_speed()
552 do_mute=fade_out=fade_in=0;
554 if (speed != speed_target)
557 speed_step=speed_target-speed_real;
561 if (speed_target != speed_real)
563 speed_real+=speed_step;
564 if ((speed_step<0) && (speed_real<speed_target)) speed_real=speed_target;
566 if ((speed_step>0) && (speed_real>speed_target)) speed_real=speed_target;
571 if ((speed_last==0) && (speed_real !=0))
579 if ((speed_last!=0) && (speed_real==0))
586 speed_last = speed_real;
588 if (res_mute != res_mute_old)
592 fade_out=1; fade_in=0;
597 fade_in=1; fade_out=0;
600 res_mute_old=res_mute;
604 if (res_mute) do_mute=1;
608 void vtt_class :: render_scratch()
629 for (sample =0,out=output_buffer, fade_vol=0.0; sample < samples_in_outputbuffer;sample++, out++, fade_vol+=inv_samples_in_outputbuffer)
631 if ((speed_real!=0) || (fade_out))
646 master_triggered_at=sample;
666 master_triggered_at=sample;
676 pos_a_f=floor(pos_f);
677 pos_i=(unsigned int) pos_a_f;
679 amount_b=pos_f-pos_a_f;
680 amount_a=1.0-amount_b;
689 sample_a=(f_prec) *ptr;
691 if (pos_i == samples_in_buffer)
698 sample_b=(f_prec) *ptr;
701 sample_res=(sample_a*amount_a)+(sample_b*amount_b);
705 sample_res*=fade_vol;
710 sample_res*=1.0-fade_vol;
723 void vtt_class :: forward_turntable()
734 if ((speed_real==0) && (!fade_out)) return;
737 /* following code is problematic as adding speed_real*n is
738 different from adding speed_real n times to pos_f.
740 well it speeds things up quite a bit and double precision
741 seems to do a satisfying job.
743 #define pos_f_test to prove that.
746 pos_f_tmp=pos_f+speed_real*samples_in_outputbuffer;
748 if ((pos_f_tmp > 0) && (pos_f_tmp < maxpos))
758 /* now the slow way ;) */
760 for (sample =0; sample < samples_in_outputbuffer; sample++)
774 master_triggered_at=sample;
794 master_triggered_at=sample;
808 diff=pos_f_tmp-pos_f;
809 if (diff!=0) printf("fast: %f, slow: %f, diff: %f, tt: %s\n", pos_f_tmp, pos_f, diff, name);
815 The following lowpass filter is based on some sample code by
816 Paul Kellett <paul.kellett@maxim.abel.co.uk>
819 void vtt_class :: render_lp()
823 for (sample = output_buffer; sample<end_of_outputbuffer; sample++)
825 lp_buf0 = lp_a * lp_buf0 + lp_freq * ((*sample)*lp_resgain + lp_b * (lp_buf0 - lp_buf1));
826 lp_buf1 = lp_a * lp_buf1 + lp_freq * lp_buf0;
832 void vtt_class :: render_ec()
838 for (i=0, sample = output_buffer, ec_sample=ec_output_buffer; i<samples_in_outputbuffer; i++, ec_sample++,sample++, ec_ptr++)
840 if (ec_ptr>ec_delay) ec_ptr=ec_buffer;
841 *ec_sample=(*ec_ptr) *ec_feedback;
842 *ec_ptr=*sample+*ec_sample;
846 int vtt_class :: set_mix_buffer_size(int no_samples)
848 list <vtt_class *> :: iterator vtt;
851 // printf("vtt_class::set_mix_buffer_size(), mix_buffer: %12x, mix_out: %12x, samples: %i\n", mix_buffer, mix_out_buffer, no_samples);
853 if (mix_buffer) tX_freemem(mix_buffer, "mix_buffer", "vtt set_mix_buffer_size()");
854 samples_in_mix_buffer=no_samples*2;
856 tX_malloc(mix_buffer, "mix_buffer", "vtt set_mix_buffer_size()", sizeof(float)*samples_in_mix_buffer, (float *));
857 mix_buffer_end=mix_buffer+samples_in_mix_buffer;
859 // printf("mix_buffer: %12x\n", mix_buffer);
860 // printf("mix_samples: %i, out_samples: %i", samples_in_mix_buffer, no_samples);
862 if (mix_out_buffer) tX_freemem(mix_out_buffer, "mix_out_buffer", "vtt set_mix_buffer_size()");
863 tX_malloc(mix_out_buffer, "mix_out_buffer", "vtt set_mix_buffer_size()", sizeof(int16_t)*samples_in_mix_buffer + 4, (int16_t *));
865 // printf("mix_out_buffer: %12x\n", mix_out_buffer);
867 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
869 res|=(*vtt)->set_output_buffer_size(no_samples);
872 if ((!mix_buffer) || (!mix_out_buffer) || res) return(1);
876 int16_t * vtt_class :: render_all_turntables()
878 list <vtt_class *> :: iterator vtt, next;
899 #ifndef OVERRIDE_MOVQ_AUTODETECT
901 #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
902 #endif /* GCC_VERSION */
904 #if (GCC_VERSION < 2096)
905 #warning "*************************"
906 #warning "* gcc < 2.96 *"
907 #warning "* assuming working movq *"
908 #warning "*************************"
909 #undef GCC_MOVQ_BUG_WORKAROUND
911 #warning "*************************"
912 #warning "* gcc >= 2.96 *"
913 #warning "* using movq-workaround *"
914 #warning "*************************"
915 #define GCC_MOVQ_BUG_WORKAROUND 1
916 #endif /* GCC < 2.96 */
917 #endif /* OVERRIDE MOVQ AUTODETECVT */
919 #ifdef GCC_MOVQ_BUG_WORKAROUND
920 /* REQUIRED DUE TO GCC BUG (2.96-3.0.2) */
921 mmx_t *mm_src1_ptr=&mm_src1;
922 mmx_t *mm_src2_ptr=&mm_src2;
923 mmx_t *mm_volume_ptr=&mm_volume;
924 mmx_t *mm_max_ptr=&mm_max;
925 mmx_t *mm_min_ptr=&mm_min;
927 #define MM_VAR_ACC(var) (* var ## _ptr)
928 #define MM_VAR_MOVQ(var) * var ## _ptr
930 #define MM_VAR_ACC(var) var
931 #define MM_VAR_MOVQ(var) var
933 int32_t *temp_int=&mm_max.d[1];
937 pthread_mutex_lock(&render_lock);
939 if (render_list.size()==0)
941 for (sample=0; sample<samples_in_mix_buffer; sample++)
943 mix_out_buffer[sample]=0;
948 vtt=render_list.begin();
950 max=(*vtt)->max_value;
954 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
956 temp=(*vtt)->output_buffer[sample];
957 mix_buffer[mix_sample]=temp*(*vtt)->res_volume_left;
959 mix_buffer[mix_sample]=temp*(*vtt)->res_volume_right;
962 if (temp>max) max=temp;
963 else if (temp<min) min=temp;
966 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->res_volume_left;
967 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->res_volume_right;
969 MM_VAR_ACC(mm_max).s[1]=MM_VAR_ACC(mm_max).s[0]=max;
970 MM_VAR_ACC(mm_min).s[1]=MM_VAR_ACC(mm_min).s[0]=min;
972 movq_m2r(MM_VAR_MOVQ(mm_max), mm1);
973 movq_m2r(MM_VAR_MOVQ(mm_min), mm2);
975 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
977 mix=(mmx_t*)mix_buffer;
979 for (f_prec* src=(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end;)
982 MM_VAR_ACC(mm_src1).s[0]=*src;
983 MM_VAR_ACC(mm_src1).s[1]=*src;
985 /* sample * l/r volume */
986 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
992 MM_VAR_ACC(mm_src2).s[0]=*src;
993 MM_VAR_ACC(mm_src2).s[1]=*src;
995 /* sample * l/r volume */
996 movq_m2r(MM_VAR_MOVQ(mm_src2), mm3);
1000 /* calculating min/max */
1001 MM_VAR_ACC(mm_src1).s[1]=MM_VAR_ACC(mm_src2).s[0];
1002 movq_m2r(mm_src1, mm3);
1003 pfmax_r2r(mm3, mm1);
1004 pfmin_r2r(mm3, mm2);
1009 movq_r2m(mm1, MM_VAR_MOVQ(mm_max));
1010 movq_r2m(mm2, MM_VAR_MOVQ(mm_min));
1014 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];
1015 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];
1019 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
1021 if ((*vtt)->ec_enable)
1024 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1026 temp=(*vtt)->ec_output_buffer[sample];
1028 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_left;
1030 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_right;
1034 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->ec_volume_left;
1035 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->ec_volume_right;
1037 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1038 mix =(mmx_t*)mix_buffer;
1040 for (f_prec* src=(*vtt)->ec_output_buffer; mix < (mmx_t*) mix_buffer_end; src++, mix++)
1043 MM_VAR_ACC(mm_src1).s[0]=*src;
1044 MM_VAR_ACC(mm_src1).s[1]=*src;
1046 /* sample * l/r volume */
1047 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1048 pfmul_r2r(mm0, mm3);
1050 /* accumulating complete mix */
1051 movq_m2r(*mix, mm4);
1052 pfadd_r2r(mm4, mm3);
1053 movq_r2m(mm3, *mix);
1059 if (master_triggered)
1061 pthread_mutex_unlock(&render_lock);
1062 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1064 if ((*vtt)->is_sync_client)
1066 if ((*vtt)->sync_countdown)
1068 (*vtt)->sync_countdown--;
1072 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1077 pthread_mutex_lock(&render_lock);
1080 vtt=render_list.begin();
1081 for (vtt++; vtt!=render_list.end(); vtt++)
1084 max=(*vtt)->max_value;
1088 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1090 temp=(*vtt)->output_buffer[sample];
1091 mix_buffer[mix_sample]+=temp*(*vtt)->res_volume_left;
1093 mix_buffer[mix_sample]+=temp*(*vtt)->res_volume_right;
1096 if (temp>max) max=temp;
1097 else if (temp<min) min=temp;
1100 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->res_volume_left;
1101 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->res_volume_right;
1103 MM_VAR_ACC(mm_max).s[1]=MM_VAR_ACC(mm_max).s[0]=max;
1104 MM_VAR_ACC(mm_min).s[1]=MM_VAR_ACC(mm_min).s[0]=min;
1106 movq_m2r(MM_VAR_MOVQ(mm_max), mm1);
1107 movq_m2r(MM_VAR_MOVQ(mm_min), mm2);
1109 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1110 mix=(mmx_t*)mix_buffer;
1112 for (f_prec* src=(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end;)
1115 MM_VAR_ACC(mm_src1).s[0]=*src;
1116 MM_VAR_ACC(mm_src1).s[1]=*src;
1118 /* sample * l/r volume */
1119 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1120 pfmul_r2r(mm0, mm3);
1122 /* accumulating complete mix */
1123 movq_m2r(*mix, mm4);
1124 pfadd_r2r(mm4, mm3);
1125 movq_r2m(mm3, *mix);
1129 MM_VAR_ACC(mm_src2).s[0]=*src;
1130 MM_VAR_ACC(mm_src2).s[1]=*src;
1132 /* sample * l/r volume */
1133 movq_m2r(MM_VAR_MOVQ(mm_src2), mm3);
1134 pfmul_r2r(mm0, mm3);
1136 /* accumulating complete mix */
1137 movq_m2r(*mix, mm4);
1138 pfadd_r2r(mm4, mm3);
1139 movq_r2m(mm3, *mix);
1141 /* calculating min/max */
1142 MM_VAR_ACC(mm_src1).s[1]=MM_VAR_ACC(mm_src2).s[0];
1143 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1144 pfmax_r2r(mm3, mm1);
1145 pfmin_r2r(mm3, mm2);
1150 movq_r2m(mm1, MM_VAR_MOVQ(mm_max));
1151 movq_r2m(mm2, MM_VAR_MOVQ(mm_min));
1155 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];
1156 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];
1160 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
1162 if ((*vtt)->ec_enable)
1165 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1167 temp=(*vtt)->ec_output_buffer[sample];
1169 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_left;
1171 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_right;
1175 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->ec_volume_left;
1176 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->ec_volume_right;
1178 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1179 mix =(mmx_t*)mix_buffer;
1181 for (f_prec* src=(*vtt)->ec_output_buffer; mix < (mmx_t*) mix_buffer_end; src++, mix++)
1184 MM_VAR_ACC(mm_src1).s[0]=*src;
1185 MM_VAR_ACC(mm_src1).s[1]=*src;
1187 /* sample * l/r volume */
1188 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1189 pfmul_r2r(mm0, mm3);
1191 /* accumulating complete mix */
1192 movq_m2r(*mix, mm4);
1193 pfadd_r2r(mm4, mm3);
1194 movq_r2m(mm3, *mix);
1207 for (sample=0; sample<samples_in_mix_buffer; sample+=2)
1209 temp=mix_buffer[sample];
1210 mix_out_buffer[sample]=(int16_t) temp;
1212 if (temp>max) max=temp;
1213 else if (temp<min) min=temp;
1217 if (min>max) mix_max_l=min; else mix_max_l=max;
1224 for (sample=1; sample<samples_in_mix_buffer; sample+=2)
1226 temp=mix_buffer[sample];
1227 mix_out_buffer[sample]=(int16_t) temp;
1229 if (temp>max) max=temp;
1230 else if (temp<min) min=temp;
1234 if (min>max) mix_max_r=min; else mix_max_r=max;
1239 vtt=render_list.begin();
1240 while (vtt!=render_list.end())
1245 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1248 pthread_mutex_unlock(&render_lock);
1250 return(mix_out_buffer);
1253 void vtt_class :: forward_all_turntables()
1255 list <vtt_class *> :: iterator vtt, next;
1257 if (render_list.size()>0)
1259 vtt=render_list.begin();
1260 (*vtt)->forward_turntable();
1262 if (master_triggered)
1264 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1266 if ((*vtt)->is_sync_client)
1268 if ((*vtt)->sync_countdown)
1270 (*vtt)->sync_countdown--;
1274 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1281 vtt=render_list.begin();
1282 for (vtt++; vtt!=render_list.end(); vtt++)
1284 (*vtt)->forward_turntable();
1289 vtt=render_list.begin();
1290 while (vtt!=render_list.end())
1295 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1301 int vtt_class :: trigger()
1303 list <vtt_fx *> :: iterator effect;
1305 if (!buffer) return (1);
1307 if (!is_playing) pthread_mutex_lock(&render_lock);
1309 if (res_pitch>=0) pos_f=0;
1313 speed_real=res_pitch;
1314 speed_target=res_pitch;
1317 /* activating plugins */
1318 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1320 (*effect)->activate();
1331 master_triggered_at=0;
1340 render_list.push_front(this);
1344 render_list.push_back(this);
1346 pthread_mutex_unlock(&render_lock);
1351 int vtt_class :: stop_nolock()
1353 list <vtt_fx *> :: iterator effect;
1357 pthread_mutex_unlock(&render_lock);
1360 render_list.remove(this);
1371 /* deactivating plugins */
1372 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1374 (*effect)->deactivate();
1380 int vtt_class :: stop()
1384 pthread_mutex_lock(&render_lock);
1388 pthread_mutex_unlock(&render_lock);
1393 void vtt_class :: set_sync_master(int master)
1397 if (sync_master) sync_master->set_sync_master(0);
1403 if (sync_master==this) sync_master=0;
1405 gui_clear_master_button(this);
1409 void vtt_class :: set_sync_client(int slave, int cycles)
1411 is_sync_client=slave;
1413 // sync_countdown=cycles;
1417 void vtt_class :: set_sync_client_ug(int slave, int cycles)
1419 set_sync_client(slave, cycles);
1422 void vtt_class :: set_master_volume(f_prec new_volume)
1424 list <vtt_class *> :: iterator vtt;
1426 master_volume=new_volume;
1427 globals.volume=new_volume;
1429 if (main_list.size()>0)
1431 vol_channel_adjust=sqrt((f_prec) main_list.size());
1432 res_master_volume=master_volume/vol_channel_adjust;
1435 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1437 (*vtt)->recalc_volume();
1441 void vtt_class :: set_master_pitch(f_prec new_pitch)
1443 list <vtt_class *> :: iterator vtt;
1445 globals.pitch=new_pitch;
1446 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1448 (*vtt)->recalc_pitch();
1452 void vtt_class :: enable_saturate (int newstate)
1454 do_saturate=newstate;
1457 void vtt_class :: focus_no(int no)
1459 list <vtt_class *> :: iterator vtt;
1462 for (i=0, vtt=main_list.begin(); vtt!=main_list.end(); vtt++, i++)
1471 void vtt_class :: focus_next()
1473 list <vtt_class *> :: iterator vtt;
1477 if (main_list.size())
1479 focused_vtt=(*main_list.begin());
1484 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++)
1486 if ((*vtt)==focused_vtt)
1489 if (vtt==main_list.end())
1491 focused_vtt=(*main_list.begin());
1502 focused_vtt=(*main_list.begin());
1505 void vtt_class :: set_scratch(int newstate)
1509 sp_spin.receive_input_value(0);
1511 sense_cycles=globals.sense_cycles;
1515 sp_spin.receive_input_value(1);
1522 void vtt_class :: handle_input(int control, f_prec value)
1528 case CONTROL_SCRATCH:
1529 if (do_scratch) sp_speed.receive_input_value(value*globals.mouse_speed);
1530 sense_cycles=globals.sense_cycles;
1533 case CONTROL_VOLUME:
1534 temp=rel_volume+MAGIC*value*globals.mouse_speed;
1535 if (temp>2.0) temp=2.0;
1536 else if (temp<0) temp=0;
1537 sp_volume.receive_input_value(temp);
1540 case CONTROL_CUTOFF:
1541 temp=lp_freq+MAGIC*value*globals.mouse_speed;
1542 if (temp>0.99) temp=0.99;
1543 else if (temp<0) temp=0;
1544 sp_lp_freq.receive_input_value(temp);
1547 case CONTROL_FEEDBACK:
1548 temp=ec_feedback+MAGIC*value*globals.mouse_speed;
1549 if (temp>1.0) temp=1.0;
1550 else if (temp<0) temp=0;
1551 sp_ec_feedback.receive_input_value(temp);
1556 void vtt_class :: unfocus()
1561 extern void vg_display_ycontrol(vtt_class *vtt);
1562 extern void vg_display_xcontrol(vtt_class *vtt);
1564 void vtt_class :: set_x_input_parameter(tX_seqpar *sp)
1567 vg_display_xcontrol(this);
1570 void vtt_class :: set_y_input_parameter(tX_seqpar *sp)
1573 vg_display_ycontrol(this);
1576 void vtt_class :: xy_input(f_prec x_value, f_prec y_value)
1578 if (x_par) x_par->handle_mouse_input(x_value*globals.mouse_speed);
1579 if (y_par) y_par->handle_mouse_input(y_value*globals.mouse_speed);
1582 #define store(data); if (fwrite((void *) &data, sizeof(data), 1, output)!=1) res+=1;
1584 int vtt_class :: save(FILE * output)
1586 list <vtt_fx *> :: iterator effect;
1595 store(is_sync_master);
1596 store(is_sync_client);
1618 pid=sp_speed.get_persistence_id();
1620 pid=sp_volume.get_persistence_id();
1622 pid=sp_pitch.get_persistence_id();
1624 pid=sp_trigger.get_persistence_id();
1626 pid=sp_loop.get_persistence_id();
1628 pid=sp_sync_client.get_persistence_id();
1630 pid=sp_sync_cycles.get_persistence_id();
1632 pid=sp_lp_enable.get_persistence_id();
1634 pid=sp_lp_gain.get_persistence_id();
1636 pid=sp_lp_reso.get_persistence_id();
1638 pid=sp_lp_freq.get_persistence_id();
1640 pid=sp_ec_enable.get_persistence_id();
1642 pid=sp_ec_length.get_persistence_id();
1644 pid=sp_ec_feedback.get_persistence_id();
1646 pid=sp_ec_volume.get_persistence_id();
1648 pid=sp_ec_pan.get_persistence_id();
1650 pid=sp_mute.get_persistence_id();
1652 pid=sp_spin.get_persistence_id();
1654 pid=sp_pan.get_persistence_id();
1657 counter=fx_list.size();
1660 for (effect=fx_list.begin(); effect!=fx_list.end(); effect++)
1662 (*effect)->save(output);
1669 pid=x_par->get_persistence_id();
1682 pid=y_par->get_persistence_id();
1691 hidden=gui.main_panel->is_hidden();
1694 hidden=gui.trigger_panel->is_hidden();
1697 hidden=gui.lp_panel->is_hidden();
1700 hidden=gui.ec_panel->is_hidden();
1706 #define atload(data); if (fread((void *) &data, sizeof(data), 1, input)!=1) res+=1;
1708 int vtt_class :: load_10(FILE * input)
1714 atload(is_sync_master);
1715 atload(is_sync_client);
1716 atload(sync_cycles);
1722 atload(autotrigger);
1733 lp_setup(lp_gain, lp_reso, lp_freq);
1737 ec_set_length(ec_length);
1738 atload(ec_feedback);
1739 ec_set_feedback(ec_feedback);
1745 int vtt_class :: load_11(FILE * input)
1753 atload(is_sync_master);
1754 atload(is_sync_client);
1755 atload(sync_cycles);
1761 atload(autotrigger);
1772 lp_setup(lp_gain, lp_reso, lp_freq);
1776 ec_set_length(ec_length);
1777 atload(ec_feedback);
1778 ec_set_feedback(ec_feedback);
1781 sp_speed.set_persistence_id(pid);
1783 sp_volume.set_persistence_id(pid);
1785 sp_pitch.set_persistence_id(pid);
1787 sp_trigger.set_persistence_id(pid);
1789 sp_loop.set_persistence_id(pid);
1791 sp_sync_client.set_persistence_id(pid);
1793 sp_sync_cycles.set_persistence_id(pid);
1795 sp_lp_enable.set_persistence_id(pid);
1797 sp_lp_gain.set_persistence_id(pid);
1799 sp_lp_reso.set_persistence_id(pid);
1801 sp_lp_freq.set_persistence_id(pid);
1803 sp_ec_enable.set_persistence_id(pid);
1805 sp_ec_length.set_persistence_id(pid);
1807 sp_ec_feedback.set_persistence_id(pid);
1809 sp_mute.set_persistence_id(pid);
1811 sp_spin.set_persistence_id(pid);
1818 int vtt_class :: load_12(FILE * input)
1826 LADSPA_Plugin *plugin;
1828 vtt_fx_ladspa *ladspa_effect;
1832 this->set_name(buffer);
1834 atload(is_sync_master);
1835 atload(is_sync_client);
1836 atload(sync_cycles);
1842 atload(autotrigger);
1851 lp_setup(lp_gain, lp_reso, lp_freq);
1855 ec_set_length(ec_length);
1856 atload(ec_feedback);
1857 ec_set_feedback(ec_feedback);
1860 sp_speed.set_persistence_id(pid);
1862 sp_volume.set_persistence_id(pid);
1864 sp_pitch.set_persistence_id(pid);
1866 sp_trigger.set_persistence_id(pid);
1868 sp_loop.set_persistence_id(pid);
1870 sp_sync_client.set_persistence_id(pid);
1872 sp_sync_cycles.set_persistence_id(pid);
1874 sp_lp_enable.set_persistence_id(pid);
1876 sp_lp_gain.set_persistence_id(pid);
1878 sp_lp_reso.set_persistence_id(pid);
1880 sp_lp_freq.set_persistence_id(pid);
1882 sp_ec_enable.set_persistence_id(pid);
1884 sp_ec_length.set_persistence_id(pid);
1886 sp_ec_feedback.set_persistence_id(pid);
1888 sp_mute.set_persistence_id(pid);
1890 sp_spin.set_persistence_id(pid);
1894 for (i=0; i<counter; i++)
1899 case TX_FX_BUILTINCUTOFF:
1900 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
1903 case TX_FX_BUILTINECHO:
1904 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
1909 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
1912 ladspa_effect=add_effect(plugin);
1913 ladspa_effect->load(input);
1917 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%i].", id);
1924 tx_note("Fatal Error loading set: unknown effect type!");
1934 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1936 else set_x_input_parameter(NULL);
1943 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1945 else set_y_input_parameter(NULL);
1948 gui.main_panel->hide(hidden);
1951 gui.trigger_panel->hide(hidden);
1954 gui.lp_panel->hide(hidden);
1957 gui.ec_panel->hide(hidden);
1962 int vtt_class :: load_13(FILE * input)
1970 LADSPA_Plugin *plugin;
1972 vtt_fx_ladspa *ladspa_effect;
1976 this->set_name(buffer);
1978 atload(is_sync_master);
1979 atload(is_sync_client);
1980 atload(sync_cycles);
1985 atload(autotrigger);
1995 lp_setup(lp_gain, lp_reso, lp_freq);
1999 ec_set_length(ec_length);
2000 atload(ec_feedback);
2001 ec_set_feedback(ec_feedback);
2005 ec_set_volume(ec_volume);
2010 sp_speed.set_persistence_id(pid);
2012 sp_volume.set_persistence_id(pid);
2014 sp_pitch.set_persistence_id(pid);
2016 sp_trigger.set_persistence_id(pid);
2018 sp_loop.set_persistence_id(pid);
2020 sp_sync_client.set_persistence_id(pid);
2022 sp_sync_cycles.set_persistence_id(pid);
2024 sp_lp_enable.set_persistence_id(pid);
2026 sp_lp_gain.set_persistence_id(pid);
2028 sp_lp_reso.set_persistence_id(pid);
2030 sp_lp_freq.set_persistence_id(pid);
2032 sp_ec_enable.set_persistence_id(pid);
2034 sp_ec_length.set_persistence_id(pid);
2036 sp_ec_feedback.set_persistence_id(pid);
2038 sp_ec_volume.set_persistence_id(pid);
2040 sp_ec_pan.set_persistence_id(pid);
2042 sp_mute.set_persistence_id(pid);
2044 sp_spin.set_persistence_id(pid);
2046 sp_pan.set_persistence_id(pid);
2050 for (i=0; i<counter; i++)
2055 case TX_FX_BUILTINCUTOFF:
2056 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
2059 case TX_FX_BUILTINECHO:
2060 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
2065 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
2068 ladspa_effect=add_effect(plugin);
2069 ladspa_effect->load(input);
2073 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%i].", id);
2080 tx_note("Fatal Error loading set: unknown effect type!");
2090 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2092 else set_x_input_parameter(NULL);
2099 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2101 else set_y_input_parameter(NULL);
2104 gui.main_panel->hide(hidden);
2107 gui.trigger_panel->hide(hidden);
2110 gui.lp_panel->hide(hidden);
2113 gui.ec_panel->hide(hidden);
2119 int vtt_class :: save_all(FILE* output)
2122 list <vtt_class *> :: iterator vtt;
2125 tX_seqpar :: create_persistence_ids();
2128 store(master_volume);
2129 store(globals.pitch);
2130 pid=sp_master_volume.get_persistence_id();
2132 pid=sp_master_pitch.get_persistence_id();
2135 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
2137 res+=(*vtt)->save(output);
2140 sequencer.save(output);
2145 int vtt_class :: load_all_10(FILE* input, char *fname)
2147 int res=0, restmp=0;
2148 list <vtt_class *> :: iterator vtt;
2149 unsigned int i, max, size;
2152 char ftmp[PATH_MAX];
2154 while (main_list.size())
2156 delete((*main_list.begin()));
2160 atload(master_volume);
2161 set_master_volume(master_volume);
2162 globals.volume=master_volume;
2163 atload(globals.pitch);
2164 set_master_pitch(globals.pitch);
2166 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2167 ld_set_setname(fname);
2169 for (i=0; i<max; i++)
2171 newvtt=new vtt_class(1);
2172 res+=newvtt->load_10(input);
2174 if (strlen(newvtt->filename))
2176 /* ftmp IS NECESSARY !!! */
2177 strcpy(ftmp, newvtt->filename);
2178 ld_set_filename(ftmp);
2180 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2181 restmp=newvtt->load_file(ftmp);
2184 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2185 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2197 int vtt_class :: load_all_11(FILE* input, char *fname)
2199 int res=0, restmp=0;
2200 list <vtt_class *> :: iterator vtt;
2201 unsigned int i, max, size;
2204 char ftmp[PATH_MAX];
2207 while (main_list.size())
2209 delete((*main_list.begin()));
2213 atload(master_volume);
2214 set_master_volume(master_volume);
2215 globals.volume=master_volume;
2216 atload(globals.pitch);
2217 set_master_pitch(globals.pitch);
2219 sp_master_volume.set_persistence_id(pid);
2221 sp_master_pitch.set_persistence_id(pid);
2223 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2224 ld_set_setname(fname);
2226 for (i=0; i<max; i++)
2228 newvtt=new vtt_class(1);
2229 res+=newvtt->load_11(input);
2231 if (strlen(newvtt->filename))
2233 /* ftmp IS NECESSARY !!! */
2234 strcpy(ftmp, newvtt->filename);
2235 ld_set_filename(ftmp);
2237 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2238 restmp=newvtt->load_file(ftmp);
2241 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2242 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2246 sequencer.load(input);
2254 int vtt_class :: load_all_12(FILE* input, char *fname)
2256 int res=0, restmp=0;
2257 list <vtt_class *> :: iterator vtt;
2258 unsigned int i, max, size;
2261 char ftmp[PATH_MAX];
2264 while (main_list.size())
2266 delete((*main_list.begin()));
2270 atload(master_volume);
2271 set_master_volume(master_volume);
2272 globals.volume=master_volume;
2273 atload(globals.pitch);
2274 set_master_pitch(globals.pitch);
2276 sp_master_volume.set_persistence_id(pid);
2278 sp_master_pitch.set_persistence_id(pid);
2280 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2281 ld_set_setname(fname);
2283 for (i=0; i<max; i++)
2285 newvtt=new vtt_class(1);
2286 res+=newvtt->load_12(input);
2288 if (strlen(newvtt->filename))
2290 /* ftmp IS NECESSARY !!! */
2291 strcpy(ftmp, newvtt->filename);
2292 ld_set_filename(ftmp);
2294 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2295 restmp=newvtt->load_file(ftmp);
2298 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2299 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2303 sequencer.load(input);
2310 int vtt_class :: load_all_13(FILE* input, char *fname)
2312 int res=0, restmp=0;
2313 list <vtt_class *> :: iterator vtt;
2314 unsigned int i, max, size;
2317 char ftmp[PATH_MAX];
2320 while (main_list.size())
2322 delete((*main_list.begin()));
2326 atload(master_volume);
2327 set_master_volume(master_volume);
2328 globals.volume=master_volume;
2329 atload(globals.pitch);
2330 set_master_pitch(globals.pitch);
2332 sp_master_volume.set_persistence_id(pid);
2334 sp_master_pitch.set_persistence_id(pid);
2336 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2337 ld_set_setname(fname);
2339 for (i=0; i<max; i++)
2341 newvtt=new vtt_class(1);
2342 res+=newvtt->load_13(input);
2344 if (strlen(newvtt->filename))
2346 /* ftmp IS NECESSARY !!! */
2347 strcpy(ftmp, newvtt->filename);
2348 ld_set_filename(ftmp);
2350 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2351 restmp=newvtt->load_file(ftmp);
2354 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2355 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2359 sequencer.load(input);
2366 void add_vtt(GtkWidget *ctrl, GtkWidget *audio, char *fn)
2369 hmmpg = new vtt_class(1);
2370 gtk_box_pack_start(GTK_BOX(ctrl), hmmpg->gui.control_box, TRUE, TRUE, 0);
2371 gtk_box_pack_start(GTK_BOX(audio), hmmpg->gui.audio_box, TRUE, TRUE, 0);
2372 if (fn) hmmpg->load_file(fn);
2375 extern void vg_move_fx_panel_up(GtkWidget *wid, vtt_class *vtt);
2376 extern void vg_move_fx_panel_down(GtkWidget *wid, vtt_class *vtt);
2378 //#define debug_fx_stack(); for (i=fx_list.begin(); i != fx_list.end(); i++) puts((*i)->get_info_string());
2379 #define debug_fx_stack();
2381 void vtt_class :: effect_up(vtt_fx *effect)
2383 list <vtt_fx *> :: iterator i;
2384 list <vtt_fx *> :: iterator previous;
2389 if ((*fx_list.begin())==effect) return;
2391 for (previous=i=fx_list.begin(); i != fx_list.end(); i++)
2403 pthread_mutex_lock(&render_lock);
2404 fx_list.remove(effect);
2405 fx_list.insert(previous, effect);
2406 pthread_mutex_unlock(&render_lock);
2408 vg_move_fx_panel_up(effect->get_panel_widget(), this);
2414 void vtt_class :: effect_down(vtt_fx *effect)
2416 list <vtt_fx *> :: iterator i;
2421 for (i=fx_list.begin(); i != fx_list.end(); i++)
2430 if ((ok) && (i!=fx_list.end()))
2433 if (i==fx_list.end()) return;
2436 pthread_mutex_lock(&render_lock);
2437 fx_list.remove(effect);
2439 fx_list.insert(i, effect);
2440 vg_move_fx_panel_down(effect->get_panel_widget(), this);
2441 pthread_mutex_unlock(&render_lock);
2447 void vtt_class :: effect_remove(vtt_fx_ladspa *effect)
2449 pthread_mutex_lock(&render_lock);
2450 fx_list.remove(effect);
2451 pthread_mutex_unlock(&render_lock);