diff options
-rw-r--r-- | src/pulsecore/resampler.c | 33 | ||||
-rw-r--r-- | src/pulsecore/resampler.h | 4 |
2 files changed, 33 insertions, 4 deletions
diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c index b4e84f2f5..0d7cc20b8 100644 --- a/src/pulsecore/resampler.c +++ b/src/pulsecore/resampler.c @@ -109,6 +109,15 @@ 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_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_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) { @@ -154,6 +163,9 @@ static pa_resample_method_t fix_method( } /* Else fall through */ case PA_RESAMPLER_FFMPEG: + case PA_RESAMPLER_SOXR_MQ: + case PA_RESAMPLER_SOXR_HQ: + case PA_RESAMPLER_SOXR_VHQ: if (flags & PA_RESAMPLER_VARIABLE_RATE) { pa_log_info("Resampler '%s' cannot do variable rate, reverting to resampler 'auto'.", pa_resample_method_to_string(method)); method = PA_RESAMPLER_AUTO; @@ -276,10 +288,20 @@ static pa_sample_format_t choose_work_format( } /* Else fall trough */ case PA_RESAMPLER_PEAKS: - if (a == PA_SAMPLE_S16NE || b == PA_SAMPLE_S16NE) + /* PEAKS, COPY and TRIVIAL do not benefit from increased + * working precision, so for better performance use s16ne + * if either input or output fits in it. */ + if (a == PA_SAMPLE_S16NE || b == PA_SAMPLE_S16NE) { work_format = PA_SAMPLE_S16NE; - else if (sample_format_more_precise(a, PA_SAMPLE_S16NE) || - sample_format_more_precise(b, PA_SAMPLE_S16NE)) + break; + } + /* Else fall trough */ + case PA_RESAMPLER_SOXR_MQ: + case PA_RESAMPLER_SOXR_HQ: + case PA_RESAMPLER_SOXR_VHQ: + /* Do processing with max precision of input and output. */ + if (sample_format_more_precise(a, PA_SAMPLE_S16NE) || + sample_format_more_precise(b, PA_SAMPLE_S16NE)) work_format = PA_SAMPLE_FLOAT32NE; else work_format = PA_SAMPLE_S16NE; @@ -599,7 +621,10 @@ static const char * const resample_methods[] = { "ffmpeg", "auto", "copy", - "peaks" + "peaks", + "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 0580f850e..4840a5eae 100644 --- a/src/pulsecore/resampler.h +++ b/src/pulsecore/resampler.h @@ -57,6 +57,9 @@ typedef enum pa_resample_method { PA_RESAMPLER_AUTO, /* automatic select based on sample format */ PA_RESAMPLER_COPY, PA_RESAMPLER_PEAKS, + PA_RESAMPLER_SOXR_MQ, + PA_RESAMPLER_SOXR_HQ, + PA_RESAMPLER_SOXR_VHQ, PA_RESAMPLER_MAX } pa_resample_method_t; @@ -161,6 +164,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); |