diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/pcm_format.c | 148 | ||||
-rw-r--r-- | src/pcm_format.h | 36 | ||||
-rw-r--r-- | src/pcm_utils.c | 127 |
4 files changed, 187 insertions, 126 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index c5259b155..00891cfc0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,6 +53,7 @@ mpd_headers = \ pcm_volume.h \ pcm_mix.h \ pcm_channels.h \ + pcm_format.h \ pcm_resample.h \ pcm_dither.h \ pcm_prng.h \ @@ -134,6 +135,7 @@ mpd_SOURCES = \ pcm_volume.c \ pcm_mix.c \ pcm_channels.c \ + pcm_format.c \ pcm_resample.c \ pcm_dither.c \ permission.c \ diff --git a/src/pcm_format.c b/src/pcm_format.c new file mode 100644 index 000000000..9e6f42265 --- /dev/null +++ b/src/pcm_format.c @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcm_format.h" +#include "pcm_utils.h" + +#include <glib.h> + +static void +pcm_convert_8_to_16(int16_t *out, const int8_t *in, + unsigned num_samples) +{ + while (num_samples > 0) { + *out++ = *in++ << 8; + --num_samples; + } +} + +static void +pcm_convert_24_to_16(struct pcm_dither_24 *dither, + int16_t *out, const int32_t *in, + unsigned num_samples) +{ + pcm_dither_24_to_16(dither, out, in, num_samples); +} + +const int16_t * +pcm_convert_to_16(struct pcm_convert_state *convert, + uint8_t bits, const void *src, + size_t src_size, size_t *dest_size_r) +{ + static int16_t *buf; + static size_t len; + unsigned num_samples; + + switch (bits) { + case 8: + num_samples = src_size; + *dest_size_r = src_size << 1; + if (*dest_size_r > len) { + len = *dest_size_r; + buf = g_realloc(buf, len); + } + + pcm_convert_8_to_16((int16_t *)buf, + (const int8_t *)src, + num_samples); + return buf; + + case 16: + *dest_size_r = src_size; + return src; + + case 24: + num_samples = src_size / 4; + *dest_size_r = num_samples * 2; + if (*dest_size_r > len) { + len = *dest_size_r; + buf = g_realloc(buf, len); + } + + pcm_convert_24_to_16(&convert->dither, + (int16_t *)buf, + (const int32_t *)src, + num_samples); + return buf; + } + + g_warning("only 8 or 16 bits are supported for conversion!\n"); + return NULL; +} + +static void +pcm_convert_8_to_24(int32_t *out, const int8_t *in, + unsigned num_samples) +{ + while (num_samples > 0) { + *out++ = *in++ << 16; + --num_samples; + } +} + +static void +pcm_convert_16_to_24(int32_t *out, const int16_t *in, + unsigned num_samples) +{ + while (num_samples > 0) { + *out++ = *in++ << 8; + --num_samples; + } +} + +const int32_t * +pcm_convert_to_24(uint8_t bits, const void *src, + size_t src_size, size_t *dest_size_r) +{ + static int32_t *buf; + static size_t len; + unsigned num_samples; + + switch (bits) { + case 8: + num_samples = src_size; + *dest_size_r = src_size * 4; + if (*dest_size_r > len) { + len = *dest_size_r; + buf = g_realloc(buf, len); + } + + pcm_convert_8_to_24(buf, (const int8_t *)src, + num_samples); + return buf; + + case 16: + num_samples = src_size / 2; + *dest_size_r = num_samples * 4; + if (*dest_size_r > len) { + len = *dest_size_r; + buf = g_realloc(buf, len); + } + + pcm_convert_16_to_24(buf, (const int16_t *)src, + num_samples); + return buf; + + case 24: + *dest_size_r = src_size; + return src; + } + + g_warning("only 8 or 24 bits are supported for conversion!\n"); + return NULL; +} diff --git a/src/pcm_format.h b/src/pcm_format.h new file mode 100644 index 000000000..2c52adea3 --- /dev/null +++ b/src/pcm_format.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PCM_FORMAT_H +#define PCM_FORMAT_H + +#include <stdint.h> +#include <stddef.h> + +struct pcm_convert_state; + +const int16_t * +pcm_convert_to_16(struct pcm_convert_state *convert, + uint8_t bits, const void *src, + size_t src_size, size_t *dest_size_r); + +const int32_t * +pcm_convert_to_24(uint8_t bits, const void *src, + size_t src_size, size_t *dest_size_r); + +#endif diff --git a/src/pcm_utils.c b/src/pcm_utils.c index fd2786e3a..3e66edef2 100644 --- a/src/pcm_utils.c +++ b/src/pcm_utils.c @@ -18,6 +18,7 @@ #include "pcm_utils.h" #include "pcm_channels.h" +#include "pcm_format.h" #include "conf.h" #include "audio_format.h" @@ -37,132 +38,6 @@ void pcm_convert_init(struct pcm_convert_state *state) pcm_dither_24_init(&state->dither); } -static void -pcm_convert_8_to_16(int16_t *out, const int8_t *in, - unsigned num_samples) -{ - while (num_samples > 0) { - *out++ = *in++ << 8; - --num_samples; - } -} - -static void -pcm_convert_24_to_16(struct pcm_dither_24 *dither, - int16_t *out, const int32_t *in, - unsigned num_samples) -{ - pcm_dither_24_to_16(dither, out, in, num_samples); -} - -static const int16_t * -pcm_convert_to_16(struct pcm_convert_state *convert, - uint8_t bits, const void *src, - size_t src_size, size_t *dest_size_r) -{ - static int16_t *buf; - static size_t len; - unsigned num_samples; - - switch (bits) { - case 8: - num_samples = src_size; - *dest_size_r = src_size << 1; - if (*dest_size_r > len) { - len = *dest_size_r; - buf = g_realloc(buf, len); - } - - pcm_convert_8_to_16((int16_t *)buf, - (const int8_t *)src, - num_samples); - return buf; - - case 16: - *dest_size_r = src_size; - return src; - - case 24: - num_samples = src_size / 4; - *dest_size_r = num_samples * 2; - if (*dest_size_r > len) { - len = *dest_size_r; - buf = g_realloc(buf, len); - } - - pcm_convert_24_to_16(&convert->dither, - (int16_t *)buf, - (const int32_t *)src, - num_samples); - return buf; - } - - g_warning("only 8 or 16 bits are supported for conversion!\n"); - return NULL; -} - -static void -pcm_convert_8_to_24(int32_t *out, const int8_t *in, - unsigned num_samples) -{ - while (num_samples > 0) { - *out++ = *in++ << 16; - --num_samples; - } -} - -static void -pcm_convert_16_to_24(int32_t *out, const int16_t *in, - unsigned num_samples) -{ - while (num_samples > 0) { - *out++ = *in++ << 8; - --num_samples; - } -} - -static const int32_t * -pcm_convert_to_24(uint8_t bits, const void *src, - size_t src_size, size_t *dest_size_r) -{ - static int32_t *buf; - static size_t len; - unsigned num_samples; - - switch (bits) { - case 8: - num_samples = src_size; - *dest_size_r = src_size * 4; - if (*dest_size_r > len) { - len = *dest_size_r; - buf = g_realloc(buf, len); - } - - pcm_convert_8_to_24(buf, (const int8_t *)src, - num_samples); - return buf; - - case 16: - num_samples = src_size / 2; - *dest_size_r = num_samples * 4; - if (*dest_size_r > len) { - len = *dest_size_r; - buf = g_realloc(buf, len); - } - - pcm_convert_16_to_24(buf, (const int16_t *)src, - num_samples); - return buf; - - case 24: - *dest_size_r = src_size; - return src; - } - - g_warning("only 8 or 24 bits are supported for conversion!\n"); - return NULL; -} - static size_t pcm_convert_16(const struct audio_format *src_format, const void *src_buffer, size_t src_size, |