resample: cleanup the resampler core functions

Move the increment function to a macro.
Don't use extra local variables, we can just as well call the resample
functipon with them.
This commit is contained in:
Wim Taymans 2022-11-20 15:04:02 +01:00
parent bb558b7d95
commit 4c3f56fca1

View file

@ -94,6 +94,14 @@ DEFINE_RESAMPLER(copy,arch) \
*out_len = ooffs; \ *out_len = ooffs; \
} }
#define INC(index,phase,n_phases) \
index += inc; \
phase += frac; \
if (phase >= n_phases) { \
phase -= n_phases; \
index += 1; \
}
#define MAKE_RESAMPLER_FULL(arch) \ #define MAKE_RESAMPLER_FULL(arch) \
DEFINE_RESAMPLER(full,arch) \ DEFINE_RESAMPLER(full,arch) \
{ \ { \
@ -114,17 +122,10 @@ DEFINE_RESAMPLER(full,arch) \
phase = data->phase; \ phase = data->phase; \
\ \
for (o = ooffs; o < olen && index + n_taps <= ilen; o++) { \ for (o = ooffs; o < olen && index + n_taps <= ilen; o++) { \
const float *ip, *taps; \ inner_product_##arch(&d[o], &s[index], \
\ &data->filter[phase * stride], \
ip = &s[index]; \ n_taps); \
taps = &data->filter[phase * stride]; \ INC(index, phase, n_phases); \
index += inc; \
phase += frac; \
if (phase >= n_phases) { \
phase -= n_phases; \
index += 1; \
} \
inner_product_##arch(&d[o], ip, taps, n_taps); \
} \ } \
} \ } \
*in_len = index; \ *in_len = index; \
@ -153,24 +154,13 @@ DEFINE_RESAMPLER(inter,arch) \
phase = data->phase; \ phase = data->phase; \
\ \
for (o = ooffs; o < olen && index + n_taps <= ilen; o++) { \ for (o = ooffs; o < olen && index + n_taps <= ilen; o++) { \
const float *ip, *t0, *t1; \ float ph = (float)phase * n_phases / out_rate; \
float ph, x; \ uint32_t offset = floorf(ph); \
uint32_t offset; \ inner_product_ip_##arch(&d[o], &s[index], \
\ &data->filter[(offset + 0) * stride], \
ip = &s[index]; \ &data->filter[(offset + 1) * stride], \
ph = (float)phase * n_phases / out_rate; \ ph - offset, n_taps); \
offset = floor(ph); \ INC(index, phase, out_rate); \
x = ph - (float)offset; \
\
t0 = &data->filter[(offset + 0) * stride]; \
t1 = &data->filter[(offset + 1) * stride]; \
index += inc; \
phase += frac; \
if (phase >= out_rate) { \
phase -= out_rate; \
index += 1; \
} \
inner_product_ip_##arch(&d[o], ip, t0, t1, x, n_taps); \
} \ } \
} \ } \
*in_len = index; \ *in_len = index; \