From 4f91aec2e0ebecb4274a79372e64365c180cf577 Mon Sep 17 00:00:00 2001
From: Warren Dukes <shank@xiph.org>
Date: Sat, 11 Oct 2003 13:31:20 +0000
Subject: [PATCH] Fix for bug #456.

Set threshold to 0, as that seems to be causing dmix to deadlock in poll().


git-svn-id: http://svn.xiph.org/trunk/ao@5455 0101bb08-14d6-0310-b084-bc0e0c8e3800
---
 src/plugins/alsa09/ao_alsa09.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/plugins/alsa09/ao_alsa09.c b/src/plugins/alsa09/ao_alsa09.c
index 16eb068..3a9814c 100644
--- a/src/plugins/alsa09/ao_alsa09.c
+++ b/src/plugins/alsa09/ao_alsa09.c
@@ -288,6 +288,17 @@ static inline int alsa_set_swparams(ao_alsa_internal *internal)
 	if (err < 0)
 		return err;
 
+	/* allow transfers to start when there are four periods */
+	/* setting the threshold to a very big values seems to cause a
+	   deadlock for dmix in a pol().  So here we just set it to 0,
+	   I'm not sure why we need to set a threshold > 0 anyway, maybe 
+	   someone could enlighten me. - shank */
+	internal->cmd = "snd_pcm_sw_params_set_start_threshold";
+	err = snd_pcm_sw_params_set_start_threshold(internal->pcm_handle,
+			params, /*internal->period_size << 2*/0);
+	if (err < 0)
+		return err;
+
 	/* require a minimum of one full transfer in the buffer */
 	internal->cmd = "snd_pcm_sw_params_set_avail_min";
 	err = snd_pcm_sw_params_set_avail_min(internal->pcm_handle, params,
@@ -295,13 +306,6 @@ static inline int alsa_set_swparams(ao_alsa_internal *internal)
 	if (err < 0)
 		return err;
 
-	/* allow transfers to start when there are four periods */
-	internal->cmd = "snd_pcm_sw_params_set_start_threshold";
-	err = snd_pcm_sw_params_set_start_threshold(internal->pcm_handle,
-			params, internal->period_size << 2);
-	if (err < 0)
-		return err;
-
 	/* do not align transfers */
 	internal->cmd = "snd_pcm_sw_params_set_xfer_align";
 	err = snd_pcm_sw_params_set_xfer_align(internal->pcm_handle, params, 1);
@@ -417,8 +421,9 @@ int ao_plugin_play(ao_device *device, const char *output_samples,
 #endif
 
 		/* it's possible that no data was transferred */
-		if (err == -EAGAIN)
+		if (err == -EAGAIN) {
 			continue;
+		}
 
 		if (err < 0) {
 			/* this might be an error, or an exception */
-- 
GitLab