1 /*
2 * This program is in the public domain
3 *
4 * $Id: dssi_osc_send.c,v 1.5 2004/07/04 22:24:51 smbolton Exp $
5 */
6
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <lo/lo.h>
11
12 void
usage(char * program_name)13 usage(char *program_name)
14 {
15 char *base_name = strrchr(program_name, '/');
16
17 if (base_name && *(base_name + 1) != 0) {
18 base_name += 1;
19 } else {
20 base_name = program_name;
21 }
22 fprintf(stderr, "usage: %s <option> <OSC URL> <values>\n\n", program_name);
23 fprintf(stderr, "example OSC URLs:\n\n"
24 " osc.udp://localhost:19383/dssi/test.1\n"
25 " osc.udp://my.host.org:10886/dssi/xsynth-dssi/Xsynth/chan00\n\n");
26 fprintf(stderr, "example 'control' message (set control port 1 to 0.1):\n\n"
27 " %s -c <OSC URL> 1 0.1\n\n", base_name);
28 fprintf(stderr, "example 'program' message (select bank 0 program number 7):\n\n"
29 " %s -p <OSC URL> 0 7\n\n", base_name);
30 fprintf(stderr, "example 'midi' message (send a note on, middle C, velocity 64):\n\n"
31 " %s -m <OSC URL> 0 144 60 64\n\n", base_name);
32 fprintf(stderr, "example 'configure' message (send key 'load' and value '/tmp/patches.pat'):\n\n"
33 " %s -C <OSC URL> load /tmp/patches.pat\n\n", base_name);
34 fprintf(stderr, "messages requiring no additional arguments:\n\n"
35 " %s -s <OSC URL> (send 'show' message)\n", base_name);
36 fprintf(stderr, " %s -h <OSC URL> (send 'hide' message)\n", base_name);
37 fprintf(stderr, " %s -q <OSC URL> (send 'quit' message)\n", base_name);
38 fprintf(stderr, " %s -e <OSC URL> (send 'exiting' message)\n", base_name);
39 exit(1);
40 }
41
main(int argc,char * argv[])42 int main(int argc, char *argv[])
43 {
44 lo_address a;
45 char *url, *host, *port, *path, *method;
46 char mode = '-';
47 char full_path[256];
48
49 int ladspa_port, int0, int1;
50 float value;
51 unsigned char midi[4];
52
53 if (argc < 3) {
54 usage(argv[0]);
55 /* does not return */
56 }
57 url = argv[1];
58 if (argv[1][0] == '-') {
59 if (argv[1][1] == 'c' ||
60 argv[1][1] == 'p' ||
61 argv[1][1] == 'm' ||
62 argv[1][1] == 'C' ||
63 argv[1][1] == 's' ||
64 argv[1][1] == 'h' ||
65 argv[1][1] == 'q' ||
66 argv[1][1] == 'e') {
67 mode = argv[1][1];
68 url = argv[2];
69 } else {
70 usage(argv[0]);
71 }
72 }
73
74 host = lo_url_get_hostname(url);
75 port = lo_url_get_port(url);
76 path = lo_url_get_path(url);
77 a = lo_address_new(host, port);
78
79 switch (mode) {
80
81 case '-': /* old 'control' syntax */
82 if (argc != 4) usage(argv[0]);
83 ladspa_port = atoi(argv[2]);
84 value = atof(argv[3]);
85 printf("sending osc.udp://%s:%s%s %d %f\n", host, port, path,
86 ladspa_port, value);
87 lo_send(a, path, "if", ladspa_port, value);
88 break;
89
90 case 'c': /* new 'control' syntax */
91 if (argc != 5) usage(argv[0]);
92 snprintf(full_path, 255, "%s/control", path);
93 ladspa_port = atoi(argv[3]);
94 value = atof(argv[4]);
95 printf("sending osc.udp://%s:%s%s %d %f\n", host, port, full_path,
96 ladspa_port, value);
97 lo_send(a, full_path, "if", ladspa_port, value);
98 break;
99
100 case 'p': /* send 'program' message */
101 if (argc != 5) usage(argv[0]);
102 snprintf(full_path, 255, "%s/program", path);
103 int0 = atoi(argv[3]);
104 int1 = atoi(argv[4]);
105 printf("sending osc.udp://%s:%s%s %d %d\n", host, port, full_path,
106 int0, int1);
107 lo_send(a, full_path, "ii", int0, int1);
108 break;
109
110 case 'm': /* send 'midi' message */
111 if (argc < 5 || argc > 7) usage(argv[0]);
112 snprintf(full_path, 255, "%s/midi", path);
113 midi[0] = atoi(argv[3]); /* "port id", according to OSC spec */
114 midi[1] = atoi(argv[4]); /* status byte */
115 midi[2] = argc > 5 ? atoi(argv[5]) : 0; /* data byte 1 */
116 midi[3] = argc > 6 ? atoi(argv[6]) : 0; /* data byte 2 */
117 printf("sending osc.udp://%s:%s%s [%02x %02x %02x %02x]\n", host, port, full_path,
118 midi[0], midi[1], midi[2], midi[3]);
119 lo_send(a, full_path, "m", midi);
120 break;
121
122 case 'C': /* send 'configure' message */
123 if (argc != 5) usage(argv[0]);
124 snprintf(full_path, 255, "%s/configure", path);
125 printf("sending osc.udp://%s:%s%s \"%s\" \"%s\"\n", host, port, full_path,
126 argv[3], argv[4]);
127 lo_send(a, full_path, "ss", argv[3], argv[4]);
128 break;
129
130 case 's': /* send 'show' message */
131 case 'h': /* send 'hide' message */
132 case 'q': /* send 'quit' message */
133 case 'e': /* send 'exiting' message */
134 if (argc != 3) usage(argv[0]);
135 switch (mode) {
136 default:
137 case 's': method = "show"; break;
138 case 'h': method = "hide"; break;
139 case 'q': method = "quit"; break;
140 case 'e': method = "exiting"; break;
141 }
142 snprintf(full_path, 255, "%s/%s", path, method);
143 printf("sending osc.udp://%s:%s%s\n", host, port, full_path);
144 lo_send(a, full_path, "");
145 break;
146 }
147
148 if (lo_address_errno(a)) {
149 printf("liblo error: %s\n", lo_address_errstr(a));
150 }
151 free(host);
152 free(port);
153 free(path);
154
155 return 0;
156 }
157
158 /* vi:set ts=8 sts=4 sw=4: */
159