mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	Handle suspended alsa devices. Based on patch by ranma. (closes #26)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1433 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
		
							parent
							
								
									19b17ff504
								
							
						
					
					
						commit
						2b82336df2
					
				
					 2 changed files with 77 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -143,6 +143,34 @@ static int xrun_recovery(struct userdata *u) {
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int suspend_recovery(struct userdata *u) {
 | 
			
		||||
    int ret;
 | 
			
		||||
    assert(u);
 | 
			
		||||
 | 
			
		||||
    pa_log_info("*** ALSA-SUSPEND (capture) ***");
 | 
			
		||||
 | 
			
		||||
    if ((ret = snd_pcm_resume(u->pcm_handle)) < 0) {
 | 
			
		||||
        if (ret == -EAGAIN)
 | 
			
		||||
            return -1;
 | 
			
		||||
 | 
			
		||||
        if (ret != -ENOSYS)
 | 
			
		||||
            pa_log("snd_pcm_resume() failed: %s", snd_strerror(-ret));
 | 
			
		||||
        else {
 | 
			
		||||
            if ((ret = snd_pcm_prepare(u->pcm_handle)) < 0)
 | 
			
		||||
                pa_log("snd_pcm_prepare() failed: %s", snd_strerror(-ret));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            clear_up(u);
 | 
			
		||||
            pa_module_unload_request(u->module);
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_read(struct userdata *u) {
 | 
			
		||||
    assert(u);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -175,6 +203,13 @@ static void do_read(struct userdata *u) {
 | 
			
		|||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (frames == -ESTRPIPE) {
 | 
			
		||||
                if (suspend_recovery(u) < 0)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            pa_log("snd_pcm_readi() failed: %s", snd_strerror(-frames));
 | 
			
		||||
 | 
			
		||||
            clear_up(u);
 | 
			
		||||
| 
						 | 
				
			
			@ -210,6 +245,10 @@ static void fdl_callback(void *userdata) {
 | 
			
		|||
        if (xrun_recovery(u) < 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
    if (snd_pcm_state(u->pcm_handle) == SND_PCM_STATE_SUSPENDED)
 | 
			
		||||
        if (suspend_recovery(u) < 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
    do_read(u);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue