Update of /cvsroot/alsa/alsa-kernel/core In directory sc8-pr-cvs1:/tmp/cvs-serv12010/core
Modified Files: timer.c Log Message: Added snd_timer_pause(). Implemented more event notifications for timer. Cleanups. Index: timer.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/timer.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- timer.c 28 Feb 2003 19:04:34 -0000 1.27 +++ timer.c 1 Mar 2003 14:50:36 -0000 1.28 @@ -383,8 +383,12 @@ if (timeri == NULL || ticks < 1) return -EINVAL; - if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) - return snd_timer_start_slave(timeri); + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) { + result = snd_timer_start_slave(timeri); + if (timeri->ccallback) + timeri->ccallback(timeri, SNDRV_TIMER_EVENT_START, snd_timer_resolution(timeri)); + return result; + } timer = timeri->timer; if (timer == NULL) return -EINVAL; @@ -393,6 +397,8 @@ timeri->pticks = 0; result = snd_timer_start1(timer, timeri, ticks); spin_unlock_irqrestore(&timer->lock, flags); + if (timeri->ccallback) + timeri->ccallback(timeri, SNDRV_TIMER_EVENT_START, snd_timer_resolution(timeri)); return result; } @@ -403,7 +409,6 @@ snd_assert(timeri != NULL, return -ENXIO); - timer = timeri->timer; if (! timer) return -EINVAL; @@ -432,6 +437,8 @@ if (!keep_flag) timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING|SNDRV_TIMER_IFLG_START); spin_unlock_irqrestore(&timer->lock, flags); + if (timeri->ccallback) + timeri->ccallback(timeri, SNDRV_TIMER_EVENT_STOP, 0); return 0; } @@ -442,7 +449,19 @@ */ int snd_timer_stop(snd_timer_instance_t * timeri) { - return _snd_timer_stop(timeri, 0); + snd_timer_t *timer; + unsigned long flags; + int err; + + err = _snd_timer_stop(timeri, 0); + if (err < 0) + return err; + timer = timeri->timer; + spin_lock_irqsave(&timer->lock, flags); + timeri->cticks = timeri->ticks; + timeri->pticks = 0; + spin_unlock_irqrestore(&timer->lock, flags); + return 0; } /* @@ -467,10 +486,20 @@ timeri->pticks = 0; result = snd_timer_start1(timer, timeri, timer->sticks); spin_unlock_irqrestore(&timer->lock, flags); + if (timeri->ccallback) + timeri->ccallback(timeri, SNDRV_TIMER_EVENT_CONTINUE, snd_timer_resolution(timeri)); return result; } /* + * pause.. remember the ticks left + */ +int snd_timer_pause(snd_timer_instance_t * timeri) +{ + return _snd_timer_stop(timeri, 0); +} + +/* * reschedule the timer * * start pending instances and check the scheduling ticks. @@ -977,6 +1006,23 @@ } } +static void snd_timer_user_ccallback(snd_timer_instance_t *timeri, + enum sndrv_timer_event event, + unsigned long resolution) +{ + snd_timer_user_t *tu = snd_magic_cast(snd_timer_user_t, timeri->callback_data, return); + snd_timer_tread_t r1; + struct timespec tstamp; + + snd_timestamp_now(&tstamp, 1); + r1.event = event; + r1.tstamp = tstamp; + r1.val = resolution; + spin_lock(&tu->qlock); + snd_timer_user_append_to_tqueue(tu, &r1); + spin_unlock(&tu->qlock); +} + static void snd_timer_user_tinterrupt(snd_timer_instance_t *timeri, unsigned long resolution, unsigned long ticks) @@ -1203,6 +1249,7 @@ tu->timeri->flags |= SNDRV_TIMER_IFLG_FAST; tu->timeri->callback = tu->tread ? snd_timer_user_tinterrupt : snd_timer_user_interrupt; + tu->timeri->ccallback = tu->tread ? snd_timer_user_ccallback : NULL; tu->timeri->callback_data = (void *)tu; return 0; } @@ -1553,6 +1600,7 @@ EXPORT_SYMBOL(snd_timer_start); EXPORT_SYMBOL(snd_timer_stop); EXPORT_SYMBOL(snd_timer_continue); +EXPORT_SYMBOL(snd_timer_pause); EXPORT_SYMBOL(snd_timer_new); EXPORT_SYMBOL(snd_timer_global_new); EXPORT_SYMBOL(snd_timer_global_free); ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog