Beispiel #1
0
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));
	}
}