in case alsa lies to use don't spin forever
authorLennart Poettering <lennart@poettering.net>
Tue, 24 Feb 2009 05:11:42 +0000 (06:11 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 24 Feb 2009 05:11:42 +0000 (06:11 +0100)
src/modules/alsa/alsa-sink.c
src/modules/alsa/alsa-source.c

index d4a54fe..0a1ebb1 100644 (file)
@@ -255,6 +255,7 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
     pa_bool_t work_done = TRUE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_play;
+    unsigned j = 0;
 
     pa_assert(u);
     pa_sink_assert_ref(u->sink);
@@ -320,6 +321,15 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
             break;
         }
 
+
+        if (++j > 10) {
+#ifdef DEBUG_TIMING
+            pa_log_debug("Not filling up, because already too many iterations.");
+#endif
+
+            break;
+        }
+
         n_bytes -= u->hwbuf_unused;
         polled = FALSE;
 
@@ -399,6 +409,7 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
     pa_bool_t work_done = FALSE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_play;
+    unsigned j = 0;
 
     pa_assert(u);
     pa_sink_assert_ref(u->sink);
@@ -449,6 +460,14 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
             break;
         }
 
+        if (++j > 10) {
+#ifdef DEBUG_TIMING
+            pa_log_debug("Not filling up, because already too many iterations.");
+#endif
+
+            break;
+        }
+
         n_bytes -= u->hwbuf_unused;
         polled = FALSE;
 
index f2dad4c..ad9a7f2 100644 (file)
@@ -248,6 +248,7 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
     pa_bool_t work_done = FALSE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_record;
+    unsigned j = 0;
 
     pa_assert(u);
     pa_source_assert_ref(u->source);
@@ -303,6 +304,14 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
             break;
         }
 
+        if (++j > 10) {
+#ifdef DEBUG_TIMING
+            pa_log_debug("Not filling up, because already too many iterations.");
+#endif
+
+            break;
+        }
+
         polled = FALSE;
 
 #ifdef DEBUG_TIMING
@@ -381,6 +390,7 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
     int work_done = FALSE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_record;
+    unsigned j = 0;
 
     pa_assert(u);
     pa_source_assert_ref(u->source);
@@ -424,6 +434,14 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
             break;
         }
 
+        if (++j > 10) {
+#ifdef DEBUG_TIMING
+            pa_log_debug("Not filling up, because already too many iterations.");
+#endif
+
+            break;
+        }
+
         polled = FALSE;
 
         for (;;) {