Skip to content

Commit

Permalink
[ALSA] es1968: fix jitter on some maestro cards
Browse files Browse the repository at this point in the history
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.

Without this patch most of the stereo audio gets out of sync and really
distorted (oss-emulation with mplayer at 48000khz worked somehow).

Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Andreas Mueller authored and Takashi Iwai committed Apr 24, 2008
1 parent 62cef82 commit f24bfa5
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion sound/pci/es1968.c
Original file line number Diff line number Diff line change
Expand Up @@ -1827,6 +1827,23 @@ snd_es1968_pcm(struct es1968 *chip, int device)

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
Expand Down Expand Up @@ -1948,8 +1965,11 @@ static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id)
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) {
Expand Down

0 comments on commit f24bfa5

Please sign in to comment.