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);
189 control_hidden=false;
\r
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_mute(int newstate)
365 void vtt_class :: set_mix_mute(int newstate)
371 void vtt_class :: set_mix_solo(int newstate)
373 if (mix_solo && !newstate)
379 else if (!mix_solo && newstate)
388 list <vtt_class *> :: iterator vtt;
390 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++)
396 void vtt_class :: lp_set_enable (int newstate)
402 void vtt_class :: lp_reset()
407 void vtt_class :: lp_set_gain (f_prec gain)
410 lp_resgain=lp_gain*lp_autogain;
413 void vtt_class :: lp_set_reso(f_prec reso)
417 lp_b=reso*(1.0+(1.0/lp_a));
418 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
419 lp_resgain=lp_gain*lp_autogain;
422 void vtt_class :: lp_set_freq(f_prec freq)
427 lp_b=lp_reso*(1.0+(1.0/lp_a));
430 void vtt_class :: lp_setup(f_prec gain, f_prec reso, f_prec freq)
436 lp_b=reso*(1.0+(1.0/lp_a));
438 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
439 lp_resgain=lp_gain*lp_autogain;
442 void vtt_class :: ec_set_enable(int newstate)
449 void vtt_class :: ec_set_pan(f_prec pan)
456 /* Max length is 1.0 */
458 void vtt_class :: ec_set_length(f_prec length)
466 ec_res_length=length*samples_in_buffer;
470 ec_res_length=length*samples_in_buffer/res_pitch;
473 if (ec_res_length<0) ec_res_length*=-1;
475 if (ec_res_length>=EC_MAX_BUFFER)
477 ec_res_length=EC_MAX_BUFFER*length;
480 delay=(int )floor(ec_res_length);
482 ec_delay=&ec_buffer[delay];
485 void vtt_class :: ec_set_feedback(f_prec feedback)
487 ec_feedback=feedback;
491 void vtt_class :: ec_set_volume(f_prec volume)
497 void vtt_class :: ec_clear_buffer()
501 for (ptr=ec_buffer; ptr<=ec_delay; ptr++)
508 void vtt_class :: render()
510 list <vtt_fx *> :: iterator effect;
517 if (sense_cycles==0) sp_speed.receive_input_value(0);
522 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
524 if ((*effect)->isEnabled()) (*effect)->run();
528 extern void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin);
530 vtt_fx_ladspa * vtt_class :: add_effect (LADSPA_Plugin *plugin)
532 vtt_fx_ladspa *new_effect;
534 new_effect = new vtt_fx_ladspa (plugin, this);
535 pthread_mutex_lock(&render_lock);
536 fx_list.push_back(new_effect);
537 if (is_playing) new_effect->activate();
538 pthread_mutex_unlock(&render_lock);
539 vg_create_fx_gui(this, new_effect, plugin);
544 void vtt_class :: calc_speed()
546 do_mute=fade_out=fade_in=0;
548 if (speed != speed_target)
551 speed_step=speed_target-speed_real;
555 if (speed_target != speed_real)
557 speed_real+=speed_step;
558 if ((speed_step<0) && (speed_real<speed_target)) speed_real=speed_target;
560 if ((speed_step>0) && (speed_real>speed_target)) speed_real=speed_target;
565 if ((speed_last==0) && (speed_real !=0))
573 if ((speed_last!=0) && (speed_real==0))
580 speed_last = speed_real;
582 if (res_mute != res_mute_old)
586 fade_out=1; fade_in=0;
591 fade_in=1; fade_out=0;
594 res_mute_old=res_mute;
598 if (res_mute) do_mute=1;
602 void vtt_class :: render_scratch()
623 for (sample =0,out=output_buffer, fade_vol=0.0; sample < samples_in_outputbuffer;sample++, out++, fade_vol+=inv_samples_in_outputbuffer)
625 if ((speed_real!=0) || (fade_out))
640 master_triggered_at=sample;
660 master_triggered_at=sample;
670 pos_a_f=floor(pos_f);
671 pos_i=(unsigned int) pos_a_f;
673 amount_b=pos_f-pos_a_f;
674 amount_a=1.0-amount_b;
683 sample_a=(f_prec) *ptr;
685 if (pos_i == samples_in_buffer)
692 sample_b=(f_prec) *ptr;
695 sample_res=(sample_a*amount_a)+(sample_b*amount_b);
699 sample_res*=fade_vol;
704 sample_res*=1.0-fade_vol;
717 void vtt_class :: forward_turntable()
728 if ((speed_real==0) && (!fade_out)) return;
731 /* following code is problematic as adding speed_real*n is
732 different from adding speed_real n times to pos_f.
734 well it speeds things up quite a bit and double precision
735 seems to do a satisfying job.
737 #define pos_f_test to prove that.
740 pos_f_tmp=pos_f+speed_real*samples_in_outputbuffer;
742 if ((pos_f_tmp > 0) && (pos_f_tmp < maxpos))
752 /* now the slow way ;) */
754 for (sample =0; sample < samples_in_outputbuffer; sample++)
768 master_triggered_at=sample;
788 master_triggered_at=sample;
802 diff=pos_f_tmp-pos_f;
803 if (diff!=0) printf("fast: %f, slow: %f, diff: %f, tt: %s\n", pos_f_tmp, pos_f, diff, name);
809 The following lowpass filter is based on some sample code by
810 Paul Kellett <paul.kellett@maxim.abel.co.uk>
813 void vtt_class :: render_lp()
817 for (sample = output_buffer; sample<end_of_outputbuffer; sample++)
819 lp_buf0 = lp_a * lp_buf0 + lp_freq * ((*sample)*lp_resgain + lp_b * (lp_buf0 - lp_buf1));
820 lp_buf1 = lp_a * lp_buf1 + lp_freq * lp_buf0;
826 void vtt_class :: render_ec()
832 for (i=0, sample = output_buffer, ec_sample=ec_output_buffer; i<samples_in_outputbuffer; i++, ec_sample++,sample++, ec_ptr++)
834 if (ec_ptr>ec_delay) ec_ptr=ec_buffer;
835 *ec_sample=(*ec_ptr) *ec_feedback;
836 *ec_ptr=*sample+*ec_sample;
840 int vtt_class :: set_mix_buffer_size(int no_samples)
842 list <vtt_class *> :: iterator vtt;
845 // printf("vtt_class::set_mix_buffer_size(), mix_buffer: %12x, mix_out: %12x, samples: %i\n", mix_buffer, mix_out_buffer, no_samples);
847 if (mix_buffer) tX_freemem(mix_buffer, "mix_buffer", "vtt set_mix_buffer_size()");
848 samples_in_mix_buffer=no_samples*2;
850 tX_malloc(mix_buffer, "mix_buffer", "vtt set_mix_buffer_size()", sizeof(float)*samples_in_mix_buffer, (float *));
851 mix_buffer_end=mix_buffer+samples_in_mix_buffer;
853 // printf("mix_buffer: %12x\n", mix_buffer);
854 // printf("mix_samples: %i, out_samples: %i", samples_in_mix_buffer, no_samples);
856 if (mix_out_buffer) tX_freemem(mix_out_buffer, "mix_out_buffer", "vtt set_mix_buffer_size()");
857 tX_malloc(mix_out_buffer, "mix_out_buffer", "vtt set_mix_buffer_size()", sizeof(int16_t)*samples_in_mix_buffer + 4, (int16_t *));
859 // printf("mix_out_buffer: %12x\n", mix_out_buffer);
861 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
863 res|=(*vtt)->set_output_buffer_size(no_samples);
866 if ((!mix_buffer) || (!mix_out_buffer) || res) return(1);
870 int16_t * vtt_class :: render_all_turntables()
872 list <vtt_class *> :: iterator vtt, next;
893 #ifndef OVERRIDE_MOVQ_AUTODETECT
895 #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
896 #endif /* GCC_VERSION */
898 #if (GCC_VERSION < 2096)
899 #warning "*************************"
900 #warning "* gcc < 2.96 *"
901 #warning "* assuming working movq *"
902 #warning "*************************"
903 #undef GCC_MOVQ_BUG_WORKAROUND
905 #warning "*************************"
906 #warning "* gcc >= 2.96 *"
907 #warning "* using movq-workaround *"
908 #warning "*************************"
909 #define GCC_MOVQ_BUG_WORKAROUND 1
910 #endif /* GCC < 2.96 */
911 #endif /* OVERRIDE MOVQ AUTODETECVT */
913 #ifdef GCC_MOVQ_BUG_WORKAROUND
914 /* REQUIRED DUE TO GCC BUG (2.96-3.0.2) */
915 mmx_t *mm_src1_ptr=&mm_src1;
916 mmx_t *mm_src2_ptr=&mm_src2;
917 mmx_t *mm_volume_ptr=&mm_volume;
918 mmx_t *mm_max_ptr=&mm_max;
919 mmx_t *mm_min_ptr=&mm_min;
921 #define MM_VAR_ACC(var) (* var ## _ptr)
922 #define MM_VAR_MOVQ(var) * var ## _ptr
924 #define MM_VAR_ACC(var) var
925 #define MM_VAR_MOVQ(var) var
927 int32_t *temp_int=&mm_max.d[1];
931 pthread_mutex_lock(&render_lock);
933 if (render_list.size()==0)
935 for (sample=0; sample<samples_in_mix_buffer; sample++)
937 mix_out_buffer[sample]=0;
942 vtt=render_list.begin();
944 max=(*vtt)->max_value;
948 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
950 temp=(*vtt)->output_buffer[sample];
951 mix_buffer[mix_sample]=temp*(*vtt)->res_volume_left;
953 mix_buffer[mix_sample]=temp*(*vtt)->res_volume_right;
956 if (temp>max) max=temp;
957 else if (temp<min) min=temp;
960 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->res_volume_left;
961 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->res_volume_right;
963 MM_VAR_ACC(mm_max).s[1]=MM_VAR_ACC(mm_max).s[0]=max;
964 MM_VAR_ACC(mm_min).s[1]=MM_VAR_ACC(mm_min).s[0]=min;
966 movq_m2r(MM_VAR_MOVQ(mm_max), mm1);
967 movq_m2r(MM_VAR_MOVQ(mm_min), mm2);
969 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
971 mix=(mmx_t*)mix_buffer;
973 for (f_prec* src=(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end;)
976 MM_VAR_ACC(mm_src1).s[0]=*src;
977 MM_VAR_ACC(mm_src1).s[1]=*src;
979 /* sample * l/r volume */
980 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
986 MM_VAR_ACC(mm_src2).s[0]=*src;
987 MM_VAR_ACC(mm_src2).s[1]=*src;
989 /* sample * l/r volume */
990 movq_m2r(MM_VAR_MOVQ(mm_src2), mm3);
994 /* calculating min/max */
995 MM_VAR_ACC(mm_src1).s[1]=MM_VAR_ACC(mm_src2).s[0];
996 movq_m2r(mm_src1, mm3);
1003 movq_r2m(mm1, MM_VAR_MOVQ(mm_max));
1004 movq_r2m(mm2, MM_VAR_MOVQ(mm_min));
1008 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];
1009 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];
1013 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
1015 if ((*vtt)->ec_enable)
1018 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1020 temp=(*vtt)->ec_output_buffer[sample];
1022 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_left;
1024 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_right;
1028 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->ec_volume_left;
1029 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->ec_volume_right;
1031 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1032 mix =(mmx_t*)mix_buffer;
1034 for (f_prec* src=(*vtt)->ec_output_buffer; mix < (mmx_t*) mix_buffer_end; src++, mix++)
1037 MM_VAR_ACC(mm_src1).s[0]=*src;
1038 MM_VAR_ACC(mm_src1).s[1]=*src;
1040 /* sample * l/r volume */
1041 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1042 pfmul_r2r(mm0, mm3);
1044 /* accumulating complete mix */
1045 movq_m2r(*mix, mm4);
1046 pfadd_r2r(mm4, mm3);
1047 movq_r2m(mm3, *mix);
1053 if (master_triggered)
1055 pthread_mutex_unlock(&render_lock);
1056 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1058 if ((*vtt)->is_sync_client)
1060 if ((*vtt)->sync_countdown)
1062 (*vtt)->sync_countdown--;
1066 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1071 pthread_mutex_lock(&render_lock);
1074 vtt=render_list.begin();
1075 for (vtt++; vtt!=render_list.end(); vtt++)
1078 max=(*vtt)->max_value;
1082 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1084 temp=(*vtt)->output_buffer[sample];
1085 mix_buffer[mix_sample]+=temp*(*vtt)->res_volume_left;
1087 mix_buffer[mix_sample]+=temp*(*vtt)->res_volume_right;
1090 if (temp>max) max=temp;
1091 else if (temp<min) min=temp;
1094 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->res_volume_left;
1095 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->res_volume_right;
1097 MM_VAR_ACC(mm_max).s[1]=MM_VAR_ACC(mm_max).s[0]=max;
1098 MM_VAR_ACC(mm_min).s[1]=MM_VAR_ACC(mm_min).s[0]=min;
1100 movq_m2r(MM_VAR_MOVQ(mm_max), mm1);
1101 movq_m2r(MM_VAR_MOVQ(mm_min), mm2);
1103 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1104 mix=(mmx_t*)mix_buffer;
1106 for (f_prec* src=(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end;)
1109 MM_VAR_ACC(mm_src1).s[0]=*src;
1110 MM_VAR_ACC(mm_src1).s[1]=*src;
1112 /* sample * l/r volume */
1113 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1114 pfmul_r2r(mm0, mm3);
1116 /* accumulating complete mix */
1117 movq_m2r(*mix, mm4);
1118 pfadd_r2r(mm4, mm3);
1119 movq_r2m(mm3, *mix);
1123 MM_VAR_ACC(mm_src2).s[0]=*src;
1124 MM_VAR_ACC(mm_src2).s[1]=*src;
1126 /* sample * l/r volume */
1127 movq_m2r(MM_VAR_MOVQ(mm_src2), mm3);
1128 pfmul_r2r(mm0, mm3);
1130 /* accumulating complete mix */
1131 movq_m2r(*mix, mm4);
1132 pfadd_r2r(mm4, mm3);
1133 movq_r2m(mm3, *mix);
1135 /* calculating min/max */
1136 MM_VAR_ACC(mm_src1).s[1]=MM_VAR_ACC(mm_src2).s[0];
1137 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1138 pfmax_r2r(mm3, mm1);
1139 pfmin_r2r(mm3, mm2);
1144 movq_r2m(mm1, MM_VAR_MOVQ(mm_max));
1145 movq_r2m(mm2, MM_VAR_MOVQ(mm_min));
1149 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];
1150 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];
1154 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
1156 if ((*vtt)->ec_enable)
1159 for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++)
1161 temp=(*vtt)->ec_output_buffer[sample];
1163 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_left;
1165 mix_buffer[mix_sample]+=temp*(*vtt)->ec_volume_right;
1169 MM_VAR_ACC(mm_volume).s[0]=(*vtt)->ec_volume_left;
1170 MM_VAR_ACC(mm_volume).s[1]=(*vtt)->ec_volume_right;
1172 movq_m2r(MM_VAR_MOVQ(mm_volume), mm0);
1173 mix =(mmx_t*)mix_buffer;
1175 for (f_prec* src=(*vtt)->ec_output_buffer; mix < (mmx_t*) mix_buffer_end; src++, mix++)
1178 MM_VAR_ACC(mm_src1).s[0]=*src;
1179 MM_VAR_ACC(mm_src1).s[1]=*src;
1181 /* sample * l/r volume */
1182 movq_m2r(MM_VAR_MOVQ(mm_src1), mm3);
1183 pfmul_r2r(mm0, mm3);
1185 /* accumulating complete mix */
1186 movq_m2r(*mix, mm4);
1187 pfadd_r2r(mm4, mm3);
1188 movq_r2m(mm3, *mix);
1201 for (sample=0; sample<samples_in_mix_buffer; sample+=2)
1203 temp=mix_buffer[sample];
1204 mix_out_buffer[sample]=(int16_t) temp;
1206 if (temp>max) max=temp;
1207 else if (temp<min) min=temp;
1211 if (min>max) mix_max_l=min; else mix_max_l=max;
1218 for (sample=1; sample<samples_in_mix_buffer; sample+=2)
1220 temp=mix_buffer[sample];
1221 mix_out_buffer[sample]=(int16_t) temp;
1223 if (temp>max) max=temp;
1224 else if (temp<min) min=temp;
1228 if (min>max) mix_max_r=min; else mix_max_r=max;
1233 vtt=render_list.begin();
1234 while (vtt!=render_list.end())
1239 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1242 pthread_mutex_unlock(&render_lock);
1244 return(mix_out_buffer);
1247 void vtt_class :: forward_all_turntables()
1249 list <vtt_class *> :: iterator vtt, next;
1251 if (render_list.size()>0)
1253 vtt=render_list.begin();
1254 (*vtt)->forward_turntable();
1256 if (master_triggered)
1258 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1260 if ((*vtt)->is_sync_client)
1262 if ((*vtt)->sync_countdown)
1264 (*vtt)->sync_countdown--;
1268 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1275 vtt=render_list.begin();
1276 for (vtt++; vtt!=render_list.end(); vtt++)
1278 (*vtt)->forward_turntable();
1283 vtt=render_list.begin();
1284 while (vtt!=render_list.end())
1289 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1295 int vtt_class :: trigger()
1297 list <vtt_fx *> :: iterator effect;
1299 if (!buffer) return (1);
1301 if (!is_playing) pthread_mutex_lock(&render_lock);
1303 if (res_pitch>=0) pos_f=0;
1307 speed_real=res_pitch;
1308 speed_target=res_pitch;
1311 /* activating plugins */
1312 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1314 (*effect)->activate();
1325 master_triggered_at=0;
1334 render_list.push_front(this);
1338 render_list.push_back(this);
1340 pthread_mutex_unlock(&render_lock);
1345 int vtt_class :: stop_nolock()
1347 list <vtt_fx *> :: iterator effect;
1351 pthread_mutex_unlock(&render_lock);
1354 render_list.remove(this);
1365 /* deactivating plugins */
1366 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1368 (*effect)->deactivate();
1374 int vtt_class :: stop()
1378 pthread_mutex_lock(&render_lock);
1382 pthread_mutex_unlock(&render_lock);
1387 void vtt_class :: set_sync_master(int master)
1391 if (sync_master) sync_master->set_sync_master(0);
1397 if (sync_master==this) sync_master=0;
1399 gui_clear_master_button(this);
1403 void vtt_class :: set_sync_client(int slave, int cycles)
1405 is_sync_client=slave;
1407 // sync_countdown=cycles;
1411 void vtt_class :: set_sync_client_ug(int slave, int cycles)
1413 set_sync_client(slave, cycles);
1416 void vtt_class :: set_master_volume(f_prec new_volume)
1418 list <vtt_class *> :: iterator vtt;
1420 master_volume=new_volume;
1421 globals.volume=new_volume;
1423 if (main_list.size()>0)
1425 vol_channel_adjust=sqrt((f_prec) main_list.size());
1426 res_master_volume=master_volume/vol_channel_adjust;
1429 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1431 (*vtt)->recalc_volume();
1435 void vtt_class :: set_master_pitch(f_prec new_pitch)
1437 list <vtt_class *> :: iterator vtt;
1439 globals.pitch=new_pitch;
1440 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1442 (*vtt)->recalc_pitch();
1446 void vtt_class :: enable_saturate (int newstate)
1448 do_saturate=newstate;
1451 void vtt_class :: focus_no(int no)
1453 list <vtt_class *> :: iterator vtt;
1456 for (i=0, vtt=main_list.begin(); vtt!=main_list.end(); vtt++, i++)
1465 void vtt_class :: focus_next()
1467 list <vtt_class *> :: iterator vtt;
1471 if (main_list.size())
1473 focused_vtt=(*main_list.begin());
1478 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++) {
1479 if ((*vtt)==focused_vtt) {
1480 /* Ok, we found ourselves.. */
1483 while ((vtt!=main_list.end()) && ((*vtt)->audio_hidden) ) {
1487 if (vtt==main_list.end()) {
1488 /* No other "focusable" after this vtt so we're looking for the next */
1490 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++) {
1491 if (! (*vtt)->audio_hidden) {
1496 /* When we get here there's no "focusable" vtt at all... damn */
1506 focused_vtt=(*main_list.begin());
1509 void vtt_class :: set_scratch(int newstate)
1513 sp_spin.receive_input_value(0);
1515 sense_cycles=globals.sense_cycles;
1519 sp_spin.receive_input_value(1);
1525 void vtt_class :: unfocus()
1530 void vtt_class :: set_x_input_parameter(tX_seqpar *sp)
1535 void vtt_class :: set_y_input_parameter(tX_seqpar *sp)
1540 void vtt_class :: xy_input(f_prec x_value, f_prec y_value)
1542 if (x_par) x_par->handle_mouse_input(x_value*globals.mouse_speed);
1543 if (y_par) y_par->handle_mouse_input(y_value*globals.mouse_speed);
1546 #define store(data); if (fwrite((void *) &data, sizeof(data), 1, output)!=1) res+=1;
1548 int vtt_class :: save(FILE * output)
1550 list <vtt_fx *> :: iterator effect;
1559 store(is_sync_master);
1560 store(is_sync_client);
1582 store(audio_hidden);
1583 store(control_hidden);
1585 pid=sp_speed.get_persistence_id();
1587 pid=sp_volume.get_persistence_id();
1589 pid=sp_pitch.get_persistence_id();
1591 pid=sp_trigger.get_persistence_id();
1593 pid=sp_loop.get_persistence_id();
1595 pid=sp_sync_client.get_persistence_id();
1597 pid=sp_sync_cycles.get_persistence_id();
1599 pid=sp_lp_enable.get_persistence_id();
1601 pid=sp_lp_gain.get_persistence_id();
1603 pid=sp_lp_reso.get_persistence_id();
1605 pid=sp_lp_freq.get_persistence_id();
1607 pid=sp_ec_enable.get_persistence_id();
1609 pid=sp_ec_length.get_persistence_id();
1611 pid=sp_ec_feedback.get_persistence_id();
1613 pid=sp_ec_volume.get_persistence_id();
1615 pid=sp_ec_pan.get_persistence_id();
1617 pid=sp_mute.get_persistence_id();
1619 pid=sp_spin.get_persistence_id();
1621 pid=sp_pan.get_persistence_id();
1624 counter=fx_list.size();
1627 for (effect=fx_list.begin(); effect!=fx_list.end(); effect++)
1629 (*effect)->save(output);
1636 pid=x_par->get_persistence_id();
1649 pid=y_par->get_persistence_id();
1658 hidden=gui.main_panel->is_hidden();
1661 hidden=gui.trigger_panel->is_hidden();
1664 hidden=gui.lp_panel->is_hidden();
1667 hidden=gui.ec_panel->is_hidden();
1673 #define atload(data); if (fread((void *) &data, sizeof(data), 1, input)!=1) res+=1;
1675 int vtt_class :: load_10(FILE * input)
1682 atload(is_sync_master);
1683 atload(is_sync_client);
1684 atload(sync_cycles);
1690 atload(autotrigger);
1694 atload(obsolete_int); //x_control
1695 atload(obsolete_int); //y_control
1701 lp_setup(lp_gain, lp_reso, lp_freq);
1705 ec_set_length(ec_length);
1706 atload(ec_feedback);
1707 ec_set_feedback(ec_feedback);
1713 int vtt_class :: load_11(FILE * input)
1722 atload(is_sync_master);
1723 atload(is_sync_client);
1724 atload(sync_cycles);
1730 atload(autotrigger);
1734 atload(obsolete_int); //x_control
1735 atload(obsolete_int); //y_control
1741 lp_setup(lp_gain, lp_reso, lp_freq);
1745 ec_set_length(ec_length);
1746 atload(ec_feedback);
1747 ec_set_feedback(ec_feedback);
1750 sp_speed.set_persistence_id(pid);
1752 sp_volume.set_persistence_id(pid);
1754 sp_pitch.set_persistence_id(pid);
1756 sp_trigger.set_persistence_id(pid);
1758 sp_loop.set_persistence_id(pid);
1760 sp_sync_client.set_persistence_id(pid);
1762 sp_sync_cycles.set_persistence_id(pid);
1764 sp_lp_enable.set_persistence_id(pid);
1766 sp_lp_gain.set_persistence_id(pid);
1768 sp_lp_reso.set_persistence_id(pid);
1770 sp_lp_freq.set_persistence_id(pid);
1772 sp_ec_enable.set_persistence_id(pid);
1774 sp_ec_length.set_persistence_id(pid);
1776 sp_ec_feedback.set_persistence_id(pid);
1778 sp_mute.set_persistence_id(pid);
1780 sp_spin.set_persistence_id(pid);
1787 int vtt_class :: load_12(FILE * input)
1795 LADSPA_Plugin *plugin;
1797 vtt_fx_ladspa *ladspa_effect;
1801 this->set_name(buffer);
1803 atload(is_sync_master);
1804 atload(is_sync_client);
1805 atload(sync_cycles);
1811 atload(autotrigger);
1820 lp_setup(lp_gain, lp_reso, lp_freq);
1824 ec_set_length(ec_length);
1825 atload(ec_feedback);
1826 ec_set_feedback(ec_feedback);
1829 sp_speed.set_persistence_id(pid);
1831 sp_volume.set_persistence_id(pid);
1833 sp_pitch.set_persistence_id(pid);
1835 sp_trigger.set_persistence_id(pid);
1837 sp_loop.set_persistence_id(pid);
1839 sp_sync_client.set_persistence_id(pid);
1841 sp_sync_cycles.set_persistence_id(pid);
1843 sp_lp_enable.set_persistence_id(pid);
1845 sp_lp_gain.set_persistence_id(pid);
1847 sp_lp_reso.set_persistence_id(pid);
1849 sp_lp_freq.set_persistence_id(pid);
1851 sp_ec_enable.set_persistence_id(pid);
1853 sp_ec_length.set_persistence_id(pid);
1855 sp_ec_feedback.set_persistence_id(pid);
1857 sp_mute.set_persistence_id(pid);
1859 sp_spin.set_persistence_id(pid);
1863 for (i=0; i<counter; i++)
1868 case TX_FX_BUILTINCUTOFF:
1869 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
1872 case TX_FX_BUILTINECHO:
1873 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
1878 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
1881 ladspa_effect=add_effect(plugin);
1882 ladspa_effect->load(input);
1886 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%i].", id);
1893 tx_note("Fatal Error loading set: unknown effect type!");
1903 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1905 else set_x_input_parameter(NULL);
1912 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1914 else set_y_input_parameter(NULL);
1917 gui.main_panel->hide(hidden);
1920 gui.trigger_panel->hide(hidden);
1923 gui.lp_panel->hide(hidden);
1926 gui.ec_panel->hide(hidden);
1931 int vtt_class :: load_13(FILE * input)
1939 LADSPA_Plugin *plugin;
1941 vtt_fx_ladspa *ladspa_effect;
1945 this->set_name(buffer);
1947 atload(is_sync_master);
1948 atload(is_sync_client);
1949 atload(sync_cycles);
1954 atload(autotrigger);
1964 lp_setup(lp_gain, lp_reso, lp_freq);
1968 ec_set_length(ec_length);
1969 atload(ec_feedback);
1970 ec_set_feedback(ec_feedback);
1974 ec_set_volume(ec_volume);
1979 sp_speed.set_persistence_id(pid);
1981 sp_volume.set_persistence_id(pid);
1983 sp_pitch.set_persistence_id(pid);
1985 sp_trigger.set_persistence_id(pid);
1987 sp_loop.set_persistence_id(pid);
1989 sp_sync_client.set_persistence_id(pid);
1991 sp_sync_cycles.set_persistence_id(pid);
1993 sp_lp_enable.set_persistence_id(pid);
1995 sp_lp_gain.set_persistence_id(pid);
1997 sp_lp_reso.set_persistence_id(pid);
1999 sp_lp_freq.set_persistence_id(pid);
2001 sp_ec_enable.set_persistence_id(pid);
2003 sp_ec_length.set_persistence_id(pid);
2005 sp_ec_feedback.set_persistence_id(pid);
2007 sp_ec_volume.set_persistence_id(pid);
2009 sp_ec_pan.set_persistence_id(pid);
2011 sp_mute.set_persistence_id(pid);
2013 sp_spin.set_persistence_id(pid);
2015 sp_pan.set_persistence_id(pid);
2019 for (i=0; i<counter; i++)
2024 case TX_FX_BUILTINCUTOFF:
2025 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
2028 case TX_FX_BUILTINECHO:
2029 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
2034 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
2037 ladspa_effect=add_effect(plugin);
2038 ladspa_effect->load(input);
2042 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%i].", id);
2049 tx_note("Fatal Error loading set: unknown effect type!");
2059 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2061 else set_x_input_parameter(NULL);
2068 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2070 else set_y_input_parameter(NULL);
2073 gui.main_panel->hide(hidden);
2076 gui.trigger_panel->hide(hidden);
2079 gui.lp_panel->hide(hidden);
2082 gui.ec_panel->hide(hidden);
2087 int vtt_class :: load_14(FILE * input)
2095 LADSPA_Plugin *plugin;
2097 vtt_fx_ladspa *ladspa_effect;
2101 this->set_name(buffer);
2103 atload(is_sync_master);
2104 atload(is_sync_client);
2105 atload(sync_cycles);
2110 atload(autotrigger);
2120 lp_setup(lp_gain, lp_reso, lp_freq);
2124 ec_set_length(ec_length);
2125 atload(ec_feedback);
2126 ec_set_feedback(ec_feedback);
2130 ec_set_volume(ec_volume);
2132 atload(audio_hidden);
2133 atload(control_hidden);
2138 sp_speed.set_persistence_id(pid);
2140 sp_volume.set_persistence_id(pid);
2142 sp_pitch.set_persistence_id(pid);
2144 sp_trigger.set_persistence_id(pid);
2146 sp_loop.set_persistence_id(pid);
2148 sp_sync_client.set_persistence_id(pid);
2150 sp_sync_cycles.set_persistence_id(pid);
2152 sp_lp_enable.set_persistence_id(pid);
2154 sp_lp_gain.set_persistence_id(pid);
2156 sp_lp_reso.set_persistence_id(pid);
2158 sp_lp_freq.set_persistence_id(pid);
2160 sp_ec_enable.set_persistence_id(pid);
2162 sp_ec_length.set_persistence_id(pid);
2164 sp_ec_feedback.set_persistence_id(pid);
2166 sp_ec_volume.set_persistence_id(pid);
2168 sp_ec_pan.set_persistence_id(pid);
2170 sp_mute.set_persistence_id(pid);
2172 sp_spin.set_persistence_id(pid);
2174 sp_pan.set_persistence_id(pid);
2178 for (i=0; i<counter; i++)
2183 case TX_FX_BUILTINCUTOFF:
2184 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
2187 case TX_FX_BUILTINECHO:
2188 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
2193 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
2196 ladspa_effect=add_effect(plugin);
2197 ladspa_effect->load(input);
2201 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%i].", id);
2208 tx_note("Fatal Error loading set: unknown effect type!");
2218 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2220 else set_x_input_parameter(NULL);
2227 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
2229 else set_y_input_parameter(NULL);
2232 gui.main_panel->hide(hidden);
2235 gui.trigger_panel->hide(hidden);
2238 gui.lp_panel->hide(hidden);
2241 gui.ec_panel->hide(hidden);
2247 int vtt_class :: save_all(FILE* output)
2250 list <vtt_class *> :: iterator vtt;
2253 tX_seqpar :: create_persistence_ids();
2256 store(master_volume);
2257 store(globals.pitch);
2258 pid=sp_master_volume.get_persistence_id();
2260 pid=sp_master_pitch.get_persistence_id();
2263 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
2265 res+=(*vtt)->save(output);
2268 sequencer.save(output);
2273 int vtt_class :: load_all_10(FILE* input, char *fname)
2275 int res=0, restmp=0;
2276 list <vtt_class *> :: iterator vtt;
2277 unsigned int i, max, size;
2280 char ftmp[PATH_MAX];
2282 while (main_list.size())
2284 delete((*main_list.begin()));
2288 atload(master_volume);
2289 set_master_volume(master_volume);
2290 globals.volume=master_volume;
2291 atload(globals.pitch);
2292 set_master_pitch(globals.pitch);
2294 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2295 ld_set_setname(fname);
2297 for (i=0; i<max; i++)
2299 newvtt=new vtt_class(1);
2300 res+=newvtt->load_10(input);
2302 if (strlen(newvtt->filename))
2304 /* ftmp IS NECESSARY !!! */
2305 strcpy(ftmp, newvtt->filename);
2306 ld_set_filename(ftmp);
2308 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2309 restmp=newvtt->load_file(ftmp);
2312 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2313 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2324 int vtt_class :: load_all_11(FILE* input, char *fname)
2326 int res=0, restmp=0;
2327 list <vtt_class *> :: iterator vtt;
2328 unsigned int i, max, size;
2331 char ftmp[PATH_MAX];
2334 while (main_list.size())
2336 delete((*main_list.begin()));
2340 atload(master_volume);
2341 set_master_volume(master_volume);
2342 globals.volume=master_volume;
2343 atload(globals.pitch);
2344 set_master_pitch(globals.pitch);
2346 sp_master_volume.set_persistence_id(pid);
2348 sp_master_pitch.set_persistence_id(pid);
2350 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2351 ld_set_setname(fname);
2353 for (i=0; i<max; i++)
2355 newvtt=new vtt_class(1);
2356 res+=newvtt->load_11(input);
2358 if (strlen(newvtt->filename))
2360 /* ftmp IS NECESSARY !!! */
2361 strcpy(ftmp, newvtt->filename);
2362 ld_set_filename(ftmp);
2364 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2365 restmp=newvtt->load_file(ftmp);
2368 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2369 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2373 sequencer.load(input);
2381 int vtt_class :: load_all_12(FILE* input, char *fname)
2383 int res=0, restmp=0;
2384 list <vtt_class *> :: iterator vtt;
2385 unsigned int i, max, size;
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 list <vtt_class *> :: iterator vtt;
2441 unsigned int i, max, size;
2444 char ftmp[PATH_MAX];
2447 while (main_list.size())
2449 delete((*main_list.begin()));
2453 atload(master_volume);
2454 set_master_volume(master_volume);
2455 globals.volume=master_volume;
2456 atload(globals.pitch);
2457 set_master_pitch(globals.pitch);
2459 sp_master_volume.set_persistence_id(pid);
2461 sp_master_pitch.set_persistence_id(pid);
2463 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2464 ld_set_setname(fname);
2466 for (i=0; i<max; i++)
2468 newvtt=new vtt_class(1);
2469 res+=newvtt->load_13(input);
2471 if (strlen(newvtt->filename))
2473 /* ftmp IS NECESSARY !!! */
2474 strcpy(ftmp, newvtt->filename);
2475 ld_set_filename(ftmp);
2477 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2478 restmp=newvtt->load_file(ftmp);
2481 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2482 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2486 sequencer.load(input);
2493 int vtt_class :: load_all_14(FILE* input, char *fname)
2495 int res=0, restmp=0;
2496 list <vtt_class *> :: iterator vtt;
2497 unsigned int i, max, size;
2500 char ftmp[PATH_MAX];
2503 while (main_list.size())
2505 delete((*main_list.begin()));
2509 atload(master_volume);
2510 set_master_volume(master_volume);
2511 globals.volume=master_volume;
2512 atload(globals.pitch);
2513 set_master_pitch(globals.pitch);
2515 sp_master_volume.set_persistence_id(pid);
2517 sp_master_pitch.set_persistence_id(pid);
2519 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
2520 ld_set_setname(fname);
2522 for (i=0; i<max; i++)
2524 newvtt=new vtt_class(1);
2525 res+=newvtt->load_14(input);
2527 if (strlen(newvtt->filename))
2529 /* ftmp IS NECESSARY !!! */
2530 strcpy(ftmp, newvtt->filename);
2531 ld_set_filename(ftmp);
2533 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
2534 restmp=newvtt->load_file(ftmp);
2537 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
2538 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
2539 if (newvtt->audio_hidden) newvtt->hide_audio(newvtt->audio_hidden);
2540 if (newvtt->control_hidden) newvtt->hide_control(newvtt->control_hidden);
\r
2543 sequencer.load(input);
2551 void add_vtt(GtkWidget *ctrl, GtkWidget *audio, char *fn)
2554 hmmpg = new vtt_class(1);
2555 gtk_box_pack_start(GTK_BOX(ctrl), hmmpg->gui.control_box, TRUE, TRUE, 0);
2556 gtk_box_pack_start(GTK_BOX(audio), hmmpg->gui.audio_box, TRUE, TRUE, 0);
2557 if (fn) hmmpg->load_file(fn);
2560 extern void vg_move_fx_panel_up(GtkWidget *wid, vtt_class *vtt);
2561 extern void vg_move_fx_panel_down(GtkWidget *wid, vtt_class *vtt);
2563 //#define debug_fx_stack(); for (i=fx_list.begin(); i != fx_list.end(); i++) puts((*i)->get_info_string());
2564 #define debug_fx_stack();
2566 void vtt_class :: effect_up(vtt_fx *effect)
2568 list <vtt_fx *> :: iterator i;
2569 list <vtt_fx *> :: iterator previous;
2574 if ((*fx_list.begin())==effect) return;
2576 for (previous=i=fx_list.begin(); i != fx_list.end(); i++)
2588 pthread_mutex_lock(&render_lock);
2589 fx_list.remove(effect);
2590 fx_list.insert(previous, effect);
2591 pthread_mutex_unlock(&render_lock);
2593 vg_move_fx_panel_up(effect->get_panel_widget(), this);
2599 void vtt_class :: effect_down(vtt_fx *effect)
2601 list <vtt_fx *> :: iterator i;
2606 for (i=fx_list.begin(); i != fx_list.end(); i++)
2615 if ((ok) && (i!=fx_list.end()))
2618 if (i==fx_list.end()) return;
2621 pthread_mutex_lock(&render_lock);
2622 fx_list.remove(effect);
2624 fx_list.insert(i, effect);
2625 vg_move_fx_panel_down(effect->get_panel_widget(), this);
2626 pthread_mutex_unlock(&render_lock);
2632 void vtt_class :: effect_remove(vtt_fx_ladspa *effect)
2634 pthread_mutex_lock(&render_lock);
2635 fx_list.remove(effect);
2636 pthread_mutex_unlock(&render_lock);
2641 extern void gui_hide_control_panel(vtt_class *vtt, bool hide);
2642 extern void gui_hide_audio_panel(vtt_class *vtt, bool hide);
2644 void vtt_class :: hide_audio(bool hide) {
2646 gui_hide_audio_panel(this, hide);
2649 void vtt_class :: hide_control(bool hide) {
2650 control_hidden=hide;
2651 gui_hide_control_panel(this, hide);