MLOSCListener::~MLOSCListener() { listenToOSC(0); }
int MLOSCListener::listenToOSC(int port) { int ret = false; if(port) { if(mpSocket) { listenToOSC(0); } try { std::cout << "MLOSCListener: trying listen on port " << port << "...\n"; mpSocket = new UdpListeningReceiveSocket( IpEndpointName( IpEndpointName::ANY_ADDRESS, port), this); } catch( osc::Exception& e ) { mpSocket = 0; std::cout << "MLOSCListener::listenToOSC: couldn't bind to port " << port << ".\n"; std::cout << "error: " << e.what() << "\n"; } catch(...) { mpSocket = 0; std::cout << "MLOSCListener::listenToOSC: couldn't bind to port " << port << ".\n"; std::cout << "Unknown error.\n"; } if(mpSocket) { std::cout << "MLOSCListener::listenToOSC: created receive socket on port " << port << ".\n"; mPort = port; int err; pthread_attr_t attr; // std::cout << "initializing pthread attributes...\n"; err = pthread_attr_init(&attr); if(!err) { // std::cout << "creating listener thread...\n"; err = pthread_create(&mListenerThread, &attr, &MLOSCListenerStartThread, (void*)this); if(!err) { ret = true; mListening = true; } } } } else { if(mpSocket) { std::cout << "MLOSCListener: disconnecting.\n"; mpSocket->Break(); delete mpSocket; mpSocket = 0; } mListening = false; ret = true; } return ret; }
void SoundplaneModel::doPropertyChangeAction(MLSymbol p, const MLProperty & newVal) { // debug() << "SoundplaneModel::doPropertyChangeAction: " << p << " -> " << newVal << "\n"; int propertyType = newVal.getType(); switch(propertyType) { case MLProperty::kFloatProperty: { float v = newVal.getFloatValue(); if (p.withoutFinalNumber() == MLSymbol("carrier_toggle")) { // toggles changed -- mute carriers unsigned long mask = 0; for(int i=0; i<32; ++i) { MLSymbol tSym = MLSymbol("carrier_toggle").withFinalNumber(i); bool on = (int)(getFloatProperty(tSym)); mask = mask | (on << i); } mCarriersMask = mask; mCarrierMaskDirty = true; // trigger carriers set in a second or so } else if (p == "all_toggle") { bool on = (bool)(v); for(int i=0; i<32; ++i) { MLSymbol tSym = MLSymbol("carrier_toggle").withFinalNumber(i); setProperty(tSym, on); } mCarriersMask = on ? ~0 : 0; mCarrierMaskDirty = true; // trigger carriers set in a second or so } else if (p == "max_touches") { mTracker.setMaxTouches(v); mMIDIOutput.setMaxTouches(v); mOSCOutput.setMaxTouches(v); } else if (p == "lopass") { mTracker.setLopass(v); } else if (p == "z_thresh") { mTracker.setThresh(v); } else if (p == "z_max") { mTracker.setMaxForce(v); } else if (p == "z_curve") { mTracker.setForceCurve(v); } else if (p == "snap") { sendParametersToZones(); } else if (p == "vibrato") { sendParametersToZones(); } else if (p == "lock") { sendParametersToZones(); } else if (p == "data_freq_midi") { // TODO attribute mMIDIOutput.setDataFreq(v); } else if (p == "data_freq_osc") { // TODO attribute mOSCOutput.setDataFreq(v); } else if (p == "midi_active") { mMIDIOutput.setActive(bool(v)); } else if (p == "midi_multi_chan") { mMIDIOutput.setMultiChannel(bool(v)); } else if (p == "midi_start_chan") { mMIDIOutput.setStartChannel(int(v)); } else if (p == "midi_pressure_active") { mMIDIOutput.setPressureActive(bool(v)); } else if (p == "osc_active") { bool b = v; mOSCOutput.setActive(b); listenToOSC(b ? kDefaultUDPReceivePort : 0); } else if (p == "osc_send_matrix") { bool b = v; mSendMatrixData = b; } else if (p == "t_thresh") { mTracker.setTemplateThresh(v); } else if (p == "bg_filter") { mTracker.setBackgroundFilter(v); } else if (p == "quantize") { bool b = v; mTracker.setQuantize(b); sendParametersToZones(); } else if (p == "rotate") { bool b = v; mTracker.setRotate(b); } else if (p == "retrig") { mMIDIOutput.setRetrig(bool(v)); sendParametersToZones(); } else if (p == "hysteresis") { mMIDIOutput.setHysteresis(v); sendParametersToZones(); } else if (p == "transpose") { sendParametersToZones(); } else if (p == "bend_range") { mMIDIOutput.setBendRange(v); sendParametersToZones(); } else if (p == "debug_pause") { debug().setActive(!bool(v)); } else if (p == "kyma_poll") { mMIDIOutput.setKymaPoll(bool(v)); } } break; case MLProperty::kStringProperty: { const std::string& str = newVal.getStringValue(); if (p == "viewmode") { // nothing to do for Model } else if (p == "midi_device") { mMIDIOutput.setDevice(str); } else if (p == "zone_JSON") { loadZonesFromString(str); } } break; case MLProperty::kSignalProperty: { const MLSignal& sig = newVal.getSignalValue(); if(p == MLSymbol("carriers")) { // get carriers from signal assert(sig.getSize() == kSoundplaneSensorWidth); for(int i=0; i<kSoundplaneSensorWidth; ++i) { mCarriers[i] = sig[i]; } mNeedsCarriersSet = true; } if(p == MLSymbol("tracker_calibration")) { mTracker.setCalibration(sig); } if(p == MLSymbol("tracker_normalize")) { mTracker.setNormalizeMap(sig); } } break; default: break; } }