[alsa-devel] [PATCH 2/2] BAT: convert from getopt_long to argp

Takashi Iwai tiwai at suse.de
Sat Oct 24 09:43:04 CEST 2015


On Sat, 24 Oct 2015 00:29:16 +0200,
Caleb Crome wrote:
> 
> Convert from getopt_long to argp in preparation for converting to
> modular test framework.  This is to allow each module type to have
> its own set of options.
> 
> argp allows multiple argument sets to be used, whereas
> getopt_long is limited in that regard.

This patch seems dropping the gettext translations completely...?


Takashi

> 
> Signed-off-by: Caleb Crome <caleb at crome.org>
> ---
>  bat/bat.c | 233 ++++++++++++++++++++++++++++++++++----------------------------
>  1 file changed, 129 insertions(+), 104 deletions(-)
> 
> diff --git a/bat/bat.c b/bat/bat.c
> index 9c046e6..36705c1 100644
> --- a/bat/bat.c
> +++ b/bat/bat.c
> @@ -20,7 +20,8 @@
>  #include <string.h>
>  #include <errno.h>
>  #include <pthread.h>
> -#include <getopt.h>
> +#include <argp.h>
> +#include <error.h>
>  #include <math.h>
>  #include <limits.h>
>  #include <locale.h>
> @@ -283,37 +284,6 @@ static void test_capture(struct bat *bat)
>  	}
>  }
>  
> -static void usage(struct bat *bat)
> -{
> -	fprintf(bat->log,
> -_("Usage: bat [-options]...\n"
> -"\n"
> -"  -h, --help             this help\n"
> -"  -D                     pcm device for both playback and capture\n"
> -"  -P                     pcm device for playback\n"
> -"  -C                     pcm device for capture\n"
> -"  -f                     sample format\n"
> -"  -c                     number of channels\n"
> -"  -r                     sampling rate\n"
> -"  -n                     frames to playback or capture\n"
> -"  -k                     parameter for frequency detecting threshold\n"
> -"  -F                     target frequency\n"
> -"  -p                     total number of periods to play/capture\n"
> -"      --log=#            file that both stdout and strerr redirecting to\n"
> -"      --file=#           file for playback\n"
> -"      --saveplay=#       file that storing playback content, for debug\n"
> -"      --local            internal loop, set to bypass pcm hardware devices\n"
> -));
> -	fprintf(bat->log, _("Recognized sample formats are: %s %s %s %s\n"),
> -			snd_pcm_format_name(SND_PCM_FORMAT_U8),
> -			snd_pcm_format_name(SND_PCM_FORMAT_S16_LE),
> -			snd_pcm_format_name(SND_PCM_FORMAT_S24_3LE),
> -			snd_pcm_format_name(SND_PCM_FORMAT_S32_LE));
> -	fprintf(bat->log, _("The available format shotcuts are:\n"));
> -	fprintf(bat->log, _("-f cd (16 bit little endian, 44100, stereo)\n"));
> -	fprintf(bat->log, _("-f dat (16 bit little endian, 48000, stereo)\n"));
> -}
> -
>  static void set_defaults(struct bat *bat)
>  {
>  	int i;
> @@ -344,82 +314,136 @@ static void set_defaults(struct bat *bat)
>  	bat->err = stderr;
>  }
>  
> +
> +static error_t parse_opt (int key, char *arg, struct argp_state *state)
> +{
> +	struct bat *bat = state->input;
> +	switch (key) {
> +	case OPT_LOG:
> +		bat->logarg = arg;
> +		break;
> +	case OPT_READFILE:
> +		bat->playback.file = arg;
> +		break;
> +	case OPT_SAVEPLAY:
> +		bat->debugplay = arg;
> +		break;
> +	case OPT_LOCAL:
> +		bat->local = true;
> +		break;
> +	case 'D':
> +		if (bat->playback.device == NULL)
> +			bat->playback.device = arg;
> +		if (bat->capture.device == NULL)
> +			bat->capture.device = arg;
> +		break;
> +	case 'P':
> +		if (bat->capture.mode == MODE_SINGLE)
> +			bat->capture.mode = MODE_LOOPBACK;
> +		else
> +			bat->playback.mode = MODE_SINGLE;
> +		bat->playback.device = arg;
> +		break;
> +	case 'C':
> +		if (bat->playback.mode == MODE_SINGLE)
> +			bat->playback.mode = MODE_LOOPBACK;
> +		else
> +			bat->capture.mode = MODE_SINGLE;
> +		bat->capture.device = arg;
> +		break;
> +	case 'n':
> +		bat->narg = arg;
> +		break;
> +	case 'F':
> +		get_sine_frequencies(bat, arg);
> +		break;
> +	case 'c':
> +		bat->channels = atoi(arg);
> +		break;
> +	case 'r':
> +		bat->rate = atoi(arg);
> +		break;
> +	case 'f':
> +		get_format(bat, arg);
> +		break;
> +	case 'k':
> +		bat->sigma_k = atof(arg);
> +		break;
> +	case 'p':
> +		bat->periods_total = atoi(arg);
> +		bat->period_is_limited = true;
> +		break;
> +	default:
> +		return ARGP_ERR_UNKNOWN;
> +		break;
> +	}
> +	return 0;
> +}
>  static void parse_arguments(struct bat *bat, int argc, char *argv[])
>  {
> -	int c, option_index;
> -	static const char short_options[] = "D:P:C:f:n:F:c:r:s:k:p:lth";
> -	static const struct option long_options[] = {
> -		{"help",     0, 0, 'h'},
> -		{"log",      1, 0, OPT_LOG},
> -		{"file",     1, 0, OPT_READFILE},
> -		{"saveplay", 1, 0, OPT_SAVEPLAY},
> -		{"local",    0, 0, OPT_LOCAL},
> -		{0, 0, 0, 0}
> +
> +	const char doc[] =
> +		"Basic Audio Tester\n"
> +		"\n"
> +		"Uses a loopback configuration or 2 PC configuration "
> +		"(play on one PC and record on the other) to test "
> +		"if if audio is flowing smoothly."
> +		"\n"
> +		"Full documentation in the bat man page and at "
> +		"https://github.com/01org/bat/wiki"
> +		"\n"
> +		"Recognized sample formats are: %s %s %s %s\n"
> +		"The available format shotcuts are:\n"
> +		"\t-f cd (16 bit little endian, 44100, stereo)\n"
> +		"\t-f dat (16 bit little endian, 48000, stereo)\n";
> +
> +	const char args_doc[] = "";
> +
> +	struct argp_option options[] = {
> +		{"log", OPT_LOG, "FILENAME", 0,
> +		 "file that both stdout and strerr redirecting to", 0},
> +		{"file", OPT_READFILE, "FILENAME", 0,
> +		 "file for playback",0},
> +		{"saveplay", OPT_SAVEPLAY, "FILENAME", 0,
> +		 "file for storing playback content, for debug", 0},
> +		{"local", OPT_LOCAL, 0, 0,
> +		 "internal loopback, set to bypass pcm hardware devices",0},
> +		{"device-duplex", 'D', "DEVICE", 0,
> +		 "pcm device for both playback and capture", 0},
> +		{"device-playback", 'P', "DEVICE", 0,
> +		 "pcm device for playback", 0},
> +		{"device-capture", 'C', "DEVICE", 0,
> +		 "pcm device for capture", 0},
> +		{"sample_format" , 'f', "FORMAT", 0,
> +		 "sample format", 0},
> +		{"channels", 'c', "CHANNELS", 0,
> +		 "number of channels", 0},
> +		{"sample-rate", 'r', "SAMP/SEC", 0,
> +		 "sampling rate", 0},
> +		{"frames", 'n', "FRAMES", 0,
> +		 "The number of frames for playback and/or capture", 0},
> +		{"threshold", 'k', "THRESHOLD", 0,
> +		 "parameter for frequency detecting threshold", 0},
> +		{"target-frequency", 'F', "FREQUENCY", 0,
> +		 "target frequency for sin test ", 0},
> +		{"periods", 'p', "PERIODS", 0,
> +		 "total number of periods to play/capture", 0},
> +		{ 0 }
>  	};
>  
> -	while ((c = getopt_long(argc, argv, short_options, long_options,
> -					&option_index)) != -1) {
> -		switch (c) {
> -		case OPT_LOG:
> -			bat->logarg = optarg;
> -			break;
> -		case OPT_READFILE:
> -			bat->playback.file = optarg;
> -			break;
> -		case OPT_SAVEPLAY:
> -			bat->debugplay = optarg;
> -			break;
> -		case OPT_LOCAL:
> -			bat->local = true;
> -			break;
> -		case 'D':
> -			if (bat->playback.device == NULL)
> -				bat->playback.device = optarg;
> -			if (bat->capture.device == NULL)
> -				bat->capture.device = optarg;
> -			break;
> -		case 'P':
> -			if (bat->capture.mode == MODE_SINGLE)
> -				bat->capture.mode = MODE_LOOPBACK;
> -			else
> -				bat->playback.mode = MODE_SINGLE;
> -			bat->playback.device = optarg;
> -			break;
> -		case 'C':
> -			if (bat->playback.mode == MODE_SINGLE)
> -				bat->playback.mode = MODE_LOOPBACK;
> -			else
> -				bat->capture.mode = MODE_SINGLE;
> -			bat->capture.device = optarg;
> -			break;
> -		case 'n':
> -			bat->narg = optarg;
> -			break;
> -		case 'F':
> -			get_sine_frequencies(bat, optarg);
> -			break;
> -		case 'c':
> -			bat->channels = atoi(optarg);
> -			break;
> -		case 'r':
> -			bat->rate = atoi(optarg);
> -			break;
> -		case 'f':
> -			get_format(bat, optarg);
> -			break;
> -		case 'k':
> -			bat->sigma_k = atof(optarg);
> -			break;
> -		case 'p':
> -			bat->periods_total = atoi(optarg);
> -			bat->period_is_limited = true;
> -			break;
> -		case 'h':
> -		default:
> -			usage(bat);
> -			exit(EXIT_SUCCESS);
> -		}
> -	}
> +	char *doc_filled;
> +
> +	const int doc_size = strlen(doc) + 20*4;
> +	doc_filled = malloc(doc_size);
> +	snprintf(doc_filled, doc_size, doc,
> +		 snd_pcm_format_name(SND_PCM_FORMAT_U8),
> +		 snd_pcm_format_name(SND_PCM_FORMAT_S16_LE),
> +		 snd_pcm_format_name(SND_PCM_FORMAT_S24_3LE),
> +		 snd_pcm_format_name(SND_PCM_FORMAT_S32_LE));
> +
> +	struct argp  argp = {options, parse_opt, args_doc, doc_filled};
> +	argp_parse(&argp, argc, argv, 0, 0, bat);
> +	free(doc_filled);
>  }
>  
>  static int validate_options(struct bat *bat)
> @@ -498,6 +522,7 @@ static int bat_init(struct bat *bat)
>  			fprintf(bat->err, _("Fail to create record file: %d\n"),
>  					-errno);
>  			return -errno;
> +
>  		}
>  		/* store file name which is dynamically created */
>  		bat->capture.file = strdup(name);
> -- 
> 2.6.1
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list