[alsa-devel] [PATCH] pcm: support for audio wallclock
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Wed Jun 13 22:27:47 CEST 2012
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);
/**
+ * \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
+{
+ 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 */
+
+/**
* \brief Get delay from a PCM status container (see #snd_pcm_delay)
* \return Delay in frames
*
--
1.7.6.5
More information about the Alsa-devel
mailing list