mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ALSA: pcm: fix fifo_size frame calculation
The calculated frame size was wrong because snd_pcm_format_physical_width()
actually returns the number of bits, not bytes.
Use snd_pcm_format_size() instead, which not only returns bytes, but also
simplifies the calculation.
Fixes: 8bea869c5e ("ALSA: PCM midlevel: improve fifo_size handling")
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
			
			
This commit is contained in:
		
							parent
							
								
									8245b36345
								
							
						
					
					
						commit
						a9960e6a29
					
				
					 1 changed files with 5 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1782,14 +1782,16 @@ static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
 | 
			
		|||
{
 | 
			
		||||
	struct snd_pcm_hw_params *params = arg;
 | 
			
		||||
	snd_pcm_format_t format;
 | 
			
		||||
	int channels, width;
 | 
			
		||||
	int channels;
 | 
			
		||||
	ssize_t frame_size;
 | 
			
		||||
 | 
			
		||||
	params->fifo_size = substream->runtime->hw.fifo_size;
 | 
			
		||||
	if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) {
 | 
			
		||||
		format = params_format(params);
 | 
			
		||||
		channels = params_channels(params);
 | 
			
		||||
		width = snd_pcm_format_physical_width(format);
 | 
			
		||||
		params->fifo_size /= width * channels;
 | 
			
		||||
		frame_size = snd_pcm_format_size(format, channels);
 | 
			
		||||
		if (frame_size > 0)
 | 
			
		||||
			params->fifo_size /= (unsigned)frame_size;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue