From a6a7b3ab544da05dfd50def642c61da15c6fee21 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 8 Jul 2019 18:26:08 +0200 Subject: [PATCH] resample: add functions to calculate in/out length Add test for this as well --- spa/plugins/audioconvert/resample-native.h | 14 ++++++ spa/plugins/audioconvert/resample.h | 4 ++ spa/plugins/audioconvert/test-resample.c | 58 ++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/spa/plugins/audioconvert/resample-native.h b/spa/plugins/audioconvert/resample-native.h index c13332b6b..f13a39535 100644 --- a/spa/plugins/audioconvert/resample-native.h +++ b/spa/plugins/audioconvert/resample-native.h @@ -134,6 +134,19 @@ static void impl_native_update_rate(struct resample *r, double rate) } } +static uint32_t impl_native_in_len(struct resample *r, uint32_t out_len) +{ + struct native_data *data = r->data; \ + uint32_t in_len; + + in_len = (data->phase + out_len * data->frac) / data->out_rate; + in_len += out_len * data->inc + (data->n_taps - data->hist); + + spa_log_trace_fp(r->log, "native %p: hist:%d %d->%d", r, data->hist, out_len, in_len); + + return in_len; +} + static void impl_native_process(struct resample *r, const void * SPA_RESTRICT src[], uint32_t *in_len, void * SPA_RESTRICT dst[], uint32_t *out_len) @@ -245,6 +258,7 @@ static int impl_native_init(struct resample *r) r->free = impl_native_free; r->update_rate = impl_native_update_rate; + r->in_len = impl_native_in_len; r->process = impl_native_process; r->reset = impl_native_reset; r->delay = impl_native_delay; diff --git a/spa/plugins/audioconvert/resample.h b/spa/plugins/audioconvert/resample.h index 0da5d1f20..06a855823 100644 --- a/spa/plugins/audioconvert/resample.h +++ b/spa/plugins/audioconvert/resample.h @@ -38,6 +38,8 @@ struct resample { void (*free) (struct resample *r); void (*update_rate) (struct resample *r, double rate); + uint32_t (*in_len) (struct resample *r, uint32_t out_len); + uint32_t (*out_len) (struct resample *r, uint32_t in_len); void (*process) (struct resample *r, const void * SPA_RESTRICT src[], uint32_t *in_len, void * SPA_RESTRICT dst[], uint32_t *out_len); @@ -48,6 +50,8 @@ struct resample { #define resample_free(r) (r)->free(r) #define resample_update_rate(r,...) (r)->update_rate(r,__VA_ARGS__) +#define resample_in_len(r,...) (r)->in_len(r,__VA_ARGS__) +#define resample_out_len(r,...) (r)->out_len(r,__VA_ARGS__) #define resample_process(r,...) (r)->process(r,__VA_ARGS__) #define resample_reset(r) (r)->reset(r) #define resample_delay(r) (r)->delay(r) diff --git a/spa/plugins/audioconvert/test-resample.c b/spa/plugins/audioconvert/test-resample.c index 43a7129b2..b5464beb8 100644 --- a/spa/plugins/audioconvert/test-resample.c +++ b/spa/plugins/audioconvert/test-resample.c @@ -81,9 +81,67 @@ static void test_native(void) feed_1(&r); } +static void pull_blocks(struct resample *r, uint32_t size) +{ + uint32_t i; + float in[size]; + float out[size]; + const void *src[1]; + void *dst[1]; + uint32_t in_len, out_len; + uint32_t pin_len, pout_len; + + src[0] = in; + dst[0] = out; + + for (i = 0; i < 500; i++) { + pout_len = out_len = size; + pin_len = in_len = resample_in_len(r, out_len); + + resample_process(r, src, &pin_len, dst, &pout_len); + + fprintf(stderr, "%d: %d %d %d %d %d\n", i, + in_len, pin_len, out_len, pout_len, + resample_in_len(r, size)); + + spa_assert(in_len == pin_len + resample_delay(r)); + spa_assert(out_len == pout_len); + } +} + +static void test_in_len(void) +{ + struct resample r; + + spa_zero(r); + r.channels = 1; + r.i_rate = 32000; + r.o_rate = 48000; + impl_native_init(&r); + + pull_blocks(&r, 1024); + + spa_zero(r); + r.channels = 1; + r.i_rate = 44100; + r.o_rate = 48000; + impl_native_init(&r); + + pull_blocks(&r, 1024); + + spa_zero(r); + r.channels = 1; + r.i_rate = 48000; + r.o_rate = 44100; + impl_native_init(&r); + + pull_blocks(&r, 1024); +} + int main(int argc, char *argv[]) { test_native(); + test_in_len(); return 0; }