ALSA: pcm: Introduce protocol version field to sw_params
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>
This commit is contained in:
		
					parent
					
						
							
								5646eda585
							
						
					
				
			
			
				commit
				
					
						589008106b
					
				
			
		
					 2 changed files with 6 additions and 4 deletions
				
			
		| 
						 | 
					@ -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_threshold;	/* min distance from noise for silence filling */
 | 
				
			||||||
	snd_pcm_uframes_t silence_size;		/* silence block size */
 | 
						snd_pcm_uframes_t silence_size;		/* silence block size */
 | 
				
			||||||
	snd_pcm_uframes_t boundary;		/* pointers wrap point */
 | 
						snd_pcm_uframes_t boundary;		/* pointers wrap point */
 | 
				
			||||||
	unsigned int tstamp_type;		/* timestamp type */
 | 
						unsigned int proto;			/* protocol version */
 | 
				
			||||||
	int pads;				/* alignment, reserved */
 | 
						unsigned int tstamp_type;		/* timestamp type (req. proto >= 2.0.12) */
 | 
				
			||||||
	unsigned char reserved[56];		/* reserved for future */
 | 
						unsigned char reserved[56];		/* reserved for future */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -543,7 +543,8 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (params->tstamp_mode > SNDRV_PCM_TSTAMP_LAST)
 | 
						if (params->tstamp_mode > SNDRV_PCM_TSTAMP_LAST)
 | 
				
			||||||
		return -EINVAL;
 | 
							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;
 | 
							return -EINVAL;
 | 
				
			||||||
	if (params->avail_min == 0)
 | 
						if (params->avail_min == 0)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -559,6 +560,7 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream,
 | 
				
			||||||
	err = 0;
 | 
						err = 0;
 | 
				
			||||||
	snd_pcm_stream_lock_irq(substream);
 | 
						snd_pcm_stream_lock_irq(substream);
 | 
				
			||||||
	runtime->tstamp_mode = params->tstamp_mode;
 | 
						runtime->tstamp_mode = params->tstamp_mode;
 | 
				
			||||||
 | 
						if (params->proto >= SNDRV_PROTOCOL_VERSION(2, 0, 12))
 | 
				
			||||||
		runtime->tstamp_type = params->tstamp_type;
 | 
							runtime->tstamp_type = params->tstamp_type;
 | 
				
			||||||
	runtime->period_step = params->period_step;
 | 
						runtime->period_step = params->period_step;
 | 
				
			||||||
	runtime->control->avail_min = params->avail_min;
 | 
						runtime->control->avail_min = params->avail_min;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue