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

Fons Adriaensen fons at kokkinizita.net
Sat Jan 10 21:13:44 UTC 2009


On Sat, Jan 10, 2009 at 03:59:06PM -0500, nescivi wrote:

> 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?


> > 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;
> > }


If 'late' > 2.147 then 'latelong' will go negative.
Could this happen when you schedule an event more than
2 seconds ahead of due time ?

Alternative:

time.tv_sec = (long)(floorf (late));
time.tv_nsec = (long)((late - time.tv_sec) * 1e9f);

Ciao,

-- 
FA

Laboratorio di Acustica ed Elettroacustica
Parma, Italia

O tu, che porte, correndo si ?
E guerra e morte !



More information about the Linux-audio-dev mailing list