diff options
author | Andreas Mueller <andreas@stapelspeicher.org> | 2008-04-14 07:08:05 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2008-04-24 06:00:33 -0400 |
commit | f24bfa53dab478e1bde2d7fd39d3c1a69dc518f1 (patch) | |
tree | 6c9285033393683f81dd82417677004e9693ebeb /sound/pci | |
parent | 62cef8212ffa9df3e6c5b358ea2382d90489d590 (diff) |
[ALSA] es1968: fix jitter on some maestro cards
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>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/es1968.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index 67f03264f871..f8f3bb662d17 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -1827,6 +1827,23 @@ snd_es1968_pcm(struct es1968 *chip, int device) | |||
1827 | 1827 | ||
1828 | return 0; | 1828 | return 0; |
1829 | } | 1829 | } |
1830 | /* | ||
1831 | * suppress jitter on some maestros when playing stereo | ||
1832 | */ | ||
1833 | static void snd_es1968_suppress_jitter(struct es1968 *chip, struct esschan *es) | ||
1834 | { | ||
1835 | unsigned int cp1; | ||
1836 | unsigned int cp2; | ||
1837 | unsigned int diff; | ||
1838 | |||
1839 | cp1 = __apu_get_register(chip, 0, 5); | ||
1840 | cp2 = __apu_get_register(chip, 1, 5); | ||
1841 | diff = (cp1 > cp2 ? cp1 - cp2 : cp2 - cp1); | ||
1842 | |||
1843 | if (diff > 1) { | ||
1844 | __maestro_write(chip, IDR0_DATA_PORT, cp1); | ||
1845 | } | ||
1846 | } | ||
1830 | 1847 | ||
1831 | /* | 1848 | /* |
1832 | * update pointer | 1849 | * update pointer |
@@ -1948,8 +1965,11 @@ static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id) | |||
1948 | struct esschan *es; | 1965 | struct esschan *es; |
1949 | spin_lock(&chip->substream_lock); | 1966 | spin_lock(&chip->substream_lock); |
1950 | list_for_each_entry(es, &chip->substream_list, list) { | 1967 | list_for_each_entry(es, &chip->substream_list, list) { |
1951 | if (es->running) | 1968 | if (es->running) { |
1952 | snd_es1968_update_pcm(chip, es); | 1969 | snd_es1968_update_pcm(chip, es); |
1970 | if (es->fmt & ESS_FMT_STEREO) | ||
1971 | snd_es1968_suppress_jitter(chip, es); | ||
1972 | } | ||
1953 | } | 1973 | } |
1954 | spin_unlock(&chip->substream_lock); | 1974 | spin_unlock(&chip->substream_lock); |
1955 | if (chip->in_measurement) { | 1975 | if (chip->in_measurement) { |