added some stuff to give tX some robust command flags, it could be usefull
[terminatorX.git] / src / main.cc
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999, 2000  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: main.c
20     
21     Description: This contains the main() function. All the initializing
22                  happens here.
23     
24     Changes:
25     
26     19 Mar 1999: Applied a patch by Andrew C. Bul+hac?k (eMail: acb@zikzak.net)
27                  that fixes wavfile reading routine for the overreading bug.
28                  
29     20 Mar 1999: Big endian support.
30     
31     23 Mar 1999: display of new keys (<-, ->)
32     
33     4 October 1999: Rewrite ;) - back to C++
34 */
35
36 #define TX_GTKRC "/usr/share/themes/terminatorX/gtk/gtkrc"
37
38 #define BENCH_CYCLES 100000
39
40 #include <stdio.h>
41 #include "tX_mastergui.h"
42 #include <malloc.h>
43 #include <math.h>
44 #include <stdio.h>
45 #ifndef WIN32
46 #include <unistd.h>
47 #endif
48
49 #ifdef HAVE_CONFIG_H
50 #include <config.h>
51 #endif
52
53 #ifdef USE_3DNOW
54 #include "3dnow.h"
55 #endif
56
57 #include "tX_endian.h"
58 #include "tX_types.h"
59 #include "tX_global.h"
60 #include "version.h"
61 #include "tX_dialog.h"
62 #include <gtk/gtk.h>
63 #include <glib.h>
64
65 #include "tX_ladspa.h"
66
67 #ifdef CREATE_BENCHMARK 
68 #include "tX_vtt.h"
69 #endif
70
71 #ifdef USE_DIAL
72 #include "tX_knobloader.h"
73 #endif
74
75 GTimer *my_time;
76 gint idle_tag;
77 /* main(): */
78
79 int idle()
80 {
81         gdouble time;
82         gulong ms;
83         
84         time=g_timer_elapsed(my_time, &ms);
85         if (time > 1.5)
86         {
87                 gtk_idle_remove(idle_tag);
88                 destroy_about();                
89                 display_mastergui();            
90         }
91         
92         return TRUE;
93 }
94
95 void show_help()
96 {
97                         
98         fprintf(stderr, "\
99 usage: terminatorX [options] [save file]\n\
100 \n\
101   -h, --help                    Display help info\n\
102   -f, --file                    Load saved terminatorX set file\n\
103   -r, --rc-file [file]          Load alternate rc file\n\
104   -d, --dont-save               Do not save settings at exit\n\
105 \n");
106 /*
107   -n, --no-gui                  Run terminatorX with no GUI\n\
108   -m, --midi-in [file]          Use [file] for midi input\n\
109   -o, --midi-out [file]         Use [file] for midi input\n\
110   -s, --std-out                 Use stdout for sound output\n\
111 \n");
112 */
113 }
114
115
116 int parse_args(int *argc, char **argv)
117 {
118         // pass over argv once to see if we need to load an alternate_rc file
119         for (int i = 1 ; i != *argc ; ++i )
120         {
121                 if ((strcmp(argv[i], "-r") == 0) || (strcmp(argv[i], "--rc-file") == 0)) 
122                 {
123                         if (argv[i+1] )
124                         {       
125                                 ++i;
126                                 fprintf(stderr, "tX: Loading alternate rc file %s\n", argv[i]);
127                                 globals.alternate_rc = argv[i];
128                         }
129                         else
130                         {
131                                 show_help();    
132                                 exit(1);
133                         }
134                         break;
135                 }
136         }
137         
138         // load up the global values
139         load_globals();
140
141         // default the flag options, or they'll be set from last execution... (think globals.no_gui ;)
142         globals.no_gui = 0;
143         globals.alternate_rc = 0;
144         globals.store_globals = 1;
145         globals.startup_set = 0;
146                 
147         // then pass over again, this time setting passed values
148         for (int i = 1 ; i < *argc ; ++i )
149         {
150                 if ((strcmp(argv[i], "-f") == 0) || (strcmp(argv[i], "--file") == 0))
151                 {
152                         ++i;
153                         globals.startup_set = argv[i];
154                 }       
155                 else if (((strcmp(argv[i], "-r") == 0) || (strcmp(argv[i], "--rc-file") == 0)) && (argv[i+1]))
156                 {
157                         ++i;
158                         globals.alternate_rc = argv[i];
159                 }
160                 else if ((strcmp(argv[i], "-d") == 0) || (strcmp(argv[i], "--dont-save") == 0))
161                 {
162                         fprintf(stderr, "tX: Do not save settings on exit\n");
163                         globals.store_globals = 0;
164
165                 }
166 /*              
167                 else if ((strcmp(argv[i], "-m") == 0) || (strcmp(argv[i], "--midi-in") == 0))
168                 {
169                 }
170                 else if ((strcmp(argv[i], "-s") == 0) || (strcmp(argv[i], "--std-out") == 0))
171                 {
172                 }       
173                 else if ((strcmp(argv[i], "-n") == 0) || (strcmp(argv[i], "--no-gui") == 0))
174                 {
175                         globals.no_gui = 1;
176                         fprintf(stderr, "tX: Run without a GUI\n");
177                 }
178 */
179                 else
180                 {
181                         show_help();
182                         exit(1);
183                 }
184         }
185         return 1;
186 }
187
188 int main(int argc, char **argv)
189 {
190         FILE *gtk_rc_file;
191
192 #ifndef WIN32
193         fprintf(stderr, "%s, Copyright(C)1999 Alexander König, alkoit00@fht-esslingen.de\n", VERSIONSTRING);
194 #else
195         fprintf(stderr, "%s, Copyright(C)1999 Alexander König, alkoit00@fht-esslingen.de\n", VERSIONSTRING);
196         setenv ("CYGWIN", "binmode");
197 #endif
198         
199
200         fprintf(stderr, "terminatorX comes with ABSOLUTELY NO WARRANTY - for details read the license.\n");
201
202 #ifdef USE_3DNOW
203         if (mm_support()!=5)
204         {
205                 printf("3DNow! not detected. Giving up.\n");
206                 return(1);
207         }
208         else
209         printf("3DNow! accelerations available.\n");    
210 #endif
211         gtk_set_locale ();
212         gtk_init (&argc, &argv);
213         
214         gtk_rc_file=fopen(TX_GTKRC, "r");
215         if (gtk_rc_file)
216         {
217                 fprintf (stderr, "Using terminatorX gtkrc.\n");
218                 fclose(gtk_rc_file);
219                 gtk_rc_parse(TX_GTKRC);
220         }
221
222         parse_args(&argc, argv); 
223
224         if (globals.show_nag)
225         {       
226                 show_about(1);
227
228                 my_time=g_timer_new();
229                 g_timer_start(my_time);         
230         
231                 idle_tag=gtk_idle_add((GtkFunction)idle, NULL);
232         }
233         
234         LADSPA_Plugin :: init();
235 //      LADSPA_Plugin :: status();
236                         
237         create_mastergui(globals.width, globals.height);
238                 
239         if (!globals.show_nag)  display_mastergui();
240                 
241         if (globals.startup_set)
242         {
243                 while (gtk_events_pending()) gtk_main_iteration(); gdk_flush(); 
244                 load_tt_part(globals.startup_set);
245         }
246                 
247 #ifndef CREATE_BENCHMARK
248 #ifdef USE_DIAL
249         load_knob_pixs(main_window);
250 #endif  
251
252         gtk_main();
253
254         store_globals();
255
256         fprintf(stderr, "Have a nice life.\n");
257 #else
258         gtk_widget_hide(main_window);
259         while (gtk_events_pending()) gtk_main_iteration(); gdk_flush(); 
260         gdk_flush();
261         
262         vtt_class::set_mix_buffer_size(globals.true_block_size);
263         printf("\n* BENCHMARKING *\nBlocksize is %i samples.\n", globals.true_block_size);
264         
265         GTimer *bench_time = g_timer_new();
266         gulong micros;
267         double ratio;
268         double res;
269         list <vtt_class *> :: iterator vtt;
270         
271         for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
272         {
273                 if ((*vtt)->autotrigger) (*vtt)->trigger();
274         }
275         sleep(3);
276         
277         g_timer_start(bench_time);
278         for (int i=0; i<BENCH_CYCLES; i++)
279         {
280                 vtt_class::render_all_turntables();
281         }
282         g_timer_stop(bench_time);
283         res=g_timer_elapsed(bench_time, &micros);
284         
285         ratio=((double) BENCH_CYCLES)/res;
286         printf ("Rendered %i blocks in %f secons,\n=> %f blocks per second.\n\n", (long) BENCH_CYCLES, res, ratio);
287 #endif
288         return (0);
289 }