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