ref: aec6ca8f5dc4edf630159d901b753b999cf1aa45
dir: /examples/parse_args.h/
/*
Copyright (C) 2003-2013 Paul Brossier <piem@aubio.org>
This file is part of aubio.
aubio is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
aubio is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with aubio. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
extern int verbose;
// input / output
extern int usejack;
extern char_t *source_uri;
extern char_t *sink_uri;
// general stuff
extern uint_t samplerate;
extern uint_t buffer_size;
extern uint_t hop_size;
// onset stuff
extern char_t * onset_method;
extern smpl_t onset_threshold;
extern smpl_t onset_minioi;
// pitch stuff
extern char_t * pitch_method;
extern char_t * pitch_unit;
extern smpl_t pitch_tolerance;
// time stuff
extern uint_t time_format;
// tempo stuff
extern char_t * tempo_method;
// more general stuff
extern smpl_t silence_threshold;
extern uint_t mix_input;
// midi tap
extern smpl_t miditap_note;
extern smpl_t miditap_velo;
extern uint_t force_overwrite;
// functions defined in utils.c
extern void examples_common_init (int argc, char **argv);
extern void examples_common_del (void);
extern void examples_common_process (aubio_process_func_t process_func,
aubio_print_func_t print);
int parse_args (int argc, char **argv);
// internal stuff
extern int blocks;
extern fvec_t *ibuf;
extern fvec_t *obuf;
const char *prog_name;
void usage (FILE * stream, int exit_code);
void usage (FILE * stream, int exit_code)
{
#ifdef HAVE_GETOPT_H
fprintf (stream, "usage: %s [ options ] \n", prog_name);
fprintf (stream,
" -i --input input file\n"
#ifdef PROG_HAS_OUTPUT
" -o --output output file\n"
#endif
" -r --samplerate select samplerate\n"
" use 0 to use input source samplerate, or 32000 to force 32kHz\n"
" -B --bufsize set buffer size\n"
" number of frames to run the analysis on\n"
" -H --hopsize set hopsize\n"
" number of frames to read from source before each analysis\n"
#ifdef PROG_HAS_ONSET
" -O --onset select onset detection algorithm\n"
" <default|energy|hfc|complex|phase|specdiff|kl|mkl|specflux>;\n"
" default=hfc\n"
" -t --onset-threshold set onset detection threshold\n"
" a value between 0.1 (more detections) and 1 (less); default=0.3\n"
" -M --minioi set minimum inter-onset interval\n"
" a value in second; default=0.012\n"
#endif /* PROG_HAS_ONSET */
#ifdef PROG_HAS_PITCH
" -p --pitch select pitch detection algorithm\n"
" <default|yinfft|yin|mcomb|fcomb|schmitt>; default=yinfft\n"
" -u --pitch-unit select pitch output unit\n"
" <default|freq|hertz|Hz|midi|cent|bin>; default=freq\n"
" -l --pitch-tolerance select pitch tolerance\n"
" (yin, yinfft only) a value between 0.1 and 0.7; default=0.3\n"
#endif /* PROG_HAS_PITCH */
#ifdef PROG_HAS_SILENCE
" -s --silence select silence threshold\n"
" a value in dB, for instance -70, or -100; default=-90\n"
#endif /* PROG_HAS_SILENCE */
" -T --time-format select time values output format\n"
" (samples, ms, seconds) default=seconds\n"
#ifdef PROG_HAS_OUTPUT
" -m --mix-input mix input signal with output signal\n"
" input signal will be added to output synthesis\n"
" -f --force-overwrite overwrite output file if needed\n"
" do not fail if output file already exists\n"
#endif /* PROG_HAS_OUTPUT */
#ifdef PROG_HAS_JACK
" -j --jack use Jack\n"
#if defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH)
" -N --miditap-note MIDI note; default=69.\n"
" -V --miditap-velo MIDI velocity; default=65.\n"
#endif /* defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH) */
#endif /* PROG_HAS_JACK */
" -v --verbose be verbose\n"
" -h --help display this message\n"
);
#else /* HAVE_GETOPT_H */
fprintf (stream, "warning: compiled with getopt.h, no argument parsing\n");
fprintf (stream, "usage: %s <filename> \n", prog_name);
#endif /* HAVE_GETOPT_H */
exit (exit_code);
}
int
parse_args (int argc, char **argv)
{
#ifdef HAVE_GETOPT_H
const char *options = "hv"
"i:r:B:H:"
#ifdef PROG_HAS_JACK
"j"
#if defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH)
"N:V:"
#endif /* defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH) */
#endif /* PROG_HAS_JACK */
#ifdef PROG_HAS_OUTPUT
"o:"
#endif /* PROG_HAS_OUTPUT */
#ifdef PROG_HAS_ONSET
"O:t:M:"
#endif /* PROG_HAS_ONSET */
#ifdef PROG_HAS_PITCH
"p:u:l:"
#endif /* PROG_HAS_PITCH */
"T:"
#ifdef PROG_HAS_SILENCE
"s:"
#endif /* PROG_HAS_SILENCE */
#ifdef PROG_HAS_OUTPUT
"mf"
#endif /* PROG_HAS_OUTPUT */
;
int next_option;
struct option long_options[] = {
{"help", 0, NULL, 'h'},
{"verbose", 0, NULL, 'v'},
{"input", 1, NULL, 'i'},
{"samplerate", 1, NULL, 'r'},
{"bufsize", 1, NULL, 'B'},
{"hopsize", 1, NULL, 'H'},
#ifdef PROG_HAS_JACK
{"jack", 0, NULL, 'j'},
#if defined(PROG_HAS_ONSET) && !defined(PROG_HAS_PITCH)
{"miditap-note", 1, NULL, 'N'},
{"miditap-velo", 1, NULL, 'V'},
#endif /* PROG_HAS_ONSET !PROG_HAS_PITCH */
#endif /* PROG_HAS_JACK */
#ifdef PROG_HAS_OUTPUT
{"output", 1, NULL, 'o'},
#endif /* PROG_HAS_OUTPUT */
#ifdef PROG_HAS_ONSET
{"onset", 1, NULL, 'O'},
{"onset-threshold", 1, NULL, 't'},
{"onset-minioi", 1, NULL, 'M'},
#endif /* PROG_HAS_ONSET */
#ifdef PROG_HAS_PITCH
{"pitch", 1, NULL, 'p'},
{"pitch-unit", 1, NULL, 'u'},
{"pitch-tolerance", 1, NULL, 'l'},
#endif /* PROG_HAS_PITCH */
#ifdef PROG_HAS_SILENCE
{"silence", 1, NULL, 's'},
#endif /* PROG_HAS_SILENCE */
{"time-format", 1, NULL, 'T'},
#ifdef PROG_HAS_OUTPUT
{"mix-input", 0, NULL, 'm'},
{"force-overwrite", 0, NULL, 'f'},
#endif /* PROG_HAS_OUTPUT */
{NULL, 0, NULL, 0}
};
#endif /* HAVE_GETOPT_H */
prog_name = argv[0];
if (argc < 1) {
usage (stderr, 1);
return -1;
}
#ifdef HAVE_GETOPT_H
do {
next_option = getopt_long (argc, argv, options, long_options, NULL);
switch (next_option) {
case 'h': /* help */
usage (stdout, 0);
return -1;
case 'v': /* verbose */
verbose = 1;
break;
case 'j':
usejack = 1;
break;
case 'N':
miditap_note = (smpl_t) atoi (optarg);
break;
case 'V':
miditap_velo = (smpl_t) atoi (optarg);
break;
case 'i':
source_uri = optarg;
break;
case 'o':
sink_uri = optarg;
break;
case 'f': /* force_overwrite flag */
force_overwrite = 1;
break;
case 'r':
samplerate = atoi (optarg);
break;
case 'B':
buffer_size = atoi (optarg);
break;
case 'H':
hop_size = atoi (optarg);
break;
case 'O': /*onset method */
onset_method = optarg;
break;
case 't': /* threshold value for onset */
onset_threshold = (smpl_t) atof (optarg);
break;
case 'M': /* minimum inter-onset-interval */
onset_minioi = (smpl_t) atof (optarg);
break;
case 'p':
pitch_method = optarg;
break;
case 'u':
pitch_unit = optarg;
break;
case 'l':
pitch_tolerance = (smpl_t) atof (optarg);
break;
case 'T':
if (strcmp (optarg, "samples") == 0) {
time_format = 2;
} else if (strcmp (optarg, "ms") == 0) {
time_format = 1;
} else if (strcmp (optarg, "seconds") == 0) {
time_format = 0;
} else {
errmsg ("Warning: did not get '%s' time-format string\n", optarg);
}
break;
case 's': /* silence threshold */
silence_threshold = (smpl_t) atof (optarg);
break;
case 'm': /* mix_input flag */
mix_input = 1;
break;
case '?': /* unknown options */
usage (stderr, 1);
break;
case -1: /* done with options */
break;
default: /*something else unexpected */
fprintf (stderr, "Error parsing option '%c'\n", next_option);
abort ();
}
}
while (next_option != -1);
#else /* HAVE_GETOPT_H */
int optind = 1;
#endif /* HAVE_GETOPT_H */
// if unique, use the non option argument as the source
if ( source_uri == NULL ) {
if (argc - optind == 1) {
source_uri = argv[optind];
} else if ( argc - optind > 1 ) {
errmsg ("Error: too many non-option arguments `%s'\n", argv[argc - 1]);
usage ( stderr, 1 );
}
} else if ( argc - optind > 0 ) {
errmsg ("Error: extra non-option argument %s\n", argv[optind]);
usage ( stderr, 1 );
}
// if no source, show a message
if (source_uri == NULL) {
#ifdef PROG_HAS_JACK
#if HAVE_JACK
verbmsg("No input source given, using jack\n");
usejack = 1;
#else
errmsg("Error: no arguments given (and no available audio input)\n");
usage ( stderr, 1 );
#endif /* HAVE_JACK */
#else
errmsg("Error: no arguments given\n");
usage ( stderr, 1 );
#endif /* PROG_HAS_JACK */
}
if ((sint_t)hop_size < 1) {
errmsg("Error: got hop_size %d, but can not be < 1\n", hop_size);
usage ( stderr, 1 );
} else if ((sint_t)buffer_size < 2) {
errmsg("Error: got buffer_size %d, but can not be < 2\n", buffer_size);
usage ( stderr, 1 );
} else if ((sint_t)buffer_size < (sint_t)hop_size) {
errmsg("Error: hop size (%d) is larger than win size (%d)\n",
hop_size, buffer_size);
usage ( stderr, 1 );
}
if ((sint_t)samplerate < 0) {
errmsg("Error: got samplerate %d, but can not be < 0\n", samplerate);
usage ( stderr, 1 );
}
return 0;
}