diff options
author | Max Kellermann <max@duempel.org> | 2008-10-24 16:39:43 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-10-24 16:39:43 +0200 |
commit | 4ecdaabbb095e2e0cb421308089a190c518b4b35 (patch) | |
tree | 3dfe263321466aac952fed54f8a4985fdc25a59a | |
parent | 91ad576aade3c80555bf41fe88a6d1b11ae93424 (diff) | |
download | mpd-4ecdaabbb095e2e0cb421308089a190c518b4b35.tar.gz mpd-4ecdaabbb095e2e0cb421308089a190c518b4b35.tar.xz mpd-4ecdaabbb095e2e0cb421308089a190c518b4b35.zip |
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.
-rw-r--r-- | src/audioOutputs/audioOutput_jack.c | 30 |
1 files changed, 15 insertions, 15 deletions
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, |