From e12140cfce88985f9fcecb93214a94a0b9c33e7f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 14 Mar 2009 15:26:36 +0100 Subject: pcm_resample: choose the fallback resampler at runtime Even if libsamplerate support is enabled, compile the fallback resampler. When the user specifies the option "samplerate_converter=internal", it is chosen in favor of libsamplerate. This may help users with a weak FPU who don't want to compile a custom MPD from source, because the fallback resampler does not use floating point operations. --- src/pcm_resample.c | 48 +++++++++++++++++++++++++++++++-------------- src/pcm_resample_internal.h | 4 +--- 2 files changed, 34 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/pcm_resample.c b/src/pcm_resample.c index f27bf4f0c..69fda79e4 100644 --- a/src/pcm_resample.c +++ b/src/pcm_resample.c @@ -20,15 +20,30 @@ #include "pcm_resample_internal.h" #include "config.h" +#ifdef HAVE_LIBSAMPLERATE +#include "conf.h" +#endif + #include +#ifdef HAVE_LIBSAMPLERATE +static bool +pcm_resample_lsr_enabled(void) +{ + return strcmp(config_get_string(CONF_SAMPLERATE_CONVERTER, ""), + "internal") == 0; +} +#endif + void pcm_resample_init(struct pcm_resample_state *state) { memset(state, 0, sizeof(*state)); #ifdef HAVE_LIBSAMPLERATE - pcm_buffer_init(&state->in); - pcm_buffer_init(&state->out); + if (pcm_resample_lsr_enabled()) { + pcm_buffer_init(&state->in); + pcm_buffer_init(&state->out); + } #endif pcm_buffer_init(&state->buffer); @@ -37,10 +52,11 @@ void pcm_resample_init(struct pcm_resample_state *state) void pcm_resample_deinit(struct pcm_resample_state *state) { #ifdef HAVE_LIBSAMPLERATE - pcm_resample_lsr_deinit(state); -#else - pcm_resample_fallback_deinit(state); + if (pcm_resample_lsr_enabled()) + pcm_resample_lsr_deinit(state); + else #endif + pcm_resample_fallback_deinit(state); } const int16_t * @@ -52,14 +68,15 @@ pcm_resample_16(struct pcm_resample_state *state, 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 + if (pcm_resample_lsr_enabled()) + return pcm_resample_lsr_16(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r); +#endif + return pcm_resample_fallback_16(state, channels, src_rate, src_buffer, src_size, dest_rate, dest_size_r); -#endif } const int32_t * @@ -71,12 +88,13 @@ pcm_resample_32(struct pcm_resample_state *state, 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 + if (pcm_resample_lsr_enabled()) + return pcm_resample_lsr_32(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r); +#endif + 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_internal.h b/src/pcm_resample_internal.h index af62b7663..a10ba08cd 100644 --- a/src/pcm_resample_internal.h +++ b/src/pcm_resample_internal.h @@ -52,7 +52,7 @@ pcm_resample_lsr_32(struct pcm_resample_state *state, unsigned dest_rate, size_t *dest_size_r); -#else +#endif void pcm_resample_fallback_deinit(struct pcm_resample_state *state); @@ -75,5 +75,3 @@ pcm_resample_fallback_32(struct pcm_resample_state *state, size_t *dest_size_r); #endif - -#endif -- cgit v1.2.3