[alsa-devel] [PATCH] alsa-lib: Provide a CLOCK_MONOTONIC_RAW timestamp type

Takashi Iwai tiwai at suse.de
Wed Jul 9 15:38:51 CEST 2014


At Tue,  8 Jul 2014 16:52:32 +0200,
Mark Brown wrote:
> 
> From: Mark Brown <broonie at linaro.org>
> 
> For applications which need to synchronise with external timebases such
> as broadcast TV applications the kernel monotonic time is not optimal as
> it includes adjustments from NTP and so may still include discontinuities
> due to that. A raw monotonic time which does not include any adjustments
> is available in the kernel from getrawmonotonic() so provide userspace with
> a new timestamp type SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW which provides
> timestamps based on this as an option.
> 
> Reported-by: Daniel Thompson <daniel.thompson at linaro.org>
> Signed-off-by: Mark Brown <broonie at linaro.org>

Currently, the timestamp mode is set implicitly in alsa-lib pcm_hw.c:
- When kernel PCM protocol version is high enough, alsa-lib hw prefers
  the monotonic always (if available), then set pcm->monotonic = 1.
- Application can ask whether the current timestamp is monotonic or
  not via snd_pcm_hw_params_is_monotonic().
So, only adding the flag above doesn't suffice.  If we need to add a
new mode, the API has to be extended as well.

But how?  The current API assumes that the monotonic mode was already
determined before hw_params.  We may add a set of new hw_params get
and set calls for tstamp mode while keeping the old API.  This would
be one option.  Another option would be to add a new PCM open flag
SND_PCM_TSTAMP_MONOTONIC_RAW, and snd_pcm_hw_params_is_monotonic_raw()
function.  The latter is easier (a simpler addition), while the former
is more extensible to newer formats in future.

Comments?

(I guess tinyalsa has a different story, but let's align genuine
 alsa-lib first.)


Takashi


> ---
>  include/sound/asound.h | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/include/sound/asound.h b/include/sound/asound.h
> index 1774a5c..9061cdd 100644
> --- a/include/sound/asound.h
> +++ b/include/sound/asound.h
> @@ -457,7 +457,8 @@ struct snd_xfern {
>  enum {
>  	SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY = 0,	/* gettimeofday equivalent */
>  	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,	/* posix_clock_monotonic equivalent */
> -	SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,
> +	SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,	/* monotonic_raw (no NTP) */
> +	SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
>  };
>  
>  /* channel positions */
> -- 
> 2.0.0
> 


More information about the Alsa-devel mailing list