mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 17:24:17 +08:00
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: Heikki Lindholm <holindho@cs.helsinki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
78f3b0b672
commit
174eb8e8cb
@ -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,
|
|||||||
|
|
||||||
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)
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user