diff options
author | Florian Jung <flo@windfisch.org> | 2012-05-28 14:15:52 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2012-05-28 14:15:52 +0000 |
commit | d2a88cfaad5ac385fc3c6212c09ad7fbc38e9454 (patch) | |
tree | 387da0b38255003e1a971629ea0de32273ac3d3c /muse2/muse/osc.cpp | |
parent | 716f5a5b56a3b7ff59004ef0a1af5f98cb2a691c (diff) |
merged with release_2_0
Diffstat (limited to 'muse2/muse/osc.cpp')
-rw-r--r-- | muse2/muse/osc.cpp | 96 |
1 files changed, 80 insertions, 16 deletions
diff --git a/muse2/muse/osc.cpp b/muse2/muse/osc.cpp index f78e7a61..0d4a1750 100644 --- a/muse2/muse/osc.cpp +++ b/muse2/muse/osc.cpp @@ -34,6 +34,7 @@ #include <string.h> #include <stdlib.h> #include <errno.h> +#include <math.h> #include <QFileInfo> #include <QString> @@ -178,9 +179,7 @@ int oscMessageHandler(const char* path, const char* types, lo_arg** argv, if(!instance) break; - QByteArray ba2 = synti->name().toLatin1(); - p = sub + strlen(ba2.constData()); - + p = sub + ba.length(); if (*p != '/' || *(p + 1) == 0) { fprintf(stderr, "oscMessageHandler error: synth: end of path or no /\n"); @@ -241,9 +240,7 @@ int oscMessageHandler(const char* path, const char* types, lo_arg** argv, if(!plugin) break; - QByteArray ba3 = instance->label().toLatin1(); - p = sub + strlen(ba3.constData()); - + p = sub + ba.length(); if (*p != '/' || *(p + 1) == 0) { fprintf(stderr, "oscMessageHandler: error: effect: end of path or no /\n"); @@ -387,6 +384,11 @@ OscIF::OscIF() _guiPid = -1; #endif _oscGuiVisible = false; + + old_prog=old_bank=0xDEADBEEF; + old_control=NULL; + control_port_mapper=NULL; + maxDssiPort=0; } OscIF::~OscIF() @@ -429,6 +431,9 @@ OscIF::~OscIF() free(_uiOscProgramPath); if(_uiOscPath) free(_uiOscPath); + + if (old_control) + delete [] old_control; } //--------------------------------------------------------- @@ -728,20 +733,29 @@ int OscIF::oscExiting(lo_arg**) // oscSendProgram //--------------------------------------------------------- -void OscIF::oscSendProgram(unsigned long prog, unsigned long bank) +void OscIF::oscSendProgram(unsigned long prog, unsigned long bank, bool force) { - if(_uiOscTarget && _uiOscProgramPath) + if(_uiOscTarget && _uiOscProgramPath && + (bank!=old_bank || prog!=old_prog || force) ) + { lo_send(_uiOscTarget, _uiOscProgramPath, "ii", bank, prog); + old_bank=bank; + old_prog=prog; + } } //--------------------------------------------------------- // oscSendControl //--------------------------------------------------------- -void OscIF::oscSendControl(unsigned long dssiPort, float v) +void OscIF::oscSendControl(unsigned long dssiPort, float v, bool force) { - if(_uiOscTarget && _uiOscControlPath) + if(_uiOscTarget && _uiOscControlPath && + ((dssiPort<maxDssiPort && old_control[control_port_mapper->at(dssiPort)]!=v) || force) ) + { lo_send(_uiOscTarget, _uiOscControlPath, "if", dssiPort, v); + old_control[control_port_mapper->at(dssiPort)]=v; + } } //--------------------------------------------------------- @@ -759,8 +773,45 @@ void OscIF::oscSendConfigure(const char *key, const char *val) //--------------------------------------------------------- bool OscIF::oscInitGui(const QString& typ, const QString& baseName, const QString& name, - const QString& label, const QString& filePath, const QString& guiPath) + const QString& label, const QString& filePath, const QString& guiPath, + const std::vector<unsigned long>* control_port_mapper_) { + if (old_control==NULL) + { + control_port_mapper=control_port_mapper_; + + unsigned long nDssiPorts=0; + for (unsigned i=0;i<control_port_mapper->size();i++) + if (control_port_mapper->at(i)!=(unsigned long)-1 && control_port_mapper->at(i)+1 > nDssiPorts) + nDssiPorts=control_port_mapper->at(i)+1; + + old_control=new float[nDssiPorts]; + for (unsigned long i=0;i<nDssiPorts;i++) // init them all with "not a number" + old_control[i]=NAN; + + maxDssiPort=nDssiPorts; + } + else + { + control_port_mapper=control_port_mapper_; + + unsigned long nDssiPorts=0; + for (unsigned i=0;i<control_port_mapper->size();i++) + if (control_port_mapper->at(i)!=(unsigned long)-1 && control_port_mapper->at(i)+1 > nDssiPorts) + nDssiPorts=control_port_mapper->at(i)+1; + + if (maxDssiPort!=nDssiPorts) + { + // this should never happen, right? + printf("STRANGE: nDssiPorts has changed (old=%lu, now=%lu)!\n", maxDssiPort, nDssiPorts); + delete [] old_control; + old_control=new float[nDssiPorts]; + for (unsigned long i=0;i<nDssiPorts;i++) // init them all with "not a number" + old_control[i]=NAN; + maxDssiPort=nDssiPorts; + } + } + // Are we already running? We don't want to allow another process do we... #ifdef _USE_QPROCESS_FOR_GUI_ if((_oscGuiQProc != 0) && (_oscGuiQProc->state())) @@ -902,8 +953,7 @@ void OscIF::oscShowGui(bool v) } } - //for (int i = 0; i < 5; ++i) { - for (int i = 0; i < 20; ++i) { // Give it a wee bit more time? + for (int i = 0; i < 20; ++i) { if (_uiOscPath) break; sleep(1); @@ -1020,7 +1070,11 @@ int OscDssiIF::oscMidi(lo_arg** argv) int OscDssiIF::oscProgram(lo_arg** argv) { if(_oscSynthIF) + { _oscSynthIF->oscProgram(argv[1]->i, argv[0]->i); + old_prog=argv[1]->i; + old_bank=argv[0]->i; + } return 0; } @@ -1036,7 +1090,11 @@ int OscDssiIF::oscControl(lo_arg** argv) return 0; if(_oscSynthIF) + { _oscSynthIF->oscControl(argv[0]->i, argv[1]->f); + if (port<maxDssiPort) + old_control[control_port_mapper->at(port)]=argv[1]->f; + } return 0; } @@ -1048,10 +1106,11 @@ bool OscDssiIF::oscInitGui() { if(!_oscSynthIF) return false; - + return OscIF::oscInitGui("dssi_synth", _oscSynthIF->dssiSynth()->baseName(), _oscSynthIF->dssiSynth()->name(), _oscSynthIF->dssiSynthI()->name(), - _oscSynthIF->dssiSynth()->fileName(), _oscSynthIF->dssi_ui_filename()); + _oscSynthIF->dssiSynth()->fileName(), _oscSynthIF->dssi_ui_filename(), + _oscSynthIF->dssiSynth()->getRpIdx()); } QString OscDssiIF::titlePrefix() const @@ -1109,7 +1168,11 @@ int OscEffectIF::oscControl(lo_arg** argv) return 0; if(_oscPluginI) + { _oscPluginI->oscControl(argv[0]->i, argv[1]->f); + if (port<maxDssiPort) + old_control[control_port_mapper->at(port)]=argv[1]->f; + } return 0; } @@ -1124,7 +1187,8 @@ bool OscEffectIF::oscInitGui() return OscIF::oscInitGui("ladspa_efx", _oscPluginI->plugin()->lib(false), _oscPluginI->plugin()->label(), _oscPluginI->label(), - _oscPluginI->plugin()->fileName(), _oscPluginI->dssi_ui_filename()); + _oscPluginI->plugin()->fileName(), _oscPluginI->dssi_ui_filename(), + _oscPluginI->plugin()->getRpIdx()); } QString OscEffectIF::titlePrefix() const |