From 4ecdaabbb095e2e0cb421308089a190c518b4b35 Mon Sep 17 00:00:00 2001 From: Max Kellermann 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/audioOutputs/audioOutput_jack.c') 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; iringbuffer[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