From 0b0912cc5b716a3887c6f261d92f16b52cad46b2 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 23 Jul 2025 14:11:11 +0200 Subject: [PATCH] resample: optimize phase scaling Precalculate the constant factor to avoid a division for each sample. --- spa/plugins/audioconvert/resample-native-impl.h | 12 ++++++------ spa/plugins/audioconvert/resample-native.c | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spa/plugins/audioconvert/resample-native-impl.h b/spa/plugins/audioconvert/resample-native-impl.h index 02cb501a6..023b350d7 100644 --- a/spa/plugins/audioconvert/resample-native-impl.h +++ b/spa/plugins/audioconvert/resample-native-impl.h @@ -30,6 +30,7 @@ struct native_data { uint32_t in_rate; uint32_t out_rate; float phase; + float pm; uint32_t inc; uint32_t frac; uint32_t filter_stride; @@ -85,7 +86,7 @@ DEFINE_RESAMPLER(full,arch) \ { \ struct native_data *data = r->data; \ uint32_t n_taps = data->n_taps, stride = data->filter_stride_os; \ - uint32_t index, phase, n_phases = data->out_rate; \ + uint32_t index, phase, out_rate = data->out_rate; \ uint32_t c, o, olen = *out_len, ilen = *in_len; \ uint32_t inc = data->inc, frac = data->frac, ch = r->channels; \ \ @@ -99,7 +100,7 @@ DEFINE_RESAMPLER(full,arch) \ inner_product_##arch(&d[o], &s[index], \ filter, n_taps); \ } \ - INC(index, phase, n_phases); \ + INC(index, phase, out_rate); \ } \ *in_len = index; \ *out_len = o; \ @@ -111,16 +112,15 @@ DEFINE_RESAMPLER(inter,arch) \ { \ struct native_data *data = r->data; \ uint32_t index, stride = data->filter_stride; \ - uint32_t n_phases = data->n_phases, out_rate = data->out_rate; \ - uint32_t n_taps = data->n_taps; \ + uint32_t n_taps = data->n_taps, out_rate = data->out_rate; \ uint32_t c, o, olen = *out_len, ilen = *in_len; \ uint32_t inc = data->inc, frac = data->frac, ch = r->channels; \ - float phase; \ + float phase, pm = data->pm; \ \ index = ioffs; \ phase = data->phase; \ for (o = ooffs; o < olen && index + n_taps <= ilen; o++) { \ - float ph = phase * n_phases / out_rate; \ + float ph = phase * pm; \ uint32_t offset = (uint32_t)floorf(ph); \ float *filter0 = &data->filter[(offset+0) * stride]; \ float *filter1 = &data->filter[(offset+1) * stride]; \ diff --git a/spa/plugins/audioconvert/resample-native.c b/spa/plugins/audioconvert/resample-native.c index b91d87115..a3c812c28 100644 --- a/spa/plugins/audioconvert/resample-native.c +++ b/spa/plugins/audioconvert/resample-native.c @@ -388,6 +388,7 @@ int resample_native_init(struct resample *r) d->in_rate = in_rate; d->out_rate = out_rate; d->gcd = gcd; + d->pm = (float)n_phases / r->o_rate; d->filter = SPA_PTROFF_ALIGN(d, sizeof(struct native_data), 64, float); d->hist_mem = SPA_PTROFF_ALIGN(d->filter, filter_size, 64, float); d->history = SPA_PTROFF(d->hist_mem, history_size, float*);