28#if !defined(__ASOUNDLIB_H) && !defined(ALSA_LIBRARY_BUILD) 
   30#warning "use #include <alsa/asoundlib.h>, <alsa/seqmid.h> should not be used directly" 
   31#include <alsa/asoundlib.h> 
   34#ifndef __ALSA_SEQMID_H 
   35#define __ALSA_SEQMID_H 
   54static inline void snd_seq_ev_clear(snd_seq_event_t *ev)
 
   56    memset(ev, 0, 
sizeof(*ev));
 
   65static inline void snd_seq_ump_ev_clear(snd_seq_ump_event_t *ev)
 
   67    memset(ev, 0, 
sizeof(*ev));
 
   77#define snd_seq_ev_set_tag(ev,t) \ 
   90#define snd_seq_ev_set_dest(ev,c,p) \ 
   91    ((ev)->dest.client = (c), (ev)->dest.port = (p)) 
  101#define snd_seq_ev_set_subs(ev) \ 
  102    ((ev)->dest.client = SND_SEQ_ADDRESS_SUBSCRIBERS,\ 
  103     (ev)->dest.port = SND_SEQ_ADDRESS_UNKNOWN) 
  113#define snd_seq_ev_set_broadcast(ev) \ 
  114    ((ev)->dest.client = SND_SEQ_ADDRESS_BROADCAST,\ 
  115     (ev)->dest.port = SND_SEQ_ADDRESS_BROADCAST) 
  124#define snd_seq_ev_set_source(ev,p) \ 
  125    ((ev)->source.port = (p)) 
  136#define snd_seq_ev_set_direct(ev) \ 
  137    ((ev)->queue = SND_SEQ_QUEUE_DIRECT) 
  151#define snd_seq_ev_schedule_tick(ev, q, relative, ttick) \ 
  152    ((ev)->flags &= ~(SND_SEQ_TIME_STAMP_MASK | SND_SEQ_TIME_MODE_MASK),\ 
  153     (ev)->flags |= SND_SEQ_TIME_STAMP_TICK,\ 
  154     (ev)->flags |= (relative) ? SND_SEQ_TIME_MODE_REL : SND_SEQ_TIME_MODE_ABS,\ 
  155     (ev)->time.tick = (ttick),\ 
  170#define snd_seq_ev_schedule_real(ev, q, relative, rtime) \ 
  171    ((ev)->flags &= ~(SND_SEQ_TIME_STAMP_MASK | SND_SEQ_TIME_MODE_MASK),\ 
  172     (ev)->flags |= SND_SEQ_TIME_STAMP_REAL,\ 
  173     (ev)->flags |= (relative) ? SND_SEQ_TIME_MODE_REL : SND_SEQ_TIME_MODE_ABS,\ 
  174     (ev)->time.time = *(rtime),\ 
  182#define snd_seq_ev_set_priority(ev, high_prior) \ 
  183    ((ev)->flags &= ~SND_SEQ_PRIORITY_MASK,\ 
  184     (ev)->flags |= (high_prior) ? SND_SEQ_PRIORITY_HIGH : SND_SEQ_PRIORITY_NORMAL) 
  194#define snd_seq_ev_set_fixed(ev) \ 
  195    ((ev)->flags &= ~SND_SEQ_EVENT_LENGTH_MASK,\ 
  196     (ev)->flags |= SND_SEQ_EVENT_LENGTH_FIXED) 
  208#define snd_seq_ev_set_variable(ev, datalen, dataptr) \ 
  209    ((ev)->flags &= ~SND_SEQ_EVENT_LENGTH_MASK,\ 
  210     (ev)->flags |= SND_SEQ_EVENT_LENGTH_VARIABLE,\ 
  211     (ev)->data.ext.len = (datalen),\ 
  212     (ev)->data.ext.ptr = (dataptr)) 
  224#define snd_seq_ev_set_varusr(ev, datalen, dataptr) \ 
  225    ((ev)->flags &= ~SND_SEQ_EVENT_LENGTH_MASK,\ 
  226     (ev)->flags |= SND_SEQ_EVENT_LENGTH_VARUSR,\ 
  227     (ev)->data.ext.len = (datalen),\ 
  228     (ev)->data.ext.ptr = (dataptr)) 
  237#define snd_seq_ev_set_queue_control(ev, typ, q, val) \ 
  238    ((ev)->type = (typ),\ 
  239     snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER),\ 
  240     (ev)->data.queue.queue = (q),\ 
  241     (ev)->data.queue.param.value = (val)) 
  250#define snd_seq_ev_set_queue_start(ev, q) \ 
  251    snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_START, q, 0) 
  260#define snd_seq_ev_set_queue_stop(ev, q) \ 
  261    snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_STOP, q, 0) 
  270#define snd_seq_ev_set_queue_continue(ev, q) \ 
  271    snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_CONTINUE, q, 0) 
  279#define snd_seq_ev_set_queue_tempo(ev, q, val) \ 
  280    snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_TEMPO, q, val) 
  288#define snd_seq_ev_set_queue_pos_real(ev, q, rtime) \ 
  289    ((ev)->type = SND_SEQ_EVENT_SETPOS_TIME,\ 
  290     snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER),\ 
  291     (ev)->data.queue.queue = (q),\ 
  292     (ev)->data.queue.param.time.time = *(rtime)) 
  300#define snd_seq_ev_set_queue_pos_tick(ev, q, ttime) \ 
  301    ((ev)->type = SND_SEQ_EVENT_SETPOS_TICK,\ 
  302     snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER),\ 
  303     (ev)->data.queue.queue = (q),\ 
  304     (ev)->data.queue.param.time.tick = (ttime)) 
  310static inline void snd_seq_ev_set_ump(snd_seq_ump_event_t *ev)
 
  312    ev->flags |= SND_SEQ_EVENT_UMP;
 
  322static inline int snd_seq_ev_set_ump_data(snd_seq_ump_event_t *ev, 
void *data, 
size_t bytes)
 
  326    snd_seq_ev_set_ump(ev);
 
  327    memcpy(ev->ump, data, bytes);
 
  332int snd_seq_control_queue(snd_seq_t *seq, 
int q, 
int type, 
int value, snd_seq_event_t *ev);
 
  340#define snd_seq_start_queue(seq, q, ev) \ 
  341    snd_seq_control_queue(seq, q, SND_SEQ_EVENT_START, 0, ev) 
  349#define snd_seq_stop_queue(seq, q, ev) \ 
  350    snd_seq_control_queue(seq, q, SND_SEQ_EVENT_STOP, 0, ev) 
  358#define snd_seq_continue_queue(seq, q, ev) \ 
  359    snd_seq_control_queue(seq, q, SND_SEQ_EVENT_CONTINUE, 0, ev) 
  368#define snd_seq_change_queue_tempo(seq, q, tempo, ev) \ 
  369    snd_seq_control_queue(seq, q, SND_SEQ_EVENT_TEMPO, tempo, ev) 
  372int snd_seq_create_simple_port(snd_seq_t *seq, 
const char *name,
 
  373                   unsigned int caps, 
unsigned int type);
 
  375int snd_seq_delete_simple_port(snd_seq_t *seq, 
int port);
 
  380int snd_seq_connect_from(snd_seq_t *seq, 
int my_port, 
int src_client, 
int src_port);
 
  381int snd_seq_connect_to(snd_seq_t *seq, 
int my_port, 
int dest_client, 
int dest_port);
 
  382int snd_seq_disconnect_from(snd_seq_t *seq, 
int my_port, 
int src_client, 
int src_port);
 
  383int snd_seq_disconnect_to(snd_seq_t *seq, 
int my_port, 
int dest_client, 
int dest_port);
 
  388int snd_seq_set_client_name(snd_seq_t *seq, 
const char *name);
 
  389int snd_seq_set_client_event_filter(snd_seq_t *seq, 
int event_type);
 
  390int snd_seq_set_client_midi_version(snd_seq_t *seq, 
int midi_version);
 
  391int snd_seq_set_client_ump_conversion(snd_seq_t *seq, 
int enable);
 
  392int snd_seq_set_client_pool_output(snd_seq_t *seq, 
size_t size);
 
  393int snd_seq_set_client_pool_output_room(snd_seq_t *seq, 
size_t size);
 
  394int snd_seq_set_client_pool_input(snd_seq_t *seq, 
size_t size);
 
  396int snd_seq_sync_output_queue(snd_seq_t *seq);
 
  401int snd_seq_parse_address(snd_seq_t *seq, snd_seq_addr_t *addr, 
const char *str);
 
  406int snd_seq_reset_pool_output(snd_seq_t *seq);
 
  407int snd_seq_reset_pool_input(snd_seq_t *seq);
 
  417#define snd_seq_ev_set_note(ev, ch, key, vel, dur) \ 
  418    ((ev)->type = SND_SEQ_EVENT_NOTE,\ 
  419     snd_seq_ev_set_fixed(ev),\ 
  420     (ev)->data.note.channel = (ch),\ 
  421     (ev)->data.note.note = (key),\ 
  422     (ev)->data.note.velocity = (vel),\ 
  423     (ev)->data.note.duration = (dur)) 
  432#define snd_seq_ev_set_noteon(ev, ch, key, vel) \ 
  433    ((ev)->type = SND_SEQ_EVENT_NOTEON,\ 
  434     snd_seq_ev_set_fixed(ev),\ 
  435     (ev)->data.note.channel = (ch),\ 
  436     (ev)->data.note.note = (key),\ 
  437     (ev)->data.note.velocity = (vel)) 
  446#define snd_seq_ev_set_noteoff(ev, ch, key, vel) \ 
  447    ((ev)->type = SND_SEQ_EVENT_NOTEOFF,\ 
  448     snd_seq_ev_set_fixed(ev),\ 
  449     (ev)->data.note.channel = (ch),\ 
  450     (ev)->data.note.note = (key),\ 
  451     (ev)->data.note.velocity = (vel)) 
  460#define snd_seq_ev_set_keypress(ev,ch,key,vel) \ 
  461    ((ev)->type = SND_SEQ_EVENT_KEYPRESS,\ 
  462     snd_seq_ev_set_fixed(ev),\ 
  463     (ev)->data.note.channel = (ch),\ 
  464     (ev)->data.note.note = (key),\ 
  465     (ev)->data.note.velocity = (vel)) 
  474#define snd_seq_ev_set_controller(ev,ch,cc,val) \ 
  475    ((ev)->type = SND_SEQ_EVENT_CONTROLLER,\ 
  476     snd_seq_ev_set_fixed(ev),\ 
  477     (ev)->data.control.channel = (ch),\ 
  478     (ev)->data.control.param = (cc),\ 
  479     (ev)->data.control.value = (val)) 
  487#define snd_seq_ev_set_pgmchange(ev,ch,val) \ 
  488    ((ev)->type = SND_SEQ_EVENT_PGMCHANGE,\ 
  489     snd_seq_ev_set_fixed(ev),\ 
  490     (ev)->data.control.channel = (ch),\ 
  491     (ev)->data.control.value = (val)) 
  499#define snd_seq_ev_set_pitchbend(ev,ch,val) \ 
  500    ((ev)->type = SND_SEQ_EVENT_PITCHBEND,\ 
  501     snd_seq_ev_set_fixed(ev),\ 
  502     (ev)->data.control.channel = (ch),\ 
  503     (ev)->data.control.value = (val)) 
  511#define snd_seq_ev_set_chanpress(ev,ch,val) \ 
  512    ((ev)->type = SND_SEQ_EVENT_CHANPRESS,\ 
  513     snd_seq_ev_set_fixed(ev),\ 
  514     (ev)->data.control.channel = (ch),\ 
  515     (ev)->data.control.value = (val)) 
  525#define snd_seq_ev_set_sysex(ev,datalen,dataptr) \ 
  526    ((ev)->type = SND_SEQ_EVENT_SYSEX,\ 
  527     snd_seq_ev_set_variable(ev, datalen, dataptr)) 
  530int snd_seq_create_ump_endpoint(snd_seq_t *seq,
 
  531                const snd_ump_endpoint_info_t *info,
 
  532                unsigned int num_groups);
 
  533int snd_seq_create_ump_block(snd_seq_t *seq, 
int blkid,
 
  534                 const snd_ump_block_info_t *info);