On Fri, 30 Dec 2005 15:17:04 +0000 GMT
"Chris Cannam" <chris.cannam(a)ferventsoftware.com> wrote:
Hi Chris,
and midi
events are not queued
for future delivery but always delivered immediately.
but this isn't -- Rosegarden always queues events
from a non-RT thread and lets the ALSA sequencer
kernel layer deliver them. (Thru events are delivered
directly, with potential additional latency because of
the lower priority used for the MIDI thread.) In
principle this should mean that only the priority of
the receiving synth's MIDI thread is significant for
the timing of sequenced events.
Hi,
i tested Rosegarden running with the system timer as timing source (RTC
is a bit broken atm on -rt kernels for me), and i do not get
satisfactory results. I used my ughsynth again (which is heavy on the
cpu which makes the problems just clearer) with its midi thread at
priority 95.
Here's example output with rosegarden producing a supposedly steady
stream of 16th notes at 120 bpm:
note on, frame_time: 205200106
next event: 744
next event: 746
diff: 5998
note on, frame_time: 205206104
next event: 599
next event: 600
diff: 6042
note on, frame_time: 205212146
next event: 497
next event: 498
diff: 6157
note on, frame_time: 205218303
next event: 510
next event: 511
diff: 6140
note on, frame_time: 205224443
next event: 506
next event: 507
diff: 6145
note on, frame_time: 205230588
next event: 507
next event: 508
diff: 5511
note on, frame_time: 205236099
next event: 898
next event: 899
diff: 6000
note on, frame_time: 205242099
next event: 754
next event: 755
diff: 5998
note on, frame_time: 205248097
next event: 608
next event: 609
diff: 6034
note on, frame_time: 205254131
next event: 498
next event: 499
diff: 6153
note on, frame_time: 205260284
next event: 507
next event: 508
diff: 6141
note on, frame_time: 205266425
next event: 504
next event: 505
diff: 6148
note on, frame_time: 205272573
next event: 507
next event: 509
diff: 5521
note on, frame_time: 205278094
next event: 908
next event: 910
next event: 510
which is again in the range as with my test program and ughsynth having
a low midi thread prio. This is clearly audible, too:
http://affenbande.org/~tapas/rosegarden_ughsynth.ogg
this is the rosegardenfile used for this:
http://affenbande.org/~tapas/test16th.rg
This would imply to me, that either the way the events are scheduled in
rosegarden is buggy (unlikely as it works fine when there's less audio
load on the system) or that the event queue delivery by ALSA is somehow
happening with only SCHED_OTHER priority as well.
I have not yet found an option for ALSA to configure this.
- ALSA sequencer uses kernel timers by default and
of course they only run at 100 or 250Hz in many
kernels.
In my case i have compiled the kernel to use a system timer frequency of
1000hz. It would be interesting to know though what priority the ALSA
event queue handling gets.
I also stumbled across some problems with sleep() and especially waking
up when the sleep time has expired in the course of writing my
rt_watchdog program. Sometimes the high prio SCHED_FIFO thread wasn't
woken up as long as a lower SCHED_FIFO prio thread hugged the cpu even
when the sleep time of the high prio thread was long expired.. Ingo told
me back then that there's extra kernel threads for the timing subsystem
which need to be setup to high prios too for this to work correctly.
Haven't really investigated further into this.
I need to write another small test app that uses sleep based timing and
a high prio, too, to drive ughsynth. Will report what results i get.
- ALSA sequencer can sync to RTC, but the
associated module (snd-rtctimer) appears to hang
some kernels solid when loaded or used. I don't have
much information about that, but I can probably find
out some more.
I have never bothered to try this either.
- ALSA sequencer can sync to a soundcard clock,
but this induces jitter when used with JACK and has
caused confusion for users who find themselves
inadvertently sync'd to an unused soundcard (the
classic "first note plays, then nothing" symptom).
The biggest advantage of course is not having to run
an RT MIDI timing thread. My impression is that this
aspect of MusE (which does that, I think) causes
as many configuration problems for its users as using
ALSA sequencer queue timers does for Rosegarden's.
Any more thoughts on this?
From my point of view just setting up a RT midi thread
driven by RTC and
with a sufficiently high prio for dispatching midi events
immediately is
the best way. As it seems to work well, at least for my small test case.
Further testing needs to be done though. I will report back.
I haven't really tried muse. Will do so if i find the time though..
Flo
--
Palimm Palimm!
http://tapas.affenbande.org