]> code.delx.au - pulseaudio/commitdiff
Handle suspended alsa devices. Based on patch by ranma. (closes #26)
authorPierre Ossman <ossman@cendio.se>
Fri, 2 Mar 2007 09:20:54 +0000 (09:20 +0000)
committerPierre Ossman <ossman@cendio.se>
Fri, 2 Mar 2007 09:20:54 +0000 (09:20 +0000)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1433 fefdeb5f-60dc-0310-8127-8f9354f1896f

src/modules/module-alsa-sink.c
src/modules/module-alsa-source.c

index 6f8f270d85bf11c0bd6f72002c3c5df3f1349772..3d9f757747dd63cc5f28e584ff59107db522f818 100644 (file)
@@ -141,6 +141,33 @@ static int xrun_recovery(struct userdata *u) {
     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) {
     assert(u);
 
@@ -176,6 +203,13 @@ static void do_write(struct userdata *u) {
                 continue;
             }
 
+            if (frames == -ESTRPIPE) {
+                if (suspend_recovery(u) < 0)
+                    return;
+
+                continue;
+            }
+
             pa_log("snd_pcm_writei() failed: %s", snd_strerror(-frames));
 
             clear_up(u);
@@ -207,6 +241,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_write(u);
 }
 
index 2ea551cb8d0d119f49f39e2e0a3fab878e2fc8a8..4061d668c2ceaf5555e63d22fa1333ae571c1f7a 100644 (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);
 }