- 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.
This commit is contained in:
ariff 2009-06-15 04:31:34 +00:00
parent 548135de8c
commit cf1afc1774
2 changed files with 40 additions and 15 deletions

View File

@ -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_ */

View File

@ -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"]++;