|
|
|
@ -61,6 +61,27 @@ static void SET_TYPE(resample_nearest)(void *dst0, int dst_index, const void *sr |
|
|
|
|
dst[dst_index] = src[index]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void SET_TYPE(resample_linear)(ResampleContext *c, void *dst0, int dst_index, |
|
|
|
|
const void *src0, unsigned int index, int frac) |
|
|
|
|
{ |
|
|
|
|
FELEM *dst = dst0; |
|
|
|
|
const FELEM *src = src0; |
|
|
|
|
int i; |
|
|
|
|
unsigned int sample_index = index >> c->phase_shift; |
|
|
|
|
FELEM2 val = 0; |
|
|
|
|
FELEM *filter = ((FELEM *)c->filter_bank) + |
|
|
|
|
c->filter_length * (index & c->phase_mask); |
|
|
|
|
FELEM2 v2 = 0; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < c->filter_length; i++) { |
|
|
|
|
val += src[sample_index + i] * (FELEM2)filter[i]; |
|
|
|
|
v2 += src[sample_index + i] * (FELEM2)filter[i + c->filter_length]; |
|
|
|
|
} |
|
|
|
|
val += (v2 - val) * (FELEML)frac / c->src_incr; |
|
|
|
|
|
|
|
|
|
OUT(dst[dst_index], val); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void SET_TYPE(resample_one)(ResampleContext *c, |
|
|
|
|
void *dst0, int dst_index, const void *src0, |
|
|
|
|
unsigned int index, int frac) |
|
|
|
@ -73,17 +94,8 @@ static void SET_TYPE(resample_one)(ResampleContext *c, |
|
|
|
|
FELEM *filter = ((FELEM *)c->filter_bank) + |
|
|
|
|
c->filter_length * (index & c->phase_mask); |
|
|
|
|
|
|
|
|
|
if (c->linear) { |
|
|
|
|
FELEM2 v2 = 0; |
|
|
|
|
for (i = 0; i < c->filter_length; i++) { |
|
|
|
|
val += src[sample_index + i] * (FELEM2)filter[i]; |
|
|
|
|
v2 += src[sample_index + i] * (FELEM2)filter[i + c->filter_length]; |
|
|
|
|
} |
|
|
|
|
val += (v2 - val) * (FELEML)frac / c->src_incr; |
|
|
|
|
} else { |
|
|
|
|
for (i = 0; i < c->filter_length; i++) |
|
|
|
|
val += src[sample_index + i] * (FELEM2)filter[i]; |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < c->filter_length; i++) |
|
|
|
|
val += src[sample_index + i] * (FELEM2)filter[i]; |
|
|
|
|
|
|
|
|
|
OUT(dst[dst_index], val); |
|
|
|
|
} |
|
|
|
|