1 #include "snd.h"
2 #include "snd-menu.h"
3 #include "snd-file.h"
4 
5 void cleanup_file_monitor(void) {}
6 void *unmonitor_file(void *watcher) {return(NULL);}
7 void monitor_sound(snd_info *sp) {}
8 
9 bool find_dialog_is_active(void) {return(false);}
10 void snd_help_back_to_top(void) {}
11 color_t get_in_between_color(color_t fg, color_t bg) {return(0);}
12 void save_find_dialog_state(FILE *fd) {}
13 void check_menu_labels(int key, int state, bool extended) {}
14 int add_channel_window(snd_info *sound, int channel, int chan_y, int insertion, widget_t main, fw_button_t arrows, bool with_events) {return(0);}
15 int snd_help(const char *subject, const char *help, with_word_wrap_t with_wrap) {fprintf(stdout, "%s", help); return(0);}
16 int snd_help_with_xrefs(const char *subject, const char *helpstr, with_word_wrap_t with_wrap, const char **xrefs, const char **urls) {return(0);}
17 void snd_help_append(const char *text) {fprintf(stdout, "%s", text);}
18 int help_text_width(const char *txt, int start, int end) {return(0);}
19 widget_t post_it(const char *subject, const char *str) {fprintf(stdout, "%s", str); return(0);}
20 void save_post_it_dialog_state(FILE *fd) {}
21 void reflect_just_sounds(void) {}
22 void reflect_save_as_src(bool val) {}
23 void reflect_save_as_auto_comment(bool val) {}
24 void reflect_save_as_sound_selection(const char *sound_name) {}
25 void save_file_dialog_state(FILE *fd) {}
26 void draw_line(graphics_context *ax, int x0, int y0, int x1, int y1) {}
27 void fill_rectangle(graphics_context *ax, int x0, int y0, int width, int height) {}
28 void fill_polygon(graphics_context *ax, int points, ...) {}
29 void fill_polygons(graphics_context *ax, point_t *points, int num, int y0) {}
30 void fill_two_sided_polygons(graphics_context *ax, point_t *points, point_t *points1, int num) {}
31 void draw_string(graphics_context *ax, int x0, int y0, const char *str, int len) {}
32 void draw_dot(graphics_context *ax, int x, int y, int size) {}
33 void save_colors(FILE *Fp) {}
34 void erase_rectangle(chan_info *cp, graphics_context *ax, int x0, int y0, int width, int height) {}
35 void setup_graphics_context(chan_info *cp, graphics_context *ax) {}
36 void draw_spectro_line(graphics_context *ax, int color, int x0, int y0, int x1, int y1) {}
37 void allocate_color_map(int colormap) {}
38 void allocate_sono_rects(int size) {}
39 void set_with_gl(bool val, bool dpys) {}
40 void set_sono_rectangle(int j, int color, int x, int y, int width, int height) {}
41 void draw_sono_rectangles(graphics_context *ax, int color, int jmax) {}
42 void draw_colored_lines(chan_info *cp, graphics_context *ax, point_t *points, int num, int *colors, int axis_y0, color_t default_color) {}
43 widget_t make_color_orientation_dialog(bool managed) {return(0);}
44 void set_color_scale(mus_float_t val) {}
45 void set_color_inverted(bool val) {}
46 void set_color_cutoff(mus_float_t val) {}
47 void set_spectro_hop(int val) {}
48 void set_spectro_x_angle(mus_float_t val) {}
49 void set_spectro_y_angle(mus_float_t val) {}
50 void set_spectro_z_angle(mus_float_t val) {}
51 void set_spectro_x_scale(mus_float_t val) {}
52 void set_spectro_y_scale(mus_float_t val) {}
53 void set_spectro_z_scale(mus_float_t val) {}
54 void set_spectrum_end(mus_float_t val) {}
55 void set_spectrum_start(mus_float_t val) {}
56 bool color_orientation_dialog_is_active(void) {return(false);}
57 void reflect_spectro(void) {}
58 void reflect_peaks_in_transform_dialog(void) {}
59 void reflect_log_freq_start_in_transform_dialog(void) {}
60 void reflect_min_db_in_transform_dialog(void) {}
61 void listener_append_and_prompt(const char *msg) {fprintf(stderr, "%s", msg);}
62 void goto_listener(void) {}
63 int save_listener_text(FILE *fp) {return(0);}
64 void append_listener_text(int end, const char *msg) {}
65 void listener_append(const char *msg) {fprintf(stderr, "%s", msg);}
66 void handle_listener(bool new_state) {}
67 bool listener_exists(void) {return(false);}
68 int listener_height(void) {return(0);}
69 int listener_width(void) {return(0);}
70 void set_button_label(int label, const char *str) {}
71 int g_add_to_main_menu(const char *label, int slot) {return(0);}
72 widget_t g_add_to_menu(int which_menu, const char *label, int callb, int position) {return(0);}
73 int g_remove_from_menu(int which_menu, const char *label) {return(0);}
74 void reflect_play_selection_stop(void) {}
75 int make_transform_dialog(bool managed) {return(0);}
76 bool transform_dialog_is_active(void) {return(false);}
77 void set_show_transform_peaks(bool val) {}
78 void set_fft_log_magnitude(bool val) {}
79 void set_fft_with_phases(bool val) {}
80 void set_fft_log_frequency(bool val) {}
81 void set_transform_normalization(fft_normalize_t val) {}
82 void set_show_selection_transform(bool show) {}
83 void reflect_regions_in_region_browser(void) {}
84 void reflect_selection_in_save_as_dialog(bool on) {}
85 void reflect_no_regions_in_region_browser(void) {}
86 int update_region_browser(bool grf_too) {return(0);}
87 bool region_browser_is_active(void) {return(false);}
88 void delete_region_and_update_browser(int n) {}
89 void reflect_play_region_stop(int n) {}
90 bool region_dialog_is_active(void) {return(false);}
91 void allocate_region_rows(int n) {}
92 void reflect_region_graph_style(void) {}
93 bool set_tiny_font(const char *font) {if (ss->Tiny_Font) free(ss->Tiny_Font); ss->Tiny_Font = mus_strdup(font); return(false);}
94 bool set_listener_font(const char *font) {if (ss->Listener_Font) free(ss->Listener_Font); ss->Listener_Font = mus_strdup(font); return(false);}
95 bool set_peaks_font(const char *font) {if (ss->Peaks_Font) free(ss->Peaks_Font); ss->Peaks_Font = mus_strdup(font); return(false);}
96 bool set_bold_peaks_font(const char *font) {if (ss->Bold_Peaks_Font) free(ss->Bold_Peaks_Font); ss->Bold_Peaks_Font = mus_strdup(font); return(false);}
97 bool set_axis_label_font(const char *font) {if (ss->Axis_Label_Font) free(ss->Axis_Label_Font); ss->Axis_Label_Font = mus_strdup(font); return(false);}
98 bool set_axis_numbers_font(const char *font) {if (ss->Axis_Numbers_Font) free(ss->Axis_Numbers_Font); ss->Axis_Numbers_Font = mus_strdup(font); return(false);}
99 int label_width(const char *txt, bool use_tiny_font) {return(0);}
100 int number_width(const char *num, bool use_tiny_font) {return(0);}
101 int number_height(int fnt) {return(0);}
102 int label_height(bool use_tiny_font) {return(0);}
103 int mark_name_width(const char *txt) {return(0);}
104 void clear_window(graphics_context *ax) {}
105 void set_title(const char *title) {}
106 void goto_window(int text) {}
107 void check_for_event(void) {}
108 void recolor_graph(chan_info *cp, bool selected) {}
109 void set_sensitive(int wid, bool val) {}
110 void set_toggle_button(int wid, bool val, bool passed, void *data) {}
111 int widget_height(int w) {return(0);}
112 int widget_width(int w) {return(0);}
113 void set_widget_size(int w, int width, int height) {}
114 int widget_x(int w) {return(0);}
115 int widget_y(int w) {return(0);}
116 void set_widget_x(int w, int x) {}
117 void set_widget_y(int w, int y) {}
118 void set_open_file_play_button(bool val) {}
119 int channel_w(chan_info *cp) {return(0);}
120 int channel_f(chan_info *cp) {return(0);}
121 int channel_graph(chan_info *cp) {return(0);}
122 bool channel_graph_is_visible(chan_info *cp) {return(false);} /* maybe this should be true? */
123 void change_gzy(mus_float_t val, chan_info *cp) {}
124 mus_float_t gsy_value(chan_info *cp) {return(0.0);}
125 mus_float_t gsy_size(chan_info *cp) {return(0.0);}
126 void initialize_scrollbars(chan_info *cp) {}
127 void set_z_scrollbars(chan_info *cp, axis_info *ap) {}
128 void resize_sx(chan_info *cp) {}
129 void resize_sy(chan_info *cp) {}
130 void resize_sy_and_zy(chan_info *cp) {}
131 void resize_sx_and_zx(chan_info *cp) {}
132 void channel_open_pane(chan_info *cp) {}
133 void reflect_edit_history_change(chan_info *cp) {}
134 void reflect_edit_counter_change(chan_info *cp) {}
135 void set_peak_numbers_font(chan_info *cp, graphics_context *ax) {}
136 void set_bold_peak_numbers_font(chan_info *cp, graphics_context *ax) {}
137 void set_tiny_numbers_font(chan_info *cp, graphics_context *ax) {}
138 color_t get_foreground_color(graphics_context *ax) {return(0);}
139 void set_foreground_color(graphics_context *ax, int color) {}
140 void change_channel_style(snd_info *sp, channel_style_t new_style) {}
141 void cleanup_cw(chan_info *cp) {}
142 void set_status(snd_info *sp, const char *str, bool update) {if ((str) && (*str)) fprintf(stderr, "%s", str);}
143 void snd_info_cleanup(snd_info *sp) {}
144 void toggle_expand_button(snd_info *sp, bool state) {}
145 void toggle_contrast_button(snd_info *sp, bool state) {}
146 void toggle_reverb_button(snd_info *sp, bool state) {}
147 void toggle_filter_button(snd_info *sp, bool state) {}
148 void toggle_direction_arrow(snd_info *sp, bool state) {}
149 void filter_env_changed(snd_info *sp, env *e) {}
150 void set_play_button(snd_info *sp, bool val) {}
151 void play_button_pause(bool pausing) {}
152 void syncb(snd_info *sp, int on) {sp->sync = on; if (on > ss->sound_sync_max) ss->sound_sync_max = on;}
153 void show_lock(snd_info *sp) {}
154 void hide_lock(snd_info *sp) {}
155 void start_bomb(snd_info *sp) {}
156 void stop_bomb(snd_info *sp) {}
157 void set_sound_pane_file_label(snd_info *sp, const char *str) {}
158 void reflect_sound_selection(snd_info *sp) {}
159 void show_controls(snd_info *sp) {}
160 void hide_controls(snd_info *sp) {}
161 bool showing_controls(snd_info *sp) {return(false);}
162 void start_progress_report(chan_info *cp) {}
163 void finish_progress_report(chan_info *cp) {}
164 void progress_report(chan_info *cp, mus_float_t pct) {}
165 char *get_file_dialog_sound_attributes(file_data *fdat, int *srate, int *chans, mus_header_t *header_type,
166 				       mus_sample_t *sample_type, mus_long_t *location, mus_long_t *samples, int min_chan) {return(NULL);}
167 widget_t make_new_file_dialog(bool managed) {return(0);}
168 int edit_header(snd_info *sp) {return(0);}
169 void save_edit_header_dialog_state(FILE *fd) {}
170 widget_t make_selection_save_as_dialog(bool managed) {return(0);}
171 widget_t make_region_save_as_dialog(bool managed) {return(0);}
172 widget_t make_sound_save_as_dialog(bool managed) {return(0);}
173 widget_t make_file_print_dialog(bool managed, bool direct_to_printer) {return(0);}
174 axis_info *enved_make_axis(const char *name, graphics_context *ax, int ex0, int ey0, int width, int height,
175 			   mus_float_t xmin, mus_float_t xmax, mus_float_t ymin, mus_float_t ymax, printing_t printing) {return(NULL);}
176 void display_enved_env_with_selection(env *e, const char *name, int x0, int y0, int width, int height, bool dots, printing_t printing) {}
177 void set_enved_redo_sensitive(bool val) {}
178 void set_enved_revert_sensitive(bool val) {}
179 void set_enved_undo_sensitive(bool val) {}
180 void set_enved_save_sensitive(bool val) {}
181 void set_enved_show_sensitive(bool val) {}
182 void enved_reflect_selection(bool on) {}
183 void make_scrolled_env_list(void) {}
184 void enved_reflect_peak_env_completion(snd_info *sp) {}
185 void new_active_channel_alert(void) {}
186 void env_redisplay(void) {}
187 void env_redisplay_with_print(void) {}
188 void update_enved_background_waveform(chan_info *cp) {}
189 int create_envelope_editor(void) {return(0);}
190 void set_enved_clipping(bool val) {}
191 void reflect_enved_style(void) {}
192 void set_enved_base(mus_float_t val) {}
193 void set_enved_target(enved_target_t val) {}
194 void set_enved_with_wave(bool val) {}
195 void set_enved_in_dB(bool val) {}
196 bool enved_dialog_is_active(void) {return(false);}
197 void set_enved_filter_order(int order) {}
198 widget_t make_open_file_dialog(read_only_t read_only, bool managed) {return(0);}
199 widget_t make_mix_file_dialog(bool managed) {return(0);}
200 widget_t make_insert_file_dialog(bool managed) {return(0);}
201 void clear_listener(void) {}
202 int menu_widget(int which_menu) {return(0);}
203 void get_current_color(int colormap, int j, rgb_t *r, rgb_t *g, rgb_t *b) {}
204 void set_filter_text(snd_info *sp, const char *str) {}
205 void display_filter_env(snd_info *sp) {}
206 void reflect_mix_change(int mix_id) {}
207 int make_mix_dialog(void) {return(0);}
208 void reflect_mix_play_stop(void) {}
209 void set_mix_color(int color) {}
210 int mix_dialog_mix(void) {return(0);}
211 void mix_dialog_set_mix(int id) {}
212 void set_fft_window_alpha(mus_float_t val) {in_set_fft_window_alpha(val);}
213 void set_fft_window_beta(mus_float_t val) {in_set_fft_window_beta(val);}
214 void set_transform_size(mus_long_t val) {in_set_transform_size(val);}
215 void set_fft_window(mus_fft_window_t val) {in_set_fft_window(val);}
216 void set_transform_type(int val) {in_set_transform_type(val);}
217 void set_wavelet_type(int val) {in_set_wavelet_type(val);}
218 void make_transform_type_list(void) {}
219 void set_transform_graph_type(graph_type_t val) {in_set_transform_graph_type(val);}
220 void set_amp(snd_info *sp, mus_float_t val) {sp->amp_control = val;}
221 void set_expand(snd_info *sp, mus_float_t val) {sp->expand_control = val;}
222 void set_contrast(snd_info *sp, mus_float_t val) {sp->contrast_control = val;}
223 void set_speed(snd_info *sp, mus_float_t val) {sp->speed_control = val;}
224 void set_revlen(snd_info *sp, mus_float_t val) {sp->reverb_control_length = val;}
225 void set_revscl(snd_info *sp, mus_float_t val) {sp->reverb_control_scale = val;}
226 void set_filter_order(snd_info *sp, int val) {sp->filter_control_order = val;}
227 void set_filter_in_dB(snd_info *sp, bool val) {sp->filter_control_in_dB = val;}
228 void set_filter_in_hz(snd_info *sp, bool val) {sp->filter_control_in_hz = val;}
229 void post_basic_popup_menu(void *ev) {}
230 void post_lisp_popup_menu(void *ev) {}
231 void post_fft_popup_menu(void *ev) {}
232 void post_selection_popup_menu(void *ev) {}
233 void ensure_scrolled_window_row_visible(widget_t list, int pos, int num_rows) {}
234 widget_t make_preferences_dialog(void) {return(NULL_WIDGET);}
235 void update_sound_label(snd_info *sp) {}
236 
237 void auto_update_restart(void) {}
238 
239 #if HAVE_SCHEME
240 static s7_pointer top_level_let = NULL;
241 static s7_pointer g_top_level_let(s7_scheme *sc, s7_pointer args)
242 {
243   return(top_level_let);
244 }
245 
246 static s7_pointer g_set_top_level_let(s7_scheme *sc, s7_pointer args)
247 {
248   top_level_let = s7_car(args);
249   return(top_level_let);
250 }
251 #endif
252 
253 snd_info *add_sound_window(char *filename, read_only_t read_only, file_info *hdr)
254 {
255   snd_info *sp;
256   int snd_slot, nchans, i;
257   bool free_filename = false;
258 
259   if (ss->translated_filename)
260     {
261       filename = ss->translated_filename;
262       free_filename = true;
263       ss->translated_filename = NULL;
264     }
265 
266   nchans = hdr->chans;
267   if (nchans <= 0) nchans = 1;
268 
269   if (nchans > MUS_MAX_CHANS)
270     {
271       /* either a screwed up header, or Snd was built with wrong endianness */
272       /* this kind of error is trapped by raw_data_explanation in make_file_info in the motif cases */
273       fprintf(stderr, "%s has %d channels? ", filename, nchans);
274       if (mus_char_to_bint((unsigned char *)&nchans) < 8)
275 	fprintf(stderr, "byte swap problem: chans should be %d", mus_char_to_bint((unsigned char *)&nchans));
276       if (mus_char_to_lint((unsigned char *)&nchans) < 8)
277 	fprintf(stderr, "byte swap problem: chans should be %d", mus_char_to_lint((unsigned char *)&nchans));
278       nchans = 1; /* ?? */
279     }
280 
281   snd_slot = find_free_sound_slot(nchans); /* expands sound list if needed */
282   ss->sounds[snd_slot] = make_snd_info(ss->sounds[snd_slot], filename, hdr, snd_slot, read_only);
283   sp = ss->sounds[snd_slot];
284 
285   sp->write_date = file_write_date(filename); /* needed early in this process by the peak-env handlers */
286   for (i = 0; i < nchans; i++) sp->chans[i] = make_chan_info(sp->chans[i], i, sp);
287   add_sound_data(filename, sp, WITHOUT_GRAPH);
288   after_open(sp);
289 
290   if (free_filename) free(filename);
291   return(sp);
292 }
293 
294 #if USE_NOTCURSES
295   #include "nrepl.c"
296 #endif
297 
298 static char **auto_open_file_names = NULL;
299 static int auto_open_files = 0;
300 static bool noglob = false, noinit = false, nostdin = false;
301 
302 #ifndef _MSC_VER
303 #include <setjmp.h>
304 
305 static jmp_buf top_level_jump;
306 void top_level_catch(int ignore);
307 void top_level_catch(int ignore)
308 {
309   siglongjmp(top_level_jump, 1);
310 }
311 #endif
312 
313 
314 #define FALLBACK_FONT "9x15"
315 static Xen colormap_temp[16]; /* static for Ruby's sake */
316 
317 void snd_doit(int argc, char **argv)
318 {
319   static int auto_open_ctr = 0;
320   int i;
321   ss->axis_color_set = false;
322 
323 #if HAVE_SCHEME
324   xen_s7_set_repl_prompt("snd> ");
325 #endif
326 
327   Xen_define_variable("black-and-white-colormap", colormap_temp[0], C_int_to_Xen_integer(0));
328   Xen_define_variable("gray-colormap",            colormap_temp[1], C_int_to_Xen_integer(1));
329   Xen_define_variable("hot-colormap",             colormap_temp[2], C_int_to_Xen_integer(2));
330   Xen_define_variable("cool-colormap",            colormap_temp[3], C_int_to_Xen_integer(3));
331   Xen_define_variable("bone-colormap",            colormap_temp[4], C_int_to_Xen_integer(4));
332   Xen_define_variable("copper-colormap",          colormap_temp[5], C_int_to_Xen_integer(5));
333   Xen_define_variable("pink-colormap",            colormap_temp[6], C_int_to_Xen_integer(6));
334   Xen_define_variable("jet-colormap",             colormap_temp[7], C_int_to_Xen_integer(7));
335   Xen_define_variable("prism-colormap",           colormap_temp[8], C_int_to_Xen_integer(8));
336   Xen_define_variable("autumn-colormap",          colormap_temp[9], C_int_to_Xen_integer(9));
337   Xen_define_variable("winter-colormap",          colormap_temp[10], C_int_to_Xen_integer(10));
338   Xen_define_variable("spring-colormap",          colormap_temp[11], C_int_to_Xen_integer(11));
339   Xen_define_variable("summer-colormap",          colormap_temp[12], C_int_to_Xen_integer(12));
340   Xen_define_variable("rainbow-colormap",         colormap_temp[13], C_int_to_Xen_integer(13));
341   Xen_define_variable("flag-colormap",            colormap_temp[14], C_int_to_Xen_integer(14));
342   Xen_define_variable("phases-colormap",          colormap_temp[15], C_int_to_Xen_integer(15));
343 
344 #if HAVE_SCHEME
345   Xen_eval_C_string("(define " S_color_hook " (make-hook))");
346   Xen_eval_C_string("(define " S_drop_hook " (make-hook 'name))");
347   Xen_eval_C_string("(define " S_listener_click_hook " (make-hook 'position)) ");
348   Xen_eval_C_string("(define " S_mouse_enter_graph_hook " (make-hook 'snd 'chn))");
349   Xen_eval_C_string("(define " S_mouse_enter_label_hook " (make-hook 'type 'position 'label))");
350   Xen_eval_C_string("(define " S_mouse_enter_listener_hook " (make-hook 'widget))");
351   Xen_eval_C_string("(define " S_mouse_enter_text_hook " (make-hook 'widget))");
352   Xen_eval_C_string("(define " S_mouse_leave_graph_hook " (make-hook 'snd 'chn))");
353   Xen_eval_C_string("(define " S_mouse_leave_label_hook " (make-hook 'type 'position 'label))");
354   Xen_eval_C_string("(define " S_mouse_leave_listener_hook " (make-hook 'widget))");
355   Xen_eval_C_string("(define " S_mouse_leave_text_hook " (make-hook 'widget))");
356   Xen_eval_C_string("(define " S_new_widget_hook " (make-hook 'widget))");
357   Xen_eval_C_string("(define " S_orientation_hook " (make-hook))");
358 
359   Xen_eval_C_string("(define " S_copy_context " 0)");
360   Xen_eval_C_string("(define " S_cursor_context " 3)");
361   Xen_eval_C_string("(define " S_lisp_graph " 2)");
362   Xen_eval_C_string("(define " S_mark_context " 4)");
363   Xen_eval_C_string("(define " S_selection_context " 2)");
364   Xen_eval_C_string("(define " S_time_graph " 0)");
365   Xen_eval_C_string("(define " S_transform_graph " 1)");
366 
367   Xen_eval_C_string("(define " S_basic_color " (dilambda (lambda () #f) (lambda (val) val)))");
368   Xen_eval_C_string("(define " S_colormap " (dilambda (lambda () #f) (lambda (val) val)))");
369   Xen_eval_C_string("(define " S_colormap_size " (dilambda (lambda () #f) (lambda (val) val)))");
370   Xen_eval_C_string("(define " S_cursor_color " (dilambda (lambda () #f) (lambda (val) val)))");
371   Xen_eval_C_string("(define " S_data_color " (dilambda (lambda () #f) (lambda (val) val)))");
372   Xen_eval_C_string("(define " S_enved_envelope " (dilambda (lambda () #f) (lambda (val) val)))");
373   Xen_eval_C_string("(define " S_enved_filter " (dilambda (lambda () #f) (lambda (val) val)))");
374   Xen_eval_C_string("(define " S_enved_waveform_color " (dilambda (lambda () #f) (lambda (val) val)))");
375   Xen_eval_C_string("(define " S_filter_control_waveform_color " (dilambda (lambda () #f) (lambda (val) val)))");
376   Xen_eval_C_string("(define " S_graph_color " (dilambda (lambda () #f) (lambda (val) val)))");
377   Xen_eval_C_string("(define " S_graph_cursor " (dilambda (lambda () #f) (lambda (val) val)))");
378   Xen_eval_C_string("(define " S_listener_color " (dilambda (lambda () #f) (lambda (val) val)))");
379   Xen_eval_C_string("(define " S_listener_text_color " (dilambda (lambda () #f) (lambda (val) val)))");
380   Xen_eval_C_string("(define " S_axis_color " (dilambda (lambda () #f) (lambda (val) val)))");
381   Xen_eval_C_string("(define " S_mark_color " (dilambda (lambda args #f) (lambda args #f)))");
382   Xen_eval_C_string("(define " S_mix_color " (dilambda (lambda args #f) (lambda args #f)))");
383   Xen_eval_C_string("(define " S_combined_data_color " (dilambda (lambda args #f) (lambda args #f)))");
384   Xen_eval_C_string("(define " S_position_color " (dilambda (lambda () #f) (lambda (val) val)))");
385   Xen_eval_C_string("(define " S_foreground_color " (dilambda (lambda args #f) (lambda args (car args))))");
386   Xen_eval_C_string("(define " S_sash_color " (dilambda (lambda () #f) (lambda (val) val)))");
387   Xen_eval_C_string("(define " S_selected_data_color " (dilambda (lambda () #f) (lambda (val) val)))");
388   Xen_eval_C_string("(define " S_selected_graph_color " (dilambda (lambda () #f) (lambda (val) val)))");
389   Xen_eval_C_string("(define " S_text_focus_color " (dilambda (lambda () #f) (lambda (val) val)))");
390   Xen_eval_C_string("(define " S_x_axis_label " (dilambda (lambda args \"\") (lambda args \"\")))");
391   Xen_eval_C_string("(define " S_y_axis_label " (dilambda (lambda args \"\") (lambda args \"\")))");
392   Xen_eval_C_string("(define " S_zoom_color " (dilambda (lambda () #f) (lambda (val) val)))");
393   Xen_eval_C_string("(define " S_widget_size " (dilambda (lambda (w) #f) (lambda (w val) val)))");
394   Xen_eval_C_string("(define " S_widget_position " (dilambda (lambda (w) #f) (lambda (w val) val)))");
395 
396   Xen_eval_C_string("(define (" S_axis_info " . args) #f)");
397   Xen_eval_C_string("(define (" S_channel_widgets " . args) #f)");
398   Xen_eval_C_string("(define (" S_is_color " obj) #f)");
399   Xen_eval_C_string("(define (" S_color_to_list " obj) #f)");
400   Xen_eval_C_string("(define (" S_is_colormap " obj) #f)");
401   Xen_eval_C_string("(define (" S_current_font " . args) #f)");
402   Xen_eval_C_string("(define (" S_dialog_widgets ") #f)");
403   Xen_eval_C_string("(define (" S_graph_data " . args) #f)");
404 
405   Xen_eval_C_string("(define (" S_in " . args) #f)");
406   Xen_eval_C_string("(define (" S_main_widgets ") #f)");
407   Xen_eval_C_string("(define (" S_make_color " . args) #f)");
408   Xen_eval_C_string("(define (" S_make_graph_data " . args) #f)");
409   Xen_eval_C_string("(define (" S_menu_widgets " . args) #f)");
410   Xen_eval_C_string("(define (" S_reset_listener_cursor ") #f)");
411   Xen_eval_C_string("(define (" S_sound_widgets " . args) #f)");
412   Xen_eval_C_string("(define (" S_view_regions_dialog " . args) #f)");
413   Xen_eval_C_string("(define (" S_find_dialog " . args) #f)");
414   Xen_eval_C_string("(define (" S_widget_text " . args) \"\")");
415   Xen_eval_C_string("(define (" S_goto_listener_end ") #f)");
416   Xen_eval_C_string("(define (" S_y_to_position " . args) #f)");
417   Xen_eval_C_string("(define (" S_x_to_position " . args) #f)");
418   Xen_eval_C_string("(define (" S_snd_gcs " . args) #f)");
419   Xen_eval_C_string("(define (" S_show_widget " . args) #f)");
420   Xen_eval_C_string("(define (" S_position_to_y " . args) #f)");
421   Xen_eval_C_string("(define (" S_position_to_x " . args) #f)");
422   Xen_eval_C_string("(define (" S_listener_selection " . args) #f)");
423   Xen_eval_C_string("(define (" S_hide_widget " arg) #f)");
424   Xen_eval_C_string("(define (" S_focus_widget " arg) #f)");
425   Xen_eval_C_string("(define (" S_fill_rectangle " . args) #f)");
426   Xen_eval_C_string("(define (" S_fill_polygon " . args) #f)");
427   Xen_eval_C_string("(define (" S_draw_string " . args) #f)");
428   Xen_eval_C_string("(define (" S_draw_lines " . args) #f)");
429   Xen_eval_C_string("(define (" S_draw_line " . args) #f)");
430   Xen_eval_C_string("(define (" S_draw_dots " . args) #f)");
431   Xen_eval_C_string("(define (" S_draw_dot " . args) #f)");
432   Xen_eval_C_string("(define (" S_draw_axes " . args) #f)");
433   Xen_eval_C_string("(define (" S_delete_colormap " . args) #f)");
434   Xen_eval_C_string("(define (" S_colormap_ref " . args) #f)");
435   Xen_eval_C_string("(define (" S_colormap_name " arg) #f)");
436   Xen_eval_C_string("(define (" S_add_colormap " . args) #f)");
437 
438   Xen_eval_C_string("(define " S_x_bounds " (dilambda (lambda args #f) (lambda args #f)))");
439   Xen_eval_C_string("(define " S_y_bounds " (dilambda (lambda args #f) (lambda args #f)))");
440 #endif
441 
442 #if HAVE_RUBY
443   Xen_eval_C_string("def axis_info (s, c, a) false end");
444   Xen_eval_C_string("def channel_widgets (s, c) false end");
445   Xen_eval_C_string("def color? (a) false end");
446   Xen_eval_C_string("def color_to_list (a) false end");
447   Xen_eval_C_string("def current_font () false end");
448   Xen_eval_C_string("def dialog_widgets () false end");
449   Xen_eval_C_string("def enved_filter () false end");
450   Xen_eval_C_string("def main_widgets (s) false end");
451   Xen_eval_C_string("def make_color (r, g, b) false end");
452   Xen_eval_C_string("def menu_widgets (s) false end");
453   Xen_eval_C_string("def reset_listener_cursor () false end");
454   Xen_eval_C_string("def sound_widgets (s) false end");
455   Xen_eval_C_string("def view_regions_dialog () false end");
456   Xen_eval_C_string("def find_dialog () false end");
457   Xen_eval_C_string("def x_axis_label () false end");
458   Xen_eval_C_string("def y_axis_label () false end");
459 
460   Xen_eval_C_string("def basic_color () false end");
461   Xen_eval_C_string("def set_basic_color (a) false end");
462   Xen_eval_C_string("def colormap () false end");
463   Xen_eval_C_string("def set_colormap (a) false end");
464   Xen_eval_C_string("def colormap_size () false end");
465   Xen_eval_C_string("def set_colormap_size (a) false end");
466   Xen_eval_C_string("def cursor_color () false end");
467   Xen_eval_C_string("def set_cursor_color (a) false end");
468   Xen_eval_C_string("def data_color () false end");
469   Xen_eval_C_string("def set_data_color (a) false end");
470   Xen_eval_C_string("def enved_envelope () false end");
471   Xen_eval_C_string("def set_enved_envelope (a) false end");
472   Xen_eval_C_string("def enved_waveform_color () false end");
473   Xen_eval_C_string("def set_enved_waveform_color (a) false end");
474   Xen_eval_C_string("def filter_control_waveform_color () false end");
475   Xen_eval_C_string("def set_filter_control_waveform_color (a) false end");
476   Xen_eval_C_string("def graph_color () false end");
477   Xen_eval_C_string("def set_graph_color (a) false end");
478   Xen_eval_C_string("def graph_cursor () false end");
479   Xen_eval_C_string("def set_graph_cursor (a) false end");
480   Xen_eval_C_string("def listener_color () false end");
481   Xen_eval_C_string("def set_listener_color (a) false end");
482   Xen_eval_C_string("def listener_text_color () false end");
483   Xen_eval_C_string("def set_listener_text_color (a) false end");
484   Xen_eval_C_string("def mark_color () false end");
485   Xen_eval_C_string("def set_mark_color (m) false end");
486   Xen_eval_C_string("def mix_color () false end");
487   Xen_eval_C_string("def set_mix_color (m) false end");
488   Xen_eval_C_string("def combined_data_color (a, b) false end");
489   Xen_eval_C_string("def set_combined_data_color (a, b, c) false end");
490   Xen_eval_C_string("def position_color () false end");
491   Xen_eval_C_string("def set_position_color (a) false end");
492   Xen_eval_C_string("def foreground_color () false end");
493   Xen_eval_C_string("def set_foreground_color (a) false end");
494   Xen_eval_C_string("def sash_color () false end");
495   Xen_eval_C_string("def set_sash_color (a) false end");
496   Xen_eval_C_string("def selected_data_color () false end");
497   Xen_eval_C_string("def set_selected_data_color (a) false end");
498   Xen_eval_C_string("def selected_graph_color () false end");
499   Xen_eval_C_string("def set_selected_graph_color (a) false end");
500   Xen_eval_C_string("def text_focus_color () false end");
501   Xen_eval_C_string("def set_text_focus_color (a) false end");
502   Xen_eval_C_string("def zoom_color () false end");
503   Xen_eval_C_string("def set_zoom_color (a) false end");
504   Xen_eval_C_string("def widget_size () false end");
505   Xen_eval_C_string("def set_widget_size (a) false end");
506   Xen_eval_C_string("def widget_position () false end");
507   Xen_eval_C_string("def set_widget_position (a) false end");
508   Xen_eval_C_string("def colormap? (a) false end");
509   Xen_eval_C_string("def in (a, b) false end");
510   Xen_eval_C_string("def widget_text (a) false end");
511 
512   Xen_eval_C_string("def y2position (a) false end");
513   Xen_eval_C_string("def x2position (a) false end");
514   Xen_eval_C_string("def position2y (a) false end");
515   Xen_eval_C_string("def position2x (a) false end");
516   Xen_eval_C_string("def snd_gcs (a) false end");
517   Xen_eval_C_string("def show_widget (a) false end");
518   Xen_eval_C_string("def listener_selection (a) false end");
519   Xen_eval_C_string("def hide_widget (a) false end");
520   Xen_eval_C_string("def focus_widget (a) false end");
521   Xen_eval_C_string("def fill_rectangle (a) false end");
522   Xen_eval_C_string("def fill_polygon (a) false end");
523   Xen_eval_C_string("def draw_string (a) false end");
524   Xen_eval_C_string("def draw_lines (a) false end");
525   Xen_eval_C_string("def draw_line (a) false end");
526   Xen_eval_C_string("def draw_dots (a) false end");
527   Xen_eval_C_string("def draw_dot (a) false end");
528   Xen_eval_C_string("def draw_axes (a) false end");
529   Xen_eval_C_string("def delete_colormap (a) false end");
530   Xen_eval_C_string("def colormap_ref (a) false end");
531   Xen_eval_C_string("def colormap_name (a) false end");
532   Xen_eval_C_string("def add_colormap (a) false end");
533 
534   Xen_eval_C_string("def make_graph_data (a, b, c) false end");
535   Xen_eval_C_string("def graph_data (a, b, c) false end");
536 
537   Xen_eval_C_string("$drop_hook = false");
538   Xen_eval_C_string("$listener_click_hook = false");
539   Xen_eval_C_string("$mouse_enter_graph_hook = false");
540   Xen_eval_C_string("$mouse_enter_label_hook = false");
541   Xen_eval_C_string("$mouse_enter_listener_hook = false");
542   Xen_eval_C_string("$mouse_enter_text_hook = false");
543   Xen_eval_C_string("$mouse_leave_graph_hook = false");
544   Xen_eval_C_string("$mouse_leave_label_hook = false");
545   Xen_eval_C_string("$mouse_leave_listener_hook = false");
546   Xen_eval_C_string("$mouse_leave_text_hook = false");
547   Xen_eval_C_string("$new_widget_hook = false");
548   Xen_eval_C_string("$orientation_hook = false");
549 
550   Xen_eval_C_string("Copy_context = 0");
551   Xen_eval_C_string("Cursor_context = 3");
552   Xen_eval_C_string("Lisp_graph = 2");
553   Xen_eval_C_string("Mark_context = 4");
554   Xen_eval_C_string("Selection_context = 2");
555   Xen_eval_C_string("Time_graph = 0");
556   Xen_eval_C_string("Transform_graph = 1");
557 
558   Xen_eval_C_string("def x_bounds (s, c, a) false end");
559   Xen_eval_C_string("def set_x_bounds (s, c, ax, a) false end");
560   Xen_eval_C_string("def y_bounds (s, c, a) false end");
561   Xen_eval_C_string("def set_y_bounds (s, c, ax, a) false end");
562 #endif
563 
564 #if HAVE_FORTH
565   Xen_eval_C_string("\
566 0 #f create-hook " S_color_hook "\n\
567 1 #f create-hook " S_drop_hook "\n\
568 1 #f create-hook " S_listener_click_hook "\n\
569 2 #f create-hook " S_mouse_enter_graph_hook "\n\
570 3 #f create-hook " S_mouse_enter_label_hook "\n\
571 1 #f create-hook " S_mouse_enter_listener_hook "\n\
572 1 #f create-hook " S_mouse_enter_text_hook "\n\
573 2 #f create-hook " S_mouse_leave_graph_hook "\n\
574 3 #f create-hook " S_mouse_leave_label_hook "\n\
575 1 #f create-hook " S_mouse_leave_listener_hook "\n\
576 1 #f create-hook " S_mouse_leave_text_hook "\n\
577 1 #f create-hook " S_new_widget_hook "\n\
578 0 #f create-hook " S_orientation_hook "\n");
579 
580   Xen_eval_C_string("\
581 0 constant " S_copy_context "\n\
582 3 constant " S_cursor_context "\n\
583 2 constant " S_lisp_graph "\n\
584 4 constant " S_mark_context "\n\
585 2 constant " S_selection_context "\n\
586 0 constant " S_time_graph "\n\
587 1 constant " S_transform_graph "\n");
588 
589   Xen_eval_C_string("\
590 : " S_basic_color " #f ;\n\
591 : set-" S_basic_color " { a } #f ;\n\
592 : " S_colormap " #f ;\n\
593 : set-" S_colormap " { a } #f ;\n\
594 : " S_colormap_size " #f ;\n\
595 : set-" S_colormap_size " { a } #f ;\n\
596 : " S_cursor_color " #f ;\n\
597 : set-" S_cursor_color " { a } #f ;\n\
598 : " S_data_color " #f ;\n\
599 : set-" S_data_color " { a } #f ;\n\
600 : " S_enved_envelope " #f ;\n\
601 : set-" S_enved_envelope " { a } #f ;\n\
602 : " S_enved_filter " #f ;\n\
603 : set-" S_enved_filter " { a } #f ;\n\
604 : " S_enved_waveform_color " #f ;\n\
605 : set-" S_enved_waveform_color " { a } #f ;\n\
606 : " S_filter_control_waveform_color " #f ;\n\
607 : set-" S_filter_control_waveform_color " { a } #f ;\n\
608 : " S_graph_color " #f ;\n\
609 : set-" S_graph_color " { a } #f ;\n\
610 : " S_graph_cursor " #f ;\n\
611 : set-" S_graph_cursor " { a } #f ;\n\
612 : " S_listener_color " #f ;\n\
613 : set-" S_listener_color " { a } #f ;\n\
614 : " S_listener_text_color " #f ;\n\
615 : set-" S_listener_text_color " { a } #f ;\n\
616 : " S_mark_color " #f ;\n\
617 : set-" S_mark_color " { a } #f ;\n\
618 : " S_mix_color " #f ;\n\
619 : set-" S_mix_color " { a } #f ;\n\
620 : " S_combined_data_color " #f ;\n\
621 : set-" S_combined_data_color " { a } #f ;\n\
622 : " S_position_color " #f ;\n\
623 : set-" S_position_color " { a } #f ;\n\
624 : " S_sash_color " #f ;\n\
625 : set-" S_sash_color " { a } #f ;\n\
626 : " S_selected_data_color " #f ;\n\
627 : set-" S_selected_data_color " { a } #f ;\n\
628 : " S_selected_graph_color " #f ;\n\
629 : set-" S_selected_graph_color " { a } #f ;\n\
630 : " S_text_focus_color " #f ;\n\
631 : set-" S_text_focus_color " { a } #f ;\n\
632 : " S_x_axis_label " #f ;\n\
633 : set-" S_x_axis_label " { a } #f ;\n\
634 : " S_y_axis_label " #f ;\n\
635 : set-" S_y_axis_label " { a } #f ;\n\
636 : " S_zoom_color " #f ;\n\
637 : set-" S_zoom_color " { a } #f ;\n\
638 : " S_axis_info " { s c a } #f ;\n\
639 : " S_x_bounds " { s c a } #f ;\n\
640 : set-" S_x_bounds " { a } #f ;\n\
641 : " S_y_bounds " { s c a } #f ;\n\
642 : set-" S_y_bounds " { a } #f ;\n\
643 : " S_channel_widgets " { s c } #f ;\n\
644 : " S_is_color " { a } #f ;\n\
645 : " S_color_to_list " { a } #f ;\n\
646 : " S_is_colormap " { a } #f ;\n\
647 : " S_current_font " #f ;\n\
648 : " S_dialog_widgets " #f ;\n\
649 : " S_focus_widget " #f ;\n\
650 : " S_graph_data " { a b c } #f ;\n\
651 : " S_in " { a b } #f ;\n\
652 : " S_main_widgets " { s } #f ;\n\
653 : " S_make_color " { r g b } #f ;\n\
654 : " S_make_graph_data " { a b c } #f ;\n\
655 : " S_menu_widgets " { s } #f ;\n\
656 : " S_reset_listener_cursor " #f ;\n\
657 : " S_sound_widgets " { s } #f ;\n\
658 : " S_view_regions_dialog " #f ;\n\
659 : " S_widget_text " { a } #f ;\n\
660 : " S_goto_listener_end " #f ;\n");
661 #endif
662 
663   set_peaks_font(FALLBACK_FONT);
664   set_tiny_font(FALLBACK_FONT);
665   set_bold_peaks_font(FALLBACK_FONT);
666   set_axis_label_font(FALLBACK_FONT);
667   set_axis_numbers_font(FALLBACK_FONT);
668   set_listener_font(FALLBACK_FONT);
669   ss->startup_title = mus_strdup("snd");
670 
671   for (i = 1; i < argc; i++)
672     {
673       if (mus_strcmp(argv[i], "-noglob"))
674 	noglob = true;
675       else
676 	if (mus_strcmp(argv[i], "-noinit"))
677 	  noinit = true;
678 	else
679 	  if (mus_strcmp(argv[i], "-nostdin"))
680 	    nostdin = true;
681 	  else
682 	    if ((mus_strcmp(argv[i], "-b")) || (mus_strcmp(argv[i], "-batch")))
683 	      ss->batch_mode = true;
684 	    else
685 	      if (mus_strcmp(argv[i], "--features")) /* testing (compsnd) */
686 		check_features_list(argv[i + 1]);
687     }
688   snd_load_init_file(noglob, noinit);
689 
690 #if (!_MSC_VER) && !__MINGW32__
691   signal(SIGTTIN, SIG_IGN); /* disallow terminal read/write if a background job */
692   signal(SIGTTOU, SIG_IGN);
693 #endif
694 
695 #ifndef _MSC_VER
696   if (sigsetjmp(top_level_jump, 1))
697     {
698       if (!(ss->jump_ok))
699 	snd_error_without_format("Caught top level error (will try to continue):\n");
700       else ss->jump_ok = false;
701     }
702   else
703     {
704 #endif
705 
706   auto_open_files = argc - 1;
707   if (argc > 1) auto_open_file_names = (char **)(argv + 1);
708   while (auto_open_ctr < auto_open_files)
709     auto_open_ctr = handle_next_startup_arg(auto_open_ctr, auto_open_file_names, false, auto_open_files);
710 
711 #ifndef _MSC_VER
712     }
713 #endif
714 
715   if ((ss->sounds) && (ss->sounds[0]) && ((ss->sounds[0])->inuse == SOUND_NORMAL))
716     select_channel(ss->sounds[0], 0);
717 
718 #if HAVE_SCHEME
719   top_level_let = s7_nil(s7);
720   s7_define_variable(s7, "top-level-let", s7_dilambda(s7, "top-level-let", g_top_level_let, 0, 0, g_set_top_level_let, 1, 0, "listener environment"));
721 #endif
722 
723 #if HAVE_SCHEME && (!defined(__sun)) && (!defined(_MSC_VER))
724   if (!nostdin)
725     {
726       if (noinit) goto DUMB_REPL;
727 #if USE_NOTCURSES
728       if (nrepl(s7))                 /* nrepl.c -- loads nrepl.scm, 0=success */
729 #else
730       if (s7_load(s7, "repl.scm"))   /* returns NULL if can't find repl.scm */
731 	{
732 	  if ((listener_prompt(ss)) && (strcmp(listener_prompt(ss), DEFAULT_LISTENER_PROMPT) != 0))
733 	    s7_eval_c_string(s7, "(set! (*repl* 'prompt)                \
734                                   (lambda (num)				\
735                                     (with-let (sublet (*repl* 'repl-let) :num num) \
736 			              (set! prompt-string (format #f \"(~D)~A\" num *listener-prompt*)) \
737 			              (set! prompt-length (length prompt-string)))))");
738 	  s7_eval_c_string(s7, "((*repl* 'run))");
739 	}
740       else
741 #endif
742 	{
743 	DUMB_REPL:
744 	  while (true)
745 	    {
746 	      char buffer[512];
747 	      fprintf(stdout, "\n> ");
748 	      if (!fgets(buffer, 512, stdin)) break;  /* error or ctrl-D */
749 	      if (((buffer[0] != '\n') || (strlen(buffer) > 1)))
750 		{
751 		  char response[1024];
752 		  snprintf(response, 1024, "(write %s)", buffer);
753 		  s7_eval_c_string(s7, response);
754 		}
755 	    }
756 	  fprintf(stdout, "\n");
757 	  if (ferror(stdin))
758 	    fprintf(stderr, "read error on stdin\n");
759 	}
760     }
761 #else /* not scheme */
762   if (!nostdin)
763     xen_repl(1, argv);
764 #endif
765 }
766