提交 174eb8e8 编写于 作者: H Heikki Lindholm 提交者: Mauro Carvalho Chehab

V4L/DVB (6666): saa7134-alsa: fix period handling

The period handling in saa7134-alsa is broken in two ways. First, the
minimum number of periods of two does not work, because the dma is setup
two periods ahead in the irq handler. Fix the minimum to four periods.
Second, the code assumes that the number of periods is divisible by two,
which isn't always the case on ALSA. Fix by adding a constraint.
Signed-off-by: NHeikki Lindholm  <holindho@cs.helsinki.fi>
Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 78f3b0b6
...@@ -457,7 +457,7 @@ static struct snd_pcm_hardware snd_card_saa7134_capture = ...@@ -457,7 +457,7 @@ static struct snd_pcm_hardware snd_card_saa7134_capture =
.buffer_bytes_max = (256*1024), .buffer_bytes_max = (256*1024),
.period_bytes_min = 64, .period_bytes_min = 64,
.period_bytes_max = (256*1024), .period_bytes_max = (256*1024),
.periods_min = 2, .periods_min = 4,
.periods_max = 1024, .periods_max = 1024,
}; };
...@@ -491,7 +491,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream, ...@@ -491,7 +491,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
snd_assert(period_size >= 0x100 && period_size <= 0x10000, snd_assert(period_size >= 0x100 && period_size <= 0x10000,
return -EINVAL); return -EINVAL);
snd_assert(periods >= 2, return -EINVAL); snd_assert(periods >= 4, return -EINVAL);
snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL); snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL);
dev = saa7134->dev; dev = saa7134->dev;
...@@ -647,7 +647,14 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) ...@@ -647,7 +647,14 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
saa7134_tvaudio_setmute(dev); saa7134_tvaudio_setmute(dev);
} }
if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) err = snd_pcm_hw_constraint_integer(runtime,
SNDRV_PCM_HW_PARAM_PERIODS);
if (err < 0)
return err;
err = snd_pcm_hw_constraint_step(runtime, 0,
SNDRV_PCM_HW_PARAM_PERIODS, 2);
if (err < 0)
return err; return err;
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册