36 void error(
int num,
const char *m,
const char *path);
38 int argc,
void *
data,
void *user_data);
40 void *
data,
void *user_data);
42 void *
data,
void *user_data);
44 #define MAX_ACCESSORS 64 // max number of instrument accessors
53 #define addOSCMethod(name, nfunction) \
54 lo_server_thread_add_method(sSrvThrd, nname, NULL, nfunction, NULL)
56 extern "C" void addOSCMethod2(name, nfunction,
void * user_data);
70 void error(
int num,
const char *msg,
const char *path)
72 printf(
"liblo server error %d in path %s: %s\n", num, path, msg);
80 printf(
"path: <%s>\n", path);
81 for (i=0; i<argc; i++) {
82 printf(
"arg %d '%c' ", i, types[i]);
92 int foo_handler(
const char *path,
const char *types,
lo_arg **argv,
int argc,
void *data,
void *user_data) {
94 printf(
"%s <- f:%f, i:%d\n\n", path, argv[0]->f, argv[1]->i);
100 int quit_handler(
const char *path,
const char *types,
lo_arg **argv,
int argc,
void *data,
void *user_data) {
102 printf(
"quiting\n\n");
105 logMsg(
"OSC server exiting.");
107 IO * io = IO :: theInstance();
157 void floatParamSetter(
void * con,
int arglen,
const void * vargs, OSCTimeTag when, NetworkReturnAddressPtr ra) {
160 char * typeString = (
char *) vargs;
161 void * otherArgs = (
void *) OSCDataAfterAlignedString(typeString, typeString+arglen, &error);
162 if (strcmp(typeString,
",f")) {
163 logMsg(
kLogError,
"ERROR: Invalid type string in OSC message, expected \",f\" got \"%s\"", typeString);
167 logMsg(
"OSC set float param %d/%d to %g", (context->
num + 1), context->
selector, ((
float *) otherArgs)[0]);
172 void intParamSetter(
void * con,
int arglen,
const void * vargs, OSCTimeTag when, NetworkReturnAddressPtr ra) {
175 char * typeString = (
char *) vargs;
176 void * otherArgs = (
void *) OSCDataAfterAlignedString(typeString, typeString+arglen, &error);
177 if (strcmp(typeString,
",i")) {
178 logMsg(
kLogError,
"ERROR: Invalid type string in OSC message, expected \",i\" got \"%s\"", typeString);
181 logMsg(
"OSC set int param %d/%d to %d", (context->
num + 1), context->
selector, ((
int *) otherArgs)[0]);
186 void stringParamSetter(
void * con,
int arglen,
const void * vargs, OSCTimeTag when, NetworkReturnAddressPtr ra) {
189 char * typeString = (
char *) vargs;
190 void * otherArgs = (
void *) OSCDataAfterAlignedString(typeString, typeString+arglen, &error);
191 if (strcmp(typeString,
",s")) {
192 logMsg(
kLogError,
"ERROR: Invalid type string in OSC message, expected \",s\" got \"%s\"", typeString);
195 logMsg(
"OSC set string param %d/%d to %s", (context->
num + 1), context->
selector, (
char *) otherArgs);
201 void playNote(
void * con,
int arglen,
const void * vargs, OSCTimeTag when, NetworkReturnAddressPtr ra) {
203 logMsg(
"OSC play_note on instr %d", (context->
num + 1));
209 void playWithArgs(
void * con,
int arglen,
const void * vargs, OSCTimeTag when, NetworkReturnAddressPtr ra) {
212 char * typeString = (
char *) vargs;
213 char * endOfArgs = (
char *) vargs + arglen;
214 void * otherArgs = OSCDataAfterAlignedString(typeString, typeString+arglen, &error);
215 logMsg(
"OSC play_with_args on instr %d %s", (context->
num + 1), typeString);
216 context->
instr->
playOSC(typeString, otherArgs, endOfArgs);
228 extern "C" void addOSCMethod2(
char * name, OSC_CALL_BACK
function,
void * user_data) {
236 unsigned num_instruments = library.size();
237 logMsg(
"Setting up OSC address space for %d instruments\n", num_instruments);
240 for (
unsigned i = 0; i < num_instruments; i++) {
241 iname = (
char *) malloc(8);
242 sprintf(iname,
"i%d", i+1);
243 temp_cont = OSCNewContainer(iname, OSCTopLevelContainer, &cqinfo);
247 logMsg(
"Adding instrument \"%s\" (%s); %d accessors", iname, instr->
name().c_str(), num_accessors);
250 for (
unsigned j = 0; j < num_accessors; j++) {
252 the_context->
instr = instr;
253 the_context->
num = i;
254 the_context->
selector = accs[j]->mSelector;
257 switch(accs[j]->mType) {
259 OSCNewMethod(accs[j]->mName.c_str(), temp_cont,
intParamSetter, the_context, &QueryResponseInfo);
262 OSCNewMethod(accs[j]->mName.c_str(), temp_cont,
floatParamSetter, the_context, &QueryResponseInfo);
265 OSCNewMethod(accs[j]->mName.c_str(), temp_cont,
stringParamSetter, the_context, &QueryResponseInfo);
268 OSCNewMethod(
"p", temp_cont,
playNote, the_context, &QueryResponseInfo);
269 OSCNewMethod(
"pn", temp_cont,
playWithArgs, the_context, &QueryResponseInfo);