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(); }