diff --git a/src/minimodem.1.in b/src/minimodem.1.in index 242086b..512faee 100644 --- a/src/minimodem.1.in +++ b/src/minimodem.1.in @@ -83,6 +83,9 @@ Generate 32-bit floating-point format audio samples, instead of the default 16-bit signed integer format (applies to \-\-tx mode only; \-\-rx mode always uses 32-bit floating-point). .TP +.B \-\-benchmarks +Run and report internal performance tests (all other flags are ignored). +.TP .B \-V, \-\-version print program version .SH {baudmode} diff --git a/src/minimodem.c b/src/minimodem.c index 49f0018..e3dfcde 100644 --- a/src/minimodem.c +++ b/src/minimodem.c @@ -40,6 +40,8 @@ #include "fsk.h" #include "baudot.h" +char *program_name = ""; + /* * ASCII 8-bit data framebits decoder/encoder (passthrough) @@ -223,6 +225,55 @@ report_no_carrier( fsk_plan *fskp, } } +void +generate_test_tones( simpleaudio *sa_out, unsigned int duration_sec ) +{ + unsigned int sample_rate = simpleaudio_get_rate(sa_out); + unsigned int nframes = sample_rate / 10; + int i; + for ( i=0; i<(sample_rate/nframes*duration_sec); i++ ) { + simpleaudio_tone(sa_out, 1000, nframes/2); + simpleaudio_tone(sa_out, 1777, nframes/2); + } +} + +static int +benchmarks() +{ + fprintf(stdout, "minimodem %s benchmarks\n", VERSION); + + int ret; + ret = system("sed -n '/^model name/{p;q}' /proc/cpuinfo"); + ret = ret; // don't care, hush compiler. + + fflush(stdout); + + unsigned int sample_rate = 48000; + sa_backend_t backend = SA_BACKEND_BENCHMARK; + // backend = SA_BACKEND_SYSDEFAULT; // for test + + simpleaudio *sa_out; + + sa_out = simpleaudio_open_stream(backend, SA_STREAM_PLAYBACK, + SA_SAMPLE_FORMAT_S16, sample_rate, 1, + program_name, "generate-tones-S16-mono"); + if ( ! sa_out ) + return 0; + generate_test_tones(sa_out, 10); + simpleaudio_close(sa_out); + + sa_out = simpleaudio_open_stream(backend, SA_STREAM_PLAYBACK, + SA_SAMPLE_FORMAT_FLOAT, sample_rate, 1, + program_name, "generate-tones-FLOAT-mono"); + if ( ! sa_out ) + return 0; + generate_test_tones(sa_out, 10); + simpleaudio_close(sa_out); + + return 1; +} + + void version() { @@ -258,6 +309,7 @@ usage() " -V, --version\n" " -A, --alsa\n" " -F, --float-samples\n" + " --benchmarks\n" " {baudmode}\n" " 1200 Bell202 1200 bps --ascii\n" " 300 Bell103 300 bps --ascii\n" @@ -280,7 +332,6 @@ main( int argc, char*argv[] ) unsigned int bfsk_n_data_bits = 0; int autodetect_shift; char *filename = NULL; - char *program_name; float carrier_autodetect_threshold = 0.0; float bfsk_confidence_threshold = 0.6; @@ -307,6 +358,11 @@ main( int argc, char*argv[] ) int c; int option_index; + enum { + MINIMODEM_OPT_UNUSED=256, // placeholder + MINIMODEM_OPT_BENCHMARKS, + }; + while ( 1 ) { static struct option long_options[] = { { "version", 0, 0, 'V' }, @@ -329,6 +385,7 @@ main( int argc, char*argv[] ) { "alsa", 0, 0, 'A' }, { "samplerate", 1, 0, 'R' }, { "float-samples", 0, 0, 'F' }, + { "benchmarks", 0, 0, MINIMODEM_OPT_BENCHMARKS }, { 0 } }; c = getopt_long(argc, argv, "Vtrc:a85f:b:M:S:T:qAR:F", @@ -398,6 +455,10 @@ main( int argc, char*argv[] ) case 'F': sample_format = SA_SAMPLE_FORMAT_FLOAT; break; + case MINIMODEM_OPT_BENCHMARKS: + benchmarks(); + exit(0); + break; default: usage(); }