Removed lots of old code - fixed a record-to-wav error with the
[terminatorX.git] / src / tX_vttgui.cc
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2002  Alexander K├Ânig
4  
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: tX_vttgui.cc
20  
21     Description: This implements the gtk+ GUI for the virtual turntable
22                  class implemented in tX_vtt.cc. This code is not in tX_vtt.cc
23                  for mainly to keep the GUI code divided from the audio-rendering
24                  code and as gtk+ callback to C++ method call wrapper.
25                  
26     Changes:
27     
28     before 11-26-2001: too many changes.
29     
30     11-26-2001: applied Adrian's solo/mute patch - Alex
31     
32     11-27-2001: modified solo/mute to use the set_mix_mute/solo function
33                 of the vtts. The previous approach messed up the sequencer
34                 and more. Removed some old unnecessary code, too.
35 */    
36
37 #include <gdk/gdk.h>
38 #include <gtk/gtk.h>
39 #include "tX_vttgui.h"
40 #include "tX_vtt.h"
41 #include "tX_widget.h"
42 #include "tX_mastergui.h"
43 #include "tX_loaddlg.h"
44 #include "tX_prelis.h"
45 #include "tX_pbutton.h"
46 #include "tX_global.h"
47 #include "tX_extdial.h"
48 #include "tX_panel.h"
49 #include "tX_ladspa.h"
50
51 #ifdef USE_DIAL
52 #include "tX_dial.h"
53 #endif
54
55 #ifdef USE_FLASH
56 #include "tX_flash.h"
57 #endif
58 #include <stdio.h>
59
60 #define WID_DYN TRUE, TRUE, 0
61 #define WID_FIX FALSE, FALSE, 0
62
63 #define FILENAME_BUTTON_MAX 20
64
65 void nicer_filename(char *dest, char *source)
66 {
67                 char *fn;
68                 char temp[PATH_MAX];
69                 int i;
70                 
71                 fn=strrchr(source, '/');
72                 if (fn) fn++;
73                 else fn=source;
74                 
75                 strcpy (temp, fn);
76                 
77                 fn=strrchr(temp, '.');
78                 if (fn) *fn=0;
79                 
80                 if (strlen(temp) > FILENAME_BUTTON_MAX)
81                 {
82                         temp[FILENAME_BUTTON_MAX-3]='.';
83                         temp[FILENAME_BUTTON_MAX-2]='.';
84                         temp[FILENAME_BUTTON_MAX-1]='.';
85                         temp[FILENAME_BUTTON_MAX]=0;
86                 } 
87                 strcpy (dest, temp);
88 }
89
90 void name_changed(GtkWidget *wid, vtt_class *vtt)
91 {
92         vtt->set_name((char *) gtk_entry_get_text(GTK_ENTRY(wid)));
93 }
94
95 void volume_changed(GtkWidget *wid, vtt_class *vtt)
96 {
97         vtt->sp_volume.receive_gui_value(2.0-GTK_ADJUSTMENT(wid)->value);
98 }
99
100 void pan_changed(GtkWidget *wid, vtt_class *vtt)
101 {
102       vtt->sp_pan.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
103 }
104
105 void pitch_changed(GtkWidget *wid, vtt_class *vtt)
106 {
107         vtt->sp_pitch.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
108 }
109
110 GtkSignalFunc trigger_prelis(GtkWidget *w)
111 {
112         GtkFileSelection *fs;
113
114         fs=GTK_FILE_SELECTION(gtk_widget_get_toplevel(w));
115         
116         prelis_start((char *) gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
117         return(0);
118 }
119
120 void cancel_load_file(GtkWidget *wid, vtt_class *vtt)
121 {
122         prelis_stop();
123         
124         vtt->gui.file_dialog=NULL;
125         if (vtt->gui.fs) gtk_widget_destroy(GTK_WIDGET(vtt->gui.fs));
126 }
127
128 int quit_load_file(GtkWidget *wid, vtt_class *vtt)
129 {
130         return 1;
131 }
132
133 char global_filename_buffer[PATH_MAX];
134
135 void load_part(char *newfile, vtt_class *vtt)
136 {
137         int ret=0;
138         char *fn;
139
140         ld_create_loaddlg(TX_LOADDLG_MODE_SINGLE, 1);
141         ld_set_filename(newfile);
142
143         ret = vtt->load_file(newfile);
144         
145         ld_destroy();
146         if (ret)
147         {
148                 switch(ret)
149                 {
150                         case TX_AUDIO_ERR_ALLOC:
151                         tx_note("Error loading file: failed to allocate memory");
152                         break;
153                         case TX_AUDIO_ERR_PIPE_READ:
154                         tx_note("Error loading file: broken pipe (File not supported/corrupt?)");
155                         break;
156                         case TX_AUDIO_ERR_SOX:
157                         tx_note("Error loading file: couldn't execute sox");
158                         break;
159                         case TX_AUDIO_ERR_MPG123:
160                         tx_note("Error loading file: couldn't execute mpg123");
161                         break;
162                         case TX_AUDIO_ERR_WAV_NOTFOUND:
163                         tx_note("Error loading file: file not found");
164                         break;
165                         case TX_AUDIO_ERR_NOT_16BIT:
166                         tx_note("Error loading file: RIFF/WAV is not 16 Bit.");
167                         break;
168                         case TX_AUDIO_ERR_NOT_MONO:
169                         tx_note("Error loading file: RIFF/WAV is not mono");
170                         break;
171                         case TX_AUDIO_ERR_WAV_READ:
172                         tx_note("Error loading file: RIFF/WAV corrupt?");
173                         break;
174                         case TX_AUDIO_ERR_NOT_SUPPORTED:
175                         tx_note("Error loading file: filetype not supported.");
176                         break;
177                         default:                                        
178                         tx_note("OOPS: An unknown error occured - This shouldn't happen :(");   
179                 }
180         }
181         else
182         {
183                 nicer_filename(global_filename_buffer, newfile);
184 #ifdef  USE_GTK2
185         gtk_button_set_label(GTK_BUTTON(vtt->gui.file), global_filename_buffer);
186 #else           
187                 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.file)->child), global_filename_buffer);
188 #endif
189         }       
190 }
191
192 void do_load_file(GtkWidget *wid, vtt_class *vtt)
193 {
194         int ret;
195         char newfile[PATH_MAX];
196         char buffer[1024]="Couldn't open loop file: ";
197         char fn[FILENAME_BUTTON_MAX];
198         
199         int16_t *newbuffer;
200         unsigned int newsize;
201         
202         prelis_stop();
203
204         strcpy(newfile, gtk_file_selection_get_filename(GTK_FILE_SELECTION(vtt->gui.fs)));
205         gtk_widget_destroy(GTK_WIDGET(vtt->gui.fs));
206         
207         load_part(newfile, vtt);
208         
209         if (!globals.current_path)
210         {
211                 free(globals.current_path);
212                 globals.current_path = NULL;
213         }
214
215         globals.current_path = strdup(newfile);
216
217         vtt->gui.file_dialog=NULL;
218 }
219
220 void drop_file(GtkWidget *widget, GdkDragContext *context,
221                 gint x, gint y, GtkSelectionData *selection_data,
222                 guint info, guint time, vtt_class *vtt)
223 {
224         char filename[PATH_MAX];
225         char *fn;
226         int s;
227         void *prr;
228         
229         strncpy(filename, (char *) selection_data->data, (size_t) selection_data->length);
230         filename[selection_data->length]=0;
231
232         fn = strchr (filename, '\r');
233         *fn=0;  
234
235 #ifdef USE_GTK2 
236         char *host=NULL;
237         char *realfn=NULL;
238         
239         realfn=g_filename_from_uri(filename, &host, NULL);
240         if (realfn) {
241                 fn=realfn;
242         } else  {
243 #endif          
244                 fn = strchr (filename, ':');
245                 if (fn) fn++; else fn=(char *) selection_data->data;
246 #ifdef USE_GTK2                 
247         }
248 #endif  
249
250         load_part(realfn, vtt);
251
252 #ifdef USE_GTK2 
253         if (realfn) g_free(realfn);
254         if (host) g_free(host);
255 #endif          
256 }
257
258
259 GtkSignalFunc load_file(GtkWidget *wid, vtt_class *vtt)
260 {       
261         char buffer[512];
262         
263         if (vtt->gui.file_dialog)
264         {
265                 gdk_window_raise(vtt->gui.file_dialog);
266                 return(0);
267         }
268         
269         sprintf(buffer, "Select Audio File for %s", vtt->name);
270         vtt->gui.fs=gtk_file_selection_new(buffer);
271         
272         if (strlen(vtt->filename) > 0)
273         {
274                 gtk_file_selection_set_filename(GTK_FILE_SELECTION(vtt->gui.fs), vtt->filename);        
275         }
276         
277         gtk_widget_show(GTK_WIDGET(vtt->gui.fs));
278         
279         vtt->gui.file_dialog=vtt->gui.fs->window;
280         
281         if (globals.current_path)
282                 {
283                         gtk_file_selection_set_filename(GTK_FILE_SELECTION(vtt->gui.fs),globals.current_path);
284                 }
285         gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->ok_button), "clicked", GTK_SIGNAL_FUNC(do_load_file), vtt);
286         gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->cancel_button), "clicked", GTK_SIGNAL_FUNC (cancel_load_file), vtt);    
287         gtk_signal_connect (GTK_OBJECT(vtt->gui.fs), "delete-event", GTK_SIGNAL_FUNC(quit_load_file), vtt);     
288 #ifdef USE_GTK2
289         gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->file_list), "cursor_changed", GTK_SIGNAL_FUNC(trigger_prelis), vtt->gui.fs);            
290 #else
291         gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->file_list), "select_row", GTK_SIGNAL_FUNC(trigger_prelis), vtt->gui.fs);
292 #endif          
293 }
294
295 void delete_vtt(GtkWidget *wid, vtt_class *vtt)
296 {
297         if (audioon) tx_note("Sorry, you'll have to stop playback first.");
298         else
299         delete(vtt);
300 }
301
302 void edit_vtt_buffer(GtkWidget *wid, vtt_class *vtt)
303 {
304         char command[2*PATH_MAX];
305
306         if (vtt->samples_in_buffer == 0)
307         {
308                 tx_note("Nothing to edit.");
309         }
310         else
311         if (strlen(globals.file_editor)>0)
312         {
313                 sprintf(command, "%s \"%s\" &", globals.file_editor, vtt->filename);
314                 system(command); /*) tx_note("Failed to run the soundfile editor."); */
315         }
316         else
317         {
318                 tx_note("No soundfile editor configured.");
319         }
320 }
321
322 void reload_vtt_buffer(GtkWidget *wid, vtt_class *vtt)
323 {
324         char reload_buffer[PATH_MAX];
325         
326         while (gtk_events_pending()) gtk_main_iteration();
327         
328         if (vtt->samples_in_buffer > 0)
329         {
330                 strcpy(reload_buffer, vtt->filename);
331                 load_part(reload_buffer, vtt);
332         }
333         else tx_note("Nothing to reload.");
334 }
335
336 void clone_vtt(GtkWidget *wid, vtt_class *vtt)
337 {
338         vtt->stop();
339 }
340
341 void trigger_vtt(GtkWidget *wid, vtt_class *vtt)
342 {
343         vtt->sp_trigger.receive_gui_value((float) 1.0);
344 }
345
346 void stop_vtt(GtkWidget *wid, vtt_class *vtt)
347 {
348         vtt->sp_trigger.receive_gui_value((float) 0.0);
349 }
350
351 void autotrigger_toggled(GtkWidget *wid, vtt_class *vtt)
352 {
353         vtt->set_autotrigger(GTK_TOGGLE_BUTTON(wid)->active);
354 }
355
356 void loop_toggled(GtkWidget *wid, vtt_class *vtt)
357 {
358         vtt->sp_loop.receive_gui_value(GTK_TOGGLE_BUTTON(wid)->active);
359 }
360
361 void lp_enabled(GtkWidget *wid, vtt_class *vtt)
362 {
363         vtt->sp_lp_enable.receive_gui_value(GTK_TOGGLE_BUTTON(wid)->active);
364 }
365
366 void lp_gain_changed(GtkWidget *wid, vtt_class *vtt)
367 {
368         vtt->sp_lp_gain.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
369 }
370
371 void lp_reso_changed(GtkWidget *wid, vtt_class *vtt)
372 {
373         vtt->sp_lp_reso.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
374 }
375
376 void lp_freq_changed(GtkWidget *wid, vtt_class *vtt)
377 {
378         vtt->sp_lp_freq.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
379 }
380
381 void ec_enabled(GtkWidget *wid, vtt_class *vtt)
382 {
383         vtt->sp_ec_enable.receive_gui_value(GTK_TOGGLE_BUTTON(wid)->active);
384 }
385
386 void ec_length_changed(GtkWidget *wid, vtt_class *vtt)
387 {
388         vtt->sp_ec_length.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
389 }
390
391 void ec_feedback_changed(GtkWidget *wid, vtt_class *vtt)
392 {
393         vtt->sp_ec_feedback.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
394 }
395
396 void ec_pan_changed(GtkWidget *wid, vtt_class *vtt)
397 {
398         vtt->sp_ec_pan.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
399 }
400
401 void ec_volume_changed(GtkWidget *wid, vtt_class *vtt)
402 {
403         vtt->sp_ec_volume.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
404 }
405
406 void master_setup(GtkWidget *wid, vtt_class *vtt)
407 {
408         vtt->set_sync_master(GTK_TOGGLE_BUTTON(wid)->active);
409 }
410
411 void client_setup(GtkWidget *wid, vtt_class *vtt)
412 {
413         int client;
414         
415         client=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vtt->gui.sync_client));   
416         vtt->sp_sync_client.receive_gui_value(client);
417 }
418
419 void client_setup_number(GtkWidget *wid, vtt_class *vtt)
420 {
421         int cycles;
422         
423         cycles=(int) GTK_ADJUSTMENT(vtt->gui.cycles)->value;    
424         
425         vtt->sp_sync_cycles.receive_gui_value(cycles);
426 }
427
428 void mute_volume(GtkWidget *widget, vtt_class *vtt)
429 {
430         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
431         {
432                 vtt->set_mix_mute(1);
433         }
434         else
435         {
436                 vtt->set_mix_mute(0);
437         }
438 }
439
440 void solo_vtt(GtkWidget *widget, vtt_class *vtt)
441 {
442         list <vtt_class *> :: iterator it_vtt;
443
444         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) 
445         {
446                 vtt->set_mix_solo(1);
447         }
448         else
449         {
450                 vtt->set_mix_solo(0);
451         }
452 }      
453
454 void minimize_control_panel(GtkWidget *wid, vtt_class *vtt)
455 {
456         vtt->hide_control(true);
457 }
458
459 void unminimize_control_panel(GtkWidget *wid, vtt_class *vtt)
460 {
461         vtt->hide_control(false);
462 }
463
464 void minimize_audio_panel(GtkWidget *wid, vtt_class *vtt)
465 {
466         vtt->hide_audio(true);
467 }
468
469 void unminimize_audio_panel(GtkWidget *wid, vtt_class *vtt)
470 {
471         vtt->hide_audio(false);
472 }
473
474 void vg_xcontrol_dis(GtkWidget *wid, vtt_class *vtt)
475 {
476         vtt->set_x_input_parameter(NULL);
477 }
478
479 void vg_ycontrol_dis(GtkWidget *wid, vtt_class *vtt)
480 {
481         vtt->set_y_input_parameter(NULL);
482 }
483
484 void vg_xcontrol_set(GtkWidget *wid, tX_seqpar *sp)
485 {
486         vtt_class *vtt=(vtt_class *) sp->vtt;
487         vtt->set_x_input_parameter(sp);
488 }
489
490 void vg_ycontrol_set(GtkWidget *wid, tX_seqpar *sp)
491 {
492         vtt_class *vtt=(vtt_class *) sp->vtt;
493         vtt->set_y_input_parameter(sp);
494 }
495
496 void vg_mouse_mapping_pressed(GtkWidget *wid, vtt_class *vtt) {
497         if (vtt->gui.mouse_mapping_menu) {
498                 gtk_widget_destroy(vtt->gui.mouse_mapping_menu);
499                 vtt->gui.mouse_mapping_menu=NULL;
500         }
501         /* gtk+ seems to cleanup the submenus automatically */
502         
503         vtt->gui.mouse_mapping_menu=gtk_menu_new();
504         GtkWidget *x_item;
505         GtkWidget *y_item;
506         
507         x_item=gtk_menu_item_new_with_label("X-axis (Left <-> Right)");
508         gtk_menu_append(GTK_MENU(vtt->gui.mouse_mapping_menu), x_item);
509         gtk_widget_show(x_item);
510
511         y_item=gtk_menu_item_new_with_label("Y-axis (Up <-> Down)");
512         gtk_menu_append(GTK_MENU(vtt->gui.mouse_mapping_menu), y_item);
513         gtk_widget_show(y_item);
514         
515         vtt->gui.mouse_mapping_menu_x=gtk_menu_new();
516         vtt->gui.mouse_mapping_menu_y=gtk_menu_new();
517         
518         GtkWidget *item;
519         GtkWidget *item_to_activate=NULL;
520         
521         /* Filling the X menu */
522         item = gtk_check_menu_item_new_with_label("Disable");
523         gtk_menu_append(GTK_MENU(vtt->gui.mouse_mapping_menu_x), item);
524         gtk_widget_show(item);
525         gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_xcontrol_dis), vtt);
526         if (vtt->x_par==NULL) item_to_activate=item;
527
528         list <tX_seqpar *> :: iterator sp;
529
530         for (sp=tX_seqpar::all.begin(); sp!=tX_seqpar::all.end(); sp++) {
531                 if (((*sp)->is_mappable) && ((*sp)->vtt) == (void*) vtt) {
532                         item=gtk_check_menu_item_new_with_label((*sp)->get_name());
533                         gtk_menu_append(GTK_MENU(vtt->gui.mouse_mapping_menu_x), item);
534                         gtk_widget_show(item);
535                         gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_xcontrol_set), (void*) (*sp));
536                         
537                         if (vtt->x_par==(*sp)) item_to_activate=item;
538                 }
539         }
540
541         if (item_to_activate) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_to_activate), TRUE);
542         
543         /* Filling the Y menu */
544         item_to_activate=NULL;
545         
546         item = gtk_check_menu_item_new_with_label("Disable");
547         gtk_menu_append(GTK_MENU(vtt->gui.mouse_mapping_menu_y), item);
548         gtk_widget_show(item);
549         gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_ycontrol_dis), vtt);
550         if (vtt->y_par==NULL) item_to_activate=item;
551
552         for (sp=tX_seqpar::all.begin(); sp!=tX_seqpar::all.end(); sp++) {
553                 if (((*sp)->is_mappable) && ((*sp)->vtt) == (void*) vtt) {
554                         item=gtk_check_menu_item_new_with_label((*sp)->get_name());
555                         gtk_menu_append(GTK_MENU(vtt->gui.mouse_mapping_menu_y), item);
556                         gtk_widget_show(item);
557                         gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_ycontrol_set), (void*) (*sp));
558                         
559                         if (vtt->y_par==(*sp)) item_to_activate=item;
560                 }
561         }
562
563         if (item_to_activate) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_to_activate), TRUE);
564         
565         gtk_menu_item_set_submenu(GTK_MENU_ITEM(x_item), vtt->gui.mouse_mapping_menu_x);
566         gtk_menu_item_set_submenu(GTK_MENU_ITEM(y_item), vtt->gui.mouse_mapping_menu_y);
567         
568         gtk_menu_popup (GTK_MENU(vtt->gui.mouse_mapping_menu), NULL, NULL, NULL, NULL, 0, 0);
569
570 #ifdef USE_GTK2
571         /* gtk+ is really waiting for this.. */
572         gtk_signal_emit_by_name(GTK_OBJECT(wid), "released", vtt);
573 #endif  
574 }
575
576 void vg_file_button_pressed(GtkWidget *wid, vtt_class *vtt) {
577         if (vtt->gui.file_menu==NULL) {
578                 GtkWidget *item;
579                 
580                 vtt->gui.file_menu=gtk_menu_new();
581                 item=gtk_menu_item_new_with_label("Load audio file");
582                 gtk_menu_append(GTK_MENU(vtt->gui.file_menu), item);
583                 gtk_widget_show(item);
584                 
585                 gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(load_file), vtt);
586                 
587                 item=gtk_menu_item_new_with_label("Edit audio file");
588                 gtk_menu_append(GTK_MENU(vtt->gui.file_menu), item);
589                 gtk_widget_show(item);
590
591                 gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(edit_vtt_buffer), vtt);
592
593                 item=gtk_menu_item_new_with_label("Reload current audio file");
594                 gtk_menu_append(GTK_MENU(vtt->gui.file_menu), item);
595                 gtk_widget_show(item);
596
597                 gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(reload_vtt_buffer), vtt);
598         }
599         
600         gtk_menu_popup(GTK_MENU(vtt->gui.file_menu), NULL, NULL, NULL, NULL, 0,0);
601
602 #ifdef USE_GTK2
603         /* gtk+ is really waiting for this.. */
604         gtk_signal_emit_by_name(GTK_OBJECT(wid), "released", vtt);
605 #endif  
606 }
607
608
609 static vtt_class * fx_vtt;
610
611 void new_effect(GtkWidget *wid, LADSPA_Plugin *plugin)
612 {
613         fx_vtt->add_effect(plugin);
614 }
615
616 void fx_button_pressed(GtkWidget *wid, vtt_class *vtt)
617 {
618         vtt_gui *g=&vtt->gui;
619         GtkWidget *item;
620         int i;
621         LADSPA_Plugin *plugin;
622         char buffer[1024];
623         char oldfile[1024]="";
624         GtkWidget *submenu;
625
626         fx_vtt=vtt; /* AAAAARGH - Long live ugly code */
627
628         if (g->ladspa_menu) gtk_object_destroy(GTK_OBJECT(g->ladspa_menu));
629         g->ladspa_menu=gtk_menu_new();
630         
631         for (i=0; i<LADSPA_Plugin::getPluginCount(); i++)
632         {
633                 plugin=LADSPA_Plugin::getPluginByIndex(i);
634                 if (strcmp(plugin->get_file_name(), oldfile))
635                 {
636                         strcpy(oldfile, plugin->get_file_name());
637                         item = gtk_menu_item_new_with_label(oldfile);
638                         submenu=gtk_menu_new();
639                         gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
640                         gtk_menu_append(GTK_MENU(g->ladspa_menu), item);
641                         gtk_widget_show(item);
642                 }
643                 sprintf(buffer, "%s - [%i, %s]", plugin->getName(), plugin->getUniqueID(), plugin->getLabel());
644                 item=gtk_menu_item_new_with_label(buffer);
645                 gtk_menu_append(GTK_MENU(submenu), item);
646                 gtk_widget_show(item);
647                 gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(new_effect), plugin);
648         }
649         
650         gtk_menu_popup (GTK_MENU(g->ladspa_menu), NULL, NULL, NULL, NULL, 0, 0);
651
652 #ifdef USE_GTK2
653         /* gtk+ is really waiting for this.. */
654         gtk_signal_emit_by_name(GTK_OBJECT(wid), "released", vtt);
655 #endif  
656 }
657
658 #define connect_entry(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "activate", (GtkSignalFunc) func, (void *) vtt);
659 #define connect_adj(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "value_changed", (GtkSignalFunc) func, (void *) vtt);
660 #define connect_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "clicked", (GtkSignalFunc) func, (void *) vtt);
661
662 #ifdef USE_GTK2
663 #define connect_press_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "pressed", (GtkSignalFunc) func, (void *) vtt);
664 #else
665 /* "pressed" then pop-up doesn't work with gtk 1.2 
666    and the well-known gdk hack doesn't support an additional vtt pointer..
667 */
668 #define connect_press_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "clicked", (GtkSignalFunc) func, (void *) vtt);
669 #endif
670
671 #define connect_rel_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "released", (GtkSignalFunc) func, (void *) vtt);
672
673 GtkWidget *vg_create_fx_bar(vtt_class *vtt, vtt_fx *effect, int showdel);
674
675 void gui_connect_signals(vtt_class *vtt)
676 {
677         vtt_gui *g=&vtt->gui;
678
679         connect_entry(name, name_changed);
680         connect_adj(volume, volume_changed);
681         connect_adj(pitch, pitch_changed);
682         connect_adj(pan, pan_changed);
683         connect_press_button(file, vg_file_button_pressed);
684         
685         connect_button(del, delete_vtt);
686         connect_button(trigger, trigger_vtt);
687         connect_button(stop, stop_vtt);
688         connect_button(autotrigger, autotrigger_toggled);
689         connect_button(loop, loop_toggled);
690         connect_button(sync_master, master_setup);
691         connect_button(sync_client, client_setup);
692         connect_adj(cycles, client_setup_number);
693         connect_press_button(fx_button, fx_button_pressed);
694         
695         connect_button(lp_enable, lp_enabled);
696         connect_adj(lp_gain, lp_gain_changed);
697         connect_adj(lp_reso, lp_reso_changed);
698         connect_adj(lp_freq, lp_freq_changed);
699         
700         connect_button(ec_enable, ec_enabled);
701         connect_adj(ec_length, ec_length_changed);
702         connect_adj(ec_feedback, ec_feedback_changed);
703         connect_adj(ec_pan, ec_pan_changed);
704         connect_adj(ec_volume, ec_volume_changed);      
705         connect_press_button(mouse_mapping, vg_mouse_mapping_pressed);
706         connect_button(control_minimize, minimize_control_panel);
707         connect_button(audio_minimize, minimize_audio_panel);
708
709         static GtkTargetEntry drop_types [] = {
710                 { "text/uri-list", 0, 0}
711         };
712         static gint n_drop_types = sizeof (drop_types) / sizeof(drop_types[0]);
713         
714         gtk_drag_dest_set (GTK_WIDGET (g->file), (GtkDestDefaults) (GTK_DEST_DEFAULT_MOTION |GTK_DEST_DEFAULT_HIGHLIGHT |GTK_DEST_DEFAULT_DROP),
715                         drop_types, n_drop_types,
716                         GDK_ACTION_COPY);
717                                                 
718         gtk_signal_connect (GTK_OBJECT (g->file), "drag_data_received",
719                         GTK_SIGNAL_FUNC(drop_file), (void *) vtt);
720
721         gtk_drag_dest_set (GTK_WIDGET (g->display), (GtkDestDefaults) (GTK_DEST_DEFAULT_MOTION |GTK_DEST_DEFAULT_HIGHLIGHT |GTK_DEST_DEFAULT_DROP),
722                         drop_types, n_drop_types,
723                         GDK_ACTION_COPY);
724                                                 
725         gtk_signal_connect (GTK_OBJECT (g->display), "drag_data_received",
726                         GTK_SIGNAL_FUNC(drop_file), (void *) vtt);
727         
728 }
729         
730 void build_vtt_gui(vtt_class *vtt)
731 {
732         GtkWidget *tempbox;
733         GtkWidget *tempbox2;
734         GtkWidget *tempbox3;
735         GtkWidget *dummy;
736         char nice_name[FILENAME_BUTTON_MAX];
737         
738         vtt_gui *g;
739         
740         g=&vtt->gui;
741         vtt->have_gui=1;
742         g->par_menu=NULL;
743         g->ladspa_menu=NULL;
744
745         /* Building Audio Box */
746         g->audio_box=gtk_vbox_new(FALSE,2);
747         gtk_widget_show(g->audio_box);
748         
749         tempbox2=gtk_hbox_new(FALSE,2);
750         gtk_widget_show(tempbox2);
751         gtk_box_pack_start(GTK_BOX(g->audio_box), tempbox2, WID_FIX);
752         
753         tempbox=gtk_hbox_new(TRUE,2);
754         gtk_widget_show(tempbox);
755         gtk_box_pack_start(GTK_BOX(tempbox2), tempbox, WID_DYN);
756
757         GtkWidget *pixmap;
758         g->audio_minimize=gtk_button_new();
759         pixmap=tx_pixmap_widget(TX_ICON_MINIMIZE_PANEL);
760         gtk_container_add (GTK_CONTAINER (g->audio_minimize), pixmap);  
761         gtk_box_pack_end(GTK_BOX(tempbox2), g->audio_minimize, WID_FIX);
762         gtk_widget_show(pixmap);
763         gtk_widget_show(g->audio_minimize);
764
765
766         g->audio_label=gtk_label_new(vtt->name);
767         gtk_misc_set_alignment(GTK_MISC(g->audio_label), 0.025, 0.5);
768         gtk_widget_show(g->audio_label);
769         gtk_box_pack_start(GTK_BOX(tempbox), g->audio_label, WID_DYN);
770
771         nicer_filename(nice_name, vtt->filename);
772         g->file = gtk_button_new_with_label(nice_name);
773         gtk_widget_show(g->file);
774         gui_set_tooltip(g->file, "Click to Load/Edit/Reload a sample for this turntable. To load you can also drag a file and drop it over this button or the sound data display below.");
775         gtk_box_pack_start(GTK_BOX(tempbox), g->file, WID_DYN);
776
777         g->mouse_mapping=gtk_button_new_with_label("Mouse Mapping");
778         gtk_widget_show(g->mouse_mapping);
779         gui_set_tooltip(g->mouse_mapping, "Determines what parameters should be affected on mouse moition in mouse grab mode.");
780    
781         gtk_box_pack_start(GTK_BOX(tempbox), g->mouse_mapping, WID_DYN);
782    
783         g->display=gtk_tx_new(vtt->buffer, vtt->samples_in_buffer);
784         gtk_box_pack_start(GTK_BOX(g->audio_box), g->display, WID_DYN);
785         gtk_widget_show(g->display);    
786         
787         /* Building Control Box */
788         
789         g->control_box=gtk_vbox_new(FALSE,2);
790         gtk_widget_show(g->control_box);
791
792         tempbox2=gtk_hbox_new(FALSE, 2);
793         gtk_widget_show(tempbox2);
794         gtk_box_pack_start(GTK_BOX(g->control_box), tempbox2, WID_FIX);
795
796         g->control_label=gtk_label_new(vtt->name);
797         gtk_widget_show(g->control_label);
798         gtk_box_pack_start(GTK_BOX(tempbox2), g->control_label, WID_DYN);
799
800         g->control_minimize=gtk_button_new();
801         pixmap=tx_pixmap_widget(TX_ICON_MINIMIZE_PANEL);
802         gtk_container_add (GTK_CONTAINER (g->control_minimize), pixmap);        
803         gtk_box_pack_end(GTK_BOX(tempbox2), g->control_minimize, WID_FIX);
804         gtk_widget_show(pixmap);
805         gtk_widget_show(g->control_minimize);
806
807         g->scrolled_win=gtk_scrolled_window_new (NULL, NULL);
808         gtk_container_set_border_width (GTK_CONTAINER (g->scrolled_win), 0);
809         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (g->scrolled_win),
810                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
811         gtk_widget_show(g->scrolled_win);
812         gtk_box_pack_start(GTK_BOX(g->control_box), g->scrolled_win, WID_DYN);
813                                     
814         g->control_subbox=gtk_vbox_new(FALSE,0);
815         gtk_scrolled_window_add_with_viewport (
816                    GTK_SCROLLED_WINDOW (g->scrolled_win), g->control_subbox);
817         gtk_widget_show(g->control_subbox);
818                    
819
820         /* Main panel */
821         
822         tX_panel *p=new tX_panel("Main", g->control_subbox);
823         g->main_panel=p;
824                         
825         g->name = gtk_entry_new_with_max_length(256);   
826         gtk_entry_set_text(GTK_ENTRY(g->name), vtt->name);
827         p->add_client_widget(g->name);
828         gui_set_tooltip(g->name, "Enter the turntable's name here.");
829         gtk_widget_set_usize(g->name, 40, g->name->requisition.height);
830         
831         g->del=gtk_button_new_with_label("Delete");
832         gui_set_tooltip(g->del, "Click here to annihilate this turntable. All events recorded for this turntable will be erased, too.");
833         p->add_client_widget(g->del);
834         
835         gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
836                                 
837         p=new tX_panel("Trigger", g->control_subbox);
838         g->trigger_panel=p;
839         
840         g->trigger=gtk_button_new_with_label("Trigger!");
841         gui_set_tooltip(g->trigger, "Click here to trigger this turntable right now. If the audio engine is disabled this turntable will be triggerd as soon as the engine is turned on.");
842         p->add_client_widget(g->trigger);
843         
844         g->stop=gtk_button_new_with_label("Stop.");
845         gui_set_tooltip(g->stop, "Stop this turntable's playback.");
846         p->add_client_widget(g->stop);
847         
848         g->autotrigger=gtk_check_button_new_with_label("Auto");
849         p->add_client_widget(g->autotrigger);
850         gui_set_tooltip(g->autotrigger, "If turned on, this turntable will be automagically triggered whenever the audio engine is turned on.");
851         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->autotrigger), vtt->autotrigger);
852         
853         g->loop=gtk_check_button_new_with_label("Loop");
854         p->add_client_widget(g->loop);
855         gui_set_tooltip(g->loop, "Enable this option to make the turntable loop the audio data.");
856         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->loop), vtt->loop);
857         
858         g->sync_master=gtk_check_button_new_with_label("Master");
859         p->add_client_widget(g->sync_master);
860         gui_set_tooltip(g->sync_master, "Click here to make this turntable the sync-master. All turntables marked as sync-clients will be (re-)triggered in relation to the sync-master. Note that only *one* turntable can be the sync-master.");
861         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->sync_master), vtt->is_sync_master);
862         
863         g->sync_client=gtk_check_button_new_with_label("Client");
864         p->add_client_widget(g->sync_client);
865         gui_set_tooltip(g->sync_client, "If enabled this turntable will be (re-)triggerd in relation to the sync-master turntable.");
866         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->sync_client), vtt->is_sync_client);
867         
868         g->cycles=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->sync_cycles, 0, 10.0, 1,1,1));
869         dummy=gtk_spin_button_new(g->cycles, 1.0, 0);
870         p->add_client_widget(dummy);
871         gui_set_tooltip(dummy, "Determines how often a sync-client turntable gets triggered. 0 -> this turntable will be triggered with every trigger of the sync-master table, 1 -> the table will be triggered every 2nd master trigger and so on.");
872
873         gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
874
875         dummy=gtk_button_new_with_label("FX");
876         gtk_widget_show(dummy);
877         g->fx_button=dummy;
878         gui_set_tooltip(g->fx_button, "Click here to load a LADSPA plugin. You will get a menu from which you can choose which plugin to load.");
879         gtk_box_pack_start(GTK_BOX(g->control_subbox), dummy, WID_FIX);
880         
881         /* Lowpass Panel */
882
883         p=new tX_panel("Lowpass", g->control_subbox);
884         g->lp_panel=p;
885                 
886         g->lp_enable=gtk_check_button_new_with_label("Enable");
887         gui_set_tooltip(g->lp_enable, "Click here to enable the built-in lowpass effect.");
888         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->lp_enable), vtt->lp_enable);
889         p->add_client_widget(vg_create_fx_bar(vtt, vtt->lp_fx, 0));
890
891         p->add_client_widget(g->lp_enable);
892
893         g->lp_gain=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->lp_gain, 0, 2, 0.1, 0.01, 0.01));
894         g->lp_reso=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->lp_reso, 0, 0.99, 0.1, 0.01, 0.01));
895         g->lp_freq=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->lp_freq, 0, 1, 0.1, 0.01, 0.01));
896
897         g->lp_gaind=new tX_extdial("Input Gain", g->lp_gain);
898         p->add_client_widget(g->lp_gaind->get_widget());
899         gui_set_tooltip(g->lp_gaind->get_entry(), "Adjust the input gain. with this parameter you can either amplify or damp the input-signal for the lowpass effect.");
900
901         g->lp_freqd=new tX_extdial("Frequency", g->lp_freq);
902         p->add_client_widget(g->lp_freqd->get_widget());
903         gui_set_tooltip(g->lp_freqd->get_entry(), "Adjust the cutoff frequency of the lowpass filter. 0 is 0 Hz, 1 is 22.1 kHz.");
904
905         g->lp_resod=new tX_extdial("Resonance", g->lp_reso);
906         p->add_client_widget(g->lp_resod->get_widget());
907         gui_set_tooltip(g->lp_resod->get_entry(), "Adjust the resonance of the lowpass filter. This value determines how much the signal at the cutoff frequency will be amplified.");
908
909         gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
910
911         /* Echo Panel */
912
913         p=new tX_panel("Echo", g->control_subbox);
914         g->ec_panel=p;
915
916         p->add_client_widget(vg_create_fx_bar(vtt, vtt->ec_fx, 0));
917         
918         g->ec_enable=gtk_check_button_new_with_label("Enable");
919         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->ec_enable), vtt->ec_enable);
920         p->add_client_widget(g->ec_enable);
921         gui_set_tooltip(g->ec_enable, "Enable the built-in echo effect.");
922
923         g->ec_length=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_length, 0, 1, 0.1, 0.01, 0.001));
924         g->ec_feedback=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_feedback, 0, 1, 0.1, 0.01, 0.001));
925         g->ec_pan=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_pan, -1.0, 1, 0.1, 0.01, 0.001));
926         g->ec_volume=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_volume, 0.0, 3.0, 0.1, 0.01, 0.001));
927
928         g->ec_lengthd=new tX_extdial("Duration", g->ec_length);
929         p->add_client_widget(g->ec_lengthd->get_widget());
930         gui_set_tooltip(g->ec_lengthd->get_entry(), "Adjust the length of the echo buffer.");
931
932         g->ec_feedbackd=new tX_extdial("Feedback", g->ec_feedback);
933         p->add_client_widget(g->ec_feedbackd->get_widget());
934         gui_set_tooltip(g->ec_feedbackd->get_entry(), "Adjust the feedback of the echo effect. Note that a value of 1 will result in a constant signal.");
935
936         g->ec_volumed=new tX_extdial("Volume", g->ec_volume);
937         p->add_client_widget(g->ec_volumed->get_widget());
938         gui_set_tooltip(g->ec_volumed->get_entry(), "Adjust the volume of the echo effect.");
939
940         g->ec_pand=new tX_extdial("Pan", g->ec_pan);
941         p->add_client_widget(g->ec_pand->get_widget());
942         gui_set_tooltip(g->ec_pand->get_entry(), "Adjust the panning of the echo effect.");
943
944         gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
945         
946         /* Output */
947         
948         tempbox=gtk_hbox_new(FALSE,2);
949         gtk_widget_show(tempbox);
950         gtk_box_pack_end(GTK_BOX(g->control_box), tempbox, WID_FIX);
951         
952         tempbox2=gtk_vbox_new(FALSE,0);
953         gtk_widget_show(tempbox2);
954         gtk_box_pack_start(GTK_BOX(tempbox), tempbox2, WID_FIX);
955         
956         g->pitch=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->rel_pitch, -3, +3, 0.1, 0.01, 0.001));
957         g->pan=GTK_ADJUSTMENT(gtk_adjustment_new(0, -1, 1, 0.1, 0.01, 0.001));
958
959         g->pitchd=new tX_extdial("Pitch", g->pitch);
960         gui_set_tooltip(g->pitchd->get_entry(), "Adjust this turntable's pitch.");
961
962         gtk_box_pack_start(GTK_BOX(tempbox2), g->pitchd->get_widget(), WID_FIX);
963
964         g->pand=new tX_extdial("Pan", g->pan);
965         gtk_box_pack_start(GTK_BOX(tempbox2), g->pand->get_widget(), WID_FIX);
966         gui_set_tooltip(g->pand->get_entry(), "Specifies the position of this turntable within the stereo spectrum: -1 -> left, 0-> center, 1->right.");
967
968         tempbox3=gtk_hbox_new(FALSE,2);
969         gtk_widget_show(tempbox3);
970
971         g->mute=gtk_check_button_new_with_label("M");
972         gtk_box_pack_start(GTK_BOX(tempbox3), g->mute, WID_FIX);
973         gtk_signal_connect(GTK_OBJECT(g->mute),"clicked", (GtkSignalFunc) mute_volume, vtt);
974         gtk_widget_show(g->mute);
975         gui_set_tooltip(g->mute, "Mute this turntable's mixer output.");
976
977         g->solo=gtk_check_button_new_with_label("S");
978         gtk_box_pack_start(GTK_BOX(tempbox3), g->solo, WID_FIX);
979         gtk_signal_connect(GTK_OBJECT(g->solo),"clicked", (GtkSignalFunc) solo_vtt, vtt);
980         gtk_widget_show(g->solo);
981         gui_set_tooltip(g->mute, "Allow only this and other solo-switched turntabels' signal to be routed to the mixer.");
982
983         gtk_box_pack_start(GTK_BOX(tempbox2), tempbox3, WID_FIX);
984
985         tempbox2=gtk_hbox_new(FALSE,0);
986         gtk_widget_show(tempbox2);
987         gtk_box_pack_start(GTK_BOX(tempbox), tempbox2, WID_FIX);
988         
989         g->volume=GTK_ADJUSTMENT(gtk_adjustment_new(2.0-vtt->rel_volume, 0, 2, 0.01, 0.01, 0.01));
990         dummy=gtk_vscale_new(GTK_ADJUSTMENT(g->volume)); 
991         gtk_scale_set_draw_value(GTK_SCALE(dummy), False);
992         gui_set_tooltip(dummy, "Adjust this turntable's volume.");
993
994         gtk_box_pack_start(GTK_BOX(tempbox2), dummy, WID_FIX);
995         gtk_widget_show(dummy);
996
997         g->flash=gtk_tx_flash_new();
998         gtk_box_pack_start(GTK_BOX(tempbox2), g->flash, WID_FIX);
999         gtk_widget_show(g->flash);              
1000
1001         g->file_dialog=NULL;
1002
1003         gui_connect_signals(vtt);
1004         
1005         g->audio_minimized_panel_bar_button=NULL;
1006         g->control_minimized_panel_bar_button=NULL;
1007         g->file_menu=NULL;
1008         g->mouse_mapping_menu=NULL;
1009         g->mouse_mapping_menu_x=NULL;
1010         g->mouse_mapping_menu_y=NULL;
1011 }
1012
1013 void fx_up(GtkWidget *wid, vtt_fx *effect)
1014 {
1015         vtt_class *vtt;
1016         
1017         vtt=(vtt_class*)effect->get_vtt();
1018         vtt->effect_up(effect);
1019 }
1020
1021 void fx_down(GtkWidget *wid, vtt_fx *effect)
1022 {
1023         vtt_class *vtt;
1024         
1025         vtt=(vtt_class*)effect->get_vtt();
1026         vtt->effect_down(effect);
1027 }
1028
1029 void fx_kill(GtkWidget *wid, vtt_fx_ladspa *effect)
1030 {
1031         vtt_class *vtt;
1032         
1033         vtt=(vtt_class*)effect->get_vtt();
1034         vtt->effect_remove(effect);
1035 }
1036
1037 GtkWidget *vg_create_fx_bar(vtt_class *vtt, vtt_fx *effect, int showdel)
1038 {
1039         GtkWidget *box;
1040         GtkWidget *pixmap;
1041         GtkWidget *button;
1042         
1043         box=gtk_hbox_new(FALSE,0);
1044
1045         if (showdel)
1046         {
1047                 button=gtk_button_new();
1048                 pixmap=tx_pixmap_widget(TX_ICON_FX_CLOSE);
1049                 gtk_container_add (GTK_CONTAINER (button), pixmap);     
1050                 gtk_box_pack_end(GTK_BOX(box), button, WID_FIX);
1051                 gtk_widget_show(pixmap);
1052                 gtk_widget_show(button);
1053                 gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) fx_kill, (void *) effect);
1054         }
1055
1056         button=gtk_button_new();
1057         pixmap=tx_pixmap_widget(TX_ICON_FX_DOWN);
1058         gtk_container_add (GTK_CONTAINER (button), pixmap);     
1059         gtk_box_pack_end(GTK_BOX(box), button, WID_FIX);
1060         gtk_widget_show(pixmap);
1061         gtk_widget_show(button);
1062         gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) fx_down, (void *) effect);
1063
1064         button=gtk_button_new();
1065         pixmap=tx_pixmap_widget(TX_ICON_FX_UP);
1066         gtk_container_add (GTK_CONTAINER (button), pixmap);     
1067         gtk_box_pack_end(GTK_BOX(box), button, WID_FIX);
1068         gtk_widget_show(pixmap);
1069         gtk_widget_show(button);
1070         gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) fx_up, (void *) effect);
1071         
1072         gtk_widget_show(box);
1073         
1074         return box;
1075 }
1076
1077
1078 int gtk_box_get_widget_pos(GtkBox *box, GtkWidget *child)
1079 {
1080         int i=0;
1081         GList *list;
1082  
1083         list = box->children;
1084         while (list)
1085         {
1086                 GtkBoxChild *child_info;
1087                 child_info = (GtkBoxChild *) list->data;
1088                 if (child_info->widget == child)
1089                 break;
1090                 list = list->next; i++;
1091         }
1092         return i;
1093 }
1094
1095 void vg_move_fx_panel_up(GtkWidget *wid, vtt_class *vtt)
1096 {
1097         int pos=gtk_box_get_widget_pos(GTK_BOX(vtt->gui.control_subbox), wid);
1098         gtk_box_reorder_child(GTK_BOX(vtt->gui.control_subbox), wid, pos-1);
1099 }
1100
1101 void vg_move_fx_panel_down(GtkWidget *wid, vtt_class *vtt)
1102 {
1103         int pos=gtk_box_get_widget_pos(GTK_BOX(vtt->gui.control_subbox), wid);
1104         gtk_box_reorder_child(GTK_BOX(vtt->gui.control_subbox), wid, pos+1);
1105 }
1106
1107 void vg_show_fx_info(GtkWidget *wid, vtt_fx *effect)
1108 {
1109         tx_l_note(effect->get_info_string());
1110 }
1111
1112 void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin)
1113 {
1114         char buffer[1024];
1115         
1116         vtt_gui *g;
1117         g=&vtt->gui;    
1118         tX_panel *p;
1119         list <tX_seqpar_vttfx *> :: iterator sp;
1120         
1121         strcpy(buffer, plugin->getLabel());
1122         if (strlen(buffer) > 6)
1123         {
1124                 buffer[5]='.';
1125                 buffer[6]='.';
1126                 buffer[7]='.';
1127                 buffer[8]=0;
1128         }
1129
1130         p=new tX_panel(buffer, g->control_subbox);
1131         
1132         p->add_client_widget(vg_create_fx_bar(vtt, effect, 1));
1133         
1134         for (sp = effect->controls.begin(); sp != effect->controls.end(); sp++)
1135         {
1136                         p->add_client_widget((*sp)->get_widget());
1137         }
1138
1139         gtk_signal_connect(GTK_OBJECT(p->get_labelbutton()), "clicked", (GtkSignalFunc) vg_show_fx_info, (void *) effect);
1140         gui_set_tooltip(p->get_labelbutton(), "Click here to learn more about this plugin.");
1141         effect->set_panel_widget(p->get_widget());
1142         effect->set_panel(p);
1143
1144         gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
1145 }
1146
1147 void gui_set_name(vtt_class *vtt, char *newname)
1148 {
1149         gtk_label_set_text(GTK_LABEL(vtt->gui.audio_label), newname);
1150         gtk_label_set_text(GTK_LABEL(vtt->gui.control_label), newname);
1151         gtk_entry_set_text(GTK_ENTRY(vtt->gui.name), newname);
1152         
1153         if (vtt->gui.audio_minimized_panel_bar_button!=NULL) {
1154                 gtk_label_set_text(GTK_LABEL(vtt->gui.audio_minimized_panel_bar_label), newname);
1155         }
1156
1157         if (vtt->gui.control_minimized_panel_bar_button!=NULL) {
1158                 gtk_label_set_text(GTK_LABEL(vtt->gui.control_minimized_panel_bar_label), newname);
1159         }
1160 }
1161
1162 void gui_set_filename (vtt_class *vtt, char *newname)
1163 {
1164 #ifdef  USE_GTK2
1165         gtk_button_set_label(GTK_BUTTON(vtt->gui.file), newname);
1166 #else           
1167         gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.file)->child), newname);
1168 #endif  
1169 }
1170
1171 void gui_update_display(vtt_class *vtt)
1172 {
1173         nicer_filename(global_filename_buffer, vtt->filename);
1174 #ifdef  USE_GTK2
1175         gtk_button_set_label(GTK_BUTTON(vtt->gui.file), global_filename_buffer);
1176 #else           
1177         gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.file)->child), global_filename_buffer);
1178 #endif  
1179         gtk_tx_set_data(GTK_TX(vtt->gui.display), vtt->buffer, vtt->samples_in_buffer);
1180 }
1181
1182 void gui_hide_control_panel(vtt_class *vtt, bool hide) {
1183         if (hide) {
1184                 gtk_widget_hide(vtt->gui.control_box);
1185                 vtt->gui.control_minimized_panel_bar_button=tx_xpm_button_new(TX_ICON_MIN_CONTROL, vtt->name, 0, &vtt->gui.control_minimized_panel_bar_label);
1186                 gtk_signal_connect(GTK_OBJECT(vtt->gui.control_minimized_panel_bar_button), "clicked", (GtkSignalFunc) unminimize_control_panel, vtt);
1187                 gtk_widget_show(vtt->gui.control_minimized_panel_bar_button);
1188                 add_to_panel_bar(vtt->gui.control_minimized_panel_bar_button);
1189         } else {
1190                 gtk_widget_show(vtt->gui.control_box);
1191                 remove_from_panel_bar(vtt->gui.control_minimized_panel_bar_button);
1192                 gtk_widget_destroy(vtt->gui.control_minimized_panel_bar_button);
1193                 vtt->gui.control_minimized_panel_bar_button=NULL;
1194         }
1195 }
1196
1197 void gui_hide_audio_panel(vtt_class *vtt, bool hide) {
1198         if (hide) {
1199                 gtk_widget_hide(vtt->gui.audio_box);
1200                 vtt->gui.audio_minimized_panel_bar_button=tx_xpm_button_new(TX_ICON_MIN_AUDIO, vtt->name, 0, &vtt->gui.audio_minimized_panel_bar_label);
1201                 gtk_signal_connect(GTK_OBJECT(vtt->gui.audio_minimized_panel_bar_button), "clicked", (GtkSignalFunc) unminimize_audio_panel, vtt);              
1202                 gtk_widget_show(vtt->gui.audio_minimized_panel_bar_button);
1203                 add_to_panel_bar(vtt->gui.audio_minimized_panel_bar_button);
1204         } else {
1205                 gtk_widget_show(vtt->gui.audio_box);
1206                 remove_from_panel_bar(vtt->gui.audio_minimized_panel_bar_button);
1207                 gtk_widget_destroy(vtt->gui.audio_minimized_panel_bar_button);
1208                 vtt->gui.audio_minimized_panel_bar_button=NULL;
1209         }
1210 }
1211
1212 void delete_gui(vtt_class *vtt)
1213 {
1214         if (vtt->gui.control_minimized_panel_bar_button!=NULL) gui_hide_control_panel(vtt, false);
1215         if (vtt->gui.audio_minimized_panel_bar_button!=NULL) gui_hide_audio_panel(vtt, false);
1216
1217         delete vtt->gui.main_panel;
1218         delete vtt->gui.trigger_panel;
1219         
1220         delete vtt->gui.pitchd;
1221         delete vtt->gui.pand;
1222         
1223         delete vtt->gui.lp_gaind;
1224         delete vtt->gui.lp_resod;
1225         delete vtt->gui.lp_freqd;
1226         delete vtt->gui.lp_panel;
1227         
1228         delete vtt->gui.ec_lengthd;
1229         delete vtt->gui.ec_feedbackd;
1230         delete vtt->gui.ec_volumed;
1231         delete vtt->gui.ec_pand;
1232         delete vtt->gui.ec_panel;
1233
1234         gtk_widget_destroy(vtt->gui.control_box);
1235         gtk_widget_destroy(vtt->gui.audio_box);
1236         if (vtt->gui.file_menu) gtk_widget_destroy(vtt->gui.file_menu);
1237         if (vtt->gui.mouse_mapping_menu) gtk_widget_destroy(vtt->gui.mouse_mapping_menu);
1238         if (vtt->gui.ladspa_menu) gtk_widget_destroy(vtt->gui.ladspa_menu);
1239 }
1240
1241 void update_all_vtts()
1242 {
1243         list <vtt_class *> :: iterator vtt;
1244         f_prec temp;
1245         
1246         for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1247         {
1248                 if ((*vtt)->is_playing)
1249                 {
1250                         gtk_tx_update_pos_display(GTK_TX((*vtt)->gui.display), (*vtt)->pos_i, (*vtt)->mute);
1251 #ifdef USE_FLASH
1252                         temp=(*vtt)->max_value*(*vtt)->res_volume*vtt_class::vol_channel_adjust;
1253                         (*vtt)->max_value=0;
1254                         gtk_tx_flash_set_level((*vtt)->gui.flash, temp);
1255 #endif          
1256                 }
1257         }
1258 }
1259
1260 void cleanup_vtt(vtt_class *vtt)
1261 {
1262                 gtk_tx_cleanup_pos_display(GTK_TX(vtt->gui.display));   
1263 #ifdef USE_FLASH
1264                 gtk_tx_flash_set_level(vtt->gui.flash, 0.0);
1265                 gtk_tx_flash_clear(vtt->gui.flash);
1266 #endif          
1267 }
1268
1269 void cleanup_all_vtts()
1270 {
1271         list <vtt_class *> :: iterator vtt;
1272         
1273         for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1274         {
1275                 if ((*vtt)->buffer) gtk_tx_cleanup_pos_display(GTK_TX((*vtt)->gui.display));
1276 #ifdef USE_FLASH
1277                 gtk_tx_flash_set_level((*vtt)->gui.flash, 0.0);
1278                 gtk_tx_flash_clear((*vtt)->gui.flash);
1279 #endif          
1280         }
1281 }
1282
1283 void gui_clear_master_button(vtt_class *vtt)
1284 {
1285         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(vtt->gui.sync_master), 0);
1286 }
1287
1288 void gui_show_frame(vtt_class *vtt, int show)
1289 {
1290         gtk_tx_show_frame(GTK_TX(vtt->gui.display), show);
1291 }
1292
1293 #define vgui (*vtt)->gui
1294 #define v (*vtt)
1295
1296 void vg_enable_critical_buttons(int enable)
1297 {
1298         list <vtt_class *> :: iterator vtt;
1299         for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1300         {
1301                 gtk_widget_set_sensitive(vgui.del, enable);
1302                 gtk_widget_set_sensitive(vgui.sync_master, enable);
1303         }
1304 }
1305
1306
1307 void vg_init_all_non_seqpars()
1308 {
1309         list <vtt_class *> :: iterator vtt;
1310         
1311         for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1312         {
1313                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON((*vtt)->gui.autotrigger), (*vtt)->autotrigger);
1314                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON((*vtt)->gui.sync_master), (*vtt)->is_sync_master);
1315         }       
1316 }
1317