diff --git a/Mixer.cpp b/Mixer.cpp index 78e39e1..d3e585e 100644 --- a/Mixer.cpp +++ b/Mixer.cpp @@ -746,7 +746,7 @@ void Mixer::groupSelection() } } -void Mixer::groupAll() +void Mixer::groupAll(bool only_active) { // obvious cancel if (session_->empty()) @@ -759,16 +759,38 @@ void Mixer::groupAll() // remember groups before emptying the session std::list allgroups = session_->getMixingGroups(); - // empty the session (does not delete sources) - for ( Source *s = session_->popSource(); s != nullptr; s = session_->popSource()) { - if ( sessiongroup->import(s) ) - detach(s); + // loop over sources from the current mixer session + for(auto it = session_->begin(); it != session_->end(); ) { + // if request for only active, take only active source + // and if could import the source in the new session group + if ( ( !only_active || (*it)->active() ) && sessiongroup->import( *it ) ) { + // detatch the source from mixer + detach( *it ); + // take out source from session and go to next (does not delete the source) + it = session_->removeSource( *it ); + } + // otherwise just iterate (leave source in mixer) else - break; + ++it; } + // successful creation of a session group if (sessiongroup->session()->size() > 0) { + // if a clone was left orphan in the mixer current session, take in in the group + for(auto it = session_->begin(); it != session_->end(); ) { + CloneSource *cs = dynamic_cast(*it); + if ( cs != nullptr && session_->find( cs->origin() ) == session_->end() && sessiongroup->import( *it ) ) { + // detatch the source from mixer + detach( *it ); + // take out source from session and go to next (does not delete the source) + it = session_->removeSource( *it ); + } + // otherwise just iterate (leave source in mixer) + else + ++it; + } + // recreate groups in session group for (auto git = allgroups.begin(); git != allgroups.end(); ++git) sessiongroup->session()->link( *git ); diff --git a/Mixer.h b/Mixer.h index 2388d4a..39a05e3 100644 --- a/Mixer.h +++ b/Mixer.h @@ -67,7 +67,7 @@ public: // operations on selection void deleteSelection (); void groupSelection (); - void groupAll (); + void groupAll (bool only_active = false); void ungroupAll (); void groupSession (); diff --git a/Session.cpp b/Session.cpp index 5f27c56..952e65d 100644 --- a/Session.cpp +++ b/Session.cpp @@ -305,8 +305,10 @@ SourceList::iterator Session::deleteSource(Source *s) return its; } -void Session::removeSource(Source *s) +SourceList::iterator Session::removeSource(Source *s) { + SourceList::iterator ret = sources_.end(); + // lock before change access_.lock(); @@ -320,11 +322,13 @@ void Session::removeSource(Source *s) if (s->mixingGroup() != nullptr) s->mixingGroup()->detach(s); // erase the source from the update list & get next element - sources_.erase(its); + ret = sources_.erase(its); } // unlock access access_.unlock(); + + return ret; } Source *Session::popSource() diff --git a/Session.h b/Session.h index 97424b6..d748a9c 100644 --- a/Session.h +++ b/Session.h @@ -57,11 +57,11 @@ public: // remove this source from the session // Does not delete the source - void removeSource(Source *s); + SourceList::iterator removeSource (Source *s); // get ptr to front most source and remove it from the session // Does not delete the source - Source *popSource(); + Source *popSource (); // management of list of sources bool empty() const; diff --git a/SourceList.cpp b/SourceList.cpp index 7a7b4ab..b107fe0 100644 --- a/SourceList.cpp +++ b/SourceList.cpp @@ -45,6 +45,17 @@ SourceList playable_only (const SourceList &list) return pl; } +bool notactive (const Source *s) { return !s->active(); } + +SourceList active_only (const SourceList &list) +{ + SourceList pl = list; + + pl.remove_if(notactive); + + return pl; +} + SourceList depth_sorted(const SourceList &list) { SourceList sl = list; diff --git a/SourceList.h b/SourceList.h index 69c1460..a557425 100644 --- a/SourceList.h +++ b/SourceList.h @@ -12,6 +12,7 @@ typedef std::list SourceList; typedef std::list SourceCoreList; SourceList playable_only (const SourceList &list); +SourceList active_only (const SourceList &list); SourceList depth_sorted (const SourceList &list); SourceList mixing_sorted (const SourceList &list, glm::vec2 center = glm::vec2(0.f, 0.f)); SourceList intersect (const SourceList &first, const SourceList &second); diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index f3df058..e824354 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -985,13 +985,13 @@ void UserInterface::showMenuFile() // GROUP ImGui::Separator(); - if (ImGuiToolkit::MenuItemIcon(11, 2, " Group all sources", false, Mixer::manager().numSource() > 0)) { - // create a new group session with all sources - Mixer::manager().groupAll(); + if (ImGuiToolkit::MenuItemIcon(11, 2, " Group active sources", false, Mixer::manager().numSource() > 0)) { + // create a new group session with only active sources + Mixer::manager().groupAll( true ); // switch pannel to show first source (created) navigator.showPannelSource(0); } - if (ImGuiToolkit::MenuItemIcon(7, 2, " Expand all groups", false, Mixer::manager().numSource() > 0)) { + if (ImGuiToolkit::MenuItemIcon(7, 2, " Expand groups", false, Mixer::manager().numSource() > 0)) { // create a new group session with all sources Mixer::manager().ungroupAll(); }