[alsa-devel] [PATCH] aplay: support no period wakeup option in argument

Takashi Sakamoto o-takashi at sakamocchi.jp
Wed Dec 26 14:35:17 CET 2018


Hi,

On Wed, Dec 26, 2018 at 11:28:11AM +0000, S.j. Wang wrote:
> In the case that alsa driver can't support period wakeup,
> we need to set the no period wakeup flag
> 
> Signed-off-by: Shengjiu Wang <shengjiu.wang at nxp.com>
> ---
>  aplay/aplay.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
>
> diff --git a/aplay/aplay.c b/aplay/aplay.c
> index efc1eb4cae3a..4f562bfe2884 100644
> --- a/aplay/aplay.c
> +++ b/aplay/aplay.c
> @@ -137,6 +137,7 @@ static int use_strftime = 0;
>  volatile static int recycle_capture_file = 0;
>  static long term_c_lflag = -1;
>  static int dump_hw_params = 0;
> +static int no_period_wakeup = 0;
>  
>  static int fd = -1;
>  static off64_t pbrec_count = LLONG_MAX, fdcount;
> @@ -243,6 +244,7 @@ _("Usage: %s [OPTION]... [FILE]...\n"
>  "    --use-strftime      apply the strftime facility to the output file name\n"
>  "    --dump-hw-params    dump hw_params of the device\n"
>  "    --fatal-errors      treat all errors as fatal\n"
> +"    --no-period-wakeup  set no period wakeup flag if necessary\n"
>    )
>  		, command);
>  	printf(_("Recognized sample formats are:"));
> @@ -429,6 +431,7 @@ enum {
>  	OPT_USE_STRFTIME,
>  	OPT_DUMP_HWPARAMS,
>  	OPT_FATAL_ERRORS,
> +	OPT_NO_PERIOD_WAKEUP,
>  };
>  
>  /*
> @@ -516,6 +519,7 @@ int main(int argc, char *argv[])
>  		{"interactive", 0, 0, 'i'},
>  		{"dump-hw-params", 0, 0, OPT_DUMP_HWPARAMS},
>  		{"fatal-errors", 0, 0, OPT_FATAL_ERRORS},
> +		{"no-period-wakeup", 0, 0, OPT_NO_PERIOD_WAKEUP},
>  #ifdef CONFIG_SUPPORT_CHMAP
>  		{"chmap", 1, 0, 'm'},
>  #endif
> @@ -799,6 +803,9 @@ int main(int argc, char *argv[])
>  		case OPT_FATAL_ERRORS:
>  			fatal_errors = 1;
>  			break;
> +		case OPT_NO_PERIOD_WAKEUP:
> +			no_period_wakeup = 1;
> +			break;
>  #ifdef CONFIG_SUPPORT_CHMAP
>  		case 'm':
>  			channel_map = snd_pcm_chmap_parse_string(optarg);
> @@ -1396,6 +1403,12 @@ static void set_params(void)
>  							     &buffer_frames);
>  	}
>  	assert(err >= 0);
> +
> +	if (no_period_wakeup) {
> +		err = snd_pcm_hw_params_set_period_wakeup(handle, params, 0);
> +		assert(err >= 0);
> +	}
> +
>  	monotonic = snd_pcm_hw_params_is_monotonic(params);
>  	can_pause = snd_pcm_hw_params_can_pause(params);
>  	err = snd_pcm_hw_params(handle, params);
> -- 
> 1.9.1

As of v4.21-rc1, runtime of PCM substream can't run no_period_wakeup
mode unless two conditions are satisfied[1]:
 - driver supports SNDRV_PCM_INFO_NO_PERIOD_WAKEUP
 - PCM applications set SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP flag to
   hardware parameter structure.

Neither alsa-lib nor the most of existent userspace applications set
SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP without explicit call of helper
API. In this point, I can get your intention for this patch. If a driver
just supports no_period_wakeup mode, such driver can't work well.

However, such driver is problematic because apparently it can not run
with many existent userspace applications and alsa-lib. Before applying
this patch, we have enough discussion to prevent problems to introduce
such problematic drivers into Linux sound subsystem, in my opinion.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/tree/sound/core/pcm_native.c?h=sound-4.21-rc1#n727


Regards

Takashi Sakamoto


More information about the Alsa-devel mailing list