summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-08-17 02:12:20 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-08-17 02:12:20 +0000
commit3c3a204ad32cfa167efa193b472a7b8103734613 (patch)
treef5318153b3883d3de930385392582dbb6da4148f /libs
parent199dce57f35014189f21c76fff32e0752bcc8c15 (diff)
further optimizations for multiple-track-at-once addition. as in "whoah!"
git-svn-id: svn://localhost/ardour2/trunk@836 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/session.h8
-rw-r--r--libs/ardour/audioengine.cc2
-rw-r--r--libs/ardour/session.cc177
-rw-r--r--libs/ardour/session_state.cc5
4 files changed, 111 insertions, 81 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 757d13f79b..78f6011369 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -345,7 +345,7 @@ class Session : public sigc::trackable, public Stateful
sigc::signal<void> DurationChanged;
sigc::signal<void> HaltOnXrun;
- sigc::signal<void,boost::shared_ptr<Route> > RouteAdded;
+ sigc::signal<void,RouteList&> RouteAdded;
void request_roll ();
void request_bounded_roll (jack_nframes_t start, jack_nframes_t end);
@@ -536,8 +536,8 @@ class Session : public sigc::trackable, public Stateful
/* fundamental operations. duh. */
- std::vector<boost::shared_ptr<AudioTrack> > new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1);
- boost::shared_ptr<Route> new_audio_route (int input_channels, int output_channels);
+ std::list<boost::shared_ptr<AudioTrack> > new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1);
+ RouteList new_audio_route (int input_channels, int output_channels, uint32_t how_many);
void remove_route (boost::shared_ptr<Route>);
@@ -1517,7 +1517,7 @@ class Session : public sigc::trackable, public Stateful
SerializedRCUManager<RouteList> routes;
- void add_route (boost::shared_ptr<Route>, bool save = true);
+ void add_routes (RouteList&, bool save = true);
uint32_t destructive_index;
int load_routes (const XMLNode&);
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 5f86f21762..14593d9712 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -760,7 +760,6 @@ AudioEngine::get_physical_inputs (vector<string>& ins)
for (i = 0; ports[i]; ++i) {
ins.push_back (ports[i]);
}
- cerr << "got " << ins.size() << " physical ins\n";
free (ports);
}
}
@@ -783,7 +782,6 @@ AudioEngine::get_physical_outputs (vector<string>& outs)
for (i = 0; ports[i]; ++i) {
outs.push_back (ports[i]);
}
- cerr << "got " << outs.size() << " physical outs\n";
free (ports);
}
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index dfa7468725..43311e77e4 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -327,13 +327,17 @@ Session::Session (AudioEngine &eng,
if (control_out_channels) {
shared_ptr<Route> r (new Route (*this, _("monitor"), -1, control_out_channels, -1, control_out_channels, Route::ControlOut));
- add_route (r);
+ RouteList rl;
+ rl.push_back (r);
+ add_routes (rl);
_control_out = r;
}
if (master_out_channels) {
shared_ptr<Route> r (new Route (*this, _("master"), -1, master_out_channels, -1, master_out_channels, Route::MasterOut));
- add_route (r);
+ RouteList rl;
+ rl.push_back (r);
+ add_routes (rl);
_master_out = r;
} else {
/* prohibit auto-connect to master, because there isn't one */
@@ -1669,7 +1673,7 @@ Session::resort_routes_using (shared_ptr<RouteList> r)
}
-vector<boost::shared_ptr<AudioTrack> >
+list<boost::shared_ptr<AudioTrack> >
Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, uint32_t how_many)
{
char track_name[32];
@@ -1677,7 +1681,8 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
uint32_t n = 0;
uint32_t channels_used = 0;
string port;
- vector<boost::shared_ptr<AudioTrack> > ret;
+ RouteList new_routes;
+ list<boost::shared_ptr<AudioTrack> > ret;
/* count existing audio tracks */
@@ -1791,6 +1796,7 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
track->DiskstreamChanged.connect (mem_fun (this, &Session::resort_routes));
track->set_remote_control_id (ntracks());
+ new_routes.push_back (track);
ret.push_back (track);
}
@@ -1804,23 +1810,22 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
--how_many;
}
- if (!ret.empty()) {
- for (vector<boost::shared_ptr<AudioTrack> >::iterator x = ret.begin(); x != ret.end(); ++x) {
- add_route ((*x), false);
- }
-
+ if (!new_routes.empty()) {
+ add_routes (new_routes, false);
save_state (_current_snapshot_name);
}
return ret;
}
-shared_ptr<Route>
-Session::new_audio_route (int input_channels, int output_channels)
+Session::RouteList
+Session::new_audio_route (int input_channels, int output_channels, uint32_t how_many)
{
char bus_name[32];
+ uint32_t bus_id = 1;
uint32_t n = 0;
string port;
+ RouteList ret;
/* count existing audio busses */
@@ -1830,101 +1835,125 @@ Session::new_audio_route (int input_channels, int output_channels)
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
if (dynamic_cast<AudioTrack*>((*i).get()) == 0) {
if (!(*i)->hidden()) {
- n++;
+ bus_id++;
}
}
}
}
- do {
- snprintf (bus_name, sizeof(bus_name), "Bus %" PRIu32, n+1);
- if (route_by_name (bus_name) == 0) {
- break;
- }
- n++;
+ vector<string> physinputs;
+ vector<string> physoutputs;
- } while (n < (UINT_MAX-1));
+ _engine.get_physical_outputs (physoutputs);
+ _engine.get_physical_inputs (physinputs);
- try {
- shared_ptr<Route> bus (new Route (*this, bus_name, -1, -1, -1, -1, Route::Flag(0), DataType::AUDIO));
+ while (how_many) {
- if (bus->ensure_io (input_channels, output_channels, false, this)) {
- error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
- input_channels, output_channels)
- << endmsg;
- }
+ do {
+ ++bus_id;
- for (uint32_t x = 0; x < bus->n_inputs(); ++x) {
-
- port = "";
+ snprintf (bus_name, sizeof(bus_name), "Bus %" PRIu32, bus_id);
- if (input_auto_connect & AutoConnectPhysical) {
- port = _engine.get_nth_physical_input ((n+x)%n_physical_inputs);
- }
-
- if (port.length() && bus->connect_input (bus->input (x), port, this)) {
+ if (route_by_name (bus_name) == 0) {
break;
}
- }
- for (uint32_t x = 0; x < bus->n_outputs(); ++x) {
-
- port = "";
+ } while (bus_id < (UINT_MAX-1));
- if (output_auto_connect & AutoConnectPhysical) {
- port = _engine.get_nth_physical_input ((n+x)%n_physical_outputs);
- } else if (output_auto_connect & AutoConnectMaster) {
- if (_master_out) {
- port = _master_out->input (x%_master_out->n_inputs())->name();
+ try {
+ shared_ptr<Route> bus (new Route (*this, bus_name, -1, -1, -1, -1, Route::Flag(0), DataType::AUDIO));
+
+ if (bus->ensure_io (input_channels, output_channels, false, this)) {
+ error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
+ input_channels, output_channels)
+ << endmsg;
+ }
+
+ for (uint32_t x = 0; x < bus->n_inputs(); ++x) {
+
+ port = "";
+
+ if (input_auto_connect & AutoConnectPhysical) {
+ port = physinputs[((n+x)%n_physical_inputs)];
+ }
+
+ if (port.length() && bus->connect_input (bus->input (x), port, this)) {
+ break;
}
}
-
- if (port.length() && bus->connect_output (bus->output (x), port, this)) {
- break;
+
+ for (uint32_t x = 0; x < bus->n_outputs(); ++x) {
+
+ port = "";
+
+ if (output_auto_connect & AutoConnectPhysical) {
+ port = physoutputs[((n+x)%n_physical_outputs)];
+ } else if (output_auto_connect & AutoConnectMaster) {
+ if (_master_out) {
+ port = _master_out->input (x%_master_out->n_inputs())->name();
+ }
+ }
+
+ if (port.length() && bus->connect_output (bus->output (x), port, this)) {
+ break;
+ }
+ }
+
+ if (_control_out) {
+ vector<string> cports;
+ uint32_t ni = _control_out->n_inputs();
+
+ for (uint32_t n = 0; n < ni; ++n) {
+ cports.push_back (_control_out->input(n)->name());
+ }
+ bus->set_control_outs (cports);
}
- }
- if (_control_out) {
- vector<string> cports;
- uint32_t ni = _control_out->n_inputs();
+ ret.push_back (bus);
+ }
+
- for (uint32_t n = 0; n < ni; ++n) {
- cports.push_back (_control_out->input(n)->name());
- }
- bus->set_control_outs (cports);
+ catch (failed_constructor &err) {
+ error << _("Session: could not create new audio route.") << endmsg;
+ ret.clear ();
+ return ret;
}
-
- add_route (bus);
- return bus;
+
+ --how_many;
}
- catch (failed_constructor &err) {
- error << _("Session: could not create new audio route.") << endmsg;
- return shared_ptr<Route> ((Route*) 0);
+ if (!ret.empty()) {
+ add_routes (ret, false);
+ save_state (_current_snapshot_name);
}
+
+ return ret;
+
}
void
-Session::add_route (boost::shared_ptr<Route> route, bool save)
+Session::add_routes (RouteList& new_routes, bool save)
{
{
RCUWriter<RouteList> writer (routes);
shared_ptr<RouteList> r = writer.get_copy ();
- r->push_front (route);
+ r->insert (r->end(), new_routes.begin(), new_routes.end());
resort_routes_using (r);
}
- route->solo_changed.connect (sigc::bind (mem_fun (*this, &Session::route_solo_changed), route));
- route->mute_changed.connect (mem_fun (*this, &Session::route_mute_changed));
- route->output_changed.connect (mem_fun (*this, &Session::set_worst_io_latencies_x));
- route->redirects_changed.connect (mem_fun (*this, &Session::update_latency_compensation_proxy));
-
- if (route->master()) {
- _master_out = route;
- }
-
- if (route->control()) {
- _control_out = route;
+ for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
+ (*x)->solo_changed.connect (sigc::bind (mem_fun (*this, &Session::route_solo_changed), (*x)));
+ (*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)->redirects_changed.connect (mem_fun (*this, &Session::update_latency_compensation_proxy));
+
+ if ((*x)->master()) {
+ _master_out = (*x);
+ }
+
+ if ((*x)->control()) {
+ _control_out = (*x);
+ }
}
set_dirty();
@@ -1933,7 +1962,7 @@ Session::add_route (boost::shared_ptr<Route> route, bool save)
save_state (_current_snapshot_name);
}
- RouteAdded (route); /* EMIT SIGNAL */
+ RouteAdded (new_routes); /* EMIT SIGNAL */
}
void
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 6770428c65..6f2ad965b4 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -1707,6 +1707,7 @@ Session::load_routes (const XMLNode& node)
{
XMLNodeList nlist;
XMLNodeConstIterator niter;
+ RouteList new_routes;
nlist = node.children();
@@ -1721,9 +1722,11 @@ Session::load_routes (const XMLNode& node)
return -1;
}
- add_route (route);
+ new_routes.push_back (route);
}
+ add_routes (new_routes);
+
return 0;
}