mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	[ALSA] pcm core: fix silence_start calculations
The case where silence_size < boundary was broken because different parts of the snd_pcm_playback_silence() function disagreed about whether silence_start should point to the start or to the end of the buffer part to be silenced. This patch changes the code to always use to the start, which also simplifies several calculations. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
		
							parent
							
								
									3bc8952959
								
							
						
					
					
						commit
						9a826ddba6
					
				
					 1 changed files with 3 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -79,19 +79,17 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram
 | 
			
		|||
			runtime->silence_filled -= frames;
 | 
			
		||||
			if ((snd_pcm_sframes_t)runtime->silence_filled < 0) {
 | 
			
		||||
				runtime->silence_filled = 0;
 | 
			
		||||
				runtime->silence_start = (ofs + frames) - runtime->buffer_size;
 | 
			
		||||
				runtime->silence_start = new_hw_ptr;
 | 
			
		||||
			} else {
 | 
			
		||||
				runtime->silence_start = ofs - runtime->silence_filled;
 | 
			
		||||
				runtime->silence_start = ofs;
 | 
			
		||||
			}
 | 
			
		||||
			if ((snd_pcm_sframes_t)runtime->silence_start < 0)
 | 
			
		||||
				runtime->silence_start += runtime->boundary;
 | 
			
		||||
		}
 | 
			
		||||
		frames = runtime->buffer_size - runtime->silence_filled;
 | 
			
		||||
	}
 | 
			
		||||
	snd_assert(frames <= runtime->buffer_size, return);
 | 
			
		||||
	if (frames == 0)
 | 
			
		||||
		return;
 | 
			
		||||
	ofs = (runtime->silence_start + runtime->silence_filled) % runtime->buffer_size;
 | 
			
		||||
	ofs = runtime->silence_start % runtime->buffer_size;
 | 
			
		||||
	while (frames > 0) {
 | 
			
		||||
		transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames;
 | 
			
		||||
		if (runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED ||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue