diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/session.h | 8 | ||||
-rw-r--r-- | libs/ardour/audioengine.cc | 2 | ||||
-rw-r--r-- | libs/ardour/session.cc | 177 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 5 |
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; } |