ALSA: pcm: Introduce protocol version field to sw_params
authorTakashi Iwai <tiwai@suse.de>
Wed, 16 Jul 2014 15:45:27 +0000 (17:45 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 21 Jul 2014 07:07:46 +0000 (09:07 +0200)
For controlling the new fields more strictly, add sw_params.proto
field indicating the protocol version of the user-space.  User-space
should fill the SNDRV_PCM_VERSION value it's built with, then kernel
can know whether the new fields should be evaluated or not.

And now tstamp_type field is evaluated only when the valid value is
set there.  This avoids the wrong override of tstamp_type to zero,
which is SNDRV_PCM_TSTAMP_TYPE_GETTIMEOFDAY.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/uapi/sound/asound.h
sound/core/pcm_native.c

index a7e062f91f3969c723936c8da04e13764d90bc70..32168f7ffce3ce03fe19bb8f187cfb6321710976 100644 (file)
@@ -391,8 +391,8 @@ struct snd_pcm_sw_params {
        snd_pcm_uframes_t silence_threshold;    /* min distance from noise for silence filling */
        snd_pcm_uframes_t silence_size;         /* silence block size */
        snd_pcm_uframes_t boundary;             /* pointers wrap point */
-       unsigned int tstamp_type;               /* timestamp type */
-       int pads;                               /* alignment, reserved */
+       unsigned int proto;                     /* protocol version */
+       unsigned int tstamp_type;               /* timestamp type (req. proto >= 2.0.12) */
        unsigned char reserved[56];             /* reserved for future */
 };
 
index 81dedc381efd57eec02d045034ab88006e0adb10..8cd2f930ad0baf1db6646101b89e41f3d5947d57 100644 (file)
@@ -543,7 +543,8 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream,
 
        if (params->tstamp_mode > SNDRV_PCM_TSTAMP_LAST)
                return -EINVAL;
-       if (params->tstamp_type > SNDRV_PCM_TSTAMP_TYPE_LAST)
+       if (params->proto >= SNDRV_PROTOCOL_VERSION(2, 0, 12) &&
+           params->tstamp_type > SNDRV_PCM_TSTAMP_TYPE_LAST)
                return -EINVAL;
        if (params->avail_min == 0)
                return -EINVAL;
@@ -559,7 +560,8 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream,
        err = 0;
        snd_pcm_stream_lock_irq(substream);
        runtime->tstamp_mode = params->tstamp_mode;
-       runtime->tstamp_type = params->tstamp_type;
+       if (params->proto >= SNDRV_PROTOCOL_VERSION(2, 0, 12))
+               runtime->tstamp_type = params->tstamp_type;
        runtime->period_step = params->period_step;
        runtime->control->avail_min = params->avail_min;
        runtime->start_threshold = params->start_threshold;