Various optimisations to speed up rec-enable.
authorCarl Hetherington <carl@carlh.net>
Mon, 30 Nov 2009 23:16:28 +0000 (23:16 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 30 Nov 2009 23:16:28 +0000 (23:16 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6227 d708f5d6-7413-0410-9779-e7cbd77b26cf

18 files changed:
gtk2_ardour/audio_time_axis.cc
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/mixer_strip.cc
gtk2_ardour/port_matrix.cc
gtk2_ardour/port_matrix.h
gtk2_ardour/processor_box.cc
gtk2_ardour/processor_box.h
gtk2_ardour/route_params_ui.cc
gtk2_ardour/route_params_ui.h
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h
gtk2_ardour/route_ui.h
libs/ardour/ardour/route.h
libs/ardour/ardour/session.h
libs/ardour/ardour/types.h
libs/ardour/route.cc
libs/ardour/session.cc
libs/ardour/session_transport.cc

index 281bedafe1b2173b8271808b1bea1459ed4bb194..e2a9dc80b8250aad23d1a3ed793dcde3e4141b1a 100644 (file)
@@ -115,7 +115,7 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
        /* map current state of the route */
 
-       processors_changed ();
+       processors_changed (RouteProcessorChange ());
        reset_processor_automation_curves ();
        ensure_pan_views (false);
        update_control_names ();
index 544fee86a4ab36ed54d34ac7321bedd35bcbdd7a..c05c3fecc6ec90a9f3eb4a294e4325a9ec96de26 100644 (file)
@@ -132,7 +132,7 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session& sess,
 
        /* map current state of the route */
 
-       processors_changed ();
+       processors_changed (RouteProcessorChange ());
 
        ensure_xml_node ();
 
index 5b26bd51412bd89861dc0fc1455e174b8ada1c5d..73326c8d30247c3cceec1c7c5e25e45a961f9d8d 100644 (file)
@@ -1609,6 +1609,7 @@ MixerStrip::engine_running ()
 {
 }
 
+/** Called when the metering point has changed */
 void
 MixerStrip::meter_changed (void *src)
 {
@@ -1635,7 +1636,6 @@ MixerStrip::meter_changed (void *src)
        gpm.setup_meters ();
        // reset peak when meter point changes
        gpm.reset_peak_display();
-       set_width_enum (_width, this);
 }
 
 void
index ccf240f1bbdef03c3736dd0e00ee72353cd2bea2..f36287836a94e82fcf3f47134a6eaa14138b4bcb 100644 (file)
@@ -142,11 +142,22 @@ PortMatrix::reconnect_to_routes ()
        boost::shared_ptr<RouteList> routes = _session.get_routes ();
        for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
                _route_connections.push_back (
-                       (*i)->processors_changed.connect (mem_fun (*this, &PortMatrix::setup_global_ports))
+                       (*i)->processors_changed.connect (mem_fun (*this, &PortMatrix::route_processors_changed))
                        );
        }
 }
 
+void
+PortMatrix::route_processors_changed (RouteProcessorChange c)
+{
+       if (c.type == RouteProcessorChange::MeterPointChange) {
+               /* this change has no impact on the port matrix */
+               return;
+       }
+
+       setup_global_ports ();
+}
+
 /** A route has been added to or removed from the session */
 void
 PortMatrix::routes_changed ()
index d073740bf5e5ac42ff4d73de19e60268c9a0410c..278b5a7cedc31a49e0e054d8756ce2ee5ac6899c 100644 (file)
@@ -29,6 +29,7 @@
 #include <gtkmm/notebook.h>
 #include <boost/shared_ptr.hpp>
 #include "ardour/bundle.h"
+#include "ardour/types.h"
 #include "port_group.h"
 #include "port_matrix_types.h"
 #include "i18n.h"
@@ -178,6 +179,7 @@ private:
        void remove_notebook_pages (Gtk::Notebook &);
        void v_page_selected (GtkNotebookPage *, guint);
        void h_page_selected (GtkNotebookPage *, guint);
+       void route_processors_changed (ARDOUR::RouteProcessorChange);
 
        Gtk::Window* _parent;
 
index 41a45880aeceb24426dd4cee4f96d7aeeac97817..1f2fe906c926aed02b3907a7ed83e35afa5d2bc4 100644 (file)
@@ -318,8 +318,7 @@ ProcessorBox::set_route (boost::shared_ptr<Route> r)
        no_processor_redisplay = false;
        _route = r;
 
