aboutsummaryrefslogtreecommitdiffstats
path: root/sound/drivers
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2010-10-14 15:46:12 -0400
committerJaroslav Kysela <perex@perex.cz>2010-10-14 15:54:17 -0400
commit0db710230589b5571c23f59250eabc9504b17c98 (patch)
treedf808481c37cd38f1df0f1614313a0ba834ace32 /sound/drivers
parent838c364ff05c143fd1810e8ad1469935d6c23a7a (diff)
ALSA: snd-aloop - fix issue in the timer start function
In some circumstances (the rate shift value was changed), the irq_pos value may be higher than the fraction value in the timer start function. Check for it. Also, to avoid value overflow, decrease maximum period size. Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/drivers')
-rw-r--r--sound/drivers/aloop.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c
index 3c0088272095..838ad86311b8 100644
--- a/sound/drivers/aloop.c
+++ b/sound/drivers/aloop.c
@@ -171,6 +171,10 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
171 dpcm->pcm_rate_shift = rate_shift; 171 dpcm->pcm_rate_shift = rate_shift;
172 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size); 172 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
173 } 173 }
174 if (dpcm->period_size_frac <= dpcm->irq_pos) {
175 dpcm->irq_pos %= dpcm->period_size_frac;
176 dpcm->period_update_pending = 1;
177 }
174 tick = dpcm->period_size_frac - dpcm->irq_pos; 178 tick = dpcm->period_size_frac - dpcm->irq_pos;
175 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps; 179 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps;
176 dpcm->timer.expires = jiffies + tick; 180 dpcm->timer.expires = jiffies + tick;
@@ -531,7 +535,9 @@ static struct snd_pcm_hardware loopback_pcm_hardware =
531 .channels_max = 32, 535 .channels_max = 32,
532 .buffer_bytes_max = 2 * 1024 * 1024, 536 .buffer_bytes_max = 2 * 1024 * 1024,
533 .period_bytes_min = 64, 537 .period_bytes_min = 64,
534 .period_bytes_max = 2 * 1024 * 1024, 538 /* note check overflow in frac_pos() using pcm_rate_shift before
539 changing period_bytes_max value */
540 .period_bytes_max = 1024 * 1024,
535 .periods_min = 1, 541 .periods_min = 1,
536 .periods_max = 1024, 542 .periods_max = 1024,
537 .fifo_size = 0, 543 .fifo_size = 0,