mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -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
|
|
@ -141,6 +141,33 @@ static int xrun_recovery(struct userdata *u) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int suspend_recovery(struct userdata *u) {
|
||||||
|
int ret;
|
||||||
|
assert(u);
|
||||||
|
|
||||||
|
pa_log_info("*** ALSA-SUSPEND (playback) ***");
|
||||||
|
|
||||||
|
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_write(struct userdata *u) {
|
static void do_write(struct userdata *u) {
|
||||||
assert(u);
|
assert(u);
|
||||||
|
|
||||||
|
|
@ -176,6 +203,13 @@ static void do_write(struct userdata *u) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (frames == -ESTRPIPE) {
|
||||||
|
if (suspend_recovery(u) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
pa_log("snd_pcm_writei() failed: %s", snd_strerror(-frames));
|
pa_log("snd_pcm_writei() failed: %s", snd_strerror(-frames));
|
||||||
|
|
||||||
clear_up(u);
|
clear_up(u);
|
||||||
|
|
@ -207,6 +241,10 @@ static void fdl_callback(void *userdata) {
|
||||||
if (xrun_recovery(u) < 0)
|
if (xrun_recovery(u) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (snd_pcm_state(u->pcm_handle) == SND_PCM_STATE_SUSPENDED)
|
||||||
|
if (suspend_recovery(u) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
do_write(u);
|
do_write(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,34 @@ static int xrun_recovery(struct userdata *u) {
|
||||||
return 0;
|
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) {
|
static void do_read(struct userdata *u) {
|
||||||
assert(u);
|
assert(u);
|
||||||
|
|
||||||
|
|
@ -175,6 +203,13 @@ static void do_read(struct userdata *u) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (frames == -ESTRPIPE) {
|
||||||
|
if (suspend_recovery(u) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
pa_log("snd_pcm_readi() failed: %s", snd_strerror(-frames));
|
pa_log("snd_pcm_readi() failed: %s", snd_strerror(-frames));
|
||||||
|
|
||||||
clear_up(u);
|
clear_up(u);
|
||||||
|
|
@ -210,6 +245,10 @@ static void fdl_callback(void *userdata) {
|
||||||
if (xrun_recovery(u) < 0)
|
if (xrun_recovery(u) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (snd_pcm_state(u->pcm_handle) == SND_PCM_STATE_SUSPENDED)
|
||||||
|
if (suspend_recovery(u) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
do_read(u);
|
do_read(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue