Example #1
0
bool Project::setRoot(Object *root)
{
    if (_root || !root) return false;   //if _root is already set or trying to set _root 0
    _root = root;

    _objects.insert(root->id(), root);

    Q_ASSERT_X(_root->_project == this, "Project::setRoot(Object*)", "root.project.root =! root");

    emit structureChanged();
    return true;
}
void ProcessModel::on_processRemoved(const Process::ProcessModel & proc)
{
    auto proc_id = proc.id();
    auto fac = iscore::AppContext().components.factory<Audio::AudioStreamEngine::ProcessComponentFactoryList>().factory(proc);
    if(!fac)
        return;

    bool in = fac->hasInput();
    bool out = fac->hasOutput();
    if(!in && out)
    {
        auto it = ossia::find(m_dataProcesses, proc_id);
        if(it != m_dataProcesses.end())
            m_dataProcesses.erase(it);
    }
    else if(in && out)
    {
        auto it = ossia::find(m_fxProcesses, proc_id);
        if(it != m_fxProcesses.end())
            m_fxProcesses.erase(it);
    }
    else if(in && !out)
    {
        auto it = ossia::find(m_sendProcesses, proc_id);
        if(it != m_sendProcesses.end())
            m_sendProcesses.erase(it);
    }
    else
    {
        // send, mix
        return;
    }

    for (auto it = m_routings.begin(); it != m_routings.end(); )
    {
        if ((*it).in == proc.id() ||
            (*it).out == proc.id())
        {
            it = m_routings.erase(it);
        }
        else
        {
            ++ it;
        }
    }

    emit structureChanged();
}
void ProcessModel::on_processAdded(const Process::ProcessModel & proc)
{
    auto fac = iscore::AppContext().components.factory<Audio::AudioStreamEngine::ProcessComponentFactoryList>().factory(proc);
    if(!fac)
        return;

    bool in = fac->hasInput();
    bool out = fac->hasOutput();

    auto proc_id = proc.id();
    if(!in && out)
    {
        m_dataProcesses.push_back({proc_id, 1.0});

        for(const auto& fx : m_fxProcesses)
        {
            m_routings.insert(Routing{proc_id, fx.process, 1.0});
        }
        for(const auto& send : m_sendProcesses)
        {
            m_routings.insert(Routing{proc_id, send, 1.0});
        }
    }
    else if(in && out)
    {
        // For now we forbid mixing FX each into another.
        m_fxProcesses.push_back({proc_id, 1.0});

        for(const auto& other : m_dataProcesses)
        {
            m_routings.insert(Routing{other.process, proc_id, 1.0});
        }

        for(const auto& other : m_fxProcesses)
        {
            // By default we disable mixing Fx's into each other
            // to prevent cycles.
            m_routings.insert(Routing{other.process, proc_id, 1.0, false});
            m_routings.insert(Routing{proc_id, other.process, 1.0, false});
        }

        for(const auto& send : m_sendProcesses)
        {
            m_routings.insert(Routing{proc_id, send, 1.0});
        }
    }
    else if(in && !out)
    {
        m_sendProcesses.push_back(proc_id);

        for(const auto& other : m_dataProcesses)
        {
            m_routings.insert(Routing{other.process, proc_id, 1.0});
        }
        for(const auto& other : m_fxProcesses)
        {
            m_routings.insert(Routing{other.process, proc_id, 1.0});
        }
    }
    else
    {
        //  mix
        return;
    }

    emit structureChanged();
}