Merge pull request #23 from jackaudio/device_reservation_fixes
[jack2.git] / example-clients / midi_dump.c
blob07963a0f3ecac712e65a3432d07301675113c6fd
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <assert.h>
4 #include <jack/jack.h>
5 #include <jack/midiport.h>
7 static jack_port_t* port;
9 static void
10 describe (jack_midi_event_t* event, char* buffer, size_t buflen)
12 assert (buflen > 0);
14 buffer[0] = '\0';
16 if (event->size == 0) {
17 return;
20 int type = event->buffer[0] & 0xf0;
21 int channel = event->buffer[0] & 0xf;
23 switch (type) {
24 case 0x90:
25 assert (event->size == 3);
26 snprintf (buffer, buflen, "note on (channel %d): pitch %d, velocity %d", channel, event->buffer[1], event->buffer[2]);
27 break;
28 case 0x80:
29 assert (event->size == 3);
30 snprintf (buffer, buflen, "note off (channel %d): pitch %d, velocity %d", channel, event->buffer[1], event->buffer[2]);
31 break;
32 case 0xb0:
33 assert (event->size == 3);
34 snprintf (buffer, buflen, "control change (channel %d): controller %d, value %d", channel, event->buffer[1], event->buffer[2]);
35 break;
36 default:
37 break;
41 int
42 process (jack_nframes_t frames, void* arg)
44 void* buffer;
45 jack_nframes_t N;
46 jack_nframes_t i;
47 char description[256];
49 buffer = jack_port_get_buffer (port, frames);
50 assert (buffer);
52 N = jack_midi_get_event_count (buffer);
53 for (i = 0; i < N; ++i) {
54 jack_midi_event_t event;
55 int r;
57 r = jack_midi_event_get (&event, buffer, i);
58 if (r == 0) {
59 size_t j;
61 printf ("%d:", event.time);
62 for (j = 0; j < event.size; ++j) {
63 printf (" %x", event.buffer[j]);
66 describe (&event, description, sizeof (description));
67 printf (" %s", description);
69 printf ("\n");
73 return 0;
77 int
78 main (int argc, char* argv[])
80 jack_client_t* client;
81 char const default_name[] = "midi-monitor";
82 char const * client_name;
83 int r;
85 if (argc == 2) {
86 client_name = argv[1];
87 } else {
88 client_name = default_name;
91 client = jack_client_open (client_name, JackNullOption, NULL);
92 if (client == NULL) {
93 fprintf (stderr, "Could not create JACK client.\n");
94 exit (EXIT_FAILURE);
97 jack_set_process_callback (client, process, 0);
99 port = jack_port_register (client, "input", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
100 if (port == NULL) {
101 fprintf (stderr, "Could not register port.\n");
102 exit (EXIT_FAILURE);
105 r = jack_activate (client);
106 if (r != 0) {
107 fprintf (stderr, "Could not activate client.\n");
108 exit (EXIT_FAILURE);
111 /* run until interrupted */
112 while (1) {
113 #ifdef WIN32
114 Sleep(1000);
115 #else
116 sleep(1);
117 #endif
120 return 0;