From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gerald Grabner Subject: seq: maximum number of events w.r.t. ordering in queue Date: Sun, 04 Feb 2007 20:04:49 +0100 Message-ID: <45C62E51.3050608@gmx.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@lists.sourceforge.net Errors-To: alsa-devel-bounces@lists.sourceforge.net To: alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org Hi there, for simultaneously playing many midi tracks each with a large number of events, it would be convenient to output one track after the other in a simple loop, without caring about the ordering of the events. Of course, this requires an output buffer large enough to hold all events, otherwise events of the later are postponed every time the buffer is full. But one question remains, at least for me: Is there a maximum number of events w.r.t. the ordering in a queue? Below is a simple test program that pumps a number of events in reverse tick order into the output buffer, i.e. starting with the latest tick (high hotes) and finishing with tick=0 (low notes). output_buffer_size, client_pool_output and client_pool_output_room are increased to have the capacity for all events. But still, the (high) notes with the lowest ticks are played only towards the end instead of at the beginning - obviously because they were output last. The ordering is failing. Is there a way to ensure that all events are played in correct order, regardless of when the are outputted? Many thanks, Gerald BTW: alsa version = 1.0.11 ** #include #include int main() { // open sequencer snd_seq_t* seq; snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0) ; int my_port = snd_seq_create_simple_port ( seq, "standard port", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_APPLICATION) ; // number of events unsigned int n = 600 ; // buffer size for all events unsigned int b = (n+1)*sizeof(snd_seq_event_t); // set output buffer and client pool size if ( snd_seq_set_output_buffer_size(seq,b) ) printf("Error setting output_buffer_size\n"); if ( snd_seq_set_client_pool_output(seq,b) ) printf("Error setting client_pool_output\n"); if ( snd_seq_set_client_pool_output_room(seq,b) ) printf("Error setting client_pool_output_room\n"); // connect to 21:0 (OPL3) snd_seq_connect_to(seq, my_port, 21, 0); // queue (default: 96 PPQ and 120 BPM) int queue = snd_seq_alloc_queue(seq); snd_seq_start_queue (seq, queue, NULL); snd_seq_drain_output(seq); // set and schedule events snd_seq_event_t ev ; snd_seq_ev_clear(&ev); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_noteon(&ev,0,60,127); unsigned int i; for ( i=0 ; i