seq: maximum number of events w.r.t. ordering in queue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <alsa/asoundlib.h>
#include <stdio.h>

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<n ; i++ )
    {
      // note range: 12-107
      ev.data.note.note = (unsigned char) (12+(107-12)*i/(n-1));
      // tick in decreasing order, total length = 4 quarters
      snd_seq_ev_schedule_tick(&ev, queue, 0, (n-1-i)*96*4/n);
      // output event
      snd_seq_event_output(seq, &ev);
    }
  printf("scheduling done...\n");

  // send events and wait for end
  snd_seq_drain_output(seq);
  snd_seq_sync_output_queue(seq);
  sleep(1);

  // done
  snd_seq_close ( seq ) ;
  return 0 ;
}

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux