Lines Matching +full:first +full:- +full:conversion +full:- +full:delay
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
36 * - http://ccrma.stanford.edu/~jos/resample/
39 * + all out fixed point integer operations, no soft-float or anything like
48 * - The z, z_, and Z_ . Due to mental block (or maybe just 0x7a69), I
124 int32_t bps; /* bytes-per-sample */
129 uint8_t *z_delay; /* FIR delay line / linear buffer */
140 int32_t z_mask; /* delay line full length mask */
142 int32_t z_full; /* full size of delay line */
143 int32_t z_alloc; /* largest allocated full size of delay line */
164 &feeder_rate_presets, 0, "compile-time rate presets");
176 if (err != 0 || req->newptr == NULL || val == feeder_rate_min) in sysctl_hw_snd_feeder_rate_min()
199 if (err != 0 || req->newptr == NULL || val == feeder_rate_max) in sysctl_hw_snd_feeder_rate_max()
222 if (err != 0 || req->newptr == NULL || val == feeder_rate_round) in sysctl_hw_snd_feeder_rate_round()
228 feeder_rate_round = val - (val % Z_ROUNDHZ); in sysctl_hw_snd_feeder_rate_round()
248 if (err != 0 || req->newptr == NULL || val == feeder_rate_quality) in sysctl_hw_snd_feeder_rate_quality()
273 if (f == NULL || f->data == NULL || CHN_STARTED(c)) { in sysctl_hw_snd_feeder_rate_quality()
297 #define Z_IS_ZOH(i) ((i)->quality == Z_QUALITY_ZOH)
298 #define Z_IS_LINEAR(i) ((i)->quality == Z_QUALITY_LINEAR)
299 #define Z_IS_SINC(i) ((i)->quality > Z_QUALITY_LINEAR)
309 * sample-time.
348 Z_DIV(((_Z_GCAST((i)->z_gx) * (v)) + ((i)->z_gy - (a) - 1)), \
349 (i)->z_gy)
352 Z_DIV(((_Z_GCAST((i)->z_gy) * (v)) + (a)), (i)->z_gx)
355 ((_Z_GCAST((i)->z_gy) * (x)) - (_Z_GCAST((i)->z_gx) * (y)))
357 #define z_gy2gx(i, v) _Z_GY2GX(i, (i)->z_alpha, v)
358 #define z_gx2gy(i, v) _Z_GX2GY(i, (i)->z_alpha, v)
364 #define Z_SINC_COEFF_IDX(i) ((i)->quality - Z_QUALITY_LINEAR - 1)
368 Z_SHIFT) / (i)->z_dy))
371 ((z_coeff_tab[Z_SINC_COEFF_IDX(i)].len - 1) >> (Z_DRIFT_SHIFT - 1))
374 * Macroses for linear delay buffer operations. Alignment is not
380 #define z_align(i, v) ((v) & (i)->z_mask)
382 #define z_prev(i, o, v) z_align(i, (o) - (v))
383 #define z_fetched(i) (z_align(i, (i)->z_pos - (i)->z_start) - 1)
384 #define z_free(i) ((i)->z_full - (i)->z_pos)
439 cnt = info->channels * info->bps; in z_feed_zoh()
440 src = info->z_delay + (info->z_start * cnt); in z_feed_zoh()
448 } while (--cnt != 0); in z_feed_zoh()
467 z = ((uint32_t)info->z_alpha * info->z_dx) >> Z_LINEAR_UNSHIFT; \
469 sx = info->z_delay + (info->z_start * info->channels * \
471 sy = sx - (info->channels * PCM_##BIT##_BPS); \
473 ch = info->channels; \
483 } while (--ch != 0); \
519 z += info->z_dy; \
520 p adv##= info->channels * PCM_##BIT##_BPS
548 z_coeff = info->z_coeff; \
549 z_dcoeff = info->z_dcoeff; \
550 center = z_prev(info, info->z_start, info->z_size); \
551 ch = info->channels * PCM_##BIT##_BPS; \
555 dst -= PCM_##BIT##_BPS; \
556 ch -= PCM_##BIT##_BPS; \
558 z = info->z_alpha * info->z_dx; \
560 p = info->z_delay + (z_next(info, center, 1) * \
561 info->channels * PCM_##BIT##_BPS) + ch; \
562 for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \
564 z = info->z_dy - (info->z_alpha * info->z_dx); \
566 p = info->z_delay + (center * info->channels * \
568 for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \
569 Z_SINC_ACCUMULATE(SIGN, BIT, ENDIAN, -); \
570 if (info->z_scale != Z_ONE) \
571 v = Z_SCALE_##BIT(v, info->z_scale); \
573 v >>= Z_COEFF_SHIFT - Z_GUARD_BIT_##BIT; \
589 ch = info->channels * PCM_##BIT##_BPS; \
591 start = z_prev(info, info->z_start, (info->z_size << 1) - 1) * ch; \
594 dst -= PCM_##BIT##_BPS; \
595 ch -= PCM_##BIT##_BPS; \
597 p = info->z_delay + start + ch; \
598 z_pcoeff = info->z_pcoeff + \
599 ((info->z_alpha * info->z_size) << 1); \
600 for (i = info->z_size; i != 0; i--) { \
604 p += info->channels * PCM_##BIT##_BPS; \
608 p += info->channels * PCM_##BIT##_BPS; \
610 if (info->z_scale != Z_ONE) \
611 v = Z_SCALE_##BIT(v, info->z_scale); \
613 v >>= Z_COEFF_SHIFT - Z_GUARD_BIT_##BIT; \
657 (Z_IS_SINC(i) ? Z_RESAMPLER_SINC : (i)->quality)
706 info->src = info->rsrc - (info->rsrc % ((feeder_rate_round > 0 && in z_resampler_reset()
707 info->rsrc > feeder_rate_round) ? feeder_rate_round : 1)); in z_resampler_reset()
708 info->dst = info->rdst - (info->rdst % ((feeder_rate_round > 0 && in z_resampler_reset()
709 info->rdst > feeder_rate_round) ? feeder_rate_round : 1)); in z_resampler_reset()
710 info->z_gx = 1; in z_resampler_reset()
711 info->z_gy = 1; in z_resampler_reset()
712 info->z_alpha = 0; in z_resampler_reset()
713 info->z_resample = NULL; in z_resampler_reset()
714 info->z_size = 1; in z_resampler_reset()
715 info->z_coeff = NULL; in z_resampler_reset()
716 info->z_dcoeff = NULL; in z_resampler_reset()
717 if (info->z_pcoeff != NULL) { in z_resampler_reset()
718 free(info->z_pcoeff, M_DEVBUF); in z_resampler_reset()
719 info->z_pcoeff = NULL; in z_resampler_reset()
721 info->z_scale = Z_ONE; in z_resampler_reset()
722 info->z_dx = Z_FULL_ONE; in z_resampler_reset()
723 info->z_dy = Z_FULL_ONE; in z_resampler_reset()
725 info->z_cycle = 0; in z_resampler_reset()
727 if (info->quality < Z_QUALITY_MIN) in z_resampler_reset()
728 info->quality = Z_QUALITY_MIN; in z_resampler_reset()
729 else if (info->quality > Z_QUALITY_MAX) in z_resampler_reset()
730 info->quality = Z_QUALITY_MAX; in z_resampler_reset()
748 z = info->z_dy; in z_resampler_sinc_len()
755 z += info->z_dy; in z_resampler_sinc_len()
765 return (-1); in z_resampler_sinc_len()
809 * "Polynomial Interpolators for High-Quality Resampling of Oversampled Audio"
811 * - http://www.student.oulu.fi/~oniemita/dsp/deip.pdf
820 /* 1-point, 0th-order (Zero Order Hold) */ in z_coeff_interpolate()
826 /* 2-point, 1st-order Linear */ in z_coeff_interpolate()
828 zl1 = z_coeff[1] - z_coeff[0]; in z_coeff_interpolate()
834 /* 3-point, 2nd-order Quadratic */ in z_coeff_interpolate()
836 zq1 = z_coeff[1] - z_coeff[-1]; in z_coeff_interpolate()
837 zq2 = z_coeff[1] + z_coeff[-1] - (z_coeff[0] << 1); in z_coeff_interpolate()
844 /* 4-point, 3rd-order Hermite */ in z_coeff_interpolate()
846 zh1 = z_coeff[1] - z_coeff[-1]; in z_coeff_interpolate()
847 zh2 = (z_coeff[-1] << 1) - (z_coeff[0] * 5) + (z_coeff[1] << 2) - in z_coeff_interpolate()
849 zh3 = z_coeff[2] - z_coeff[-1] + ((z_coeff[0] - z_coeff[1]) * 3); in z_coeff_interpolate()
856 /* 4-point, 3rd-order B-Spline */ in z_coeff_interpolate()
858 z_coeff[-1] + z_coeff[1]), 30); in z_coeff_interpolate()
859 zb1 = z_coeff[1] - z_coeff[-1]; in z_coeff_interpolate()
860 zb2 = z_coeff[-1] + z_coeff[1] - (z_coeff[0] << 1); in z_coeff_interpolate()
861 zb3 = Z_RSHIFT(0x15555555LL * (((z_coeff[0] - z_coeff[1]) * 3) + in z_coeff_interpolate()
862 z_coeff[2] - z_coeff[-1]), 30); in z_coeff_interpolate()
870 /* 6-point, 5th-order Optimal 32x */ in z_coeff_interpolate()
871 zoz = z - (Z_ONE >> 1); in z_coeff_interpolate()
873 zoe2 = z_coeff[2] + z_coeff[-1]; in z_coeff_interpolate()
874 zoe3 = z_coeff[3] + z_coeff[-2]; in z_coeff_interpolate()
875 zoo1 = z_coeff[1] - z_coeff[0]; in z_coeff_interpolate()
876 zoo2 = z_coeff[2] - z_coeff[-1]; in z_coeff_interpolate()
877 zoo3 = z_coeff[3] - z_coeff[-2]; in z_coeff_interpolate()
883 zoc2 = Z_RSHIFT((-0x0d3e94a4LL * zoe1) + (0x0bddded4LL * zoe2) + in z_coeff_interpolate()
885 zoc3 = Z_RSHIFT((-0x0de10cc4LL * zoo1) + (0x019b2a7dLL * zoo2) + in z_coeff_interpolate()
887 zoc4 = Z_RSHIFT((0x02aa12d7LL * zoe1) + (-0x03ff1bb3LL * zoe2) + in z_coeff_interpolate()
889 zoc5 = Z_RSHIFT((0x051d29e5LL * zoo1) + (-0x028e7647LL * zoo2) + in z_coeff_interpolate()
900 /* 6-point, 5th-order Optimal 16x */ in z_coeff_interpolate()
901 zoz = z - (Z_ONE >> 1); in z_coeff_interpolate()
903 zoe2 = z_coeff[2] + z_coeff[-1]; in z_coeff_interpolate()
904 zoe3 = z_coeff[3] + z_coeff[-2]; in z_coeff_interpolate()
905 zoo1 = z_coeff[1] - z_coeff[0]; in z_coeff_interpolate()
906 zoo2 = z_coeff[2] - z_coeff[-1]; in z_coeff_interpolate()
907 zoo3 = z_coeff[3] - z_coeff[-2]; in z_coeff_interpolate()
913 zoc2 = Z_RSHIFT((-0x0d3e94a4LL * zoe1) + (0x0bddded4LL * zoe2) + in z_coeff_interpolate()
915 zoc3 = Z_RSHIFT((-0x0de10cc4LL * zoo1) + (0x019b2a7dLL * zoo2) + in z_coeff_interpolate()
917 zoc4 = Z_RSHIFT((0x02aa12d7LL * zoe1) + (-0x03ff1bb3LL * zoe2) + in z_coeff_interpolate()
919 zoc5 = Z_RSHIFT((0x051d29e5LL * zoo1) + (-0x028e7647LL * zoo2) + in z_coeff_interpolate()
930 /* 6-point, 5th-order Optimal 8x */ in z_coeff_interpolate()
931 zoz = z - (Z_ONE >> 1); in z_coeff_interpolate()
933 zoe2 = z_coeff[2] + z_coeff[-1]; in z_coeff_interpolate()
934 zoe3 = z_coeff[3] + z_coeff[-2]; in z_coeff_interpolate()
935 zoo1 = z_coeff[1] - z_coeff[0]; in z_coeff_interpolate()
936 zoo2 = z_coeff[2] - z_coeff[-1]; in z_coeff_interpolate()
937 zoo3 = z_coeff[3] - z_coeff[-2]; in z_coeff_interpolate()
943 zoc2 = Z_RSHIFT((-0x0d22530bLL * zoe1) + (0x0bb37a2cLL * zoe2) + in z_coeff_interpolate()
945 zoc3 = Z_RSHIFT((-0x0d744b1cLL * zoo1) + (0x01649591LL * zoo2) + in z_coeff_interpolate()
947 zoc4 = Z_RSHIFT((0x02a7ee1bLL * zoe1) + (-0x03fbdb24LL * zoe2) + in z_coeff_interpolate()
949 zoc5 = Z_RSHIFT((0x04cf9b6cLL * zoo1) + (-0x0266b378LL * zoo2) + in z_coeff_interpolate()
960 /* 6-point, 5th-order Optimal 4x */ in z_coeff_interpolate()
961 zoz = z - (Z_ONE >> 1); in z_coeff_interpolate()
963 zoe2 = z_coeff[2] + z_coeff[-1]; in z_coeff_interpolate()
964 zoe3 = z_coeff[3] + z_coeff[-2]; in z_coeff_interpolate()
965 zoo1 = z_coeff[1] - z_coeff[0]; in z_coeff_interpolate()
966 zoo2 = z_coeff[2] - z_coeff[-1]; in z_coeff_interpolate()
967 zoo3 = z_coeff[3] - z_coeff[-2]; in z_coeff_interpolate()
973 zoc2 = Z_RSHIFT((-0x0d026821LL * zoe1) + (0x0b837773LL * zoe2) + in z_coeff_interpolate()
975 zoc3 = Z_RSHIFT((-0x0cef1502LL * zoo1) + (0x01207a8eLL * zoo2) + in z_coeff_interpolate()
977 zoc4 = Z_RSHIFT((0x029fe643LL * zoe1) + (-0x03ef3fc8LL * zoe2) + in z_coeff_interpolate()
979 zoc5 = Z_RSHIFT((0x043a9d08LL * zoo1) + (-0x02154febLL * zoo2) + in z_coeff_interpolate()
990 /* 6-point, 5th-order Optimal 2x */ in z_coeff_interpolate()
991 zoz = z - (Z_ONE >> 1); in z_coeff_interpolate()
993 zoe2 = z_coeff[2] + z_coeff[-1]; in z_coeff_interpolate()
994 zoe3 = z_coeff[3] + z_coeff[-2]; in z_coeff_interpolate()
995 zoo1 = z_coeff[1] - z_coeff[0]; in z_coeff_interpolate()
996 zoo2 = z_coeff[2] - z_coeff[-1]; in z_coeff_interpolate()
997 zoo3 = z_coeff[3] - z_coeff[-2]; in z_coeff_interpolate()
1003 zoc2 = Z_RSHIFT((-0x0c3ee068LL * zoe1) + (0x0a5c3769LL * zoe2) + in z_coeff_interpolate()
1005 zoc3 = Z_RSHIFT((-0x0a8ab614LL * zoo1) + (-0x0019522eLL * zoo2) + in z_coeff_interpolate()
1007 zoc4 = Z_RSHIFT((0x0276187dLL * zoe1) + (-0x03a801e8LL * zoe2) + in z_coeff_interpolate()
1009 zoc5 = Z_RSHIFT((0x02c373f5LL * zoo1) + (-0x01275f83LL * zoo2) + in z_coeff_interpolate()
1031 /* Let this be here first. */ in z_resampler_build_polyphase()
1032 if (info->z_pcoeff != NULL) { in z_resampler_build_polyphase()
1033 free(info->z_pcoeff, M_DEVBUF); in z_resampler_build_polyphase()
1034 info->z_pcoeff = NULL; in z_resampler_build_polyphase()
1040 if (((int64_t)info->z_size * info->z_gy * 2) > in z_resampler_build_polyphase()
1044 info->z_gx, info->z_gy, in z_resampler_build_polyphase()
1045 (intmax_t)info->z_size * info->z_gy * 2, in z_resampler_build_polyphase()
1051 info->z_pcoeff = malloc(sizeof(int32_t) * in z_resampler_build_polyphase()
1052 info->z_size * info->z_gy * 2, M_DEVBUF, M_NOWAIT | M_ZERO); in z_resampler_build_polyphase()
1053 if (info->z_pcoeff == NULL) in z_resampler_build_polyphase()
1056 for (alpha = 0; alpha < info->z_gy; alpha++) { in z_resampler_build_polyphase()
1057 z = alpha * info->z_dx; in z_resampler_build_polyphase()
1059 for (i = info->z_size; i != 0; i--) { in z_resampler_build_polyphase()
1062 idx = (alpha * info->z_size * 2) + in z_resampler_build_polyphase()
1063 (info->z_size * 2) - i; in z_resampler_build_polyphase()
1064 info->z_pcoeff[idx] = in z_resampler_build_polyphase()
1065 z_coeff_interpolate(z, info->z_coeff + c); in z_resampler_build_polyphase()
1066 z += info->z_dy; in z_resampler_build_polyphase()
1068 z = info->z_dy - (alpha * info->z_dx); in z_resampler_build_polyphase()
1070 for (i = info->z_size; i != 0; i--) { in z_resampler_build_polyphase()
1073 idx = (alpha * info->z_size * 2) + i - 1; in z_resampler_build_polyphase()
1074 info->z_pcoeff[idx] = in z_resampler_build_polyphase()
1075 z_coeff_interpolate(z, info->z_coeff + c); in z_resampler_build_polyphase()
1076 z += info->z_dy; in z_resampler_build_polyphase()
1082 info->z_gx, info->z_gy, info->z_size * info->z_gy * 2); in z_resampler_build_polyphase()
1097 info = f->data; in z_resampler_setup()
1100 if (info->src == info->dst) in z_resampler_setup()
1104 i = z_gcd(info->src, info->dst); in z_resampler_setup()
1105 info->z_gx = info->src / i; in z_resampler_setup()
1106 info->z_gy = info->dst / i; in z_resampler_setup()
1109 if (!(Z_FACTOR_SAFE(info->z_gx) && Z_FACTOR_SAFE(info->z_gy))) in z_resampler_setup()
1112 format = f->desc->in; in z_resampler_setup()
1117 * Setup everything: filter length, conversion factor, etc. in z_resampler_setup()
1126 if (info->z_gx > info->z_gy) in z_resampler_setup()
1129 * enable semi-adaptive mode. Although handling in z_resampler_setup()
1131 * conversion is just pointless, unworthy, in z_resampler_setup()
1134 if ((info->z_gx / info->z_gy) > Z_SINC_DOWNMAX) in z_resampler_setup()
1137 z_scale = ((uint64_t)info->z_gy << Z_SHIFT) / in z_resampler_setup()
1138 info->z_gx; in z_resampler_setup()
1157 if (info->z_pcoeff != NULL) { in z_resampler_setup()
1158 free(info->z_pcoeff, M_DEVBUF); in z_resampler_setup()
1159 info->z_pcoeff = NULL; in z_resampler_setup()
1163 info->z_dy = z_scale << Z_DRIFT_SHIFT; in z_resampler_setup()
1164 if (info->z_dy < 1) in z_resampler_setup()
1166 info->z_scale = z_scale; in z_resampler_setup()
1168 info->z_dy = Z_FULL_ONE; in z_resampler_setup()
1169 info->z_scale = Z_ONE; in z_resampler_setup()
1173 info->z_dx = info->z_dy / info->z_gy; in z_resampler_setup()
1179 if (info->z_dx < 1) { in z_resampler_setup()
1190 info->z_dy = info->z_dx * info->z_gy; in z_resampler_setup()
1201 info->z_size = z_resampler_sinc_len(info); in z_resampler_setup()
1207 info->z_size &= ~1; in z_resampler_setup()
1209 if (info->z_size < 2 || info->z_size > Z_SINC_MAX) { in z_resampler_setup()
1216 info->z_coeff = z_coeff_tab[i].coeff + Z_COEFF_OFFSET; in z_resampler_setup()
1217 info->z_dcoeff = z_coeff_tab[i].dcoeff; in z_resampler_setup()
1221 if (info->z_coeff == NULL || info->z_dcoeff == NULL) in z_resampler_setup()
1229 info->z_dx = Z_LINEAR_FULL_ONE / info->z_gy; in z_resampler_setup()
1246 info->z_resample = z_resampler_tab[i].resampler[ridx]; in z_resampler_setup()
1250 if (info->z_resample == NULL) in z_resampler_setup()
1253 info->bps = AFMT_BPS(format); in z_resampler_setup()
1254 align = info->channels * info->bps; in z_resampler_setup()
1265 * Now that is damn confusing, I guess ;-) . in z_resampler_setup()
1267 gy2gx_max = (((uint64_t)info->z_gy * INT32_MAX) - info->z_gy + 1) / in z_resampler_setup()
1268 info->z_gx; in z_resampler_setup()
1276 gx2gy_max = (((uint64_t)info->z_gx * INT32_MAX) - info->z_gy) / in z_resampler_setup()
1277 info->z_gy; in z_resampler_setup()
1293 info->z_maxfeed = gy2gx_max * align; in z_resampler_setup()
1296 info->z_startdrift = z_gy2gx(info, 1); in z_resampler_setup()
1297 info->z_alphadrift = z_drift(info, info->z_startdrift, 1); in z_resampler_setup()
1301 info->z_full = z_roundpow2((info->z_size << 1) + i); in z_resampler_setup()
1306 if ((info->z_full * align) < 1) { in z_resampler_setup()
1316 * buffer shifting in main conversion/feeder loop. in z_resampler_setup()
1318 while (info->z_full < Z_RESERVOIR_MAX && in z_resampler_setup()
1319 (info->z_full - (info->z_size << 1)) < Z_RESERVOIR) in z_resampler_setup()
1320 info->z_full <<= 1; in z_resampler_setup()
1323 info->z_mask = info->z_full - 1; in z_resampler_setup()
1324 info->z_start = z_prev(info, info->z_size << 1, 1); in z_resampler_setup()
1325 info->z_pos = z_next(info, info->z_start, 1); in z_resampler_setup()
1328 * Allocate or reuse delay line buffer, whichever makes sense. in z_resampler_setup()
1330 i = info->z_full * align; in z_resampler_setup()
1334 if (info->z_delay == NULL || info->z_alloc < i || in z_resampler_setup()
1335 i <= (info->z_alloc >> 1)) { in z_resampler_setup()
1336 if (info->z_delay != NULL) in z_resampler_setup()
1337 free(info->z_delay, M_DEVBUF); in z_resampler_setup()
1338 info->z_delay = malloc(i, M_DEVBUF, M_NOWAIT | M_ZERO); in z_resampler_setup()
1339 if (info->z_delay == NULL) in z_resampler_setup()
1341 info->z_alloc = i; in z_resampler_setup()
1347 memset(info->z_delay, sndbuf_zerodata(f->desc->out), in z_resampler_setup()
1348 info->z_pos * align); in z_resampler_setup()
1354 #define dumpz(x) fprintf(stderr, "\t%12s = %10u : %-11d\n", \ in z_resampler_setup()
1355 "z_"__STRING(x), (uint32_t)info->z_##x, \ in z_resampler_setup()
1356 (int32_t)info->z_##x) in z_resampler_setup()
1359 info->channels, info->bps, format, info->quality); in z_resampler_setup()
1360 fprintf(stderr, "\t%d (%d) -> %d (%d), ", in z_resampler_setup()
1361 info->src, info->rsrc, info->dst, info->rdst); in z_resampler_setup()
1362 fprintf(stderr, "[%d/%d]\n", info->z_gx, info->z_gy); in z_resampler_setup()
1372 if (info->z_alloc < 1024) in z_resampler_setup()
1374 "", info->z_alloc); in z_resampler_setup()
1375 else if (info->z_alloc < (1024 << 10)) in z_resampler_setup()
1377 "", info->z_alloc >> 10); in z_resampler_setup()
1378 else if (info->z_alloc < (1024 << 20)) in z_resampler_setup()
1380 "", info->z_alloc >> 20); in z_resampler_setup()
1383 "", info->z_alloc >> 30); in z_resampler_setup()
1386 (int32_t)z_gx2gy(info, info->z_full - (info->z_size << 1))); in z_resampler_setup()
1389 (int32_t)z_gx2gy(info, (info->z_alloc / align) - in z_resampler_setup()
1390 (info->z_size << 1))); in z_resampler_setup()
1393 fprintf(stderr, "\t%12s = %10d -> z_gy2gx() -> %d\n", in z_resampler_setup()
1397 fprintf(stderr, "\t%12s = %10d -> z_gx2gy() -> %d\n", in z_resampler_setup()
1405 (double)info->z_scale / Z_ONE); in z_resampler_setup()
1408 (double)info->z_dx / info->z_dy); in z_resampler_setup()
1411 info->z_dy >> Z_SHIFT); in z_resampler_setup()
1413 (z_scale << Z_DRIFT_SHIFT) - info->z_dy); in z_resampler_setup()
1429 info = f->data; in z_resampler_set()
1435 if (value == info->rsrc) in z_resampler_set()
1437 info->rsrc = value; in z_resampler_set()
1442 if (value == info->rdst) in z_resampler_set()
1444 info->rdst = value; in z_resampler_set()
1449 if (value == info->quality) in z_resampler_set()
1457 oquality = info->quality; in z_resampler_set()
1458 info->quality = value; in z_resampler_set()
1461 info->quality = oquality; in z_resampler_set()
1466 if (value == info->channels) in z_resampler_set()
1468 info->channels = value; in z_resampler_set()
1483 info = f->data; in z_resampler_get()
1487 return (info->rsrc); in z_resampler_get()
1490 return (info->rdst); in z_resampler_get()
1493 return (info->quality); in z_resampler_get()
1496 return (info->channels); in z_resampler_get()
1502 return (-1); in z_resampler_get()
1511 if (f->desc->in != f->desc->out) in z_resampler_init()
1518 info->rsrc = Z_RATE_DEFAULT; in z_resampler_init()
1519 info->rdst = Z_RATE_DEFAULT; in z_resampler_init()
1520 info->quality = feeder_rate_quality; in z_resampler_init()
1521 info->channels = AFMT_CHANNEL(f->desc->in); in z_resampler_init()
1523 f->data = info; in z_resampler_init()
1527 if (info->z_pcoeff != NULL) in z_resampler_init()
1528 free(info->z_pcoeff, M_DEVBUF); in z_resampler_init()
1529 if (info->z_delay != NULL) in z_resampler_init()
1530 free(info->z_delay, M_DEVBUF); in z_resampler_init()
1532 f->data = NULL; in z_resampler_init()
1543 info = f->data; in z_resampler_free()
1545 if (info->z_pcoeff != NULL) in z_resampler_free()
1546 free(info->z_pcoeff, M_DEVBUF); in z_resampler_free()
1547 if (info->z_delay != NULL) in z_resampler_free()
1548 free(info->z_delay, M_DEVBUF); in z_resampler_free()
1552 f->data = NULL; in z_resampler_free()
1566 info = f->data; in z_resampler_feed_internal()
1567 if (info->z_resample == NULL) in z_resampler_feed_internal()
1568 return (z_feed(f->source, c, b, count, source)); in z_resampler_feed_internal()
1575 align = info->channels * info->bps; in z_resampler_feed_internal()
1584 reqin = z_gy2gx(info, ocount) - z_fetched(info); in z_resampler_feed_internal()
1587 startdrift = info->z_startdrift; in z_resampler_feed_internal()
1588 alphadrift = info->z_alphadrift; in z_resampler_feed_internal()
1602 * samples back to the head of delay line in z_resampler_feed_internal()
1606 start = z_prev(info, info->z_start, in z_resampler_feed_internal()
1607 (info->z_size << 1) - 1); in z_resampler_feed_internal()
1608 cp = (info->z_size << 1) + fetched; in z_resampler_feed_internal()
1609 z_copy(info->z_delay + (start * align), in z_resampler_feed_internal()
1610 info->z_delay, cp * align); in z_resampler_feed_internal()
1611 info->z_start = in z_resampler_feed_internal()
1612 z_prev(info, info->z_size << 1, 1); in z_resampler_feed_internal()
1613 info->z_pos = in z_resampler_feed_internal()
1614 z_next(info, info->z_start, fetched + 1); in z_resampler_feed_internal()
1623 start, fetched, cp, info->z_cycle, in z_resampler_feed_internal()
1626 info->z_cycle = 0; in z_resampler_feed_internal()
1634 fetched = SND_FXDIV(z_feed(f->source, c, in z_resampler_feed_internal()
1635 info->z_delay + (info->z_pos * align), in z_resampler_feed_internal()
1642 reqin -= fetched; in z_resampler_feed_internal()
1643 info->z_pos += fetched; in z_resampler_feed_internal()
1651 ocount -= reqout; in z_resampler_feed_internal()
1664 info->z_resample(info, dst); in z_resampler_feed_internal()
1665 info->z_alpha += alphadrift; in z_resampler_feed_internal()
1666 if (info->z_alpha < info->z_gy) in z_resampler_feed_internal()
1667 info->z_start += startdrift; in z_resampler_feed_internal()
1669 info->z_start += startdrift - 1; in z_resampler_feed_internal()
1670 info->z_alpha -= info->z_gy; in z_resampler_feed_internal()
1674 info->z_cycle++; in z_resampler_feed_internal()
1676 } while (--reqout != 0); in z_resampler_feed_internal()
1683 return (dst - b); in z_resampler_feed_internal()
1695 maxfeed = ((struct z_info *)(f->data))->z_maxfeed; in z_resampler_feed()
1702 left -= feed; in z_resampler_feed()
1705 return (count - left); in z_resampler_feed()