diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/pcm_resample.c | 49 | ||||
-rw-r--r-- | src/pcm_resample_fallback.c | 30 | ||||
-rw-r--r-- | src/pcm_resample_internal.h | 79 | ||||
-rw-r--r-- | src/pcm_resample_libsamplerate.c | 29 |
5 files changed, 159 insertions, 29 deletions
diff --git a/Makefile.am b/Makefile.am index 4960a6dfc..508cba28b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -101,6 +101,7 @@ mpd_headers = \ src/pcm_channels.h \ src/pcm_format.h \ src/pcm_resample.h \ + src/pcm_resample_internal.h \ src/pcm_dither.h \ src/pcm_prng.h \ src/permission.h \ diff --git a/src/pcm_resample.c b/src/pcm_resample.c index bad4b78d5..f27bf4f0c 100644 --- a/src/pcm_resample.c +++ b/src/pcm_resample.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "pcm_resample.h" +#include "pcm_resample_internal.h" #include "config.h" #include <string.h> @@ -33,3 +33,50 @@ void pcm_resample_init(struct pcm_resample_state *state) pcm_buffer_init(&state->buffer); } + +void pcm_resample_deinit(struct pcm_resample_state *state) +{ +#ifdef HAVE_LIBSAMPLERATE + pcm_resample_lsr_deinit(state); +#else + pcm_resample_fallback_deinit(state); +#endif +} + +const int16_t * +pcm_resample_16(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int16_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r) +{ +#ifdef HAVE_LIBSAMPLERATE + return pcm_resample_lsr_16(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r); +#else + return pcm_resample_fallback_16(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r); +#endif +} + +const int32_t * +pcm_resample_32(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int32_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r) +{ +#ifdef HAVE_LIBSAMPLERATE + return pcm_resample_lsr_32(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r); +#else + return pcm_resample_fallback_32(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r); +#endif +} diff --git a/src/pcm_resample_fallback.c b/src/pcm_resample_fallback.c index f7397ab12..36af51ad0 100644 --- a/src/pcm_resample_fallback.c +++ b/src/pcm_resample_fallback.c @@ -17,24 +17,25 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "pcm_resample.h" +#include "pcm_resample_internal.h" #include <assert.h> #include <glib.h> -void pcm_resample_deinit(struct pcm_resample_state *state) +void +pcm_resample_fallback_deinit(struct pcm_resample_state *state) { pcm_buffer_deinit(&state->buffer); } /* resampling code blatantly ripped from ESD */ const int16_t * -pcm_resample_16(struct pcm_resample_state *state, - uint8_t channels, - unsigned src_rate, - const int16_t *src_buffer, size_t src_size, - unsigned dest_rate, - size_t *dest_size_r) +pcm_resample_fallback_16(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int16_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r) { unsigned src_pos, dest_pos = 0; unsigned src_frames = src_size / channels / sizeof(*src_buffer); @@ -70,12 +71,13 @@ pcm_resample_16(struct pcm_resample_state *state, } const int32_t * -pcm_resample_32(struct pcm_resample_state *state, - uint8_t channels, - unsigned src_rate, - const int32_t *src_buffer, G_GNUC_UNUSED size_t src_size, - unsigned dest_rate, - size_t *dest_size_r) +pcm_resample_fallback_32(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int32_t *src_buffer, + G_GNUC_UNUSED size_t src_size, + unsigned dest_rate, + size_t *dest_size_r) { unsigned src_pos, dest_pos = 0; unsigned src_frames = src_size / channels / sizeof(*src_buffer); diff --git a/src/pcm_resample_internal.h b/src/pcm_resample_internal.h new file mode 100644 index 000000000..af62b7663 --- /dev/null +++ b/src/pcm_resample_internal.h @@ -0,0 +1,79 @@ +/* + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** \file + * + * Internal declarations for the pcm_resample library. The "internal" + * resampler is called "fallback" in the MPD source, so the file name + * of this header is somewhat unrelated to it. + */ + +#ifndef MPD_PCM_RESAMPLE_INTERNAL_H +#define MPD_PCM_RESAMPLE_INTERNAL_H + +#include "pcm_resample.h" +#include "config.h" + +#ifdef HAVE_LIBSAMPLERATE + +void +pcm_resample_lsr_deinit(struct pcm_resample_state *state); + +const int16_t * +pcm_resample_lsr_16(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int16_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r); + +const int32_t * +pcm_resample_lsr_32(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int32_t *src_buffer, + G_GNUC_UNUSED size_t src_size, + unsigned dest_rate, + size_t *dest_size_r); + +#else + +void +pcm_resample_fallback_deinit(struct pcm_resample_state *state); + +const int16_t * +pcm_resample_fallback_16(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int16_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r); + +const int32_t * +pcm_resample_fallback_32(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int32_t *src_buffer, + G_GNUC_UNUSED size_t src_size, + unsigned dest_rate, + size_t *dest_size_r); + +#endif + +#endif diff --git a/src/pcm_resample_libsamplerate.c b/src/pcm_resample_libsamplerate.c index 26482811c..3bd573809 100644 --- a/src/pcm_resample_libsamplerate.c +++ b/src/pcm_resample_libsamplerate.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "pcm_resample.h" +#include "pcm_resample_internal.h" #include "conf.h" #include "config.h" @@ -30,7 +30,8 @@ #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "pcm" -void pcm_resample_deinit(struct pcm_resample_state *state) +void +pcm_resample_lsr_deinit(struct pcm_resample_state *state) { if (state->state != NULL) state->state = src_delete(state->state); @@ -116,12 +117,12 @@ pcm_resample_set(struct pcm_resample_state *state, } const int16_t * -pcm_resample_16(struct pcm_resample_state *state, - uint8_t channels, - unsigned src_rate, - const int16_t *src_buffer, size_t src_size, - unsigned dest_rate, - size_t *dest_size_r) +pcm_resample_lsr_16(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int16_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r) { SRC_DATA *data = &state->data; size_t data_in_size; @@ -186,12 +187,12 @@ src_float_to_int_array (const float *in, int *out, int len) #endif const int32_t * -pcm_resample_32(struct pcm_resample_state *state, - uint8_t channels, - unsigned src_rate, - const int32_t *src_buffer, size_t src_size, - unsigned dest_rate, - size_t *dest_size_r) +pcm_resample_lsr_32(struct pcm_resample_state *state, + uint8_t channels, + unsigned src_rate, + const int32_t *src_buffer, size_t src_size, + unsigned dest_rate, + size_t *dest_size_r) { SRC_DATA *data = &state->data; size_t data_in_size; |