[alsa-devel] [PATCH V2 1/7] BAT: Add initial functions

Lu, Han han.lu at intel.com
Mon Oct 12 10:56:40 CEST 2015


Hi Takashi,

> -----Original Message-----
> From: Takashi Iwai [mailto:tiwai at suse.de]
> Sent: Friday, October 2, 2015 6:56 PM
> To: Lu, Han
> Cc: Girdwood, Liam R; Gautier, Bernard; caleb at crome.org; alsa-devel at alsa-
> project.org
> Subject: Re: [PATCH V2 1/7] BAT: Add initial functions
> 
> On Wed, 23 Sep 2015 09:48:49 +0200,
> han.lu at intel.com wrote:
> >
> > From: "Lu, Han" <han.lu at intel.com>
> >
> > Add main entrance, command line parsing, parameter initiating and
> > thread initiating functions for BAT.
> >
> > Signed-off-by: Lu, Han <han.lu at intel.com>
> > Signed-off-by: Liam Girdwood <liam.r.girdwood at intel.com>
> > Signed-off-by: Bernard Gautier <bernard.gautier at intel.com>
> >
> > diff --git a/bat/bat.c b/bat/bat.c
> > new file mode 100644
> > index 0000000..54fe1ec
> > --- /dev/null
> > +++ b/bat/bat.c
> > @@ -0,0 +1,603 @@
> > +/*
> > + * Copyright (C) 2013-2015 Intel Corporation
> > + *
> > + * This program 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 2 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program 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.
> > + *
> > + */
> > +
> > +#include <unistd.h>
> > +#include <stdio.h>
> > +#include <stdlib.h>
> > +#include <stdbool.h>
> > +#include <string.h>
> > +#include <errno.h>
> > +#include <pthread.h>
> > +#include <getopt.h>
> > +#include <math.h>
> > +#include <limits.h>
> > +
> > +#include "aconfig.h"
> > +#include "gettext.h"
> > +#include "version.h"
> > +
> > +#include "common.h"
> > +
> > +#include "alsa.h"
> > +#include "convert.h"
> > +#include "analyze.h"
> > +
> > +static int get_duration(struct bat *bat) {
> > +	float duration_f;
> > +	long duration_i;
> > +	char *ptrf, *ptri;
> > +
> > +	duration_f = strtof(bat->narg, &ptrf);
> > +	if (duration_f == HUGE_VALF || duration_f == -HUGE_VALF) {
> > +		fprintf(bat->err, _("duration float overflow: %f %d\n"),
> > +				duration_f, -errno);
> > +		return -errno;
> > +	} else if (duration_f == 0.0 && errno != 0) {
> > +		fprintf(bat->err, _("duration float underflow: %f %d\n"),
> > +				duration_f, -errno);
> > +		return -errno;
> > +	}
> > +
> > +	duration_i = strtol(bat->narg, &ptri, 10);
> > +	if (duration_i == LONG_MAX) {
> > +		fprintf(bat->err, _("duration long overflow: %ld %d\n"),
> > +				duration_i, -errno);
> > +		return -errno;
> > +	} else if (duration_i == LONG_MIN) {
> > +		fprintf(bat->err, _("duration long underflow: %ld %d\n"),
> > +				duration_i, -errno);
> > +		return -errno;
> > +	}
> > +
> > +	if (*ptrf == 's') {
> > +		bat->frames = duration_f * bat->rate;
> > +	} else if (*ptri == 0) {
> > +		bat->frames = duration_i;
> > +	} else {
> > +		fprintf(bat->err, _("invalid duration: %s\n"), bat->narg);
> > +		return -EINVAL;
> > +	}
> > +
> > +	if (bat->frames <= 0 || bat->frames > MAX_FRAMES) {
> > +		fprintf(bat->err, _("duration out of range: (0, %d(%ds))\n"),
> > +				MAX_FRAMES, (bat->frames / bat->rate));
> 
> The messages strings could be unified to a single error message.
> Otherwise you'll annoy translators, as they will need to work on each
> different variant.

[Han] may I just change the strings to
	" duration overflow ..."
	" duration underflow ..."
	" duration overflow ..."
	" duration underflow ..."
	" invalid duration ..."
	" duration out of range ..."
Or change the sequence and keep 2 or 3 strings like:
	"duration overflow/underflow ..."
	"invalid duration ..."
	"duration out of range ..."
Since they would be clearer to developer/user?

> 
> > +		return -EINVAL;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static void get_sine_frequencies(struct bat *bat, char *freq) {
> > +	char *tmp1;
> > +
> > +	tmp1 = strchr(freq, ',');
> > +	if (tmp1 == NULL) {
> > +		bat->target_freq[1] = bat->target_freq[0] = atof(optarg);
> > +	} else {
> > +		*tmp1 = '\0';
> > +		bat->target_freq[0] = atof(optarg);
> > +		bat->target_freq[1] = atof(tmp1 + 1);
> > +	}
> 
> Note that parsing a floting point string is tricky.  For example, if you run it in a
> locale that handles comma as the decimal point, this gets messy.  Did you
> check it, e.g. with LANG=en_GB or such?

[Han] OK, I'll check the implementation.

> 
> 
> > +static void usage(struct bat *bat, char *argv[]) {
> > +	fprintf(bat->log,
> > +_("Usage:%s [Option]...\n"
> > +"\n"
> > +"-h, --help             help\n"
> > +"-D                     sound card\n"
> > +"-P                     playback pcm\n"
> > +"-C                     capture pcm\n"
> > +"-f                     sample size\n"
> > +"-c                     number of channels\n"
> > +"-r                     sampling rate\n"
> > +"-n                     frames to capture\n"
> > +"-k                     sigma k\n"
> > +"-F                     target frequency\n"
> > +"-p                     total number of periods to play/capture\n"
> > +"    --log=#            path of log file. if not set, logs be put to stdout,\n"
> > +"                       and errors be put to stderr.\n"
> > +"    --file=#           input file\n"
> > +"    --saveplay=#       save playback content to target file, for debug\n"
> > +"    --local            internal loop, bypass hardware\n"
> 
> Why there are options with and without indentation?
> 
> > +), argv[0]);
> 
> The program name should be a const string.

[Han] OK. I followed the indentation style of aplay, to align with multiple-character options such as "--log=#". Shall I remove indentation for these options?

> 
> 
> Takashi

BR,
Han Lu


More information about the Alsa-devel mailing list