Commit 915bf29e authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Avoid BDL position workaround when no_period_wakeup is set

Originally the bogus period at BDL head was introduced as a workaround
for the mismatching position update at the period boundary, typically
seen on dmix.  However, for applications like PulseAudio that don't
require period wake ups, this workaround is just superfluous.  Thus
better to disable it when no_period_wakeup is given in hw_params.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 5fe8e1e6
...@@ -415,6 +415,7 @@ struct azx_dev { ...@@ -415,6 +415,7 @@ struct azx_dev {
*/ */
unsigned int insufficient :1; unsigned int insufficient :1;
unsigned int wc_marked:1; unsigned int wc_marked:1;
unsigned int no_period_wakeup:1;
}; };
/* CORB/RIRB */ /* CORB/RIRB */
...@@ -1419,7 +1420,7 @@ static int azx_setup_periods(struct azx *chip, ...@@ -1419,7 +1420,7 @@ static int azx_setup_periods(struct azx *chip,
ofs = 0; ofs = 0;
azx_dev->frags = 0; azx_dev->frags = 0;
pos_adj = bdl_pos_adj[chip->dev_index]; pos_adj = bdl_pos_adj[chip->dev_index];
if (pos_adj > 0) { if (!azx_dev->no_period_wakeup && pos_adj > 0) {
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
int pos_align = pos_adj; int pos_align = pos_adj;
pos_adj = (pos_adj * runtime->rate + 47999) / 48000; pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
...@@ -1435,8 +1436,7 @@ static int azx_setup_periods(struct azx *chip, ...@@ -1435,8 +1436,7 @@ static int azx_setup_periods(struct azx *chip,
pos_adj = 0; pos_adj = 0;
} else { } else {
ofs = setup_bdle(chip, substream, azx_dev, ofs = setup_bdle(chip, substream, azx_dev,
&bdl, ofs, pos_adj, &bdl, ofs, pos_adj, true);
!substream->runtime->no_period_wakeup);
if (ofs < 0) if (ofs < 0)
goto error; goto error;
} }
...@@ -1449,7 +1449,7 @@ static int azx_setup_periods(struct azx *chip, ...@@ -1449,7 +1449,7 @@ static int azx_setup_periods(struct azx *chip,
else else
ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs, ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
period_bytes, period_bytes,
!substream->runtime->no_period_wakeup); !azx_dev->no_period_wakeup);
if (ofs < 0) if (ofs < 0)
goto error; goto error;
} }
...@@ -1922,10 +1922,12 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) ...@@ -1922,10 +1922,12 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream)
if (bufsize != azx_dev->bufsize || if (bufsize != azx_dev->bufsize ||
period_bytes != azx_dev->period_bytes || period_bytes != azx_dev->period_bytes ||
format_val != azx_dev->format_val) { format_val != azx_dev->format_val ||
runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
azx_dev->bufsize = bufsize; azx_dev->bufsize = bufsize;
azx_dev->period_bytes = period_bytes; azx_dev->period_bytes = period_bytes;
azx_dev->format_val = format_val; azx_dev->format_val = format_val;
azx_dev->no_period_wakeup = runtime->no_period_wakeup;
err = azx_setup_periods(chip, substream, azx_dev); err = azx_setup_periods(chip, substream, azx_dev);
if (err < 0) if (err < 0)
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment