mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
resample: use a float phase in update_rate
My making the phase into a float, the resampler can do finer grained adjustments, which should improve the stability of adaptive resampling
This commit is contained in:
parent
764ae650e2
commit
77f6c009c1
2 changed files with 7 additions and 5 deletions
|
|
@ -29,7 +29,7 @@ struct native_data {
|
||||||
uint32_t n_phases;
|
uint32_t n_phases;
|
||||||
uint32_t in_rate;
|
uint32_t in_rate;
|
||||||
uint32_t out_rate;
|
uint32_t out_rate;
|
||||||
uint32_t phase;
|
float phase;
|
||||||
uint32_t inc;
|
uint32_t inc;
|
||||||
uint32_t frac;
|
uint32_t frac;
|
||||||
uint32_t filter_stride;
|
uint32_t filter_stride;
|
||||||
|
|
@ -117,11 +117,12 @@ DEFINE_RESAMPLER(full,arch) \
|
||||||
DEFINE_RESAMPLER(inter,arch) \
|
DEFINE_RESAMPLER(inter,arch) \
|
||||||
{ \
|
{ \
|
||||||
struct native_data *data = r->data; \
|
struct native_data *data = r->data; \
|
||||||
uint32_t index, phase, stride = data->filter_stride; \
|
uint32_t index, stride = data->filter_stride; \
|
||||||
uint32_t n_phases = data->n_phases, out_rate = data->out_rate; \
|
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; \
|
||||||
uint32_t c, o, olen = *out_len, ilen = *in_len; \
|
uint32_t c, o, olen = *out_len, ilen = *in_len; \
|
||||||
uint32_t inc = data->inc, frac = data->frac; \
|
uint32_t inc = data->inc, frac = data->frac; \
|
||||||
|
float phase; \
|
||||||
\
|
\
|
||||||
if (r->channels == 0) \
|
if (r->channels == 0) \
|
||||||
return; \
|
return; \
|
||||||
|
|
@ -134,7 +135,7 @@ 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++) { \
|
||||||
float ph = (float)phase * n_phases / out_rate; \
|
float ph = phase * n_phases / out_rate; \
|
||||||
uint32_t offset = floorf(ph); \
|
uint32_t offset = floorf(ph); \
|
||||||
inner_product_ip_##arch(&d[o], &s[index], \
|
inner_product_ip_##arch(&d[o], &s[index], \
|
||||||
&data->filter[(offset + 0) * stride], \
|
&data->filter[(offset + 0) * stride], \
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,8 @@ static inline uint32_t calc_gcd(uint32_t a, uint32_t b)
|
||||||
static void impl_native_update_rate(struct resample *r, double rate)
|
static void impl_native_update_rate(struct resample *r, double rate)
|
||||||
{
|
{
|
||||||
struct native_data *data = r->data;
|
struct native_data *data = r->data;
|
||||||
uint32_t in_rate, out_rate, phase, gcd, old_out_rate;
|
uint32_t in_rate, out_rate, gcd, old_out_rate;
|
||||||
|
float phase;
|
||||||
|
|
||||||
if (SPA_LIKELY(data->rate == rate))
|
if (SPA_LIKELY(data->rate == rate))
|
||||||
return;
|
return;
|
||||||
|
|
@ -149,7 +150,7 @@ static void impl_native_update_rate(struct resample *r, double rate)
|
||||||
out_rate /= gcd;
|
out_rate /= gcd;
|
||||||
|
|
||||||
data->rate = rate;
|
data->rate = rate;
|
||||||
data->phase = phase * out_rate / old_out_rate;
|
data->phase = phase * out_rate / (float)old_out_rate;
|
||||||
data->in_rate = in_rate;
|
data->in_rate = in_rate;
|
||||||
data->out_rate = out_rate;
|
data->out_rate = out_rate;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue