mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-11-03 09:01:52 -05:00 
			
		
		
		
	pcm: Skip avail_min check during draining
snd_pcm_wait() & co checks the current avail value and returns immediately if it satisfies <= avail_min condition. It's good in general except for one situation: draining. When the draining is being performed in the non-blocking mode, apps are supposed to wait via poll(), typically via snd_pcm_wait(). So this ends up with the busy loop because of the immediate return from snd_pcm_wait(). A simple workaround is to put the PCM state check and ignore the avail_min condition if it's DRAINING state. The equivalent check is found in the kernel xfer code, too. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									7f084af4e4
								
							
						
					
					
						commit
						d3d42f60a6
					
				
					 1 changed files with 3 additions and 1 deletions
				
			
		| 
						 | 
					@ -2751,7 +2751,9 @@ int __snd_pcm_wait_in_lock(snd_pcm_t *pcm, int timeout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!snd_pcm_may_wait_for_avail_min(pcm, snd_pcm_mmap_avail(pcm))) {
 | 
						/* NOTE: avail_min check can be skipped during draining */
 | 
				
			||||||
 | 
						if (__snd_pcm_state(pcm) != SND_PCM_STATE_DRAINING &&
 | 
				
			||||||
 | 
						    !snd_pcm_may_wait_for_avail_min(pcm, snd_pcm_mmap_avail(pcm))) {
 | 
				
			||||||
		/* check more precisely */
 | 
							/* check more precisely */
 | 
				
			||||||
		err = pcm_state_to_error(__snd_pcm_state(pcm));
 | 
							err = pcm_state_to_error(__snd_pcm_state(pcm));
 | 
				
			||||||
		return err < 0 ? err : 1;
 | 
							return err < 0 ? err : 1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue