File: alsa-seq-send.c

package info (click to toggle)
jack-tools 20131226-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 712 kB
  • sloc: ansic: 6,183; makefile: 105; lisp: 54
file content (72 lines) | stat: -rw-r--r-- 1,980 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <alsa/asoundlib.h>

#include "alsa-seq-send.h"
#include "int.h"
#include "print.h"

/* Make a basic seq queue. */
int alsa_seq_make_default_queue(snd_seq_t *seq)
{
  int queue;
  queue = snd_seq_alloc_queue(seq);
  snd_seq_start_queue(seq, queue, 0);
  snd_seq_drain_output(seq);
  return queue;
}

/* Apart from setting the event destination, all the code for _send
   and _send_to is shared. */
static void alsa_seq_send_common(snd_seq_t *seq, int queue,
				 int src_port,
				 snd_midi_event_t *encoder,
				 u8 *c, int n,
				 snd_seq_event_t e)
{
  if(n <= 0) {
    eprintf("%s: empty packet\n", __func__);
    return;
  }
  snd_seq_real_time_t time;
  int err;
  snd_seq_ev_set_source(&e, src_port);
  snd_midi_event_reset_encode(encoder);
  err = snd_midi_event_encode(encoder, c, n, &e);
  if(err < 0 || e.type == SND_SEQ_EVENT_NONE) {
    eprintf("%s: encoding failed: %s\n", __func__, snd_strerror(errno));
    return;
  }
  time.tv_sec = time.tv_nsec = 0;
  snd_seq_ev_schedule_real( &e, queue, 1, &time);
  err = snd_seq_event_output_direct(seq, &e);
  if(err < 0) {
    eprintf("%s: output failed: %s\n", __func__, snd_strerror(errno));
    return;
  }
}

/* Encode the MIDI data at `c' as an ALSA sequencer event and send it
   to the registered subscribers. */
void alsa_seq_send(snd_seq_t *seq, int queue,
		   int src_port,
		   snd_midi_event_t *encoder,
		   u8 *c, int n)
{
  snd_seq_event_t e;
  snd_seq_ev_clear(&e);
  snd_seq_ev_set_subs(&e);
  alsa_seq_send_common(seq, queue, src_port, encoder, c, n , e);
}

/* Encode the MIDI data at `c' as an ALSA sequencer event and send it
   to indicated destination port. */
void alsa_seq_send_to(snd_seq_t *seq, int queue,
		      int src_port,
		      int dst_client, int dst_port,
		      snd_midi_event_t *encoder,
		      u8 *c, int n)
{
  snd_seq_event_t e;
  snd_seq_ev_clear(&e);
  snd_seq_ev_set_dest(&e, dst_client, dst_port);
  alsa_seq_send_common(seq, queue, src_port, encoder, c, n , e);
}