-       connections.push_back (_route->processors_changed.connect (
-                       mem_fun(*this, &ProcessorBox::redisplay_processors)));
+       connections.push_back (_route->processors_changed.connect (mem_fun (*this, &ProcessorBox::route_processors_changed)));
        connections.push_back (_route->GoingAway.connect (
                        mem_fun (*this, &ProcessorBox::route_going_away)));
        connections.push_back (_route->NameChanged.connect (
@@ -924,6 +923,17 @@ ProcessorBox::choose_aux (boost::weak_ptr<Route> wr)
        _session.add_internal_sends (target, PreFader, rlist);
 }
 
+void
+ProcessorBox::route_processors_changed (RouteProcessorChange c)
+{
+       if (c.type == RouteProcessorChange::MeterPointChange && c.meter_visibly_changed == false) {
+               /* the meter has moved, but it was and still is invisible to the user, so nothing to do */
+               return;
+       }
+
+       redisplay_processors ();
+}
+
 void
 ProcessorBox::redisplay_processors ()
 {
index 06a47538025ea92cea816824dcafe17206468fe4..efc91c7a82d4e4ea0e938f5a8e374880da79d5ed 100644 (file)
@@ -200,6 +200,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject
        void redisplay_processors ();
        void add_processor_to_display (boost::weak_ptr<ARDOUR::Processor>);
        void reordered ();
+       void route_processors_changed (ARDOUR::RouteProcessorChange);
 
        void remove_processor_gui (boost::shared_ptr<ARDOUR::Processor>);
 
index 888e28aab0a8261655711d5b15a8b68b8fba8b05..d7037159dcbf548e7f664fa2fb2ad6e772644cf1 100644 (file)
@@ -480,9 +480,9 @@ RouteParams_UI::route_selected()
 }
 
 void
-RouteParams_UI::processors_changed ()
+RouteParams_UI::processors_changed (RouteProcessorChange c)
 {
-       ENSURE_GUI_THREAD(mem_fun(*this, &RouteParams_UI::processors_changed));
+       ENSURE_GUI_THREAD (bind (mem_fun (*this, &RouteParams_UI::processors_changed), c));
        cleanup_view();
 
        _processor.reset ((Processor*) 0);
index 4c79bb0829e8e1c4b6f59e96df1f31def2e0dbf1..4d21805778be7dcb10ca73bf214455c4e06fdb1a 100644 (file)
@@ -174,7 +174,7 @@ class RouteParams_UI : public ArdourDialog
        void cleanup_latency_frame ();
        void setup_latency_frame ();
 
-       void processors_changed ();
+       void processors_changed (ARDOUR::RouteProcessorChange);
 
        void setup_processor_boxes();
        void cleanup_processor_boxes();
index ce693c2d29fb3e7da8ef0f4cb220a977aa9469ce..08e9ac11ce8087c105f58a90d44e7106183be7e9 100644 (file)
@@ -55,6 +55,7 @@
 #include "ardour/route_group.h"
 #include "ardour/session.h"
 #include "ardour/session_playlist.h"
+#include "ardour/debug.h"
 #include "ardour/utils.h"
 #include "evoral/Parameter.hpp"
 
@@ -2118,8 +2119,13 @@ RouteTimeAxisView::processor_menu_item_toggled (RouteTimeAxisView::ProcessorAuto
 }
 
 void
-RouteTimeAxisView::processors_changed ()
+RouteTimeAxisView::processors_changed (RouteProcessorChange c)
 {
+       if (c.type == RouteProcessorChange::MeterPointChange) {
+               /* nothing to do if only the meter point has changed */
+               return;
+       }
+
        using namespace Menu_Helpers;
 
        for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
index 19715fe99d5142f03d367eb026be940d59145feb..f37f32b1fa1306c3836bc63ff5db6c8d4c98fa74 100644 (file)
@@ -186,7 +186,7 @@ protected:
 
        gint edit_click  (GdkEventButton *);
 
-       void processors_changed ();
+       void processors_changed (ARDOUR::RouteProcessorChange);
 
        void add_processor_to_subplugin_menu (boost::weak_ptr<ARDOUR::Processor>);
        void remove_processor_automation_node (ProcessorAutomationNode* pan);
index ebc686b4385952b96c8730b7f0a5abfbc5e11dcf..b62b14673528fed5891c1b1c147b432b06346eb0 100644 (file)
@@ -130,7 +130,7 @@ class RouteUI : public virtual AxisView
        void solo_changed_so_update_mute ();
        void mute_changed(void*);
        void listen_changed(void*);
-       virtual void processors_changed () {}
+       virtual void processors_changed (ARDOUR::RouteProcessorChange) {}
        void route_rec_enable_changed();
        void session_rec_enable_changed();
 
index 6c6acb89bd8404e0cb914bece60902a6ff046f00..984ba5fe95b0a8158b26c08c6ea74cbf655750b4 100644 (file)
@@ -240,10 +240,13 @@ class Route : public SessionObject, public AutomatableControls
        sigc::signal<void,void*> comment_changed;
        sigc::signal<void,void*> mute_changed;
        sigc::signal<void>       mute_points_changed;
-       sigc::signal<void>       processors_changed;
+
+       /** the processors have changed; the parameter indicates what changed */
+       sigc::signal<void, RouteProcessorChange> processors_changed;
        sigc::signal<void,void*> record_enable_changed;
        sigc::signal<void,void*> route_group_changed;
-       sigc::signal<void,void*> meter_change;
+       /** the metering point has changed */
+       sigc::signal<void,void*> meter_change; 
        sigc::signal<void>       signal_latency_changed;
        sigc::signal<void>       initial_delay_changed;
 
index 06f6b5e5052a07abb591fef768e595c7c4344406..a3505ec587424341dab1710a5114f2f35c284a7b 100644 (file)
@@ -1446,6 +1446,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&, int);
 
+       void route_processors_changed (RouteProcessorChange);
+
        /* mixer stuff */
 
        bool solo_update_disabled;
index 75c4d20db4d5780debbe4b258ad3cba5dd90554c..92c26a944830b4c271326d03fd2cb4a86f43bf72 100644 (file)
@@ -428,6 +428,36 @@ namespace ARDOUR {
                int64_t                  space;
        };
 
+       /** A struct used to describe changes to processors in a route.
+        *  This is useful because objects that respond to a change in processors
+        *  can optimise what work they do based on details of what has changed.
+       */
+       struct RouteProcessorChange {
+               enum Type {
+                       GeneralChange = 0x0,
+                       MeterPointChange = 0x1
+               };
+
+               RouteProcessorChange () {
+                       type = GeneralChange;
+               }
+
+               RouteProcessorChange (Type t) {
+                       type = t;
+                       meter_visibly_changed = true;
+               }
+
+               RouteProcessorChange (Type t, bool m) {
+                       type = t;
+                       meter_visibly_changed = m;
+               }
+
+               /** type of change; "GeneralChange" means anything could have changed */
+               Type type;
+               /** true if, when a MeterPointChange has occurred, the change is visible to the user */
+               bool meter_visibly_changed;
+       };
+
 } // namespace ARDOUR
 
 
index facc507133507a9ad520b84145689aa72626107e..d57f542bc416b1a30af2097b76d53f1515badc5f 100644 (file)
@@ -772,7 +772,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite
                _output->set_user_latency (0);
        }
 
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
 
        return 0;
 }
@@ -1031,7 +1031,7 @@ Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter
                _output->set_user_latency (0);
        }
 
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
 
        return 0;
 }
@@ -1231,7 +1231,7 @@ Route::clear_processors (Placement p)
 
        processor_max_streams.reset();
        _have_internal_generator = false;
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
 
        if (!already_deleting) {
                _session.clear_deletion_in_progress();
@@ -1322,7 +1322,7 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
        }
 
        processor->drop_references ();
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
 
        return 0;
 }
@@ -1414,7 +1414,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
                (*i)->drop_references ();
        }
 
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
 
        return 0;
 }
@@ -1654,7 +1654,7 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err
                }
        }
 
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
 
        return 0;
 }
@@ -2243,7 +2243,7 @@ Route::set_processor_state (const XMLNode& node)
           the XML state represents a working signal route.
        */
 
-       processors_changed ();
+       processors_changed (RouteProcessorChange ());
 }
 
 void
@@ -2683,6 +2683,8 @@ Route::set_meter_point (MeterPoint p, void *src)
                return;
        }
 
+       bool meter_was_visible_to_user = _meter->display_to_user ();
+
        {
                Glib::RWLock::WriterLock lm (_processor_lock);
                ProcessorList as_it_was (_processors);
@@ -2723,10 +2725,15 @@ Route::set_meter_point (MeterPoint p, void *src)
                }
                
        }
-       
+
        _meter_point = p;
        meter_change (src); /* EMIT SIGNAL */
-       processors_changed (); /* EMIT SIGNAL */
+
+       /* the meter has visibly changed if it is not visible to the user, or if it was and now isn't */
+       bool const meter_visibly_changed = _meter->display_to_user() || meter_was_visible_to_user;
+       
+       processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
+               
        _session.set_dirty ();
 }
 
@@ -2767,7 +2774,7 @@ Route::put_control_outs_at (Placement p)
                }
        }
 
-       processors_changed (); /* EMIT SIGNAL */
+       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
        _session.set_dirty ();
 }
 
index 79d7ccf84cf29c93da770c65851e9ec78790bb8f..93293de2b63037a5ea53980be2cbc661e8a8c75f 100644 (file)
@@ -2174,7 +2174,7 @@ Session::add_routes (RouteList& new_routes, bool save)
                (*x)->solo_changed.connect (sigc::bind (mem_fun (*this, &Session::route_solo_changed), wpr));
                (*x)->mute_changed.connect (mem_fun (*this, &Session::route_mute_changed));
                (*x)->output()->changed.connect (mem_fun (*this, &Session::set_worst_io_latencies_x));
-               (*x)->processors_changed.connect (bind (mem_fun (*this, &Session::update_latency_compensation), false, false));
+               (*x)->processors_changed.connect (mem_fun (*this, &Session::route_processors_changed));
                (*x)->route_group_changed.connect (hide (mem_fun (*this, &Session::route_group_changed)));
 
                if ((*x)->is_master()) {
index f0fc5da6a116f5d0054256ef7d53325333b6483f..69de9ead2efa836303a0cfb769c2210c8de41e94 100644 (file)
@@ -1420,6 +1420,16 @@ Session::xrun_recovery ()
        }
 }
 
+void
+Session::route_processors_changed (RouteProcessorChange c)
+{
+       if (c.type == RouteProcessorChange::MeterPointChange) {
+               return;
+       }
+
+       update_latency_compensation (false, false);
+}
+
 void
 Session::update_latency_compensation (bool with_stop, bool abort)
 {