/* ZynAddSubFX - a software synthesizer Fl_Osc_Widget.cpp - OSC Widget Superclass Copyright (C) 2016 Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include "Fl_Osc_Widget.H" #include "Fl_Osc_Pane.H" #include Fl_Osc_Widget::Fl_Osc_Widget(void) //Deprecated :loc(), osc(NULL) {} Fl_Osc_Widget::Fl_Osc_Widget(std::string loc_, Fl_Osc_Interface *osc_) :loc(loc_), osc(osc_) { assert(osc); } Fl_Osc_Widget:: Fl_Osc_Widget(Fl_Widget *self) { assert(fetch_osc_pane(self)); if(auto *pane = fetch_osc_pane(self)) { osc = pane->osc; loc = pane->loc(); } assert(osc); } Fl_Osc_Widget::~Fl_Osc_Widget(void) { if(osc) osc->removeLink(this); }; void Fl_Osc_Widget::OSC_value(float) {} void Fl_Osc_Widget::OSC_value(bool) {} void Fl_Osc_Widget::OSC_value(int) {} void Fl_Osc_Widget::OSC_value(char) {} void Fl_Osc_Widget::OSC_value(unsigned,void*) {} void Fl_Osc_Widget::OSC_value(const char *) {} //labeled forwarding methods void Fl_Osc_Widget::OSC_value(float x, const char *) {OSC_value(x);} void Fl_Osc_Widget::OSC_value(bool x, const char *) {OSC_value(x);} void Fl_Osc_Widget::OSC_value(int x, const char *) {OSC_value(x);} void Fl_Osc_Widget::OSC_value(char x, const char *) {OSC_value(x);} void Fl_Osc_Widget::OSC_value(unsigned x, void *v, const char *) {OSC_value(x,v);} void Fl_Osc_Widget::OSC_value(const char *x, const char *) {OSC_value(x);} void Fl_Osc_Widget::OSC_raw(const char *) {} void Fl_Osc_Widget::oscWrite(std::string path, const char *args, ...) { char buffer[1024]; //puts("writing OSC"); //printf("Path = '%s'\n", path.c_str()); va_list va; va_start(va, args); if(rtosc_vmessage(buffer, 1024, (loc+path).c_str(), args, va)) osc->writeRaw(buffer); else puts("Dangerous Event ommision"); va_end(va); ////Try to pretty print basic events //if(!strcmp(args, "c") || !strcmp(args, "i")) // printf("Args = ['%d']\n", rtosc_argument(buffer, 0).i); //if(!strcmp(args, "f")) // printf("Args = ['%f']\n", rtosc_argument(buffer, 0).f); //if(!strcmp(args, "T")) // printf("Args = [True]\n"); //if(!strcmp(args, "F")) // printf("Args = [False]\n"); } void Fl_Osc_Widget::oscWrite(std::string path) { osc->requestValue(loc+path); } void Fl_Osc_Widget::oscRegister(const char *path) { osc->createLink(loc+path, this); osc->requestValue(loc+path); } void Fl_Osc_Widget::update(void) { if(*((loc+ext).rbegin()) != '/' && osc) osc->requestValue(loc+ext); } Fl_Osc_Pane *Fl_Osc_Widget::fetch_osc_pane(Fl_Widget *w) { if(!w) return NULL; Fl_Osc_Pane *pane = dynamic_cast(w->parent()); if(pane) return pane; return fetch_osc_pane(w->parent()); } void Fl_Osc_Widget::rebase(std::string new_base) { osc->renameLink(loc+ext, new_base+ext, this); loc = new_base; osc->requestValue(loc+ext); } void Fl_Osc_Widget::oscMove(std::string new_ext) { osc->renameLink(loc+ext, loc+new_ext, this); ext = new_ext; osc->requestValue(loc+ext); } void Fl_Osc_Widget::oscMove(std::string old_loc, std::string new_loc) { osc->renameLink(old_loc, new_loc, this); osc->requestValue(new_loc); }