From 164e1f20ecf89ccacec38e82360e96dd2e2060b9 Mon Sep 17 00:00:00 2001 From: Ariff Abdullah Date: Mon, 15 Jun 2009 04:31:34 +0000 Subject: [PATCH] - Add a way to change filter oversampling factor through FEEDER_RATE_PRESET "OVERSAMPLING_FACTOR:X .. .." where X = log2(oversampling factor). - Lower down default filter oversampling factor from 128 (log2 = 7) to 32 (log2 = 5), saving worth of 80 Kb. The use of better polynomial interpolator will raise its conversion quality/accuracy to match (or slightly better) with previous settings. - Bump driver version. --- sys/dev/sound/version.h | 2 +- sys/tools/sound/feeder_rate_mkfilter.awk | 53 +++++++++++++++++------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/sys/dev/sound/version.h b/sys/dev/sound/version.h index d4f85e74838f..6dee6a2ca02e 100644 --- a/sys/dev/sound/version.h +++ b/sys/dev/sound/version.h @@ -37,6 +37,6 @@ * Last 2 decimal places reserved for daily versioning, starting * with 0. */ -#define SND_DRV_VERSION 2009060800 +#define SND_DRV_VERSION 2009061500 #endif /* !_SND_VERSION_H_ */ diff --git a/sys/tools/sound/feeder_rate_mkfilter.awk b/sys/tools/sound/feeder_rate_mkfilter.awk index 898c7374c302..86584b007e32 100644 --- a/sys/tools/sound/feeder_rate_mkfilter.awk +++ b/sys/tools/sound/feeder_rate_mkfilter.awk @@ -379,8 +379,15 @@ function filter_parse(s, a, i, attn, alen) split(s, a, ":"); alen = length(a); + if (alen > 0 && a[1] == "OVERSAMPLING_FACTOR") { + if (alen != 2) + return (-1); + init_drift(floor(a[2])); + return (-1); + } + if (alen == 1 || alen == 2) { - if (a[1] == "nyquist_hover") { + if (a[1] == "NYQUIST_HOVER") { i = 1.0 * a[2]; Z_NYQUIST_HOVER = (i > 0.0 && i < 1.0) ? i : 0.0; return (-1); @@ -493,6 +500,33 @@ function genlerp(bit, use64, lerp) bit, (bit < 10) ? "\t" : "", lerp); } +function init_drift(drift, xdrift) +{ + xdrift = floor(drift); + + if (Z_DRIFT_SHIFT != -1) { + if (xdrift != Z_DRIFT_SHIFT) + printf("#error Z_DRIFT_SHIFT reinitialize!\n"); + return; + } + + # + # Initialize filter oversampling factor, or in other word + # Z_DRIFT_SHIFT. + # + if (xdrift < 0) + xdrift = 1; + else if (xdrift > 31) + xdrift = 31; + + Z_DRIFT_SHIFT = xdrift; + Z_DRIFT_ONE = shl(1, Z_DRIFT_SHIFT); + + Z_SHIFT = Z_FULL_SHIFT - Z_DRIFT_SHIFT; + Z_ONE = shl(1, Z_SHIFT); + Z_MASK = Z_ONE - 1; +} + BEGIN { I0_EPSILON = 1e-21; M_PI = atan2(0.0, -1.0); @@ -511,25 +545,14 @@ BEGIN { Z_INTERP_COEFF_SHIFT = 24; Z_INTERP_COEFF_ONE = shl(1, Z_INTERP_COEFF_SHIFT); - # - # Filter oversampling factor. - # - # 6, 7, or 8 depending on how much you can trade off between memory - # consumption (due to large tables) and precision / quality. - # - Z_DRIFT_SHIFT = 7; - Z_DRIFT_ONE = shl(1, Z_DRIFT_SHIFT); - - Z_SHIFT = Z_FULL_SHIFT - Z_DRIFT_SHIFT; - Z_ONE = shl(1, Z_SHIFT); - Z_MASK = Z_ONE - 1; - Z_LINEAR_FULL_SHIFT = Z_FULL_SHIFT; Z_LINEAR_FULL_ONE = shl(1, Z_LINEAR_FULL_SHIFT); Z_LINEAR_SHIFT = 8; Z_LINEAR_UNSHIFT = Z_LINEAR_FULL_SHIFT - Z_LINEAR_SHIFT; Z_LINEAR_ONE = shl(1, Z_LINEAR_SHIFT) + Z_DRIFT_SHIFT_DEFAULT = 5; + Z_DRIFT_SHIFT = -1; # meehhhh... let it overflow... #Z_SCALE_SHIFT = 31; #Z_SCALE_ONE = shl(1, Z_SCALE_SHIFT); @@ -595,6 +618,8 @@ BEGIN { beta = Popts["beta"]; nmult = Popts["nmult"]; rolloff = Popts["rolloff"]; + if (Z_DRIFT_SHIFT == -1) + init_drift(Z_DRIFT_SHIFT_DEFAULT); ztab[imp["quality"] - 2] = \ mkfilter(imp, nmult, rolloff, beta, Z_DRIFT_ONE); imp["quality"]++;