[alsa-devel] [PATCH 1/1] jack: Fix hanging applications when using jack plugin

Adrian Knoth adi at drcomp.erfurt.thur.de
Thu Aug 4 16:19:56 CEST 2011

As described in issue #2727


applications hang after some seconds when using the jack plugin.

Kevin Ross <kevin at familyross.net> writes:

   The cause: The plugin creates a pipe, so that the fd's could be
   polled to indicate completion of a transfer.  However, the call to
   write() blocks when playing audio, as nothing actually reads from the
   pipe, and it fills up until it blocks.

   Making the socket non-blocking fixes the problem, and testing with
   playback and capture both work properly for me now.

I've also tested Kevin's patch and confirm it works.

Signed-off-by: Adrian Knoth <adi at drcomp.erfurt.thur.de>

diff --git a/jack/pcm_jack.c b/jack/pcm_jack.c
index 3370a26..a3833c5 100644
--- a/jack/pcm_jack.c
+++ b/jack/pcm_jack.c
@@ -307,6 +307,18 @@ static int parse_ports(snd_pcm_jack_t *jack, snd_config_t *conf)
 	return 0;
+static int make_nonblock(int fd) {
+	int fl;
+	if ((fl = fcntl(fd, F_GETFL)) < 0)
+		return fl;
+	if (fl & O_NONBLOCK)
+		return 0;
+	return fcntl(fd, F_SETFL, fl | O_NONBLOCK);
 static int snd_pcm_jack_open(snd_pcm_t **pcmp, const char *name,
 			     snd_config_t *playback_conf,
 			     snd_config_t *capture_conf,
@@ -363,6 +375,9 @@ static int snd_pcm_jack_open(snd_pcm_t **pcmp, const char *name,
 	socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
+	make_nonblock(fd[0]);
+	make_nonblock(fd[1]);
 	jack->fd = fd[0];
 	jack->io.version = SND_PCM_IOPLUG_VERSION;

More information about the Alsa-devel mailing list