diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-12-04 14:32:28 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-12-04 14:32:28 +0000 |
commit | 89d1a2fdf5f9794f56f6bf960bfbebfad913cf74 (patch) | |
tree | 5a2d55a420955f86151ba37870f1de0762195456 /libs | |
parent | 1feaa65d167e59b400b8ac003f69e33934ee7c08 (diff) |
dramatically speed up the addition of large numbers of busses + tracks. consists of a backend part (ignore JACK graph/latency callbacks while we're adding tracks) and a GUI side (avoid O(N^N) behaviour while adding each new time axis view)
git-svn-id: svn://localhost/ardour2/branches/3.0@13595 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/session.h | 2 | ||||
-rw-r--r-- | libs/ardour/audioengine.cc | 6 | ||||
-rw-r--r-- | libs/ardour/session.cc | 61 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 1 |
4 files changed, 43 insertions, 27 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 9b25f29c8f..5e75b4980b 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1269,6 +1269,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi SerializedRCUManager<RouteList> routes; void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save); + void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect); + bool _adding_routes_in_progress; uint32_t destructive_index; boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&, int); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 69d232079c..90ff62f2a1 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -227,8 +227,8 @@ AudioEngine::stop (bool forever) disconnect_from_jack (); } else { jack_deactivate (_priv_jack); - Stopped(); /* EMIT SIGNAL */ MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */ + Stopped(); /* EMIT SIGNAL */ } } @@ -1162,8 +1162,8 @@ AudioEngine::halted (void *arg) ae->_jack = 0; if (was_running) { - ae->Halted(""); /* EMIT SIGNAL */ MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */ + ae->Halted(""); /* EMIT SIGNAL */ } } @@ -1410,8 +1410,8 @@ AudioEngine::disconnect_from_jack () if (_running) { _running = false; - Stopped(); /* EMIT SIGNAL */ MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */ + Stopped(); /* EMIT SIGNAL */ } return 0; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index da5f956c4b..80eab3571f 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2136,6 +2136,31 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template void Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save) { + try { + PBD::Unwinder<bool> aip (_adding_routes_in_progress, true); + add_routes_inner (new_routes, input_auto_connect, output_auto_connect); + + } catch (...) { + error << _("Adding new tracks/busses failed") << endmsg; + } + + graph_reordered (); + + update_latency (true); + update_latency (false); + + set_dirty(); + + if (save) { + save_state (_current_snapshot_name); + } + + RouteAdded (new_routes); /* EMIT SIGNAL */ +} + +void +Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect) +{ ChanCount existing_inputs; ChanCount existing_outputs; uint32_t order = next_control_id(); @@ -2191,6 +2216,7 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output } } + if (input_auto_connect || output_auto_connect) { auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect); } @@ -2199,7 +2225,7 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output reasonable defaults because they also affect the remote control ID in most situations. */ - + if (!r->has_order_key (EditorSort)) { if (r->is_hidden()) { /* use an arbitrarily high value */ @@ -2215,31 +2241,18 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output } if (_monitor_out && IO::connecting_legal) { - - { - Glib::Threads::Mutex::Lock lm (_engine.process_lock()); - - for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) { - if ((*x)->is_monitor()) { - /* relax */ - } else if ((*x)->is_master()) { + Glib::Threads::Mutex::Lock lm (_engine.process_lock()); + + for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) { + if ((*x)->is_monitor()) { + /* relax */ + } else if ((*x)->is_master()) { /* relax */ - } else { - (*x)->enable_monitor_send (); - } + } else { + (*x)->enable_monitor_send (); } } - - resort_routes (); } - - set_dirty(); - - if (save) { - save_state (_current_snapshot_name); - } - - RouteAdded (new_routes); /* EMIT SIGNAL */ } void @@ -3551,7 +3564,7 @@ Session::graph_reordered () from a set_state() call or creating new tracks. Ditto for deletion. */ - if (_state_of_the_state & (InitialConnecting|Deletion)) { + if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) { return; } @@ -4531,7 +4544,7 @@ Session::update_latency (bool playback) { DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE"))); - if (_state_of_the_state & (InitialConnecting|Deletion)) { + if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) { return; } diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 74257ef482..a1f457393a 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -206,6 +206,7 @@ Session::first_stage_init (string fullpath, string snapshot_name) _play_range = false; _exporting = false; pending_abort = false; + _adding_routes_in_progress = false; destructive_index = 0; first_file_data_format_reset = true; first_file_header_format_reset = true; |