Commit e12140cf authored by Max Kellermann's avatar Max Kellermann

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.
parent 456201fa
...@@ -198,6 +198,7 @@ src_mpd_SOURCES = \ ...@@ -198,6 +198,7 @@ src_mpd_SOURCES = \
src/pcm_channels.c \ src/pcm_channels.c \
src/pcm_format.c \ src/pcm_format.c \
src/pcm_resample.c \ src/pcm_resample.c \
src/pcm_resample_fallback.c \
src/pcm_dither.c \ src/pcm_dither.c \
src/permission.c \ src/permission.c \
src/player_thread.c \ src/player_thread.c \
...@@ -240,8 +241,6 @@ endif ...@@ -240,8 +241,6 @@ endif
if HAVE_LIBSAMPLERATE if HAVE_LIBSAMPLERATE
src_mpd_SOURCES += src/pcm_resample_libsamplerate.c src_mpd_SOURCES += src/pcm_resample_libsamplerate.c
else
src_mpd_SOURCES += src/pcm_resample_fallback.c
endif endif
if HAVE_ID3TAG if HAVE_ID3TAG
......
...@@ -53,6 +53,7 @@ ver 0.15 - (200?/??/??) ...@@ -53,6 +53,7 @@ ver 0.15 - (200?/??/??)
* 32 bit audio support * 32 bit audio support
* Print available protocols in --version * Print available protocols in --version
* fill buffer after seeking * fill buffer after seeking
* choose the fallback resampler at runtime
ver 0.14.2 (2009/02/13) ver 0.14.2 (2009/02/13)
......
...@@ -158,6 +158,11 @@ distortions. ...@@ -158,6 +158,11 @@ distortions.
Linear Interpolator (4) Linear Interpolator (4)
Linear interpolator, very fast, poor quality. Linear interpolator, very fast, poor quality.
.TP
internal
Poor quality, no floating point operations. This is the default (and
only choice) if MPD was compiled without libsamplerate.
.RE .RE
.IP .IP
For an up-to-date list of available converters, please see the libsamplerate For an up-to-date list of available converters, please see the libsamplerate
......
...@@ -20,15 +20,30 @@ ...@@ -20,15 +20,30 @@
#include "pcm_resample_internal.h" #include "pcm_resample_internal.h"
#include "config.h" #include "config.h"
#ifdef HAVE_LIBSAMPLERATE
#include "conf.h"
#endif
#include <string.h> #include <string.h>
#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) void pcm_resample_init(struct pcm_resample_state *state)
{ {
memset(state, 0, sizeof(*state)); memset(state, 0, sizeof(*state));
#ifdef HAVE_LIBSAMPLERATE #ifdef HAVE_LIBSAMPLERATE
if (pcm_resample_lsr_enabled()) {
pcm_buffer_init(&state->in); pcm_buffer_init(&state->in);
pcm_buffer_init(&state->out); pcm_buffer_init(&state->out);
}
#endif #endif
pcm_buffer_init(&state->buffer); pcm_buffer_init(&state->buffer);
...@@ -37,10 +52,11 @@ void pcm_resample_init(struct pcm_resample_state *state) ...@@ -37,10 +52,11 @@ void pcm_resample_init(struct pcm_resample_state *state)
void pcm_resample_deinit(struct pcm_resample_state *state) void pcm_resample_deinit(struct pcm_resample_state *state)
{ {
#ifdef HAVE_LIBSAMPLERATE #ifdef HAVE_LIBSAMPLERATE
if (pcm_resample_lsr_enabled())
pcm_resample_lsr_deinit(state); pcm_resample_lsr_deinit(state);
#else else
pcm_resample_fallback_deinit(state);
#endif #endif
pcm_resample_fallback_deinit(state);
} }
const int16_t * const int16_t *
...@@ -52,14 +68,15 @@ pcm_resample_16(struct pcm_resample_state *state, ...@@ -52,14 +68,15 @@ pcm_resample_16(struct pcm_resample_state *state,
size_t *dest_size_r) size_t *dest_size_r)
{ {
#ifdef HAVE_LIBSAMPLERATE #ifdef HAVE_LIBSAMPLERATE
if (pcm_resample_lsr_enabled())
return pcm_resample_lsr_16(state, channels, return pcm_resample_lsr_16(state, channels,
src_rate, src_buffer, src_size, src_rate, src_buffer, src_size,
dest_rate, dest_size_r); dest_rate, dest_size_r);
#else #endif
return pcm_resample_fallback_16(state, channels, return pcm_resample_fallback_16(state, channels,
src_rate, src_buffer, src_size, src_rate, src_buffer, src_size,
dest_rate, dest_size_r); dest_rate, dest_size_r);
#endif
} }
const int32_t * const int32_t *
...@@ -71,12 +88,13 @@ pcm_resample_32(struct pcm_resample_state *state, ...@@ -71,12 +88,13 @@ pcm_resample_32(struct pcm_resample_state *state,
size_t *dest_size_r) size_t *dest_size_r)
{ {
#ifdef HAVE_LIBSAMPLERATE #ifdef HAVE_LIBSAMPLERATE
if (pcm_resample_lsr_enabled())
return pcm_resample_lsr_32(state, channels, return pcm_resample_lsr_32(state, channels,
src_rate, src_buffer, src_size, src_rate, src_buffer, src_size,
dest_rate, dest_size_r); dest_rate, dest_size_r);
#else #endif
return pcm_resample_fallback_32(state, channels, return pcm_resample_fallback_32(state, channels,
src_rate, src_buffer, src_size, src_rate, src_buffer, src_size,
dest_rate, dest_size_r); dest_rate, dest_size_r);
#endif
} }
...@@ -52,7 +52,7 @@ pcm_resample_lsr_32(struct pcm_resample_state *state, ...@@ -52,7 +52,7 @@ pcm_resample_lsr_32(struct pcm_resample_state *state,
unsigned dest_rate, unsigned dest_rate,
size_t *dest_size_r); size_t *dest_size_r);
#else #endif
void void
pcm_resample_fallback_deinit(struct pcm_resample_state *state); pcm_resample_fallback_deinit(struct pcm_resample_state *state);
...@@ -75,5 +75,3 @@ pcm_resample_fallback_32(struct pcm_resample_state *state, ...@@ -75,5 +75,3 @@ pcm_resample_fallback_32(struct pcm_resample_state *state,
size_t *dest_size_r); size_t *dest_size_r);
#endif #endif
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment