[alsa-devel] [PATCH] ALSA: timer: add config item to export PCM timer disabling for expert

Takashi Iwai tiwai at suse.de
Fri Oct 16 14:33:03 CEST 2015


On Fri, 16 Oct 2015 11:57:46 +0200,
Jie Yang wrote:
> 
> PCM timer is not always used. For embedded device, we need an interface
> to disable it when it is not needed, to shrink the kernel size and
> memory footprint, here add CONFIG_SND_PCM_TIMER for it.
> 
> When both CONFIG_SND_PCM_TIMER and CONFIG_SND_TIMER is unselected,
> about 25KB saving bonus we can get.
> 
> Please be noted that when disabled, those stubs who using pcm timer
> (e.g. dmix, dsnoop & co) may work incorrectlly.
> 
> Suggested-by: Takashi Iwai <tiwai at suse.de>
> Signed-off-by: Jie Yang <yang.jie at intel.com>

Applied, thanks.


Takashi

> ---
>  include/sound/pcm.h     |  8 +++++++-
>  sound/core/Kconfig      | 13 ++++++++++++-
>  sound/core/Makefile     |  3 ++-
>  sound/core/pcm_lib.c    |  2 ++
>  sound/core/pcm_native.c | 36 ++++++++++++++++--------------------
>  5 files changed, 39 insertions(+), 23 deletions(-)
> 
> diff --git a/include/sound/pcm.h b/include/sound/pcm.h
> index 691e7ee..79cf943 100644
> --- a/include/sound/pcm.h
> +++ b/include/sound/pcm.h
> @@ -1117,10 +1117,16 @@ static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substrea
>   *  Timer interface
>   */
>  
> +#ifdef CONFIG_SND_PCM_TIMER
>  void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream);
>  void snd_pcm_timer_init(struct snd_pcm_substream *substream);
>  void snd_pcm_timer_done(struct snd_pcm_substream *substream);
> -
> +#else
> +static inline void
> +snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream) {}
> +static inline void snd_pcm_timer_init(struct snd_pcm_substream *substream) {}
> +static inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
> +#endif
>  /**
>   * snd_pcm_gettime - Fill the timespec depending on the timestamp mode
>   * @runtime: PCM runtime instance
> diff --git a/sound/core/Kconfig b/sound/core/Kconfig
> index 6c96fee..e3e9491 100644
> --- a/sound/core/Kconfig
> +++ b/sound/core/Kconfig
> @@ -4,7 +4,7 @@ config SND_TIMER
>  
>  config SND_PCM
>  	tristate
> -	select SND_TIMER
> +	select SND_TIMER if SND_PCM_TIMER
>  
>  config SND_PCM_ELD
>  	bool
> @@ -93,6 +93,17 @@ config SND_PCM_OSS_PLUGINS
>            support conversion of channels, formats and rates. It will
>            behave like most of new OSS/Free drivers in 2.4/2.6 kernels.
>  
> +config SND_PCM_TIMER
> +	bool "PCM timer interface" if EXPERT
> +	default y
> +	help
> +	  If you disable this option, pcm timer will be inavailable, so
> +	  those stubs used pcm timer (e.g. dmix, dsnoop & co) may work
> +	  incorrectlly.
> +
> +	  For some embedded device, we may disable it to reduce memory
> +	  footprint, about 20KB on x86_64 platform.
> +
>  config SND_SEQUENCER_OSS
>  	bool "OSS Sequencer API"
>  	depends on SND_SEQUENCER
> diff --git a/sound/core/Makefile b/sound/core/Makefile
> index 3354f91..48ab4b8 100644
> --- a/sound/core/Makefile
> +++ b/sound/core/Makefile
> @@ -13,8 +13,9 @@ snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o
>  snd-$(CONFIG_SND_VMASTER) += vmaster.o
>  snd-$(CONFIG_SND_JACK)	  += ctljack.o jack.o
>  
> -snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_timer.o pcm_misc.o \
> +snd-pcm-y := pcm.o pcm_native.o pcm_lib.o pcm_misc.o \
>  		pcm_memory.o memalloc.o
> +snd-pcm-$(CONFIG_SND_PCM_TIMER) += pcm_timer.o
>  snd-pcm-$(CONFIG_SND_DMA_SGBUF) += sgbuf.o
>  snd-pcm-$(CONFIG_SND_PCM_ELD) += pcm_drm_eld.o
>  snd-pcm-$(CONFIG_SND_PCM_IEC958) += pcm_iec958.o
> diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
> index 7d45645..6dc4277 100644
> --- a/sound/core/pcm_lib.c
> +++ b/sound/core/pcm_lib.c
> @@ -1883,8 +1883,10 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
>  	    snd_pcm_update_hw_ptr0(substream, 1) < 0)
>  		goto _end;
>  
> +#ifdef CONFIG_SND_PCM_TIMER
>  	if (substream->timer_running)
>  		snd_timer_interrupt(substream->timer, 1);
> +#endif
>   _end:
>  	snd_pcm_stream_unlock_irqrestore(substream, flags);
>  	if (runtime->transfer_ack_end)
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index 75888dd..d5672ed 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -486,6 +486,16 @@ static void snd_pcm_set_state(struct snd_pcm_substream *substream, int state)
>  	snd_pcm_stream_unlock_irq(substream);
>  }
>  
> +static inline void snd_pcm_timer_notify(struct snd_pcm_substream *substream,
> +					int event)
> +{
> +#ifdef CONFIG_SND_PCM_TIMER
> +	if (substream->timer)
> +		snd_timer_notify(substream->timer, event,
> +					&substream->runtime->trigger_tstamp);
> +#endif
> +}
> +
>  static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
>  			     struct snd_pcm_hw_params *params)
>  {
> @@ -1042,9 +1052,7 @@ static void snd_pcm_post_start(struct snd_pcm_substream *substream, int state)
>  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
>  	    runtime->silence_size > 0)
>  		snd_pcm_playback_silence(substream, ULONG_MAX);
> -	if (substream->timer)
> -		snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSTART,
> -				 &runtime->trigger_tstamp);
> +	snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTART);
>  }
>  
>  static struct action_ops snd_pcm_action_start = {
> @@ -1092,9 +1100,7 @@ static void snd_pcm_post_stop(struct snd_pcm_substream *substream, int state)
>  	if (runtime->status->state != state) {
>  		snd_pcm_trigger_tstamp(substream);
>  		runtime->status->state = state;
> -		if (substream->timer)
> -			snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSTOP,
> -					 &runtime->trigger_tstamp);
> +		snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTOP);
>  	}
>  	wake_up(&runtime->sleep);
>  	wake_up(&runtime->tsleep);
> @@ -1208,18 +1214,12 @@ static void snd_pcm_post_pause(struct snd_pcm_substream *substream, int push)
>  	snd_pcm_trigger_tstamp(substream);
>  	if (push) {
>  		runtime->status->state = SNDRV_PCM_STATE_PAUSED;
> -		if (substream->timer)
> -			snd_timer_notify(substream->timer,
> -					 SNDRV_TIMER_EVENT_MPAUSE,
> -					 &runtime->trigger_tstamp);
> +		snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MPAUSE);
>  		wake_up(&runtime->sleep);
>  		wake_up(&runtime->tsleep);
>  	} else {
>  		runtime->status->state = SNDRV_PCM_STATE_RUNNING;
> -		if (substream->timer)
> -			snd_timer_notify(substream->timer,
> -					 SNDRV_TIMER_EVENT_MCONTINUE,
> -					 &runtime->trigger_tstamp);
> +		snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MCONTINUE);
>  	}
>  }
>  
> @@ -1267,9 +1267,7 @@ static void snd_pcm_post_suspend(struct snd_pcm_substream *substream, int state)
>  	snd_pcm_trigger_tstamp(substream);
>  	runtime->status->suspended_state = runtime->status->state;
>  	runtime->status->state = SNDRV_PCM_STATE_SUSPENDED;
> -	if (substream->timer)
> -		snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSUSPEND,
> -				 &runtime->trigger_tstamp);
> +	snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSUSPEND);
>  	wake_up(&runtime->sleep);
>  	wake_up(&runtime->tsleep);
>  }
> @@ -1373,9 +1371,7 @@ static void snd_pcm_post_resume(struct snd_pcm_substream *substream, int state)
>  	struct snd_pcm_runtime *runtime = substream->runtime;
>  	snd_pcm_trigger_tstamp(substream);
>  	runtime->status->state = runtime->status->suspended_state;
> -	if (substream->timer)
> -		snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MRESUME,
> -				 &runtime->trigger_tstamp);
> +	snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MRESUME);
>  }
>  
>  static struct action_ops snd_pcm_action_resume = {
> -- 
> 2.1.4
> 


More information about the Alsa-devel mailing list