[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-kernel
Subject:    Re: [PATCH] es1968: fix jitter on some maestro cards
From:       Rene Herman <rene.herman () keyaccess ! nl>
Date:       2008-03-31 22:24:43
Message-ID: 47F164AB.5040009 () keyaccess ! nl
[Download RAW message or body]

On 30-03-08 00:49, Andreas Mueller wrote:

> This patch suppresses jitter on several Maestro cards in stereo mode
> (ALSA of course).
> 
> The patch is also incorporated in the *BSD drivers where I "ported" it from.
> I am barely used to driver-development so please take a look (esp. the channel
> parameters), nevertheless it completely works for me.
> 
> Without this patch most of the stereo audio gets out of sync and really
> distorted (oss-emulation with mplayer at 48000khz worked somehow).
> 
> CCed to those listed in the .c file.

Added the alsa-devel list (and re-attached the patch). My TerraTec DMX (ESS 
Canyon3D, ES1970MS-3D) doesn't need this but doesn't seem to suffer from it 
either. Otherwise no idea about this.

Rene.

["es1968_jitter.patch" (text/plain)]

--- sound/pci/es1968.c.old	2008-03-29 19:17:16.771116317 +0100
+++ sound/pci/es1968.c	2008-03-30 00:14:35.363057160 +0100
@@ -1816,7 +1816,24 @@
 
 	return 0;
 }
+/*
+ * suppress jitter on some maestros when playing stereo
+ */
+static void snd_es1968_suppress_jitter(struct es1968 *chip, struct esschan *es)
+{
+	unsigned int cp1;
+	unsigned int cp2;
+	unsigned int diff;
 
+	cp1 = __apu_get_register(chip, 0, 5);
+	cp2 = __apu_get_register(chip, 1, 5);
+	diff = (cp1 > cp2 ? cp1 - cp2 : cp2 - cp1);
+	
+	if (diff > 1) {
+		__maestro_write(chip, IDR0_DATA_PORT, cp1);
+	}
+}
+	
 /*
  * update pointer
  */
@@ -1937,8 +1954,11 @@
 		struct esschan *es;
 		spin_lock(&chip->substream_lock);
 		list_for_each_entry(es, &chip->substream_list, list) {
-			if (es->running)
+			if (es->running) {
 				snd_es1968_update_pcm(chip, es);
+				if (es->fmt & ESS_FMT_STEREO)
+					snd_es1968_suppress_jitter(chip, es);
+			}
 		}
 		spin_unlock(&chip->substream_lock);
 		if (chip->in_measurement) {

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic