From: Maarten Bosmans Date: Wed, 23 Nov 2011 10:40:08 +0000 (+0100) Subject: resamplers: Optimize trivial resampler X-Git-Tag: 1.0_branch~210 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8539fe9765e5713f9863ab15d0c5b42189f98ae2;p=profile%2Fivi%2Fpulseaudio.git resamplers: Optimize trivial resampler This improves the performance of a typical s16 2ch resampling by 88%. --- diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c index 32a6071..c432a6f 100644 --- a/src/pulsecore/resampler.c +++ b/src/pulsecore/resampler.c @@ -1376,6 +1376,7 @@ static void trivial_resample(pa_resampler *r, const pa_memchunk *input, unsigned pa_assert(input); pa_assert(output); pa_assert(out_n_frames); + pa_assert(r->i_ss.channels == r->o_ss.channels); fz = r->w_sz * r->o_ss.channels; @@ -1391,7 +1392,16 @@ static void trivial_resample(pa_resampler *r, const pa_memchunk *input, unsigned pa_assert_fp(o_index * fz < pa_memblock_get_length(output->memblock)); - memcpy((uint8_t*) dst + fz * o_index, (uint8_t*) src + fz * i_index, (int) fz); + /* Directly assign some common sample sizes, use memcpy as fallback */ + if (r->w_sz == 2) { + for (unsigned c = 0; c < r->o_ss.channels; c++) + ((uint16_t *) dst)[o_index+c] = ((uint16_t *) src)[i_index+c]; + } else if (r->w_sz == 4) { + for (unsigned c = 0; c < r->o_ss.channels; c++) + ((uint32_t *) dst)[o_index+c] = ((uint32_t *) src)[i_index+c]; + } else { + memcpy((uint8_t *) dst + fz * o_index, (uint8_t *) src + fz * i_index, (int) fz); + } } pa_memblock_release(input->memblock);