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

Reply via email to