diff --git a/libs/ardour/ardour/stripable.h b/libs/ardour/ardour/stripable.h index b657ac6161..5f71c6ae5f 100644 --- a/libs/ardour/ardour/stripable.h +++ b/libs/ardour/ardour/stripable.h @@ -87,9 +87,67 @@ class LIBARDOUR_API Stripable : public SessionObject, void set_presentation_order (PresentationInfo::order_t); - struct PresentationOrderSorter { - bool operator() (boost::shared_ptr a, boost::shared_ptr b) { - return a->presentation_info().order() < b->presentation_info().order(); + struct Sorter + { + bool _mixer_order; // master is last + Sorter (bool mixer_order = false) : _mixer_order (mixer_order) {} + + bool operator() (boost::shared_ptr a, boost::shared_ptr b) + { + if (a->presentation_info().flags () == b->presentation_info().flags ()) { + return a->presentation_info().order() < b->presentation_info().order(); + } + + int cmp_a = 0; + int cmp_b = 0; + + if (a->is_auditioner ()) { cmp_a = -2; } + if (b->is_auditioner ()) { cmp_b = -2; } + if (a->is_monitor ()) { cmp_a = -1; } + if (b->is_monitor ()) { cmp_b = -1; } + + /* ARDOUR-Editor: [Track|Bus|Master] (0) < VCA (3) + * ARDOUR-Mixer : [Track|Bus] (0) < VCA (3) < Master (4) + * + * Mixbus-Editor: [Track|Bus] (0) < Mixbus (1) < VCA (3) < Master (4) + * Mixbus-Mixer : [Track|Bus] (0) < Mixbus (1) < Master (2) < VCA (3) + */ + + if (a->presentation_info().flags () & ARDOUR::PresentationInfo::VCA) { + cmp_a = 3; + } +#ifdef MIXBUS + else if (a->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut) { + cmp_a = _mixer_order ? 2 : 4; + } + else if ((a->presentation_info().flags () & ARDOUR::PresentationInfo::Mixbus) || a->mixbus()) { + cmp_a = 1; + } +#endif + else if (_mixer_order && (a->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut)) { + cmp_a = 4; + } + + + if (b->presentation_info().flags () & ARDOUR::PresentationInfo::VCA) { + cmp_b = 3; + } +#ifdef MIXBUS + else if (b->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut) { + cmp_b = _mixer_order ? 2 : 4; + } + else if ((b->presentation_info().flags () & ARDOUR::PresentationInfo::Mixbus) || b->mixbus()) { + cmp_b = 1; + } +#endif + else if (_mixer_order && (b->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut)) { + cmp_b = 4; + } + + if (cmp_a == cmp_b) { + return a->presentation_info().order() < b->presentation_info().order(); + } + return cmp_a < cmp_b; } };