[alsa-devel] incoming sequencer event timestamping (via a running queue): how?
Hello,
I'm attempting to write a program that lets me record (and play) MIDI sequences,
I have created a sequencer queue (with `snd_seq_alloc_queue`), and when I set it up and let it run I can observe that the tick value properly increases (with `snd_seq_queue_status_get_tick_time`); everything runs fine. Queing events to an output work as well.
But is it somehow possible to bind "incoming events" to this queue as well? (...in such a way that the `event->time.tick` value of these incoming events is used to automatically store the queue timer value at reception? ...)
At this moment, I just sample the tick value manually when I get an event. That kinda works, but chances are high that the kernel sequencer system can do that for me with more accuracy?
I wrote a function that essentially reconnects the inputs of the port used for reception just before the queue is started. This allows me to set the queue explicitly. I also enable `snd_seq_port_subscribe_set_time_update`. It doesnt't work (yet).
Should this work? Am I on the right track? Or am I missing something?
Can anyone give me a hint?
Thanks!
Greetings,
Raymond.
On Mon, Apr 11, 2011 at 2:01 PM, R. Dresens chromisx@nedlinux.nl wrote:
Hello,
I'm attempting to write a program that lets me record (and play) MIDI sequences,
I have created a sequencer queue (with `snd_seq_alloc_queue`), and when I set it up and let it run I can observe that the tick value properly increases (with `snd_seq_queue_status_get_tick_time`); everything runs fine. Queing events to an output work as well.
But is it somehow possible to bind "incoming events" to this queue as well? (...in such a way that the `event->time.tick` value of these incoming events is used to automatically store the queue timer value at reception? ...)
At this moment, I just sample the tick value manually when I get an event. That kinda works, but chances are high that the kernel sequencer system can do that for me with more accuracy?
I wrote a function that essentially reconnects the inputs of the port used for reception just before the queue is started. This allows me to set the queue explicitly. I also enable `snd_seq_port_subscribe_set_time_update`. It doesnt't work (yet).
Should this work? Am I on the right track? Or am I missing something?
Can anyone give me a hint?
Thanks!
Greetings,
Raymond. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
In your function that does the connection to the reception port... snd_seq_port_subscribe_set_queue(subs, queue_id); //<< queue_id being the one you allocated snd_seq_port_subscribe_set_time_update(subs, 1); snd_seq_port_subscribe_set_time_real(subs, 0); snd_seq_subscribe_port(pSeq, subs);
...with the caution that this may be the completely wrong way to go about this, but it may help until someone more knowledgeable comes along...
John
r10kindsofpeople wrote:
On Mon, Apr 11, 2011 at 2:01 PM, R. Dresens chromisx@nedlinux.nl wrote:
At this moment, I just sample the tick value manually when I get an event. That kinda works, but chances are high that the kernel sequencer system can do that for me with more accuracy?
In your function that does the connection to the reception port... snd_seq_port_subscribe_set_queue(subs, queue_id); //<< queue_id being the one you allocated snd_seq_port_subscribe_set_time_update(subs, 1); snd_seq_subscribe_port(pSeq, subs);
This is the correct way to get timestamps on events that go through a subscription.
Alternatively, you can get timestamps on events that arrive at a port: snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, queue); snd_seq_create_port(pSeq, pinfo);
Regards, Clemens
On Tue, 12 Apr 2011 07:49:26 +0200 Clemens Ladisch clemens@ladisch.de wrote:
r10kindsofpeople wrote:
In your function that does the connection to the reception port... snd_seq_port_subscribe_set_queue(subs, queue_id); //<< queue_id.. snd_seq_port_subscribe_set_time_update(subs, 1); snd_seq_subscribe_port(pSeq, subs);
This is the correct way to get timestamps on events that go through a subscription.
Alternatively, you can get timestamps on events that arrive at a port:
snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, queue); snd_seq_create_port(pSeq, pinfo);
Hello,
I have both solutions working now,
Setting the port_info seems (to me) the easiest solution,
Working with port subscriptions was a nice exercize though... ;)
Thanks!
Greetings,
Raymond.
participants (3)
-
Clemens Ladisch
-
R. Dresens
-
r10kindsofpeople