diff options
Diffstat (limited to 'sound/core/pcm_timer.c')
| -rw-r--r-- | sound/core/pcm_timer.c | 66 |
1 files changed, 24 insertions, 42 deletions
diff --git a/sound/core/pcm_timer.c b/sound/core/pcm_timer.c index 884eaea31fe..20ecd8f1808 100644 --- a/sound/core/pcm_timer.c +++ b/sound/core/pcm_timer.c @@ -1,6 +1,6 @@ /* * Digital Audio (PCM) abstract layer - * Copyright (c) by Jaroslav Kysela <perex@suse.cz> + * Copyright (c) by Jaroslav Kysela <perex@perex.cz> * * * This program is free software; you can redistribute it and/or modify @@ -19,8 +19,8 @@ * */ -#include <sound/driver.h> #include <linux/time.h> +#include <linux/gcd.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/timer.h> @@ -29,35 +29,21 @@ * Timer functions */ -/* Greatest common divisor */ -static unsigned long gcd(unsigned long a, unsigned long b) -{ - unsigned long r; - if (a < b) { - r = a; - a = b; - b = r; - } - while ((r = a % b) != 0) { - a = b; - b = r; - } - return b; -} - -void snd_pcm_timer_resolution_change(snd_pcm_substream_t *substream) +void snd_pcm_timer_resolution_change(struct snd_pcm_substream *substream) { unsigned long rate, mult, fsize, l, post; - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_pcm_runtime *runtime = substream->runtime; mult = 1000000000; rate = runtime->rate; - snd_assert(rate != 0, return); + if (snd_BUG_ON(!rate)) + return; l = gcd(mult, rate); mult /= l; rate /= l; fsize = runtime->period_size; - snd_assert(fsize != 0, return); + if (snd_BUG_ON(!fsize)) + return; l = gcd(rate, fsize); rate /= l; fsize /= l; @@ -67,46 +53,42 @@ void snd_pcm_timer_resolution_change(snd_pcm_substream_t *substream) post *= 2; } if (rate == 0) { - snd_printk(KERN_ERR "pcm timer resolution out of range (rate = %u, period_size = %lu)\n", runtime->rate, runtime->period_size); + pcm_err(substream->pcm, + "pcm timer resolution out of range (rate = %u, period_size = %lu)\n", + runtime->rate, runtime->period_size); runtime->timer_resolution = -1; return; } runtime->timer_resolution = (mult * fsize / rate) * post; } -static unsigned long snd_pcm_timer_resolution(snd_timer_t * timer) +static unsigned long snd_pcm_timer_resolution(struct snd_timer * timer) { - snd_pcm_substream_t * substream; + struct snd_pcm_substream *substream; substream = timer->private_data; return substream->runtime ? substream->runtime->timer_resolution : 0; } -static int snd_pcm_timer_start(snd_timer_t * timer) +static int snd_pcm_timer_start(struct snd_timer * timer) { - unsigned long flags; - snd_pcm_substream_t * substream; + struct snd_pcm_substream *substream; substream = snd_timer_chip(timer); - spin_lock_irqsave(&substream->timer_lock, flags); substream->timer_running = 1; - spin_unlock_irqrestore(&substream->timer_lock, flags); return 0; } -static int snd_pcm_timer_stop(snd_timer_t * timer) +static int snd_pcm_timer_stop(struct snd_timer * timer) { - unsigned long flags; - snd_pcm_substream_t * substream; + struct snd_pcm_substream *substream; substream = snd_timer_chip(timer); - spin_lock_irqsave(&substream->timer_lock, flags); substream->timer_running = 0; - spin_unlock_irqrestore(&substream->timer_lock, flags); return 0; } -static struct _snd_timer_hardware snd_pcm_timer = +static struct snd_timer_hardware snd_pcm_timer = { .flags = SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_SLAVE, .resolution = 0, @@ -120,16 +102,16 @@ static struct _snd_timer_hardware snd_pcm_timer = * Init functions */ -static void snd_pcm_timer_free(snd_timer_t *timer) +static void snd_pcm_timer_free(struct snd_timer *timer) { - snd_pcm_substream_t *substream = timer->private_data; + struct snd_pcm_substream *substream = timer->private_data; substream->timer = NULL; } -void snd_pcm_timer_init(snd_pcm_substream_t *substream) +void snd_pcm_timer_init(struct snd_pcm_substream *substream) { - snd_timer_id_t tid; - snd_timer_t *timer; + struct snd_timer_id tid; + struct snd_timer *timer; tid.dev_sclass = SNDRV_TIMER_SCLASS_NONE; tid.dev_class = SNDRV_TIMER_CLASS_PCM; @@ -152,7 +134,7 @@ void snd_pcm_timer_init(snd_pcm_substream_t *substream) substream->timer = timer; } -void snd_pcm_timer_done(snd_pcm_substream_t *substream) +void snd_pcm_timer_done(struct snd_pcm_substream *substream) { if (substream->timer) { snd_device_free(substream->pcm->card, substream->timer); |
