/*
*/ staticvoid calc_alsa_tempo(struct seq_oss_timer *timer); staticint send_timer_event(struct seq_oss_devinfo *dp, int type, int value);
/* * create and register a new timer. * if queue is not started yet, start it.
*/ struct seq_oss_timer *
snd_seq_oss_timer_new(struct seq_oss_devinfo *dp)
{ struct seq_oss_timer *rec;
rec = kzalloc(sizeof(*rec), GFP_KERNEL); if (rec == NULL) return NULL;
/* * delete timer. * if no more timer exists, stop the queue.
*/ void
snd_seq_oss_timer_delete(struct seq_oss_timer *rec)
{ if (rec) {
snd_seq_oss_timer_stop(rec);
kfree(rec);
}
}
/* * process one timing event * return 1 : event proceseed -- skip this event * 0 : not a timer event -- enqueue this event
*/ int
snd_seq_oss_process_timer_event(struct seq_oss_timer *rec, union evrec *ev)
{
abstime_t parm = ev->t.time;
if (ev->t.code == EV_TIMING) { switch (ev->t.cmd) { case TMR_WAIT_REL:
parm += rec->cur_tick;
rec->realtime = 0;
fallthrough; case TMR_WAIT_ABS: if (parm == 0) {
rec->realtime = 1;
} elseif (parm >= rec->cur_tick) {
rec->realtime = 0;
rec->cur_tick = parm;
} return 1; /* skip this event */
case TMR_START:
snd_seq_oss_timer_start(rec); return 1;
}
} elseif (ev->s.code == SEQ_WAIT) { /* time = from 1 to 3 bytes */
parm = (ev->echo >> 8) & 0xffffff; if (parm > rec->cur_tick) { /* set next event time */
rec->cur_tick = parm;
rec->realtime = 0;
} return 1;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.