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
This commit is contained in:
Paul Davis 2012-12-04 14:32:28 +00:00
parent 1feaa65d16
commit 89d1a2fdf5
8 changed files with 64 additions and 34 deletions

View file

@ -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);

View file

@ -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;

View file

@ -2135,6 +2135,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;
@ -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()) {
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 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;
}

View file

@ -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;