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