From b1adfaae439fd0e28724265d13aa5040afd51022 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 24 Oct 2008 17:34:47 +0200 Subject: jack: moved code to jack_write_samples_16() Move sample format dependent code to a separate function. --- src/audioOutputs/audioOutput_jack.c | 56 +++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'src/audioOutputs') diff --git a/src/audioOutputs/audioOutput_jack.c b/src/audioOutputs/audioOutput_jack.c index c4d6062fd..b24ce77ee 100644 --- a/src/audioOutputs/audioOutput_jack.c +++ b/src/audioOutputs/audioOutput_jack.c @@ -356,14 +356,50 @@ mpd_jack_cancel (mpd_unused void *data) { } +static inline jack_default_audio_sample_t +sample_16_to_jack(int16_t sample) +{ + return sample / (jack_default_audio_sample_t)(1 << (16 - 1)); +} + +static void +mpd_jack_write_samples_16(struct jack_data *jd, const int16_t *src, + unsigned num_samples) +{ + jack_default_audio_sample_t sample; + + while (num_samples-- > 0) { + sample = sample_16_to_jack(*src++); + jack_ringbuffer_write(jd->ringbuffer[0], (void*)&sample, + sizeof(sample)); + + sample = sample_16_to_jack(*src++); + jack_ringbuffer_write(jd->ringbuffer[1], (void*)&sample, + sizeof(sample)); + } +} + +static void +mpd_jack_write_samples(struct jack_data *jd, const void *src, + unsigned num_samples) +{ + switch (jd->audio_format->bits) { + case 16: + mpd_jack_write_samples_16(jd, (const int16_t*)src, + num_samples); + break; + + default: + assert(false); + } +} + static int mpd_jack_play(void *data, const char *buff, size_t size) { struct jack_data *jd = data; + const size_t frame_size = audio_format_frame_size(jd->audio_format); 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; if (jd->shutdown) { ERROR("Refusing to play, because there is no client thread.\n"); @@ -386,18 +422,10 @@ mpd_jack_play(void *data, const char *buff, size_t size) 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, - sample_size); + mpd_jack_write_samples(jd, buff, space); - sample = (jack_default_audio_sample_t) *(buffer++)/32768.0; - - jack_ringbuffer_write(jd->ringbuffer[1], (void*)&sample, - sample_size); - } + buff += space * frame_size; + size -= space; } else { /* XXX do something more intelligent to synchronize */ -- cgit v1.2.3