uint32 PMixDocument::addNode (const PluginDescription* desc, double x, double y) { AudioProcessorGraph::Node* node = nullptr; if (desc != nullptr) { String errorMessage; AudioPluginInstance* instance = audioEngine.createPluginInstance(*desc, errorMessage); jassert(instance != nullptr); node = audioEngine.getGraph().addNode (instance); FaustAudioPluginInstance* faustProc = dynamic_cast<FaustAudioPluginInstance*>(instance); if (faustProc) { faustProc->initialize(getLibraryPath(), drawPath); } if (node != nullptr) { node->properties.set ("x", x); node->properties.set ("y", y); node->properties.set ("uiLastX", Random::getSystemRandom().nextInt (500)); node->properties.set ("uiLastY", Random::getSystemRandom().nextInt (500)); node->properties.set ("uiStatus", kUIStatusEmbed); if (!InternalPluginFormat::isInternalFormat(desc->name)) { node->properties.set ("colour", defaultColours.getNextColour().toString()); node->properties.set ("iposx", x); node->properties.set ("iposy", y); node->properties.set ("update", false); Array<var> presets; node->properties.set("presets", presets); Array<var> params; node->properties.set("params", params); } changed(); } else { AlertWindow::showMessageBox (AlertWindow::WarningIcon, TRANS("Couldn't create node"), errorMessage); return 0xFFFFFFFF; } } return node->nodeID; }
void PMixDocument::createNodeFromXml (XmlElement& xml, const String& newSourceCode) { PluginDescription pd; forEachXmlChildElement (xml, e) { if (pd.loadFromXml (*e)) break; } String errorMessage; AudioPluginInstance* instance = audioEngine.createPluginInstance(pd, errorMessage); jassert(instance != nullptr); if (pd.pluginFormatName == "FAUST") { FaustAudioPluginInstance* faustProc = dynamic_cast<FaustAudioPluginInstance*>(instance); faustProc->initialize(getLibraryPath(), drawPath); if (newSourceCode.length()) faustProc->setSourceCode(newSourceCode, true); // TODO: this is a bit wrong! faustProc->prepareToPlay(44100., 8192); // xml.setAttribute("numInputs", faustProc->getNumInputChannels()); // xml.setAttribute("numOutputs", faustProc->getNumOutputChannels()); ??? } AudioProcessorGraph::Node::Ptr node (audioEngine.getGraph().addNode (instance, xml.getIntAttribute ("uid"))); if (!newSourceCode.length()) { if (const XmlElement* const state = xml.getChildByName ("STATE")) { MemoryBlock m; m.fromBase64Encoding (state->getAllSubText()); node->getProcessor()->setStateInformation (m.getData(), (int) m.getSize()); } } node->properties.set ("x", xml.getDoubleAttribute ("x")); node->properties.set ("y", xml.getDoubleAttribute ("y")); node->properties.set ("uiLastX", xml.getIntAttribute ("uiLastX")); node->properties.set ("uiLastY", xml.getIntAttribute ("uiLastY")); node->properties.set ("uiStatus", xml.getIntAttribute ("uiStatus")); // presets etc for faust & plugin nodes if(!InternalPluginFormat::isInternalFormat(pd.name)) { node->properties.set ("colour", xml.getStringAttribute ("colour")); node->properties.set ("iposx", xml.getDoubleAttribute ("iposx")); node->properties.set ("iposy", xml.getDoubleAttribute ("iposy")); if (const XmlElement* const params = xml.getChildByName ("PARAMS")) { var vparams = JSON::parse(params->getAllSubText()); node->properties.set ("params", vparams); } Array<var> presetsArr; forEachXmlChildElement (xml, e) { if (e->hasTagName ("PRESET")) { DynamicObject* obj = new DynamicObject(); obj->setProperty("name", e->getStringAttribute("name")); obj->setProperty("x", e->getDoubleAttribute("x")); obj->setProperty("y", e->getDoubleAttribute("y")); obj->setProperty("radius", e->getDoubleAttribute("radius")); obj->setProperty("hidden", e->getBoolAttribute("hidden")); // obj->setProperty("distance", e->getDoubleAttribute("distance")); obj->setProperty("coeff", e->getDoubleAttribute("coeff")); var vparams = JSON::parse(e->getAllSubText()); obj->setProperty("state", vparams); obj->setProperty("uid", e->getIntAttribute("uid")); var preset = var(obj); presetsArr.add(preset); } } node->properties.set("presets", presetsArr); }