Skip to content

Commit

Permalink
ALSA: hda - Fix a regression of the position-buffer check
Browse files Browse the repository at this point in the history
The commit a810364
    ALSA: hda - Handle -1 as invalid position, too
caused a regression on some machines that require the position-buffer
instead of LPIB, e.g. resulting in noises with mic recording with
PulseAudio.

This patch fixes the detection by delaying the test at the timing as
same as 3.0, i.e. doing the position check only when requested in
azx_position_ok().

Reported-and-tested-by: Rocko Requin <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
tiwai committed Sep 30, 2011
1 parent 0fac259 commit 798cb7e
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions sound/pci/hda/hda_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -1924,7 +1924,8 @@ static unsigned int azx_via_get_position(struct azx *chip,
}

static unsigned int azx_get_position(struct azx *chip,
struct azx_dev *azx_dev)
struct azx_dev *azx_dev,
bool with_check)
{
unsigned int pos;
int stream = azx_dev->substream->stream;
Expand All @@ -1940,7 +1941,7 @@ static unsigned int azx_get_position(struct azx *chip,
default:
/* use the position buffer */
pos = le32_to_cpu(*azx_dev->posbuf);
if (chip->position_fix[stream] == POS_FIX_AUTO) {
if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
if (!pos || pos == (u32)-1) {
printk(KERN_WARNING
"hda-intel: Invalid position buffer, "
Expand All @@ -1964,7 +1965,7 @@ static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
struct azx *chip = apcm->chip;
struct azx_dev *azx_dev = get_azx_dev(substream);
return bytes_to_frames(substream->runtime,
azx_get_position(chip, azx_dev));
azx_get_position(chip, azx_dev, false));
}

/*
Expand All @@ -1987,7 +1988,7 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
return -1; /* bogus (too early) interrupt */

stream = azx_dev->substream->stream;
pos = azx_get_position(chip, azx_dev);
pos = azx_get_position(chip, azx_dev, true);

if (WARN_ONCE(!azx_dev->period_bytes,
"hda-intel: zero azx_dev->period_bytes"))
Expand Down

0 comments on commit 798cb7e

Please sign in to comment.