From f4e6bb2815ad78ff71adb5bfaa672d4c2088d15d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 24 Oct 2008 17:36:11 +0200 Subject: jack: support for 24 bit samples When the audio source provides 24 bit samples, don't bother to convert (lossily) them to 16 bit before jack's floating point conversion - go directly from 24 bit to float. --- src/audioOutputs/audioOutput_jack.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/audioOutputs') diff --git a/src/audioOutputs/audioOutput_jack.c b/src/audioOutputs/audioOutput_jack.c index b24ce77ee..6f2bcd3a1 100644 --- a/src/audioOutputs/audioOutput_jack.c +++ b/src/audioOutputs/audioOutput_jack.c @@ -165,7 +165,10 @@ set_audioformat(struct jack_data *jd, struct audio_format *audio_format) audio_format->sample_rate = jack_get_sample_rate(jd->client); DEBUG("samplerate = %u\n", audio_format->sample_rate); audio_format->channels = 2; - audio_format->bits = 16; + + if (audio_format->bits != 16 && audio_format->bits != 24) + audio_format->bits = 24; + jd->bps = audio_format->channels * sizeof(jack_default_audio_sample_t) * audio_format->sample_rate; @@ -379,6 +382,29 @@ mpd_jack_write_samples_16(struct jack_data *jd, const int16_t *src, } } +static inline jack_default_audio_sample_t +sample_24_to_jack(int32_t sample) +{ + return sample / (jack_default_audio_sample_t)(1 << (24 - 1)); +} + +static void +mpd_jack_write_samples_24(struct jack_data *jd, const int32_t *src, + unsigned num_samples) +{ + jack_default_audio_sample_t sample; + + while (num_samples-- > 0) { + sample = sample_24_to_jack(*src++); + jack_ringbuffer_write(jd->ringbuffer[0], (void*)&sample, + sizeof(sample)); + + sample = sample_24_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) @@ -389,6 +415,11 @@ mpd_jack_write_samples(struct jack_data *jd, const void *src, num_samples); break; + case 24: + mpd_jack_write_samples_24(jd, (const int32_t*)src, + num_samples); + break; + default: assert(false); } -- cgit v1.2.3