Merge branch 'for-linus-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/mason...
[linux-2.6-block.git] / include / sound / pcm.h
index c0ddb7e69c2863a385b34212b29255df993131e5..0cb7f3f5df7b9fca12f7233503f55f6b181470a7 100644 (file)
@@ -60,6 +60,9 @@ struct snd_pcm_hardware {
 
 struct snd_pcm_substream;
 
+struct snd_pcm_audio_tstamp_config; /* definitions further down */
+struct snd_pcm_audio_tstamp_report;
+
 struct snd_pcm_ops {
        int (*open)(struct snd_pcm_substream *substream);
        int (*close)(struct snd_pcm_substream *substream);
@@ -71,8 +74,10 @@ struct snd_pcm_ops {
        int (*prepare)(struct snd_pcm_substream *substream);
        int (*trigger)(struct snd_pcm_substream *substream, int cmd);
        snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
-       int (*wall_clock)(struct snd_pcm_substream *substream,
-                         struct timespec *audio_ts);
+       int (*get_time_info)(struct snd_pcm_substream *substream,
+                       struct timespec *system_ts, struct timespec *audio_ts,
+                       struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
+                       struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
        int (*copy)(struct snd_pcm_substream *substream, int channel,
                    snd_pcm_uframes_t pos,
                    void __user *buf, snd_pcm_uframes_t count);
@@ -281,6 +286,58 @@ struct snd_pcm_hw_constraint_ranges {
 
 struct snd_pcm_hwptr_log;
 
+/*
+ * userspace-provided audio timestamp config to kernel,
+ * structure is for internal use only and filled with dedicated unpack routine
+ */
+struct snd_pcm_audio_tstamp_config {
+       /* 5 of max 16 bits used */
+       u32 type_requested:4;
+       u32 report_delay:1; /* add total delay to A/D or D/A */
+};
+
+static inline void snd_pcm_unpack_audio_tstamp_config(__u32 data,
+                                               struct snd_pcm_audio_tstamp_config *config)
+{
+       config->type_requested = data & 0xF;
+       config->report_delay = (data >> 4) & 1;
+}
+
+/*
+ * kernel-provided audio timestamp report to user-space
+ * structure is for internal use only and read by dedicated pack routine
+ */
+struct snd_pcm_audio_tstamp_report {
+       /* 6 of max 16 bits used for bit-fields */
+
+       /* for backwards compatibility */
+       u32 valid:1;
+
+       /* actual type if hardware could not support requested timestamp */
+       u32 actual_type:4;
+
+       /* accuracy represented in ns units */
+       u32 accuracy_report:1; /* 0 if accuracy unknown, 1 if accuracy field is valid */
+       u32 accuracy; /* up to 4.29s, will be packed in separate field  */
+};
+
+static inline void snd_pcm_pack_audio_tstamp_report(__u32 *data, __u32 *accuracy,
+                                               const struct snd_pcm_audio_tstamp_report *report)
+{
+       u32 tmp;
+
+       tmp = report->accuracy_report;
+       tmp <<= 4;
+       tmp |= report->actual_type;
+       tmp <<= 1;
+       tmp |= report->valid;
+
+       *data &= 0xffff; /* zero-clear MSBs */
+       *data |= (tmp << 16);
+       *accuracy = report->accuracy;
+}
+
+
 struct snd_pcm_runtime {
        /* -- Status -- */
        struct snd_pcm_substream *trigger_master;
@@ -361,6 +418,11 @@ struct snd_pcm_runtime {
 
        struct snd_dma_buffer *dma_buffer_p;    /* allocated buffer */
 
+       /* -- audio timestamp config -- */
+       struct snd_pcm_audio_tstamp_config audio_tstamp_config;
+       struct snd_pcm_audio_tstamp_report audio_tstamp_report;
+       struct timespec driver_tstamp;
+
 #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
        /* -- OSS things -- */
        struct snd_pcm_oss_runtime oss;