From 4ecdaabbb095e2e0cb421308089a190c518b4b35 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Fri, 24 Oct 2008 16:39:43 +0200
Subject: jack: partial writes to ring buffer

Don't wait until there is room for the full data chunk passed to
jack_playAudio().  Try to incrementally send as much as possible into
the ring buffer.
---
 src/audioOutputs/audioOutput_jack.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

(limited to 'src')

diff --git a/src/audioOutputs/audioOutput_jack.c b/src/audioOutputs/audioOutput_jack.c
index d9670b27b..e67554cc1 100644
--- a/src/audioOutputs/audioOutput_jack.c
+++ b/src/audioOutputs/audioOutput_jack.c
@@ -386,12 +386,10 @@ static int jack_playAudio(void *data,
 			  const char *buff, size_t size)
 {
 	JackData *jd = data;
-	size_t space;
-	size_t i;
+	size_t space, space1;
 	const short *buffer = (const short *) buff;
 	static const size_t frame_size = sizeof(*buffer) * 2;
 	jack_default_audio_sample_t sample;
-	size_t samples = size / frame_size;
 
 	/*DEBUG("jack_playAudio: (pid=%d)!\n", getpid());*/
 
@@ -402,14 +400,21 @@ static int jack_playAudio(void *data,
 		return 0;
 	}
 
-	while (samples && !jd->shutdown) {
+	size /= frame_size;
+	while (size > 0 && !jd->shutdown) {
 		space = jack_ringbuffer_write_space(jd->ringbuffer[0]);
-		if (space >= samples * sample_size) {
-			/*space = MIN(space, samples*sample_size);*/
-			/*space = samples*sample_size;*/
-
-			/*for(i=0; i<space/sample_size; i++) {*/
-			for (i = 0; i < samples; i++) {
+		space1 = jack_ringbuffer_write_space(jd->ringbuffer[1]);
+		if (space > space1)
+			/* send data symmetrically */
+			space = space1;
+
+		space /= sample_size;
+		if (space > 0) {
+			if (space > size)
+				space = size;
+
+			size -= space;
+			while (space-- > 0) {
 				sample = (jack_default_audio_sample_t) *(buffer++)/32768.0;
 
 				jack_ringbuffer_write(jd->ringbuffer[0], (void*)&sample,
@@ -419,12 +424,7 @@ static int jack_playAudio(void *data,
 
 				jack_ringbuffer_write(jd->ringbuffer[1], (void*)&sample,
 						      sample_size);
-
-				/*samples--;*/
 			}
-
-			samples = 0;
-
 		} else {
 			pthread_mutex_lock(&jd->play_audio_lock);
 			pthread_cond_wait(&jd->play_audio,
-- 
cgit v1.2.3