void AudioTrack::addPlugin(BasePlugin* plugin, int idx)/*{{{*/ { if(debugMsg) qDebug("AudioTrack::addPlugin(%p, %d) \n", plugin, idx); if (!plugin) { BasePlugin* oldPlugin = (*_efxPipe)[idx]; if (oldPlugin) { oldPlugin->setId(-1); oldPlugin->setTrack(0); uint32_t paramCount = oldPlugin->getParameterCount(); for (uint32_t i = 0; i < paramCount; i++) { ParameterPort* paramPort = oldPlugin->getParameterPort(i); if (! paramPort || paramPort->type != PARAMETER_INPUT || (paramPort->hints & PARAMETER_IS_AUTOMABLE) == 0) continue; int id = genACnum(idx, i); removeController(id); } _efxPipe->remove(idx); } } if (plugin) { idx = efxPipe()->addPlugin(plugin, idx); plugin->setId(idx); plugin->setTrack(this); uint32_t paramCount = plugin->getParameterCount(); for (uint32_t i = 0; i < paramCount; i++) { ParameterPort* paramPort = plugin->getParameterPort(i); if (! paramPort || paramPort->type != PARAMETER_INPUT || (paramPort->hints & PARAMETER_IS_AUTOMABLE) == 0) continue; int id = genACnum(idx, i); CtrlValueType t = plugin->valueType(); CtrlList* cl = new CtrlList(id); cl->setRange(paramPort->ranges.min, paramPort->ranges.max); cl->setName(plugin->getParameterName(i)); cl->setPluginName(plugin->name()); cl->setUnit(plugin->getParameterUnit(i)); cl->setValueType(t); if (paramPort->hints & PARAMETER_IS_TOGGLED) cl->setMode(CtrlList::DISCRETE); else cl->setMode(CtrlList::INTERPOLATE); cl->setCurVal(plugin->getParameterValue(i)); addController(cl); } } }/*}}}*/
void AudioTrack::swapControllerIDX(int idx1, int idx2) { // FIXME This code is ugly. // At best we would like to modify the keys (IDXs) in-place and // do some kind of deferred re-sort, but it can't be done... int pdepth = _efxPipe->size(); if (idx1 == idx2) return; if (idx1 < 0 || idx2 < 0 || idx1 >= pdepth || idx2 >= pdepth) return; CtrlList *cl; CtrlList *newcl; int id1 = (idx1 + 1) * AC_PLUGIN_CTL_BASE; int id2 = (idx2 + 1) * AC_PLUGIN_CTL_BASE; int i, j; CtrlListList tmpcll; CtrlVal cv(0, 0.0); for (ciCtrlList icl = _controller.begin(); icl != _controller.end(); ++icl) { cl = icl->second; i = cl->id() & AC_PLUGIN_CTL_ID_MASK; j = cl->id() & ~((unsigned long) AC_PLUGIN_CTL_ID_MASK); if (j == id1 || j == id2) { newcl = new CtrlList(i | (j == id1 ? id2 : id1)); newcl->setMode(cl->mode()); newcl->setValueType(cl->valueType()); newcl->setName(cl->name()); double min, max; cl->range(&min, &max); newcl->setRange(min, max); newcl->setCurVal(cl->curVal()); newcl->setDefault(cl->getDefault()); for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) { cv = ic->second; newcl->add(cv.getFrame(), cv.val); } tmpcll.insert(std::pair<const int, CtrlList*>(newcl->id(), newcl)); } else { newcl = new CtrlList(); *newcl = *cl; tmpcll.insert(std::pair<const int, CtrlList*>(newcl->id(), newcl)); } } for (iCtrlList ci = _controller.begin(); ci != _controller.end(); ++ci) delete (*ci).second; _controller.clear(); for (ciCtrlList icl = tmpcll.begin(); icl != tmpcll.end(); ++icl) { newcl = icl->second; _controller.insert(std::pair<const int, CtrlList*>(newcl->id(), newcl)); } }