1 /* Tracksplitting - Parameters
2
3 * Copyright (C) 1998 J.A. Bezemer
4 *
5 * Licensed under the terms of the GNU General Public License.
6 * ABSOLUTELY NO WARRANTY.
7 * See the file `COPYING' in this directory.
8 */
9
10 #include "tracksplit_parammenu.h"
11 #include "errorwindow.h"
12 #include "stringinput.h"
13 #include "buttons.h"
14 #include "clrscr.h"
15 #include "boxes.h"
16 #include "helpline.h"
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #ifndef OLD_CURSES
21 #include <ncurses.h>
22 #else
23 #include <curses.h>
24 #endif
25
26
27 int
tracksplit_parammenu(int * make_use_rms,int * make_graphs,long * blocklen,int * global_silence_factor,int * local_silence_threshold,int * min_silence_blocks,int * min_track_blocks,int * extra_blocks_start,int * extra_blocks_end)28 tracksplit_parammenu (int *make_use_rms, int *make_graphs, long *blocklen,
29 int *global_silence_factor,
30 int *local_silence_threshold, int *min_silence_blocks,
31 int *min_track_blocks, int *extra_blocks_start,
32 int *extra_blocks_end)
33 /* Returns 0: canceled, 1: PrevScreen, 2: NextScreen */
34 {
35 button_t next_button, cancel_button, prev_button;
36 button_t make_use_rms_check, make_graphs_check;
37 stringinput_t blocklen_string, global_silence_factor_string, local_silence_threshold_string,
38 min_silence_blocks_string, min_track_blocks_string, extra_blocks_start_string,
39 extra_blocks_end_string;
40 int dont_stop = TRUE;
41 int returnval = 0;
42 int focus = 11;
43 int in_ch;
44 long templong;
45
46 char *helplines[12] =
47 {
48 " Save results or use saved results of lengthy computation. TAB: Next field",
49 " For manual (double-)checking/adjustment. Needs a few MB's. TAB: Next field",
50 " Number of samples to compute RMS of; 4410 = 0.1 sec. TAB: Next field",
51 " The relative threshold during the initial search for tracks. TAB: Next field",
52 " Begin/end of track ...% above local (silence) power level. TAB: Next field",
53 " Shorter periods of silence not treated as track separation. TAB: Next field",
54 " Shorter tracks are ignored. TAB: Next field",
55 " Correction for fade-in effects that are hard to detect. TAB: Next field",
56 " Correction for fade-out effects that are hard to detect. TAB: Next field",
57 " To Track Splitting - File Name. TAB: Next field",
58 " Back to main menu. TAB: Next field",
59 " Start searching for tracks. TAB: Next field"};
60
61 make_use_rms_check.text = ""; /* see below */
62 make_use_rms_check.y = 4;
63 make_use_rms_check.x = 2;
64 make_use_rms_check.selected = FALSE;
65
66 make_graphs_check.text = ""; /* see below */
67 make_graphs_check.y = 6;
68 make_graphs_check.x = 2;
69 make_graphs_check.selected = FALSE;
70
71 blocklen_string.maxlen = 500;
72 blocklen_string.string = (char *) malloc (
73 blocklen_string.maxlen * sizeof (char));
74 sprintf (blocklen_string.string, "%ld", *blocklen);
75 blocklen_string.y = 8;
76 blocklen_string.x = 54;
77 blocklen_string.w = 12;
78 blocklen_string.cursorpos =
79 strlen (blocklen_string.string);
80 blocklen_string.firstcharonscreen = 0;
81
82 global_silence_factor_string.maxlen = 500;
83 global_silence_factor_string.string = (char *) malloc (
84 global_silence_factor_string.maxlen * sizeof (char));
85 sprintf (global_silence_factor_string.string, "%d",
86 *global_silence_factor);
87 global_silence_factor_string.y = 10;
88 global_silence_factor_string.x = 54;
89 global_silence_factor_string.w = 12;
90 global_silence_factor_string.cursorpos =
91 strlen (global_silence_factor_string.string);
92 global_silence_factor_string.firstcharonscreen = 0;
93
94 local_silence_threshold_string.maxlen = 500;
95 local_silence_threshold_string.string = (char *) malloc (
96 local_silence_threshold_string.maxlen * sizeof (char));
97 sprintf (local_silence_threshold_string.string, "%d",
98 *local_silence_threshold);
99 local_silence_threshold_string.y = 11;
100 local_silence_threshold_string.x = 54;
101 local_silence_threshold_string.w = 12;
102 local_silence_threshold_string.cursorpos =
103 strlen (local_silence_threshold_string.string);
104 local_silence_threshold_string.firstcharonscreen = 0;
105
106 min_silence_blocks_string.maxlen = 500;
107 min_silence_blocks_string.string = (char *) malloc (
108 min_silence_blocks_string.maxlen * sizeof (char));
109 sprintf (min_silence_blocks_string.string, "%d",
110 *min_silence_blocks);
111 min_silence_blocks_string.y = 13;
112 min_silence_blocks_string.x = 54;
113 min_silence_blocks_string.w = 12;
114 min_silence_blocks_string.cursorpos =
115 strlen (min_silence_blocks_string.string);
116 min_silence_blocks_string.firstcharonscreen = 0;
117
118 min_track_blocks_string.maxlen = 500;
119 min_track_blocks_string.string = (char *) malloc (
120 min_track_blocks_string.maxlen * sizeof (char));
121 sprintf (min_track_blocks_string.string, "%d",
122 *min_track_blocks);
123 min_track_blocks_string.y = 14;
124 min_track_blocks_string.x = 54;
125 min_track_blocks_string.w = 12;
126 min_track_blocks_string.cursorpos =
127 strlen (min_track_blocks_string.string);
128 min_track_blocks_string.firstcharonscreen = 0;
129
130 extra_blocks_start_string.maxlen = 500;
131 extra_blocks_start_string.string = (char *) malloc (
132 extra_blocks_start_string.maxlen * sizeof (char));
133 sprintf (extra_blocks_start_string.string, "%d",
134 *extra_blocks_start);
135 extra_blocks_start_string.y = 16;
136 extra_blocks_start_string.x = 54;
137 extra_blocks_start_string.w = 12;
138 extra_blocks_start_string.cursorpos =
139 strlen (extra_blocks_start_string.string);
140 extra_blocks_start_string.firstcharonscreen = 0;
141
142 extra_blocks_end_string.maxlen = 500;
143 extra_blocks_end_string.string = (char *) malloc (
144 extra_blocks_end_string.maxlen * sizeof (char));
145 sprintf (extra_blocks_end_string.string, "%d",
146 *extra_blocks_end);
147 extra_blocks_end_string.y = 17;
148 extra_blocks_end_string.x = 54;
149 extra_blocks_end_string.w = 12;
150 extra_blocks_end_string.cursorpos =
151 strlen (extra_blocks_end_string.string);
152 extra_blocks_end_string.firstcharonscreen = 0;
153
154 prev_button.text = " < Previous screen ";
155 prev_button.y = 20;
156 prev_button.x = 5;
157 prev_button.selected = FALSE;
158
159 next_button.text = " Start computation ";
160 next_button.y = 20;
161 next_button.x = 56;
162 next_button.selected = FALSE;
163
164 cancel_button.text = " Cancel ";
165 cancel_button.y = 20;
166 cancel_button.x = 36;
167 cancel_button.selected = FALSE;
168
169 clearscreen (TRACKSPLIT_PARAMMENU_HEADERTEXT);
170
171 do
172 {
173 header (TRACKSPLIT_PARAMMENU_HEADERTEXT);
174
175 if (*make_use_rms)
176 make_use_rms_check.text = "[X]";
177 else
178 make_use_rms_check.text = "[ ]";
179
180 if (*make_graphs)
181 make_graphs_check.text = "[X]";
182 else
183 make_graphs_check.text = "[ ]";
184
185 if (focus == 0)
186 make_use_rms_check.selected = TRUE;
187 else
188 make_use_rms_check.selected = FALSE;
189
190 if (focus == 1)
191 make_graphs_check.selected = TRUE;
192 else
193 make_graphs_check.selected = FALSE;
194
195 if (focus == 9)
196 prev_button.selected = TRUE;
197 else
198 prev_button.selected = FALSE;
199
200 if (focus == 10)
201 cancel_button.selected = TRUE;
202 else
203 cancel_button.selected = FALSE;
204
205 if (focus == 11)
206 next_button.selected = TRUE;
207 else
208 next_button.selected = FALSE;
209
210 stringinput_display (&blocklen_string);
211 mvprintw (blocklen_string.y, 2,
212 "Length of blocks of signal power data (samples) :");
213
214 stringinput_display (&global_silence_factor_string);
215 mvprintw (global_silence_factor_string.y, 2,
216 "Global silence factor (0.1 %) :");
217
218 stringinput_display (&local_silence_threshold_string);
219 mvprintw (local_silence_threshold_string.y, 2,
220 "Local silence factor (%) :");
221
222 stringinput_display (&min_silence_blocks_string);
223 mvprintw (min_silence_blocks_string.y, 2,
224 "Minimal length of inter-track silence (blocks) :");
225
226 stringinput_display (&min_track_blocks_string);
227 mvprintw (min_track_blocks_string.y, 2,
228 "Minimal length of tracks (blocks) :");
229
230 stringinput_display (&extra_blocks_start_string);
231 mvprintw (extra_blocks_start_string.y, 2,
232 "Number of extra blocks at track start :");
233
234 stringinput_display (&extra_blocks_end_string);
235 mvprintw (extra_blocks_end_string.y, 2,
236 "Number of extra blocks at track end :");
237
238 button_display (&prev_button);
239 mybox (prev_button.y - 1, prev_button.x - 1,
240 3, strlen (prev_button.text) + 2);
241 button_display (&cancel_button);
242 mybox (cancel_button.y - 1, cancel_button.x - 1,
243 3, strlen (cancel_button.text) + 2);
244 button_display (&next_button);
245 mybox (next_button.y - 1, next_button.x - 1,
246 3, strlen (next_button.text) + 2);
247
248 button_display (&make_use_rms_check);
249 mvprintw (make_use_rms_check.y, make_use_rms_check.x + 4,
250 "Save/load signal power (RMS) data to/from .rms file");
251
252 button_display (&make_graphs_check);
253 mvprintw (make_graphs_check.y, make_graphs_check.x + 4,
254 "Generate graph files");
255
256 helpline (helplines[focus]);
257
258 switch (focus)
259 {
260 case 2:
261 stringinput_display (&blocklen_string);
262 break;
263 case 3:
264 stringinput_display (&global_silence_factor_string);
265 break;
266 case 4:
267 stringinput_display (&local_silence_threshold_string);
268 break;
269 case 5:
270 stringinput_display (&min_silence_blocks_string);
271 break;
272 case 6:
273 stringinput_display (&min_track_blocks_string);
274 break;
275 case 7:
276 stringinput_display (&extra_blocks_start_string);
277 break;
278 case 8:
279 stringinput_display (&extra_blocks_end_string);
280 break;
281 default:
282 move (0, 79);
283 }
284
285 refresh ();
286
287 in_ch = getch ();
288
289 switch (focus)
290 {
291 case 0: /* Make/use .RMS file */
292 switch (in_ch)
293 {
294 case KEY_ENTER:
295 case 13:
296 case ' ':
297 case 'x':
298 case 'X':
299 *make_use_rms = 1 - *make_use_rms;
300 break;
301
302 case KEY_LEFT:
303 case KEY_UP:
304 focus--;
305 break;
306 case KEY_RIGHT:
307 case KEY_DOWN:
308 focus++;
309 break;
310 }
311 break;
312
313 case 1: /* Make graph files */
314 switch (in_ch)
315 {
316 case KEY_ENTER:
317 case 13:
318 case ' ':
319 case 'x':
320 case 'X':
321 *make_graphs = 1 - *make_graphs;
322 break;
323
324 case KEY_LEFT:
325 case KEY_UP:
326 focus--;
327 break;
328 case KEY_RIGHT:
329 case KEY_DOWN:
330 focus++;
331 break;
332 }
333 break;
334
335 case 2: /* Block length */
336 stringinput_stdkeys (in_ch, &blocklen_string);
337 switch (in_ch)
338 {
339 case KEY_ENTER:
340 case 13:
341 templong = atol (blocklen_string.string);
342 if (templong < 1)
343 {
344 error_window ("Enter a whole number, greater than 0. \
345 Default: 4410.");
346 blocklen_string.cursorpos =
347 strlen (blocklen_string.string);
348 }
349 else
350 {
351 *blocklen = templong;
352 sprintf (blocklen_string.string,
353 "%ld", templong);
354 blocklen_string.cursorpos =
355 strlen (blocklen_string.string);
356 focus++;
357 }
358 break;
359
360 case KEY_UP:
361 focus--;
362 break;
363 case KEY_DOWN:
364 focus++;
365 break;
366 }
367 break;
368
369 case 3: /* Global silence factor */
370 stringinput_stdkeys (in_ch,
371 &global_silence_factor_string);
372 switch (in_ch)
373 {
374 case KEY_ENTER:
375 case 13:
376 templong = atol (
377 global_silence_factor_string.string);
378 if (templong < 0 || templong > 10000)
379 {
380 error_window ("Enter a whole, positive number, preferably \
381 less than 1000. Default: 150.");
382 global_silence_factor_string.cursorpos =
383 strlen (
384 global_silence_factor_string.string);
385 }
386 else
387 {
388 *global_silence_factor = templong;
389 sprintf (global_silence_factor_string.string,
390 "%ld", templong);
391 global_silence_factor_string.cursorpos =
392 strlen (global_silence_factor_string.string);
393 focus++;
394 }
395 break;
396
397 case KEY_UP:
398 focus--;
399 break;
400 case KEY_DOWN:
401 focus++;
402 break;
403 }
404 break;
405
406 case 4: /* Local silence threshold */
407 stringinput_stdkeys (in_ch,
408 &local_silence_threshold_string);
409 switch (in_ch)
410 {
411 case KEY_ENTER:
412 case 13:
413 templong = atol (
414 local_silence_threshold_string.string);
415 if (templong < 0 || templong > 10000)
416 {
417 error_window ("Enter a whole, positive number. \
418 Default: 5.");
419 local_silence_threshold_string.cursorpos =
420 strlen (
421 local_silence_threshold_string.string);
422 }
423 else
424 {
425 *local_silence_threshold = templong;
426 sprintf (local_silence_threshold_string.string,
427 "%ld", templong);
428 local_silence_threshold_string.cursorpos =
429 strlen (
430 local_silence_threshold_string.string);
431 focus++;
432 }
433 break;
434
435 case KEY_UP:
436 focus--;
437 break;
438 case KEY_DOWN:
439 focus++;
440 break;
441 }
442 break;
443
444 case 5: /* Min. silence length (blocks) */
445 stringinput_stdkeys (in_ch,
446 &min_silence_blocks_string);
447 switch (in_ch)
448 {
449 case KEY_ENTER:
450 case 13:
451 templong = atol (
452 min_silence_blocks_string.string);
453 if (templong < 0 || templong > 10000)
454 {
455 error_window ("Enter a whole, positive number. \
456 Default: 20.");
457 min_silence_blocks_string.cursorpos =
458 strlen (
459 min_silence_blocks_string.string);
460 }
461 else
462 {
463 *min_silence_blocks = templong;
464 sprintf (min_silence_blocks_string.string,
465 "%ld", templong);
466 min_silence_blocks_string.cursorpos =
467 strlen (
468 min_silence_blocks_string.string);
469 focus++;
470 }
471 break;
472
473 case KEY_UP:
474 focus--;
475 break;
476 case KEY_DOWN:
477 focus++;
478 break;
479 }
480 break;
481
482 case 6: /* Min. track length (blocks) */
483 stringinput_stdkeys (in_ch,
484 &min_track_blocks_string);
485 switch (in_ch)
486 {
487 case KEY_ENTER:
488 case 13:
489 templong = atol (
490 min_track_blocks_string.string);
491 if (templong < 0 || templong > 10000)
492 {
493 error_window ("Enter a whole, positive number. \
494 Default: 50.");
495 min_track_blocks_string.cursorpos =
496 strlen (
497 min_track_blocks_string.string);
498 }
499 else
500 {
501 *min_track_blocks = templong;
502 sprintf (min_track_blocks_string.string,
503 "%ld", templong);
504 min_track_blocks_string.cursorpos =
505 strlen (
506 min_track_blocks_string.string);
507 focus++;
508 }
509 break;
510
511 case KEY_UP:
512 focus--;
513 break;
514 case KEY_DOWN:
515 focus++;
516 break;
517 }
518 break;
519
520 case 7: /* Extra blocks at track start */
521 stringinput_stdkeys (in_ch,
522 &extra_blocks_start_string);
523 switch (in_ch)
524 {
525 case KEY_ENTER:
526 case 13:
527 templong = atol (
528 extra_blocks_start_string.string);
529 if (templong < 0 || templong > 10000)
530 {
531 error_window ("Enter a whole, positive number. \
532 Default: 3.");
533 extra_blocks_start_string.cursorpos =
534 strlen (
535 extra_blocks_start_string.string);
536 }
537 else
538 {
539 *extra_blocks_start = templong;
540 sprintf (extra_blocks_start_string.string,
541 "%ld", templong);
542 extra_blocks_start_string.cursorpos =
543 strlen (
544 extra_blocks_start_string.string);
545 focus++;
546 }
547 break;
548
549 case KEY_UP:
550 focus--;
551 break;
552 case KEY_DOWN:
553 focus++;
554 break;
555 }
556 break;
557
558 case 8: /* Extra blocks at track end */
559 stringinput_stdkeys (in_ch,
560 &extra_blocks_end_string);
561 switch (in_ch)
562 {
563 case KEY_ENTER:
564 case 13:
565 templong = atol (
566 extra_blocks_end_string.string);
567 if (templong < 0 || templong > 10000)
568 {
569 error_window ("Enter a whole, positive number. \
570 Default: 6.");
571 extra_blocks_end_string.cursorpos =
572 strlen (
573 extra_blocks_end_string.string);
574 }
575 else
576 {
577 *extra_blocks_end = templong;
578 sprintf (extra_blocks_end_string.string,
579 "%ld", templong);
580 extra_blocks_end_string.cursorpos =
581 strlen (
582 extra_blocks_end_string.string);
583 focus++;
584 }
585 break;
586
587 case KEY_UP:
588 focus--;
589 break;
590 case KEY_DOWN:
591 focus++;
592 break;
593 }
594 break;
595
596 case 9: /* < Previous */
597 if (in_ch == KEY_ENTER || in_ch == 13)
598 {
599 returnval = 1;
600 dont_stop = FALSE;
601 }
602 else
603 switch (in_ch)
604 {
605 case KEY_LEFT:
606 case KEY_UP:
607 focus--;
608 break;
609 case KEY_RIGHT:
610 case KEY_DOWN:
611 focus++;
612 break;
613 }
614 break;
615
616 case 10: /* Cancel */
617 if (in_ch == KEY_ENTER || in_ch == 13)
618 {
619 returnval = 0;
620 dont_stop = FALSE;
621 }
622 else
623 switch (in_ch)
624 {
625 case KEY_LEFT:
626 case KEY_UP:
627 focus--;
628 break;
629 case KEY_RIGHT:
630 case KEY_DOWN:
631 focus++;
632 break;
633 }
634 break;
635
636 case 11: /* Next > */
637 if (in_ch == KEY_ENTER || in_ch == 13)
638 {
639 templong = atol (blocklen_string.string);
640 if (templong < 1)
641 {
642 error_window ("Enter a whole number, greater than 0, as \
643 block length. Default: 4410.");
644 blocklen_string.cursorpos =
645 strlen (blocklen_string.string);
646 focus = 2;
647 break;
648 }
649 *blocklen = templong;
650
651 templong = atol (global_silence_factor_string.string);
652 if (templong < 1 || templong > 10000)
653 {
654 error_window ("Enter a whole, positive number as \
655 global silence factor. Default: 150.");
656 global_silence_factor_string.cursorpos =
657 strlen (global_silence_factor_string.string);
658 focus = 3;
659 break;
660 }
661 *global_silence_factor = templong;
662
663 templong = atol (local_silence_threshold_string.string);
664 if (templong < 1 || templong > 10000)
665 {
666 error_window ("Enter a whole, positive number as \
667 local silence factor. Default: 5.");
668 local_silence_threshold_string.cursorpos =
669 strlen (local_silence_threshold_string.string);
670 focus = 4;
671 break;
672 }
673 *local_silence_threshold = templong;
674
675 templong = atol (min_silence_blocks_string.string);
676 if (templong < 1 || templong > 10000)
677 {
678 error_window ("Enter a whole, positive number as \
679 minimal silence duration. Default: 20.");
680 min_silence_blocks_string.cursorpos =
681 strlen (min_silence_blocks_string.string);
682 focus = 5;
683 break;
684 }
685 *min_silence_blocks = templong;
686
687 templong = atol (min_track_blocks_string.string);
688 if (templong < 1 || templong > 10000)
689 {
690 error_window ("Enter a whole, positive number as \
691 minimal track length. Default: 50.");
692 min_track_blocks_string.cursorpos =
693 strlen (min_track_blocks_string.string);
694 focus = 6;
695 break;
696 }
697 *min_track_blocks = templong;
698
699 templong = atol (extra_blocks_start_string.string);
700 if (templong < 1 || templong > 10000)
701 {
702 error_window ("Enter a whole, positive number as \
703 block addition. Default: 3.");
704 extra_blocks_start_string.cursorpos =
705 strlen (extra_blocks_start_string.string);
706 focus = 7;
707 break;
708 }
709 *extra_blocks_start = templong;
710
711 templong = atol (extra_blocks_end_string.string);
712 if (templong < 1 || templong > 10000)
713 {
714 error_window ("Enter a whole, positive number as \
715 block addition. Default: 6.");
716 extra_blocks_end_string.cursorpos =
717 strlen (extra_blocks_end_string.string);
718 focus = 8;
719 break;
720 }
721 *extra_blocks_end = templong;
722
723 returnval = 2;
724 dont_stop = FALSE;
725 }
726 else
727 switch (in_ch)
728 {
729 case KEY_LEFT:
730 case KEY_UP:
731 focus--;
732 break;
733 case KEY_RIGHT:
734 case KEY_DOWN:
735 focus++;
736 break;
737 }
738 break;
739
740 } /* switch(focus) */
741
742 if (in_ch == 9) /* TAB */
743 focus++;
744
745 if (in_ch == 27)
746 dont_stop = FALSE;
747
748 if (focus > 11)
749 focus = 0;
750 if (focus < 0)
751 focus = 11;
752 }
753 while (dont_stop);
754
755 return returnval;
756 }
757