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:
Pierre Ossman 2007-03-02 09:20:54 +00:00
parent 19b17ff504
commit 2b82336df2
2 changed files with 77 additions and 0 deletions

View file

@ -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);
}