Also fixed a bug in sample_format_more_precise for 32-bit integer sample formats. --- src/pulsecore/resampler.c | 32 ++++++++++++++++++++++++++++++-- src/pulsecore/resampler.h | 5 +++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c index 8b30c24..66101f6 100644 --- a/src/pulsecore/resampler.c +++ b/src/pulsecore/resampler.c @@ -111,6 +111,17 @@ static int (* const init_table[])(pa_resampler *r) = { [PA_RESAMPLER_AUTO] = NULL, [PA_RESAMPLER_COPY] = copy_init, [PA_RESAMPLER_PEAKS] = pa_resampler_peaks_init, +#ifdef HAVE_SOXR + [PA_RESAMPLER_SOXR_LQ] = pa_resampler_soxr_init, + [PA_RESAMPLER_SOXR_MQ] = pa_resampler_soxr_init, + [PA_RESAMPLER_SOXR_HQ] = pa_resampler_soxr_init, + [PA_RESAMPLER_SOXR_VHQ] = pa_resampler_soxr_init, +#else + [PA_RESAMPLER_SOXR_LQ] = NULL, + [PA_RESAMPLER_SOXR_MQ] = NULL, + [PA_RESAMPLER_SOXR_HQ] = NULL, + [PA_RESAMPLER_SOXR_VHQ] = NULL, +#endif }; static pa_resample_method_t choose_auto_resampler(pa_resample_flags_t flags) { @@ -234,7 +245,7 @@ static bool sample_format_more_precise(pa_sample_format_t a, pa_sample_format_t case PA_SAMPLE_S32LE: case PA_SAMPLE_S32BE: if (b == PA_SAMPLE_FLOAT32LE || b == PA_SAMPLE_FLOAT32BE || - b == PA_SAMPLE_S32LE || b == PA_SAMPLE_FLOAT32BE) + b == PA_SAMPLE_S32LE || b == PA_SAMPLE_S32BE) return false; else return true; @@ -287,6 +298,19 @@ static pa_sample_format_t choose_work_format( work_format = PA_SAMPLE_S16NE; break; + case PA_RESAMPLER_SOXR_LQ: + case PA_RESAMPLER_SOXR_MQ: + case PA_RESAMPLER_SOXR_HQ: + case PA_RESAMPLER_SOXR_VHQ: + /* Note: libsoxr can potentially work with PA_SAMPLE_S32NE as well */ + if (!map_required && + (a == PA_SAMPLE_S16LE || a == PA_SAMPLE_S16BE || sample_format_more_precise(PA_SAMPLE_S16NE, a)) && + (b == PA_SAMPLE_S16LE || b == PA_SAMPLE_S16BE || sample_format_more_precise(PA_SAMPLE_S16NE, b))) + work_format = PA_SAMPLE_S16NE; + else + work_format = PA_SAMPLE_FLOAT32NE; + break; + default: work_format = PA_SAMPLE_FLOAT32NE; } @@ -601,7 +625,11 @@ static const char * const resample_methods[] = { "ffmpeg", "auto", "copy", - "peaks" + "peaks", + "soxr-lq", + "soxr-mq", + "soxr-hq", + "soxr-vhq" }; const char *pa_resample_method_to_string(pa_resample_method_t m) { diff --git a/src/pulsecore/resampler.h b/src/pulsecore/resampler.h index 5a84cf0..ebb7050 100644 --- a/src/pulsecore/resampler.h +++ b/src/pulsecore/resampler.h @@ -59,6 +59,10 @@ typedef enum pa_resample_method { PA_RESAMPLER_AUTO, /* automatic select based on sample format */ PA_RESAMPLER_COPY, PA_RESAMPLER_PEAKS, + PA_RESAMPLER_SOXR_LQ, + PA_RESAMPLER_SOXR_MQ, + PA_RESAMPLER_SOXR_HQ, + PA_RESAMPLER_SOXR_VHQ, PA_RESAMPLER_MAX } pa_resample_method_t; @@ -163,6 +167,7 @@ int pa_resampler_libsamplerate_init(pa_resampler *r); int pa_resampler_peaks_init(pa_resampler *r); int pa_resampler_speex_init(pa_resampler *r); int pa_resampler_trivial_init(pa_resampler*r); +int pa_resampler_soxr_init(pa_resampler *r); /* Resampler-specific quirks */ bool pa_speex_is_fixed_point(void); -- 2.1.0