svn commit: r194233 - in head/sys: dev/sound tools/sound

Ariff Abdullah ariff at FreeBSD.org
Mon Jun 15 04:31:35 UTC 2009


Author: ariff
Date: Mon Jun 15 04:31:34 2009
New Revision: 194233
URL: http://svn.freebsd.org/changeset/base/194233

Log:
  - 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.

Modified:
  head/sys/dev/sound/version.h
  head/sys/tools/sound/feeder_rate_mkfilter.awk

Modified: head/sys/dev/sound/version.h
==============================================================================
--- head/sys/dev/sound/version.h	Mon Jun 15 04:05:38 2009	(r194232)
+++ head/sys/dev/sound/version.h	Mon Jun 15 04:31:34 2009	(r194233)
@@ -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_ */

Modified: head/sys/tools/sound/feeder_rate_mkfilter.awk
==============================================================================
--- head/sys/tools/sound/feeder_rate_mkfilter.awk	Mon Jun 15 04:05:38 2009	(r194232)
+++ head/sys/tools/sound/feeder_rate_mkfilter.awk	Mon Jun 15 04:31:34 2009	(r194233)
@@ -379,8 +379,15 @@ function filter_parse(s, a, i, attn, ale
 	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"]++;


More information about the svn-src-head mailing list