[LAD] alsa sequencer latency ( snd_seq_ev_schedule_real ) - need help!

nescivi nescivi at gmail.com
Sat Jan 10 20:59:06 UTC 2009


Hi,

since I get no response here...
which list you recommend I post this question to?
I also got no reaction on the alsa-dev list... alsa-user then?

sincerely,
Marije

On Sunday 04 January 2009 21:51:21 nescivi wrote:
> Hiho,
>
> I am experiencing strange things with some code that uses the ALSA
> sequencer, with the function
>  	snd_seq_ev_schedule_real(evt, mQueue, 1, &time);
>
> The timing of this is unreliable.
>
> At times it goes as expected for a while, but then after some time large
> delays (minutes, instead of the expected latency of 0.1 second) are
> introduced.
>
> Does anyone have any idea what the problem could be?
>
> I have a code snippet below. In case anyone wants to try (the app is
> SuperCollider, you need the latest svn).
>
> I'm on a Debian kernel (2.6.24-1-amd64 #1 SMP Thu Mar 27 16:52:38 UTC 2008
> x86_64 GNU/Linux), in case that is relevant.
>
>
> sincerely,
> Marije
>
>
>
> int SC_AlsaMidiClient::sendEvent(int outputIndex, int uid, snd_seq_event_t*
> evt, float late)
> {
> 	snd_seq_real_time time;
>
> 	if ((outputIndex < 0) || (outputIndex >= mNumOutPorts)) return
> errIndexOutOfRange;
>
> 	snd_seq_ev_set_source(evt, mOutPorts[outputIndex]);
> 	if (uid == 0) {
> 		// send to all subscribed ports
> 		snd_seq_ev_set_subs(evt);
> 	} else {
> 		// send to specific port
> 		int cid, pid;
> 		SC_AlsaParseUID(uid, cid, pid);
> 		snd_seq_ev_set_dest(evt, cid, pid);
> 	}
>
> 	long latelong;
> 	if (late > 0.f) {
> 		latelong = (long) (late * 1000000000);
> // new time calculation. The old one was not correct
> 		time.tv_sec = (long)(latelong / 1000000000); // seconds
> 		time.tv_nsec = (long)(latelong % 1000000000); // nanoseconds
> 	} else {
> 		time.tv_sec = time.tv_nsec = 0;
> 	}
>
> // 	evt->flags = evt->flags | SND_SEQ_TIME_STAMP_REAL;
>
>  	post("MIDI (ALSA): sending event, time %i, %i, late %f, latelong %i\n",
> time.tv_sec, time.tv_nsec, late, latelong);
>
> 	snd_seq_ev_schedule_real(evt, mQueue, 1, &time);
> 	snd_seq_event_output_direct(mHandle, evt);
> // 	snd_seq_event_output(mHandle, evt);
>
> 	return errNone;
> }
> _______________________________________________
> Linux-audio-dev mailing list
> Linux-audio-dev at lists.linuxaudio.org
> http://lists.linuxaudio.org/mailman/listinfo/linux-audio-dev





More information about the Linux-audio-dev mailing list