From d2facbf9c1116c192335ade77a4c07962e5473b9 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 14 Dec 2019 11:44:28 +0100 Subject: [PATCH] DSPLoad report: allow to sort plugins by load --- gtk2_ardour/plugin_dspload_ui.h | 3 ++ gtk2_ardour/plugin_dspload_window.cc | 49 ++++++++++++++++++++++++++-- gtk2_ardour/plugin_dspload_window.h | 4 +++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/plugin_dspload_ui.h b/gtk2_ardour/plugin_dspload_ui.h index a5dd82d203..abdfaa5cf4 100644 --- a/gtk2_ardour/plugin_dspload_ui.h +++ b/gtk2_ardour/plugin_dspload_ui.h @@ -37,6 +37,9 @@ public: void start_updating (); void stop_updating (); + double dsp_avg () const { return _valid ? _avg : -1; } + double dsp_max () const { return _valid ? _max : -1; } + private: void update_cpu_label (); bool draw_bar (GdkEventExpose*); diff --git a/gtk2_ardour/plugin_dspload_window.cc b/gtk2_ardour/plugin_dspload_window.cc index a15016a648..90cf54b0dd 100644 --- a/gtk2_ardour/plugin_dspload_window.cc +++ b/gtk2_ardour/plugin_dspload_window.cc @@ -33,6 +33,8 @@ using namespace ARDOUR; PluginDSPLoadWindow::PluginDSPLoadWindow () : ArdourWindow (_("Plugin DSP Load")) , _reset_button (_("Reset All Stats")) + , _sort_avg_button (_("Sort by Average Load")) + , _sort_max_button (_("Sort by Worst-Case Load")) { _scroller.set_border_width (0); _scroller.set_shadow_type (Gtk::SHADOW_NONE); @@ -40,7 +42,12 @@ PluginDSPLoadWindow::PluginDSPLoadWindow () _scroller.add (_box); _reset_button.set_name ("generic button"); + _sort_avg_button.set_name ("generic button"); + _sort_max_button.set_name ("generic button"); + _reset_button.signal_clicked.connect (sigc::mem_fun (*this, &PluginDSPLoadWindow::clear_all_stats)); + _sort_avg_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginDSPLoadWindow::sort_by_stats), true)); + _sort_max_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginDSPLoadWindow::sort_by_stats), false)); add (_scroller); _box.show (); @@ -49,6 +56,11 @@ PluginDSPLoadWindow::PluginDSPLoadWindow () Gtk::Viewport* viewport = (Gtk::Viewport*) _scroller.get_child(); viewport->set_shadow_type(Gtk::SHADOW_NONE); viewport->set_border_width(0); + + _ctrlbox.pack_end (_reset_button, Gtk::PACK_SHRINK, 2); + _ctrlbox.pack_end (_sort_avg_button, Gtk::PACK_SHRINK, 2); + _ctrlbox.pack_end (_sort_max_button, Gtk::PACK_SHRINK, 2); + _ctrlbox.show_all (); } PluginDSPLoadWindow::~PluginDSPLoadWindow () @@ -98,6 +110,37 @@ PluginDSPLoadWindow::clear_all_stats () } } +struct DSPLoadSorter +{ + bool _avg; + DSPLoadSorter (bool avg) : _avg (avg) {} + bool operator() (PluginLoadStatsGui* a, PluginLoadStatsGui* b) { + return _avg ? (a->dsp_avg () < b->dsp_avg ()) : (a->dsp_max () < b->dsp_max ()); + } +}; + +void +PluginDSPLoadWindow::sort_by_stats (bool avg) +{ + std::list pl; + std::list children = _box.get_children (); + for (std::list::iterator child = children.begin(); child != children.end(); ++child) { + Gtk::Frame* frame = dynamic_cast(*child); + if (!frame) continue; + PluginLoadStatsGui* plsg = dynamic_cast(frame->get_child()); + if (plsg) { + pl.push_back (plsg); + } + } + pl.sort (DSPLoadSorter (avg)); + uint32_t pos = 0; + for (std::list::iterator i = pl.begin(); i != pl.end(); ++i, ++pos) { + Gtk::Container* p = (*i)->get_parent(); + assert (p); + _box.reorder_child (*p, pos); + } +} + void PluginDSPLoadWindow::drop_references () { @@ -105,7 +148,7 @@ PluginDSPLoadWindow::drop_references () for (std::list::iterator child = children.begin(); child != children.end(); ++child) { (*child)->hide (); _box.remove (**child); - if (*child != &_reset_button) { + if (*child != &_ctrlbox) { delete *child; } } @@ -144,8 +187,8 @@ PluginDSPLoadWindow::refill_processors () _box.add (*Gtk::manage (new Gtk::Label (_("No Plugins")))); _box.show_all (); } else if (_box.get_children().size() > 1) { - _box.pack_start (_reset_button, Gtk::PACK_SHRINK, 2); - _reset_button.show (); + _box.pack_start (_ctrlbox, Gtk::PACK_SHRINK, 2); + _ctrlbox.show (); } } diff --git a/gtk2_ardour/plugin_dspload_window.h b/gtk2_ardour/plugin_dspload_window.h index d02888bb7d..ee84729679 100644 --- a/gtk2_ardour/plugin_dspload_window.h +++ b/gtk2_ardour/plugin_dspload_window.h @@ -53,12 +53,16 @@ private: void refill_processors (); void drop_references (); void clear_all_stats (); + void sort_by_stats (bool); void add_processor_to_display (boost::weak_ptr, std::string const&); void clear_processor_stats (boost::weak_ptr); Gtk::ScrolledWindow _scroller; Gtk::VBox _box; + Gtk::HBox _ctrlbox; ArdourWidgets::ArdourButton _reset_button; + ArdourWidgets::ArdourButton _sort_avg_button; + ArdourWidgets::ArdourButton _sort_max_button; PBD::ScopedConnectionList _processor_connections; PBD::ScopedConnectionList _route_connections;