[alsa-devel] [PATCH] pcm: support for audio wallclock
Takashi Iwai
tiwai at suse.de
Thu Jun 14 09:45:25 CEST 2012
At Wed, 13 Jun 2012 15:27:47 -0500,
Pierre-Louis Bossart wrote:
>
> add new snd_pcm_status_get_htstamp_wallclk() routine to
> query the audio timestamps read from the wallclock.
>
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> ---
> include/pcm.h | 1 +
> include/sound/asound.h | 7 ++++++-
> src/pcm/pcm.c | 16 ++++++++++++++++
> 3 files changed, 23 insertions(+), 1 deletions(-)
>
> diff --git a/include/pcm.h b/include/pcm.h
> index 4997557..325c0ea 100644
> --- a/include/pcm.h
> +++ b/include/pcm.h
> @@ -858,6 +858,7 @@ void snd_pcm_status_get_trigger_tstamp(const snd_pcm_status_t *obj, snd_timestam
> void snd_pcm_status_get_trigger_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
> void snd_pcm_status_get_tstamp(const snd_pcm_status_t *obj, snd_timestamp_t *ptr);
> void snd_pcm_status_get_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
> +void snd_pcm_status_get_htstamp_wallclk(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
> snd_pcm_sframes_t snd_pcm_status_get_delay(const snd_pcm_status_t *obj);
> snd_pcm_uframes_t snd_pcm_status_get_avail(const snd_pcm_status_t *obj);
> snd_pcm_uframes_t snd_pcm_status_get_avail_max(const snd_pcm_status_t *obj);
> diff --git a/include/sound/asound.h b/include/sound/asound.h
> index 07c03fa..c186fd6 100644
> --- a/include/sound/asound.h
> +++ b/include/sound/asound.h
> @@ -285,6 +285,7 @@ enum sndrv_pcm_subformat {
> #define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */
> #define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */
> #define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 0x00800000 /* period wakeup can be disabled */
> +#define SNDRV_PCM_INFO_HAS_WALL_CLOCK 0x01000000 /* has audio wall clock for audio/system time sync */
>
> enum sndrv_pcm_state {
> SNDRV_PCM_STATE_OPEN = 0, /* stream is open */
> @@ -426,7 +427,10 @@ struct sndrv_pcm_status {
> sndrv_pcm_uframes_t avail_max; /* max frames available on hw since last status */
> sndrv_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */
> int suspended_state; /* suspended stream state */
> - unsigned char reserved[60]; /* must be filled with zero */
> + union {
> + unsigned char reserved[60]; /* must be filled with zero */
> + struct timespec audio_tstamp; /* audio wall clock timestamp */
> + } ext;
> };
>
> struct sndrv_pcm_mmap_status {
> @@ -434,6 +438,7 @@ struct sndrv_pcm_mmap_status {
> int pad1; /* Needed for 64 bit alignment */
> sndrv_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
> struct timespec tstamp; /* Timestamp */
> + struct timespec audio_tstamp; /* audio wall clock timestamp */
> int suspended_state; /* RO: suspended stream state */
> };
>
> diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
> index 18b43b3..2221865 100644
> --- a/src/pcm/pcm.c
> +++ b/src/pcm/pcm.c
> @@ -6213,6 +6213,22 @@ void snd_pcm_status_get_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *p
> use_default_symbol_version(__snd_pcm_status_get_htstamp, snd_pcm_status_get_htstamp, ALSA_0.9.0rc8);
You need to provide a function to indicate whether htstamp_wallclk is
available or not. Since the function returning tstamp_wallclk is a
void function and it itself can't return the error, user can't know
whether it's a bogus value or not.
And that function should check whether the running PCM protocol
version is high enough to support the new ABI.
> /**
> + * \brief Get "now" hi-res audio wallclock timestamp from a PCM status container
> + * \param obj pointer to #snd_pcm_status_t
> + * \param ptr Pointer to returned timestamp
> + */
> +#ifndef DOXYGEN
> +void INTERNAL(snd_pcm_status_get_htstamp_wallclk)(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr)
> +#else
> +void snd_pcm_status_get_htstamp_wallclk(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr)
> +#endif
I think you can avoid this hack for the new functions.
> +{
> + assert(obj && ptr);
> + *ptr = obj->ext.audio_tstamp;
> +}
> +use_default_symbol_version(__snd_pcm_status_get_htstamp_wallclk, snd_pcm_status_get_htstamp_wallclk, ALSA_0.9.0rc8); /* FIXME, no idea why this is needed */
Ditto. It was needed just for those functions that have been added to
0.9.0rc8 release.
Takashi
More information about the Alsa-devel
mailing list