All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liam Girdwood <liam.r.girdwood@linux.intel.com>
To: vivian.zhang@intel.com
Cc: tiwai@suse.de, han.lu@intel.com, alsa-devel@alsa-project.org
Subject: Re: [PATCH v2] alsabat: add buffer size and period size settings
Date: Tue, 31 May 2016 08:56:42 +0100	[thread overview]
Message-ID: <1464681402.25898.22.camel@loki> (raw)
In-Reply-To: <1464679892-16412-1-git-send-email-vivian.zhang@intel.com>

On Tue, 2016-05-31 at 15:31 +0800, vivian.zhang@intel.com wrote:
> From: "vivian,zhang" <vivian.zhang@intel.com>
> 
> Add buffer size and period size settings in alsabat.
> With -E and -B options, alsabat performs the test with
> specified buffer size and period size
> 
> Signed-off-by: Zhang Vivian <vivian.zhang@intel.com>

Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>

> ---
> 
> Changes in v2:
> - Use a micro for min and max values of buffer size and period size
> - Use a micro for default period size in tinyalsa.c
> 
>  bat/alsa.c     |   95 +++++++++++++++++++++++++++++++++++++++-----------------
>  bat/bat.c      |   18 +++++++++--
>  bat/common.h   |    8 +++++
>  bat/tinyalsa.c |    5 ++-
>  4 files changed, 94 insertions(+), 32 deletions(-)
> 
> diff --git a/bat/alsa.c b/bat/alsa.c
> index 75158cb..0a37714 100644
> --- a/bat/alsa.c
> +++ b/bat/alsa.c
> @@ -74,6 +74,8 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm)
>  	snd_pcm_format_t format;
>  	unsigned int buffer_time = 0;
>  	unsigned int period_time = 0;
> +	snd_pcm_uframes_t buffer_size = 0;
> +	snd_pcm_uframes_t period_size = 0;
>  	unsigned int rate;
>  	int err;
>  	const char *device_name = snd_pcm_name(sndpcm->handle);
> @@ -145,39 +147,71 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm)
>  		return -EINVAL;
>  	}
>  
> -	if (snd_pcm_hw_params_get_buffer_time_max(params,
> -			&buffer_time, 0) < 0) {
> -		fprintf(bat->err, _("Get parameter from device error: "));
> -		fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
> -				buffer_time,
> -				device_name, snd_strerror(err), err);
> -		return -EINVAL;
> -	}
> +	if (bat->buffer_size > 0 && bat->period_size == 0)
> +		bat->period_size = bat->buffer_size / DIV_BUFFERTIME;
>  
> -	if (buffer_time > MAX_BUFFERTIME)
> -		buffer_time = MAX_BUFFERTIME;
> +	if (bat->buffer_size > 0) {
> +		buffer_size = bat->buffer_size;
> +		period_size = bat->period_size;
>  
> -	period_time = buffer_time / DIV_BUFFERTIME;
> +		fprintf(bat->log, _("Set period size: %d  buffer size: %d\n"),
> +				(int) period_size, (int) buffer_size);
>  
> -	/* Set buffer time and period time */
> -	err = snd_pcm_hw_params_set_buffer_time_near(sndpcm->handle, params,
> -			&buffer_time, 0);
> -	if (err < 0) {
> -		fprintf(bat->err, _("Set parameter to device error: "));
> -		fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
> -				buffer_time,
> -				device_name, snd_strerror(err), err);
> -		return err;
> -	}
> +		err = snd_pcm_hw_params_set_buffer_size_near(sndpcm->handle,
> +				params, &buffer_size);
> +		if (err < 0) {
> +			fprintf(bat->err, _("Set parameter to device error: "));
> +			fprintf(bat->err, _("buffer size: %d %s: %s(%d)\n"),
> +					(int) buffer_size,
> +					device_name, snd_strerror(err), err);
> +			return err;
> +		}
>  
> -	err = snd_pcm_hw_params_set_period_time_near(sndpcm->handle, params,
> -			&period_time, 0);
> -	if (err < 0) {
> -		fprintf(bat->err, _("Set parameter to device error: "));
> -		fprintf(bat->err, _("period time: %d %s: %s(%d)\n"),
> -				period_time,
> -				device_name, snd_strerror(err), err);
> -		return err;
> +		err = snd_pcm_hw_params_set_period_size_near(sndpcm->handle,
> +				params, &period_size, 0);
> +		if (err < 0) {
> +			fprintf(bat->err, _("Set parameter to device error: "));
> +			fprintf(bat->err, _("period size: %d %s: %s(%d)\n"),
> +					(int) period_size,
> +					device_name, snd_strerror(err), err);
> +			return err;
> +		}
> +	} else {
> +		if (snd_pcm_hw_params_get_buffer_time_max(params,
> +				&buffer_time, 0) < 0) {
> +			fprintf(bat->err,
> +					_("Get parameter from device error: "));
> +			fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
> +					buffer_time,
> +					device_name, snd_strerror(err), err);
> +			return -EINVAL;
> +		}
> +
> +		if (buffer_time > MAX_BUFFERTIME)
> +			buffer_time = MAX_BUFFERTIME;
> +
> +		period_time = buffer_time / DIV_BUFFERTIME;
> +
> +		/* Set buffer time and period time */
> +		err = snd_pcm_hw_params_set_buffer_time_near(sndpcm->handle,
> +				params, &buffer_time, 0);
> +		if (err < 0) {
> +			fprintf(bat->err, _("Set parameter to device error: "));
> +			fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
> +					buffer_time,
> +					device_name, snd_strerror(err), err);
> +			return err;
> +		}
> +
> +		err = snd_pcm_hw_params_set_period_time_near(sndpcm->handle,
> +				params, &period_time, 0);
> +		if (err < 0) {
> +			fprintf(bat->err, _("Set parameter to device error: "));
> +			fprintf(bat->err, _("period time: %d %s: %s(%d)\n"),
> +					period_time,
> +					device_name, snd_strerror(err), err);
> +			return err;
> +		}
>  	}
>  
>  	/* Write the parameters to the driver */
> @@ -214,6 +248,9 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm)
>  		return -EINVAL;
>  	}
>  
> +	fprintf(bat->log, _("Get period size: %d  buffer size: %d\n"),
> +			(int) sndpcm->period_size, (int) sndpcm->buffer_size);
> +
>  	err = snd_pcm_format_physical_width(format);
>  	if (err < 0) {
>  		fprintf(bat->err, _("Invalid parameters: "));
> diff --git a/bat/bat.c b/bat/bat.c
> index 1afdcb4..cd4ea2d 100644
> --- a/bat/bat.c
> +++ b/bat/bat.c
> @@ -292,6 +292,8 @@ _("Usage: alsabat [-options]...\n"
>  "  -k                     parameter for frequency detecting threshold\n"
>  "  -F                     target frequency\n"
>  "  -p                     total number of periods to play/capture\n"
> +"  -B                     buffer size in frames\n"
> +"  -E                     period size in frames\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"
> @@ -324,6 +326,8 @@ static void set_defaults(struct bat *bat)
>  	bat->capture.device = NULL;
>  	bat->buf = NULL;
>  	bat->local = false;
> +	bat->buffer_size = 0;
> +	bat->period_size = 0;
>  #ifdef HAVE_LIBTINYALSA
>  	bat->channels = 2;
>  	bat->playback.fct = &playback_tinyalsa;
> @@ -342,8 +346,8 @@ static void set_defaults(struct bat *bat)
>  
>  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";
> +	int c, option_index, err;
> +	static const char short_options[] = "D:P:C:f:n:F:c:r:s:k:p:B:E:lth";
>  	static const struct option long_options[] = {
>  		{"help",     0, 0, 'h'},
>  		{"log",      1, 0, OPT_LOG},
> @@ -414,6 +418,16 @@ static void parse_arguments(struct bat *bat, int argc, char *argv[])
>  			bat->periods_total = atoi(optarg);
>  			bat->period_is_limited = true;
>  			break;
> +		case 'B':
> +			err = atoi(optarg);
> +			bat->buffer_size = err >= MIN_BUFFERSIZE
> +					&& err < MAX_BUFFERSIZE ? err : 0;
> +			break;
> +		case 'E':
> +			err = atoi(optarg);
> +			bat->period_size = err >= MIN_PERIODSIZE
> +					&& err < MAX_PERIODSIZE ? err : 0;
> +			break;
>  		case 'h':
>  		default:
>  			usage(bat);
> diff --git a/bat/common.h b/bat/common.h
> index b789af5..ad02a5a 100644
> --- a/bat/common.h
> +++ b/bat/common.h
> @@ -46,6 +46,12 @@
>  #define DIV_BUFFERTIME			8
>  /* margin to avoid sign inversion when generate sine wav */
>  #define RANGE_FACTOR			0.95
> +#define MAX_BUFFERSIZE			200000
> +#define MIN_BUFFERSIZE			32
> +#define MAX_PERIODSIZE			200000
> +#define MIN_PERIODSIZE			32
> +/* default period size for tinyalsa */
> +#define TINYALSA_PERIODSIZE			1024
>  
>  #define EBATBASE			1000
>  #define ENOPEAK				(EBATBASE + 1)
> @@ -152,6 +158,8 @@ struct bat {
>  	int frame_size;			/* size of frame */
>  	int sample_size;		/* size of sample */
>  	enum _bat_pcm_format format;	/* PCM format */
> +	int buffer_size;		/* buffer size in frames */
> +	int period_size;		/* period size in frames */
>  
>  	float sigma_k;			/* threshold for peak detection */
>  	float target_freq[MAX_CHANNELS];
> diff --git a/bat/tinyalsa.c b/bat/tinyalsa.c
> index ea5f848..a19dd90 100644
> --- a/bat/tinyalsa.c
> +++ b/bat/tinyalsa.c
> @@ -57,7 +57,10 @@ static int init_config(struct bat *bat, struct pcm_config *config)
>  {
>  	config->channels = bat->channels;
>  	config->rate = bat->rate;
> -	config->period_size = 1024;
> +	if (bat->period_size > 0)
> +		config->period_size = bat->period_size;
> +	else
> +		config->period_size = TINYALSA_PERIODSIZE;
>  	config->period_count = 4;
>  	config->start_threshold = 0;
>  	config->stop_threshold = 0;

      reply	other threads:[~2016-05-31  7:56 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-31  7:31 [PATCH v2] alsabat: add buffer size and period size settings vivian.zhang
2016-05-31  7:56 ` Liam Girdwood [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1464681402.25898.22.camel@loki \
    --to=liam.r.girdwood@linux.intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=han.lu@intel.com \
    --cc=tiwai@suse.de \
    --cc=vivian.zhang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.