[pulseaudio-discuss] [PATCH 1/2] resampler: Moved speex_is_fixed_point() to speex.c
Alexander E. Patrakov
patrakov at gmail.com
Sun Aug 17 01:53:07 PDT 2014
IMHO code that calls into speex belongs in speex.c, not in resampler.c.
Signed-off-by: Alexander E. Patrakov <patrakov at gmail.com>
---
src/pulsecore/resampler.c | 43 ++++-------------------------------------
src/pulsecore/resampler.h | 3 +++
src/pulsecore/resampler/speex.c | 31 ++++++++++++++++++++++++++++-
3 files changed, 37 insertions(+), 40 deletions(-)
diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index de58f3f..5e9dc39 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -25,16 +25,10 @@
#include <string.h>
-#ifdef HAVE_SPEEX
-#include <speex/speex_resampler.h>
-#include <math.h>
-#endif
-
#include <pulse/xmalloc.h>
#include <pulsecore/log.h>
#include <pulsecore/macro.h>
#include <pulsecore/strbuf.h>
-#include <pulsecore/once.h>
#include <pulsecore/core-util.h>
#include "resampler.h"
@@ -119,8 +113,6 @@ static int (* const init_table[])(pa_resampler *r) = {
[PA_RESAMPLER_PEAKS] = pa_resampler_peaks_init,
};
-static bool speex_is_fixed_point(void);
-
static pa_resample_method_t choose_auto_resampler(pa_resample_flags_t flags) {
pa_resample_method_t method;
@@ -186,6 +178,7 @@ static pa_resample_method_t fix_method(
if (method == PA_RESAMPLER_AUTO)
method = choose_auto_resampler(flags);
+#ifdef HAVE_SPEEX
/* At this point, method is supported in the sense that it
* has an init function and supports the required flags. However,
* speex-float implementation in PulseAudio relies on the
@@ -194,12 +187,14 @@ static pa_resample_method_t fix_method(
* in this configuration. So use it instead.
*/
if (method >= PA_RESAMPLER_SPEEX_FLOAT_BASE && method <= PA_RESAMPLER_SPEEX_FLOAT_MAX) {
- if (speex_is_fixed_point()) {
+ if (pa_speex_is_fixed_point()) {
pa_log_info("Speex appears to be compiled with --enable-fixed-point. "
"Switching to a fixed-point resampler because it should be faster.");
method = method - PA_RESAMPLER_SPEEX_FLOAT_BASE + PA_RESAMPLER_SPEEX_FIXED_BASE;
}
}
+#endif
+
return method;
}
@@ -1341,36 +1336,6 @@ void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out)
pa_memchunk_reset(out);
}
-/*** speex based implementation ***/
-
-static bool speex_is_fixed_point(void) {
- static bool result = false;
-#ifdef HAVE_SPEEX
- PA_ONCE_BEGIN {
- float f_out = -1.0f, f_in = 1.0f;
- spx_uint32_t in_len = 1, out_len = 1;
- SpeexResamplerState *s;
-
- pa_assert_se(s = speex_resampler_init(1, 1, 1,
- SPEEX_RESAMPLER_QUALITY_MIN, NULL));
-
- /* feed one sample that is too soft for fixed-point speex */
- pa_assert_se(speex_resampler_process_float(s, 0, &f_in, &in_len,
- &f_out, &out_len) == RESAMPLER_ERR_SUCCESS);
-
- /* expecting sample has been processed, one sample output */
- pa_assert_se(in_len == 1 && out_len == 1);
-
- /* speex compiled with --enable-fixed-point will output 0.0 due to insufficient precision */
- if (fabsf(f_out) < 0.00001f)
- result = true;
-
- speex_resampler_destroy(s);
- } PA_ONCE_END;
-#endif
- return result;
-}
-
/*** copy (noop) implementation ***/
static int copy_init(pa_resampler *r) {
diff --git a/src/pulsecore/resampler.h b/src/pulsecore/resampler.h
index 13d8c35..e3463a2 100644
--- a/src/pulsecore/resampler.h
+++ b/src/pulsecore/resampler.h
@@ -166,4 +166,7 @@ int pa_resampler_peaks_init(pa_resampler *r);
int pa_resampler_speex_init(pa_resampler *r);
int pa_resampler_trivial_init(pa_resampler*r);
+/* Resampler-specific quirks */
+bool pa_speex_is_fixed_point(void);
+
#endif
diff --git a/src/pulsecore/resampler/speex.c b/src/pulsecore/resampler/speex.c
index faeef76..e989c3a 100644
--- a/src/pulsecore/resampler/speex.c
+++ b/src/pulsecore/resampler/speex.c
@@ -24,8 +24,37 @@
#endif
#include <speex/speex_resampler.h>
+#include <math.h>
+
+#include <pulsecore/once.h>
+#include <pulsecore/resampler.h>
+
+bool pa_speex_is_fixed_point(void) {
+ static bool result = false;
+ PA_ONCE_BEGIN {
+ float f_out = -1.0f, f_in = 1.0f;
+ spx_uint32_t in_len = 1, out_len = 1;
+ SpeexResamplerState *s;
+
+ pa_assert_se(s = speex_resampler_init(1, 1, 1,
+ SPEEX_RESAMPLER_QUALITY_MIN, NULL));
+
+ /* feed one sample that is too soft for fixed-point speex */
+ pa_assert_se(speex_resampler_process_float(s, 0, &f_in, &in_len,
+ &f_out, &out_len) == RESAMPLER_ERR_SUCCESS);
+
+ /* expecting sample has been processed, one sample output */
+ pa_assert_se(in_len == 1 && out_len == 1);
+
+ /* speex compiled with --enable-fixed-point will output 0.0 due to insufficient precision */
+ if (fabsf(f_out) < 0.00001f)
+ result = true;
+
+ speex_resampler_destroy(s);
+ } PA_ONCE_END;
+ return result;
+}
-#include "pulsecore/resampler.h"
static unsigned speex_resample_float(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) {
float *in, *out;
--
2.0.4
More information about the pulseaudio-discuss
mailing list