When Speex is compiled with FIXED_POINT defined, it scales float input
to ±32768 instead of ±1. In order to make floating point resampler
work with speex compiled with FIXED_POINT, we need to rescale the input
to speex. This rescaling does not hurt normal speex, so we do it
unconditionally.

Signed-off-by: Alexander E. Patrakov <[email protected]>
Reported-by: Fahad Arslan <[email protected]>
Original-author: Peter Meerwald <[email protected]>
Cc: Damir Jelić <[email protected]>
Cc: Peter Meerwald <[email protected]>
---
 src/pulsecore/resampler.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index 1153281..fca6887 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -1473,9 +1473,11 @@ static int libsamplerate_init(pa_resampler *r) {
 /*** speex based implementation ***/
 
 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;
+    pa_memblock *b;
+    float *in, *out, *t;
     uint32_t inf = in_n_frames, outf = *out_n_frames;
     SpeexResamplerState *state;
+    unsigned i, nsamples;
 
     pa_assert(r);
     pa_assert(input);
@@ -1484,12 +1486,29 @@ static unsigned speex_resample_float(pa_resampler *r, 
const pa_memchunk *input,
 
     state = r->impl.data;
 
+    nsamples = r->work_channels * in_n_frames;
+    b = pa_memblock_new(r->mempool, nsamples * sizeof(float));
+    t = pa_memblock_acquire(b);
+
     in = pa_memblock_acquire_chunk(input);
-    out = pa_memblock_acquire_chunk(output);
 
-    pa_assert_se(speex_resampler_process_interleaved_float(state, in, &inf, 
out, &outf) == 0);
+    for (i = 0; i < nsamples; i++)
+        t[i] = 32768.0f * in[i];
 
     pa_memblock_release(input->memblock);
+
+    out = pa_memblock_acquire_chunk(output);
+
+    pa_assert_se(speex_resampler_process_interleaved_float(state, t, &inf, 
out, &outf) == 0);
+
+    pa_memblock_release(b);
+    pa_memblock_unref(b);
+
+    nsamples = r->work_channels * outf;
+
+    for (i = 0; i < nsamples; i++)
+        out[i] = out[i] * (1.0f / 32768.0f);
+
     pa_memblock_release(output->memblock);
 
     pa_assert(inf == in_n_frames);
-- 
1.9.2

_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to