aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutputs/audioOutput_jack.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-24 16:39:43 +0200
committerMax Kellermann <max@duempel.org>2008-10-24 16:39:43 +0200
commit4ecdaabbb095e2e0cb421308089a190c518b4b35 (patch)
tree3dfe263321466aac952fed54f8a4985fdc25a59a /src/audioOutputs/audioOutput_jack.c
parent91ad576aade3c80555bf41fe88a6d1b11ae93424 (diff)
downloadmpd-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.
Diffstat (limited to 'src/audioOutputs/audioOutput_jack.c')
-rw-r--r--src/audioOutputs/audioOutput_jack.c30
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,