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